diff --git a/src/effect_mixer.hpp b/src/effect_mixer.hpp index ea0b510..e16b6f5 100644 --- a/src/effect_mixer.hpp +++ b/src/effect_mixer.hpp @@ -22,7 +22,10 @@ public: { buffer_length=len; for (uint8_t i=0; i 0U) + { + if (*pIn >= 0 && *(pIn - 1) < 0) + return blockSize - blkCnt; + + pIn++; + blkCnt--; + } + + return blockSize; + } + void pan(uint8_t channel, float32_t pan) { if (channel >= NN) return; @@ -113,22 +139,38 @@ public: pan = MIN_PANORAMA; // From: https://stackoverflow.com/questions/67062207/how-to-pan-audio-sample-data-naturally - panorama[channel][0]=arm_cos_f32(mapfloat(pan, MIN_PANORAMA, MAX_PANORAMA, 0.0, M_PI/2.0)); - panorama[channel][1]=arm_sin_f32(mapfloat(pan, MIN_PANORAMA, MAX_PANORAMA, 0.0, M_PI/2.0)); + panorama_w[channel][0]=arm_cos_f32(mapfloat(pan, MIN_PANORAMA, MAX_PANORAMA, 0.0, M_PI/2.0)); + panorama_w[channel][1]=arm_sin_f32(mapfloat(pan, MIN_PANORAMA, MAX_PANORAMA, 0.0, M_PI/2.0)); } void doAddMix(uint8_t channel, float32_t* in) { float32_t tmp[buffer_length]; - + uint32_t zc; assert(in); - // left - arm_scale_f32(in, panorama[channel][0] * multiplier[channel], tmp, buffer_length); - arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); - // right - arm_scale_f32(in, panorama[channel][1] * multiplier[channel], tmp, buffer_length); - arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); + if ((panorama[channel][0] != panorama_w[channel][0] || multiplier[channel] != multiplier_w[channel]) && + (zc = find_zc_f32(in, buffer_length)) != buffer_length) + { + arm_scale_f32(in, panorama[channel][0] * multiplier[channel], tmp, zc); + arm_scale_f32(in + zc, panorama_w[channel][0] * multiplier_w[channel], tmp + zc, buffer_length - zc); + arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); + panorama[channel][0] = panorama_w[channel][0]; + + arm_scale_f32(in, panorama[channel][1] * multiplier[channel], tmp, zc); + arm_scale_f32(in + zc, panorama_w[channel][1] * multiplier_w[channel], tmp + zc, buffer_length - zc); + arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); + panorama[channel][1] = panorama_w[channel][1]; + + multiplier[channel] = multiplier_w[channel]; + } + else + { + arm_scale_f32(in, panorama[channel][0] * multiplier[channel], tmp, buffer_length); + arm_add_f32(sumbufL, tmp, sumbufL, buffer_length); + arm_scale_f32(in, panorama[channel][1] * multiplier[channel], tmp, buffer_length); + arm_add_f32(sumbufR, tmp, sumbufR, buffer_length); + } } void getMix(float32_t* bufferL, float32_t* bufferR) @@ -164,8 +206,10 @@ public: protected: using AudioMixer::sumbufL; using AudioMixer::multiplier; + using AudioMixer::multiplier_w; using AudioMixer::buffer_length; float32_t panorama[NN][2]; + float32_t panorama_w[NN][2]; float32_t* sumbufR; };