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:
parent
6b23590ac8
commit
9a23ff9ff9
1 changed files with 11 additions and 15 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue