From c5732aa13b2d37d25278d5fbb90b53492a70bb2e Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Thu, 27 Mar 2025 17:13:38 -0700 Subject: [PATCH] Audio Output: Optimize fader function Now using Accelerate methods to calculate and multiply ramps per channel and add the remainder if necessary. Signed-off-by: Christopher Snowhill --- Audio/Output/OutputCoreAudio.m | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index d0533c915..ffcca853e 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -31,23 +31,19 @@ static BOOL fadeAudio(const float *inSamples, float *outSamples, size_t channels float _fadeLevel = *fadeLevel; BOOL towardZero = fadeStep < 0.0; BOOL stopping = NO; - for(size_t i = 0; i < count; ++i) { - for(size_t j = 0; j < channels; ++j) { - outSamples[j] += inSamples[j] * _fadeLevel; + size_t maxCount = (size_t)floor(fabs(fadeTarget - _fadeLevel) / fabs(fadeStep)); + if(maxCount) { + size_t countToDo = MIN(count, maxCount); + for(size_t i = 0; i < channels; ++i) { + _fadeLevel = *fadeLevel; + vDSP_vrampmuladd(&inSamples[i], channels, &_fadeLevel, &fadeStep, &outSamples[i], channels, countToDo); } - inSamples += channels; - outSamples += channels; - _fadeLevel += fadeStep; - if(towardZero && _fadeLevel <= fadeTarget) { - _fadeLevel = fadeTarget; - fadeStep = 0.0; - stopping = YES; - break; - } else if(!towardZero && _fadeLevel >= fadeTarget) { - _fadeLevel = fadeTarget; - fadeStep = 0.0; - stopping = YES; + } + if(maxCount <= count) { + if(!towardZero && maxCount < count) { + vDSP_vadd(&inSamples[maxCount * channels], 1, &outSamples[maxCount * channels], 1, &outSamples[maxCount * channels], 1, (count - maxCount) * channels); } + stopping = YES; } *fadeLevel = _fadeLevel; return stopping;