diff options
author | Chris Robinson <[email protected]> | 2016-10-05 20:33:45 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2016-10-05 20:33:45 -0700 |
commit | 9b8f36b75879d2fee652c9ff81e1cb5db665a5c5 (patch) | |
tree | dae9a1458b8f2d12fab0962792a8bf3528e111ab /Alc/mixer_neon.c | |
parent | 1e1a8837f8a595639aa8933889b892766379d111 (diff) |
Pass current and target gains directly for mixing
Diffstat (limited to 'Alc/mixer_neon.c')
-rw-r--r-- | Alc/mixer_neon.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 8c96aef1..6b506357 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -76,18 +76,21 @@ static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2], void Mix_Neon(const ALfloat *data, ALuint OutChans, ALfloat (*restrict OutBuffer)[BUFFERSIZE], - MixGains *Gains, ALuint Counter, ALuint OutPos, ALuint BufferSize) + ALfloat *CurrentGains, const ALfloat *TargetGains, ALuint Counter, ALuint OutPos, + ALuint BufferSize) { - ALfloat gain, step; + ALfloat gain, delta, step; float32x4_t gain4; ALuint c; + delta = (Counter > 0) ? 1.0f/(ALfloat)Counter : 0.0f; + for(c = 0;c < OutChans;c++) { ALuint pos = 0; - gain = Gains[c].Current; - step = Gains[c].Step; - if(step != 0.0f && Counter > 0) + gain = CurrentGains[c]; + step = (TargetGains[c] - gain) * delta; + if(fabsf(step) > FLT_EPSILON) { ALuint minsize = minu(BufferSize, Counter); /* Mix with applying gain steps in aligned multiples of 4. */ @@ -120,8 +123,8 @@ void Mix_Neon(const ALfloat *data, ALuint OutChans, ALfloat (*restrict OutBuffer gain += step; } if(pos == Counter) - gain = Gains[c].Target; - Gains[c].Current = gain; + gain = TargetGains[c]; + CurrentGains[c] = gain; /* Mix until pos is aligned with 4 or the mix is done. */ minsize = minu(BufferSize, (pos+3)&~3); |