diff options
author | Stéphane Letz <letz@grame.fr> | 2016-02-25 08:03:45 +0100 |
---|---|---|
committer | Stéphane Letz <letz@grame.fr> | 2016-02-25 08:03:45 +0100 |
commit | cf8ccd2e31a51da30837cde79677cfaf43301cd9 (patch) | |
tree | 78f155c2fa9c9177dd6d47c131357cce8f8471ed | |
parent | 51f923882ebc99e47037c5123f592a94203eb7da (diff) | |
parent | 8c50f67f3c2b4f07710ddee845deefc9ac8f9a8b (diff) | |
download | jack2-cf8ccd2e31a51da30837cde79677cfaf43301cd9.tar.gz |
Merge pull request #191 from falkTX/master
Use ARM neon intrinsics for AudioBufferMixdown
-rw-r--r-- | common/JackAudioPort.cpp | 26 |
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 |