From 8c50f67f3c2b4f07710ddee845deefc9ac8f9a8b Mon Sep 17 00:00:00 2001 From: falkTX Date: Thu, 25 Feb 2016 00:11:09 +0100 Subject: [PATCH] Use ARM neon intrinsics for AudioBufferMixdown --- common/JackAudioPort.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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 #elif defined (__SSE__) && !defined (__sun__) #include +#elif defined (__ARM_NEON__) +#include #endif namespace Jack @@ -51,6 +53,13 @@ static inline void MixAudioBuffer(jack_default_audio_sample_t* mixbuffer, jack_d __m128 vec = _mm_add_ps(_mm_load_ps(mixbuffer), _mm_load_ps(buffer)); _mm_store_ps(mixbuffer, vec); + 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--; @@ -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(src_buffers[0]); + jack_default_audio_sample_t* target = static_cast(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