From 3a6e741e900bbfbee99906c780402455637c223a Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 22 Mar 2019 19:25:55 -0700 Subject: Use MixParams for the wet buffers --- Alc/alu.cpp | 54 +++++++++++++++++++--------------------------- Alc/effects/autowah.cpp | 2 +- Alc/effects/compressor.cpp | 2 +- Alc/effects/equalizer.cpp | 4 ++-- Alc/effects/modulator.cpp | 4 ++-- Alc/panning.cpp | 25 +++++++++++---------- 6 files changed, 42 insertions(+), 49 deletions(-) (limited to 'Alc') diff --git a/Alc/alu.cpp b/Alc/alu.cpp index 7216e18b..82eaa510 100644 --- a/Alc/alu.cpp +++ b/Alc/alu.cpp @@ -406,18 +406,9 @@ bool CalcEffectSlotParams(ALeffectslot *slot, ALCcontext *context, bool force) AtomicReplaceHead(context->FreeEffectslotProps, props); } - MixParams params; EffectTarget output; if(ALeffectslot *target{slot->Params.Target}) - { - auto iter = std::copy(std::begin(target->ChanMap), std::end(target->ChanMap), - std::begin(params.AmbiMap)); - std::fill(iter, std::end(params.AmbiMap), BFChannelConfig{}); - params.Buffer = &reinterpret_cast(target->WetBuffer[0]); - params.NumChannels = target->WetBuffer.size(); - - output = EffectTarget{¶ms, nullptr}; - } + output = EffectTarget{&target->Wet, nullptr}; else { ALCdevice *device{context->Device}; @@ -628,8 +619,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo for(ALsizei i{0};i < NumSends;i++) { if(const ALeffectslot *Slot{SendSlots[i]}) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i]*scale0, voice->mSend[i].Params[0].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i]*scale0, + voice->mSend[i].Params[0].Gains.Target); } } else @@ -689,8 +680,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo { if(const ALeffectslot *Slot{SendSlots[i]}) for(ALsizei c{0};c < num_channels;c++) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), matrix[c], - WetGain[i], voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, matrix[c], WetGain[i], + voice->mSend[i].Params[c].Gains.Target); } } } @@ -719,8 +710,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo for(ALsizei i{0};i < NumSends;i++) { if(const ALeffectslot *Slot{SendSlots[i]}) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i], voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i], + voice->mSend[i].Params[c].Gains.Target); } } } @@ -770,8 +761,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo { /* Skip LFE */ if(chans[c].channel != LFE) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i]*downmix_gain, voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i] * downmix_gain, + voice->mSend[i].Params[c].Gains.Target); } } } @@ -803,8 +794,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo for(ALsizei i{0};i < NumSends;i++) { if(const ALeffectslot *Slot{SendSlots[i]}) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i], voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i], + voice->mSend[i].Params[c].Gains.Target); } } } @@ -879,8 +870,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo { /* Skip LFE */ if(chans[c].channel != LFE) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i]*downmix_gain, voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i] * downmix_gain, + voice->mSend[i].Params[c].Gains.Target); } } } @@ -929,8 +920,8 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat xpos, const ALfloat ypo for(ALsizei i{0};i < NumSends;i++) { if(const ALeffectslot *Slot{SendSlots[i]}) - ComputePanningGainsBF(Slot->ChanMap, Slot->WetBuffer.size(), coeffs, - WetGain[i], voice->mSend[i].Params[c].Gains.Target); + ComputePanGains(&Slot->Wet, coeffs, WetGain[i], + voice->mSend[i].Params[c].Gains.Target); } } } @@ -1001,8 +992,8 @@ void CalcNonAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, cons } else { - voice->mSend[i].Buffer = &reinterpret_cast(SendSlots[i]->WetBuffer[0]); - voice->mSend[i].Channels = SendSlots[i]->WetBuffer.size(); + voice->mSend[i].Buffer = SendSlots[i]->Wet.Buffer; + voice->mSend[i].Channels = SendSlots[i]->Wet.NumChannels; } } @@ -1109,8 +1100,8 @@ void CalcAttnSourceParams(ALvoice *voice, const ALvoicePropsBase *props, const A } else { - voice->mSend[i].Buffer = &reinterpret_cast(SendSlots[i]->WetBuffer[0]); - voice->mSend[i].Channels = SendSlots[i]->WetBuffer.size(); + voice->mSend[i].Buffer = SendSlots[i]->Wet.Buffer; + voice->mSend[i].Channels = SendSlots[i]->Wet.NumChannels; } } @@ -1424,7 +1415,7 @@ void ProcessContext(ALCcontext *ctx, const ALsizei SamplesToDo) std::for_each(auxslots->begin(), auxslots->end(), [SamplesToDo](ALeffectslot *slot) -> void { - for(auto &buffer : slot->WetBuffer) + for(auto &buffer : slot->MixBuffer) std::fill_n(buffer.begin(), SamplesToDo, 0.0f); } ); @@ -1482,9 +1473,8 @@ void ProcessContext(ALCcontext *ctx, const ALsizei SamplesToDo) [SamplesToDo](const ALeffectslot *slot) -> void { EffectState *state{slot->Params.mEffectState}; - state->process(SamplesToDo, - &reinterpret_cast(slot->WetBuffer[0]), - slot->WetBuffer.size(), state->mOutBuffer, state->mOutChannels); + state->process(SamplesToDo, slot->Wet.Buffer, slot->Wet.NumChannels, + state->mOutBuffer, state->mOutChannels); } ); } diff --git a/Alc/effects/autowah.cpp b/Alc/effects/autowah.cpp index 81c0c75c..0b12f68e 100644 --- a/Alc/effects/autowah.cpp +++ b/Alc/effects/autowah.cpp @@ -121,7 +121,7 @@ void ALautowahState::update(const ALCcontext *context, const ALeffectslot *slot, mOutBuffer = target.Main->Buffer; mOutChannels = target.Main->NumChannels; - for(size_t i{0u};i < slot->WetBuffer.size();++i) + for(ALsizei i{0};i < slot->Wet.NumChannels;++i) { auto coeffs = GetAmbiIdentityRow(i); ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); diff --git a/Alc/effects/compressor.cpp b/Alc/effects/compressor.cpp index 9e2ea376..6e5cea9d 100644 --- a/Alc/effects/compressor.cpp +++ b/Alc/effects/compressor.cpp @@ -80,7 +80,7 @@ void CompressorState::update(const ALCcontext* UNUSED(context), const ALeffectsl mOutBuffer = target.Main->Buffer; mOutChannels = target.Main->NumChannels; - for(size_t i{0u};i < slot->WetBuffer.size();++i) + for(ALsizei i{0};i < slot->Wet.NumChannels;++i) { auto coeffs = GetAmbiIdentityRow(i); ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mGain[i]); diff --git a/Alc/effects/equalizer.cpp b/Alc/effects/equalizer.cpp index e9c75d53..441d8764 100644 --- a/Alc/effects/equalizer.cpp +++ b/Alc/effects/equalizer.cpp @@ -141,7 +141,7 @@ void EqualizerState::update(const ALCcontext *context, const ALeffectslot *slot, calc_rcpQ_from_slope(gain, 0.75f)); /* Copy the filter coefficients for the other input channels. */ - for(size_t i{1u};i < slot->WetBuffer.size();++i) + for(ALsizei i{1};i < slot->Wet.NumChannels;++i) { mChans[i].filter[0].copyParamsFrom(mChans[0].filter[0]); mChans[i].filter[1].copyParamsFrom(mChans[0].filter[1]); @@ -151,7 +151,7 @@ void EqualizerState::update(const ALCcontext *context, const ALeffectslot *slot, mOutBuffer = target.Main->Buffer; mOutChannels = target.Main->NumChannels; - for(size_t i{0u};i < slot->WetBuffer.size();++i) + for(ALsizei i{0};i < slot->Wet.NumChannels;++i) { auto coeffs = GetAmbiIdentityRow(i); ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); diff --git a/Alc/effects/modulator.cpp b/Alc/effects/modulator.cpp index 46fe32a3..c2095192 100644 --- a/Alc/effects/modulator.cpp +++ b/Alc/effects/modulator.cpp @@ -129,12 +129,12 @@ void ModulatorState::update(const ALCcontext *context, const ALeffectslot *slot, /* Bandwidth value is constant in octaves. */ mChans[0].Filter.setParams(BiquadType::HighPass, 1.0f, f0norm, calc_rcpQ_from_bandwidth(f0norm, 0.75f)); - for(size_t i{1u};i < slot->WetBuffer.size();++i) + for(ALsizei i{1};i < slot->Wet.NumChannels;++i) mChans[i].Filter.copyParamsFrom(mChans[0].Filter); mOutBuffer = target.Main->Buffer; mOutChannels = target.Main->NumChannels; - for(size_t i{0u};i < slot->WetBuffer.size();++i) + for(ALsizei i{0};i < slot->Wet.NumChannels;++i) { auto coeffs = GetAmbiIdentityRow(i); ComputePanGains(target.Main, coeffs.data(), slot->Params.Gain, mChans[i].TargetGains); diff --git a/Alc/panning.cpp b/Alc/panning.cpp index 209c650c..941e2a8b 100644 --- a/Alc/panning.cpp +++ b/Alc/panning.cpp @@ -740,11 +740,13 @@ void CalcAmbiCoeffs(const ALfloat y, const ALfloat z, const ALfloat x, const ALf } } - -void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, const ALfloat*RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS]) +void ComputePanGains(const MixParams *mix, const ALfloat *RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS]) { + auto ambimap = mix->AmbiMap.cbegin(); + const ALsizei numchans{mix->NumChannels}; + ASSUME(numchans > 0); - auto iter = std::transform(chanmap, chanmap+numchans, std::begin(gains), + auto iter = std::transform(ambimap, ambimap+numchans, std::begin(gains), [coeffs,ingain](const BFChannelConfig &chanmap) noexcept -> ALfloat { ASSUME(chanmap.Index >= 0); @@ -754,9 +756,6 @@ void ComputePanningGainsBF(const BFChannelConfig *chanmap, ALsizei numchans, con std::fill(iter, std::end(gains), 0.0f); } -void ComputePanGains(const ALeffectslot *slot, const ALfloat*RESTRICT coeffs, ALfloat ingain, ALfloat (&gains)[MAX_OUTPUT_CHANNELS]) -{ ComputePanningGainsBF(slot->ChanMap, slot->WetBuffer.size(), coeffs, ingain, gains); } - void aluInitRenderer(ALCdevice *device, ALint hrtf_id, HrtfRequestMode hrtf_appreq, HrtfRequestMode hrtf_userreq) { @@ -1015,11 +1014,15 @@ no_hrtf: void aluInitEffectPanning(ALeffectslot *slot, ALCdevice *device) { const size_t count{AmbiChannelsFromOrder(device->mAmbiOrder)}; - slot->WetBuffer.resize(count); - slot->WetBuffer.shrink_to_fit(); + slot->MixBuffer.resize(count); + slot->MixBuffer.shrink_to_fit(); auto acnmap_end = AmbiIndex::From3D.begin() + count; - auto iter = std::transform(AmbiIndex::From3D.begin(), acnmap_end, std::begin(slot->ChanMap), - [](const ALsizei &acn) noexcept { return BFChannelConfig{1.0f, acn}; }); - std::fill(iter, std::end(slot->ChanMap), BFChannelConfig{}); + auto iter = std::transform(AmbiIndex::From3D.begin(), acnmap_end, slot->Wet.AmbiMap.begin(), + [](const ALsizei &acn) noexcept -> BFChannelConfig + { return BFChannelConfig{1.0f, acn}; } + ); + std::fill(iter, slot->Wet.AmbiMap.end(), BFChannelConfig{}); + slot->Wet.Buffer = &reinterpret_cast(slot->MixBuffer[0]); + slot->Wet.NumChannels = static_cast(count); } -- cgit v1.2.3