summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStéphane Letz <letz@grame.fr>2016-02-25 08:03:45 +0100
committerStéphane Letz <letz@grame.fr>2016-02-25 08:03:45 +0100
commitcf8ccd2e31a51da30837cde79677cfaf43301cd9 (patch)
tree78f155c2fa9c9177dd6d47c131357cce8f8471ed
parent51f923882ebc99e47037c5123f592a94203eb7da (diff)
parent8c50f67f3c2b4f07710ddee845deefc9ac8f9a8b (diff)
downloadjack2-cf8ccd2e31a51da30837cde79677cfaf43301cd9.tar.gz
Merge pull request #191 from falkTX/master
Use ARM neon intrinsics for AudioBufferMixdown
-rw-r--r--common/JackAudioPort.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/common/JackAudioPort.cpp b/common/JackAudioPort.cpp
index 4ddd6f90..43f5c5fe 100644
--- a/common/JackAudioPort.cpp
+++ b/common/JackAudioPort.cpp
@@ -28,6 +28,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <Accelerate/Accelerate.h>
#elif defined (__SSE__) && !defined (__sun__)
#include <xmmintrin.h>
+#elif defined (__ARM_NEON__)
+#include <arm_neon.h>
#endif
namespace Jack
@@ -54,6 +56,13 @@ static inline void MixAudioBuffer(jack_default_audio_sample_t* mixbuffer, jack_d
mixbuffer += 4;
buffer += 4;
frames_group--;
+ #elif defined (__ARM_NEON__)
+ float32x4_t vec = vaddq_f32(vld1q_f32(mixbuffer), vld1q_f32(buffer));
+ vst1q_f32(mixbuffer, vec);
+
+ mixbuffer += 4;
+ buffer += 4;
+ frames_group--;
#else
register jack_default_audio_sample_t mixFloat1 = *mixbuffer;
register jack_default_audio_sample_t sourceFloat1 = *buffer;
@@ -116,7 +125,24 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun
for (jack_nframes_t i = 0; i != remaining_frames; ++i) {
target[i] = source[i];
}
+#elif defined (__ARM_NEON__)
+ jack_nframes_t frames_group = nframes / 4;
+ jack_nframes_t remaining_frames = nframes % 4;
+
+ jack_default_audio_sample_t* source = static_cast<jack_default_audio_sample_t*>(src_buffers[0]);
+ jack_default_audio_sample_t* target = static_cast<jack_default_audio_sample_t*>(mixbuffer);
+
+ while (frames_group > 0) {
+ float32x4_t vec = vld1q_f32(source);
+ vst1q_f32(target, vec);
+ source += 4;
+ target += 4;
+ --frames_group;
+ }
+ for (jack_nframes_t i = 0; i != remaining_frames; ++i) {
+ target[i] = source[i];
+ }
#else
memcpy(mixbuffer, src_buffers[0], nframes * sizeof(jack_default_audio_sample_t));
#endif