diff options
author | Chris Robinson <[email protected]> | 2020-05-01 15:16:35 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2020-05-01 21:14:41 -0700 |
commit | 3898b77dd6b3d0bd9fad6b4f65f15b3c5b44c39b (patch) | |
tree | e341e7e1edd179542c2ac82fd96008de333efd5c /alc/mixer/mixer_c.cpp | |
parent | 8acf16fc820c1b36b5364bcf17cf4f96a27fedef (diff) |
Avoid iterators for the main mixer
Diffstat (limited to 'alc/mixer/mixer_c.cpp')
-rw-r--r-- | alc/mixer/mixer_c.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/alc/mixer/mixer_c.cpp b/alc/mixer/mixer_c.cpp index 8a58ff10..b665b0a5 100644 --- a/alc/mixer/mixer_c.cpp +++ b/alc/mixer/mixer_c.cpp @@ -161,27 +161,25 @@ void Mix_<CTag>(const al::span<const float> InSamples, const al::span<FloatBuffe float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos) { const float delta{(Counter > 0) ? 1.0f / static_cast<float>(Counter) : 0.0f}; - const bool reached_target{InSamples.size() >= Counter}; - const auto min_end = reached_target ? InSamples.begin() + Counter : InSamples.end(); + const auto min_len = minz(Counter, InSamples.size()); for(FloatBufferLine &output : OutBuffer) { float *RESTRICT dst{al::assume_aligned<16>(output.data()+OutPos)}; float gain{*CurrentGains}; - const float diff{*TargetGains - gain}; + const float step{(*TargetGains-gain) * delta}; - auto in_iter = InSamples.begin(); - if(!(std::fabs(diff) > std::numeric_limits<float>::epsilon())) + size_t pos{0}; + if(!(std::fabs(step) > std::numeric_limits<float>::epsilon())) gain = *TargetGains; else { - const float step{diff * delta}; float step_count{0.0f}; - while(in_iter != min_end) + for(;pos != min_len;++pos) { - *(dst++) += *(in_iter++) * (gain + step*step_count); + dst[pos] += InSamples[pos] * (gain + step*step_count); step_count += 1.0f; } - if(reached_target) + if(pos == Counter) gain = *TargetGains; else gain += step*step_count; @@ -192,7 +190,7 @@ void Mix_<CTag>(const al::span<const float> InSamples, const al::span<FloatBuffe if(!(std::fabs(gain) > GAIN_SILENCE_THRESHOLD)) continue; - while(in_iter != InSamples.end()) - *(dst++) += *(in_iter++) * gain; + for(;pos != InSamples.size();++pos) + dst[pos] += InSamples[pos] * gain; } } |