diff options
author | Chris Robinson <[email protected]> | 2019-06-03 22:24:26 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2019-06-03 22:24:26 -0700 |
commit | c76fb714ccd44584f18c1be7c8366c462c493831 (patch) | |
tree | 53ada8c82651596d51b82e06cbccd390eee7d00a /OpenAL32/alSource.cpp | |
parent | 53e1415a6709140654b5d70cc277d25fafa0bf66 (diff) |
Restructure voice data members
This should improve access patters by packing each buffer channel's data
together, which is more inline with its use.
Diffstat (limited to 'OpenAL32/alSource.cpp')
-rw-r--r-- | OpenAL32/alSource.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/OpenAL32/alSource.cpp b/OpenAL32/alSource.cpp index 02396fd0..d2414e50 100644 --- a/OpenAL32/alSource.cpp +++ b/OpenAL32/alSource.cpp @@ -2938,40 +2938,42 @@ START_API_FUNC BandSplitter splitter{400.0f / static_cast<ALfloat>(device->Frequency)}; const auto scales = BFormatDec::GetHFOrderScales(1, device->mAmbiOrder); - auto init_ambi = [scales,&OrderFromChan,&splitter](ALvoice::ResampleData &resdata) -> void + auto init_ambi = [scales,&OrderFromChan,&splitter](ALvoice::ChannelData &chandata) -> void { - resdata.mPrevSamples.fill(0.0f); - resdata.mAmbiScale = scales[*(OrderFromChan++)]; - resdata.mAmbiSplitter = splitter; + chandata.mPrevSamples.fill(0.0f); + chandata.mAmbiScale = scales[*(OrderFromChan++)]; + chandata.mAmbiSplitter = splitter; }; - std::for_each(voice->mResampleData.begin(), - voice->mResampleData.begin()+voice->mNumChannels, init_ambi); + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + init_ambi); voice->mFlags |= VOICE_IS_AMBISONIC; } else { /* Clear previous samples. */ - auto clear_prevs = [](ALvoice::ResampleData &resdata) -> void - { resdata.mPrevSamples.fill(0.0f); }; - std::for_each(voice->mResampleData.begin(), - voice->mResampleData.begin()+voice->mNumChannels, clear_prevs); + auto clear_prevs = [](ALvoice::ChannelData &chandata) -> void + { chandata.mPrevSamples.fill(0.0f); }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + clear_prevs); } - std::fill_n(std::begin(voice->mDirect.Params), voice->mNumChannels, DirectParams{}); - std::for_each(voice->mSend.begin(), voice->mSend.end(), - [voice](ALvoice::SendData &send) -> void - { std::fill_n(std::begin(send.Params), voice->mNumChannels, SendParams{}); } - ); + auto clear_params = [device](ALvoice::ChannelData &chandata) -> void + { + chandata.mDryParams = DirectParams{}; + std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{}); + }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + clear_params); if(device->AvgSpeakerDist > 0.0f) { const ALfloat w1{SPEEDOFSOUNDMETRESPERSEC / (device->AvgSpeakerDist * device->Frequency)}; - std::for_each(voice->mDirect.Params+0, voice->mDirect.Params+voice->mNumChannels, - [w1](DirectParams &parms) noexcept -> void - { parms.NFCtrlFilter.init(w1); } - ); + auto init_nfc = [w1](ALvoice::ChannelData &chandata) -> void + { chandata.mDryParams.NFCtrlFilter.init(w1); }; + std::for_each(voice->mChans.begin(), voice->mChans.begin()+voice->mNumChannels, + init_nfc); } voice->mSourceID.store(source->id, std::memory_order_relaxed); |