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 <kode54@gmail.com>
This commit is contained in:
Christopher Snowhill 2025-03-27 17:13:38 -07:00
parent 355bdf8616
commit c5732aa13b

View file

@ -31,23 +31,19 @@ static BOOL fadeAudio(const float *inSamples, float *outSamples, size_t channels
float _fadeLevel = *fadeLevel; float _fadeLevel = *fadeLevel;
BOOL towardZero = fadeStep < 0.0; BOOL towardZero = fadeStep < 0.0;
BOOL stopping = NO; BOOL stopping = NO;
for(size_t i = 0; i < count; ++i) { size_t maxCount = (size_t)floor(fabs(fadeTarget - _fadeLevel) / fabs(fadeStep));
for(size_t j = 0; j < channels; ++j) { if(maxCount) {
outSamples[j] += inSamples[j] * _fadeLevel; 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; if(maxCount <= count) {
_fadeLevel += fadeStep; if(!towardZero && maxCount < count) {
if(towardZero && _fadeLevel <= fadeTarget) { vDSP_vadd(&inSamples[maxCount * channels], 1, &outSamples[maxCount * channels], 1, &outSamples[maxCount * channels], 1, (count - maxCount) * channels);
_fadeLevel = fadeTarget;
fadeStep = 0.0;
stopping = YES;
break;
} else if(!towardZero && _fadeLevel >= fadeTarget) {
_fadeLevel = fadeTarget;
fadeStep = 0.0;
stopping = YES;
} }
stopping = YES;
} }
*fadeLevel = _fadeLevel; *fadeLevel = _fadeLevel;
return stopping; return stopping;