DirectXTK 3D音频仅使用左声道

DirectXTK 3D音频仅使用左声道,directx,directx-12,xaudio2,directxtk,Directx,Directx 12,Xaudio2,Directxtk,我决定尝试DirectXTK12音频,除了3D声音外,它工作正常。我正在跟随,但无论我如何定位听众/发射器,声音总是在左侧扬声器中。发生了什么?我的代码如下所示: HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hr)) {...} std::unique_ptr<DirectX::AudioEngine> audEngine; DirectX::AUDIO_ENGINE_FLAGS e

我决定尝试DirectXTK12音频,除了3D声音外,它工作正常。我正在跟随,但无论我如何定位听众/发射器,声音总是在左侧扬声器中。发生了什么?我的代码如下所示:

HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr)) {...}

std::unique_ptr<DirectX::AudioEngine> audEngine;

DirectX::AUDIO_ENGINE_FLAGS eflags = DirectX::AudioEngine_Default;
#ifdef _DEBUG
    eflags |= DirectX::AudioEngine_Debug;
#endif

std::unique_ptr<DirectX::SoundEffect> soundEffect;
soundEffect = std::make_unique<DirectX::SoundEffect>(audEngine.get(), L"Sound.wav");
auto effect = soundEffect->CreateInstance(DirectX::SoundEffectInstance_Use3D);

effect->Play(false);

DirectX::AudioListener listener;
listener.SetPosition(DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f));

DirectX::AudioEmitter emitter;
emitter.SetPosition(DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f));

effect->Apply3D(listener, emitter, false);

在不使用3D的情况下播放声音会像预期的那样使用两个扬声器。

我已通过将使用的sound.wav转换为单声道(1声道)声音解决了这个问题。

如果发射器和监听器都在同一点上,我不确定您是否得到了有效的测试。如果向左或向右移动发射器,会发生什么情况?此外,您可能应该将有关
Sound.wav
的详细信息转储到问题中。您可以使用此实用程序来执行此操作。另外,在Windows控制面板中检查您的音频设备,以确保左侧和右侧都正常工作,并且设置了立体声扬声器类型。请注意,如果侦听器和发射器都位于同一位置,则数学计算会出错,因此不要将此视为测试。此外,XAudio2是多线程的,因此您需要在某个地方输入一个循环,以等待声音在工作线程上播放。有关通过DirectX工具包为DX11使用位置音频的完整演练,请参阅。另一个注意事项是,如果
Sound.wav
文件有多个通道,则需要添加:
emitter.ChannelCount=soundEffect->GetFormat()->nChannels问题是多声道声音配置错误。修复方法是使用mono-wav文件-或-将
emitter.ChannelCount
emitter.EmitterAzimuths
设置为立体声的合理值。
INFO: XAudio 2.9 debugging enabled
INFO: mastering voice has 2 channels, 96000 sample rate, 00000003 channel mask