From cc8201738be804f3ca794850362de034305aaf09 Mon Sep 17 00:00:00 2001 From: David Reid Date: Mon, 1 Jun 2020 20:47:34 +1000 Subject: [PATCH] Optimization to stereo panner. --- research/ma_engine.c | 2 +- research/ma_engine.h | 33 ++++++++++++++------------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/research/ma_engine.c b/research/ma_engine.c index d5285501..c55ce46a 100644 --- a/research/ma_engine.c +++ b/research/ma_engine.c @@ -35,7 +35,7 @@ int main(int argc, char** argv) } ma_engine_sound_set_pitch(&engine, &sound1, 0.75f); - ma_engine_sound_set_pan(&engine, &sound1, -1.0f); + ma_engine_sound_set_pan(&engine, &sound1, 0.0f); ma_engine_sound_set_looping(&engine, &sound1, MA_TRUE); ma_engine_sound_start(&engine, &sound1); diff --git a/research/ma_engine.h b/research/ma_engine.h index 3e808437..e46e088d 100644 --- a/research/ma_engine.h +++ b/research/ma_engine.h @@ -510,29 +510,24 @@ MA_API ma_result ma_panner_init(const ma_panner_config* pConfig, ma_panner* pPan static void ma_stereo_pan_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, float pan) { - float factorL0; - float factorR0; - float factorL1; - float factorR1; ma_uint64 iFrame; - - /* TODO: We can optimize this by removing some multiplies and adds. */ if (pan > 0) { - factorL0 = 1.0f - pan; - factorR0 = 0.0f; - factorL1 = 0.0f + pan; - factorR1 = 1.0f; - } else { - factorL0 = 1.0f; - factorR0 = 0.0f - pan; - factorL1 = 0.0f; - factorR1 = 1.0f + pan; - } + float factorL0 = 1.0f - pan; + float factorL1 = 0.0f + pan; - for (iFrame = 0; iFrame < frameCount; iFrame += 1) { - pFramesOut[iFrame*2 + 0] = (pFramesIn[iFrame*2 + 0] * factorL0) + (pFramesIn[iFrame*2 + 1] * factorR0); - pFramesOut[iFrame*2 + 1] = (pFramesIn[iFrame*2 + 0] * factorL1) + (pFramesIn[iFrame*2 + 1] * factorR1); + for (iFrame = 0; iFrame < frameCount; iFrame += 1) { + pFramesOut[iFrame*2 + 0] = (pFramesIn[iFrame*2 + 0] * factorL0); + pFramesOut[iFrame*2 + 1] = (pFramesIn[iFrame*2 + 0] * factorL1) + pFramesIn[iFrame*2 + 1]; + } + } else { + float factorR0 = 0.0f - pan; + float factorR1 = 1.0f + pan; + + for (iFrame = 0; iFrame < frameCount; iFrame += 1) { + pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0] + (pFramesIn[iFrame*2 + 1] * factorR0); + pFramesOut[iFrame*2 + 1] = (pFramesIn[iFrame*2 + 1] * factorR1); + } } }