aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32/alSource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32/alSource.cpp')
-rw-r--r--OpenAL32/alSource.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/OpenAL32/alSource.cpp b/OpenAL32/alSource.cpp
index cf466c32..fbf6bfe6 100644
--- a/OpenAL32/alSource.cpp
+++ b/OpenAL32/alSource.cpp
@@ -41,6 +41,7 @@
#include "alFilter.h"
#include "alAuxEffectSlot.h"
#include "ringbuffer.h"
+#include "bformatdec.h"
#include "backends/base.h"
@@ -2828,6 +2829,19 @@ AL_API ALvoid AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources)
voice->Flags = start_fading ? VOICE_IS_FADING : 0;
if(source->SourceType == AL_STATIC) voice->Flags |= VOICE_IS_STATIC;
+ /* Don't need to set the VOICE_IS_AMBISONIC flag if the device is
+ * mixing in first order. No HF scaling is necessary to mix it.
+ */
+ if(((*buffer)->mFmtChannels == FmtBFormat2D || (*buffer)->mFmtChannels == FmtBFormat3D) &&
+ device->mAmbiOrder > 1)
+ {
+ voice->AmbiScales = AmbiUpsampler::GetHFOrderScales(1, device->mAmbiOrder);
+ voice->AmbiSplitter[0].init(400.0f / static_cast<ALfloat>(device->Frequency));
+ for(ALsizei i{1};i < voice->NumChannels;++i)
+ voice->AmbiSplitter[i] = voice->AmbiSplitter[0];
+ voice->Flags |= VOICE_IS_AMBISONIC;
+ }
+
std::fill_n(std::begin(voice->Direct.Params), voice->NumChannels, DirectParams{});
std::for_each(voice->Send.begin(), voice->Send.end(),
[voice](ALvoice::SendData &send) -> void