@@ -136,6 +136,8 @@ namespace
136136 XAUDIO2FX_I3DL2_PRESET_PLATE, // Reverb_Plate
137137 };
138138
139+ constexpr uint32_t c_XAudio3DCalculateDefault = X3DAUDIO_CALCULATE_MATRIX | X3DAUDIO_CALCULATE_LPF_DIRECT;
140+
139141 inline unsigned int makeVoiceKey (_In_ const WAVEFORMATEX* wfx) noexcept
140142 {
141143 assert (IsValid (wfx));
@@ -278,6 +280,7 @@ class AudioEngine::Impl
278280 maxVoiceInstances (SIZE_MAX),
279281 mMasterVolume (1 .f),
280282 mX3DAudio {},
283+ mX3DCalcFlags (c_XAudio3DCalculateDefault),
281284 mCriticalError (false ),
282285 mReverbEnabled (false ),
283286 mEngineFlags (AudioEngine_Default),
@@ -338,6 +341,7 @@ class AudioEngine::Impl
338341 float mMasterVolume ;
339342
340343 X3DAUDIO_HANDLE mX3DAudio ;
344+ uint32_t mX3DCalcFlags ;
341345
342346 bool mCriticalError ;
343347 bool mReverbEnabled ;
@@ -402,6 +406,7 @@ HRESULT AudioEngine::Impl::Reset(const WAVEFORMATEX* wfx, const wchar_t* deviceI
402406 mOutputFormat = {};
403407
404408 memset (&mX3DAudio , 0 , X3DAUDIO_HANDLE_BYTESIZE);
409+ mX3DCalcFlags = c_XAudio3DCalculateDefault;
405410
406411 mCriticalError = false ;
407412 mReverbEnabled = false ;
@@ -572,6 +577,8 @@ HRESULT AudioEngine::Impl::Reset(const WAVEFORMATEX* wfx, const wchar_t* deviceI
572577 }
573578
574579 DebugTrace (" INFO: I3DL2 reverb effect enabled for 3D positional audio\n " );
580+
581+ mX3DCalcFlags |= X3DAUDIO_CALCULATE_LPF_REVERB | X3DAUDIO_CALCULATE_REVERB;
575582 }
576583
577584 //
@@ -590,6 +597,22 @@ HRESULT AudioEngine::Impl::Reset(const WAVEFORMATEX* wfx, const wchar_t* deviceI
590597 return hr;
591598 }
592599
600+ if ((masterChannelMask & SPEAKER_LOW_FREQUENCY) && !(mEngineFlags & AudioEngine_DisableLFERedirect))
601+ {
602+ // On devices with an LFE channel, allow the mono source data to be routed to the LFE destination channel.
603+ mX3DCalcFlags |= X3DAUDIO_CALCULATE_REDIRECT_TO_LFE;
604+ }
605+
606+ if (mEngineFlags & AudioEngine_ZeroCenter3D)
607+ {
608+ mX3DCalcFlags |= X3DAUDIO_CALCULATE_ZEROCENTER;
609+ }
610+
611+ if (!(mEngineFlags & AudioEngine_DisableDopplerEffect))
612+ {
613+ mX3DCalcFlags |= X3DAUDIO_CALCULATE_DOPPLER;
614+ }
615+
593616 //
594617 // Inform any notify objects we are ready to go again
595618 //
@@ -1470,6 +1493,11 @@ X3DAUDIO_HANDLE& AudioEngine::Get3DHandle() const noexcept
14701493}
14711494
14721495
1496+ uint32_t AudioEngine::Get3DCalculateFlags () const noexcept
1497+ {
1498+ return pImpl->mX3DCalcFlags ;
1499+ }
1500+
14731501// Static methods.
14741502#if (defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)) || defined(USING_XAUDIO2_8)
14751503// --- Use Windows Runtime device enumeration ---
0 commit comments