我有一个较旧的系统 (XP),它允许我使用 DirectSoundBuffer 和 WAVEFORMATEXTENSIBLE 对象以及为后置扬声器设置的 ChannelMask 通过 DirectX 从后置声道(右后和/或左后)播放单声道编码的 PCM 音频。
我正在尝试在旧系统上重做相同的功能以及使用 .Net 和 SlimDx XAudio2 的新系统,但是当我在旧系统上调用 SetOutputMatrix 时,它会忽略我为除前左声道和前右声道之外的任何内容设置的所有内容,即使声卡设置为 5.1 环绕声。在新系统上它工作正常。当我在旧系统上调用 GetDeviceDetails 时,它报告通道掩码为 3(只有前两个扬声器)。我猜这就是为什么即使旧的 C++ DirectSound 有效,它也只允许我在前面播放。我猜声音驱动程序有误,但我找不到任何更新。
有解决方法吗?
这是来自 XAudio2 C++ Basic Sound Demo 的示例,具有相同的行为
if( FAILED( hr = XAudio2Create( &pXAudio2, flags ) ) )
{
wprintf( L"Failed to init XAudio2 engine: %#X\n", hr );
CoUninitialize();
return 0;
}
UINT32 devCount;
hr = pXAudio2->GetDeviceCount(&devCount);
XAUDIO2_DEVICE_DETAILS devDetails;
hr = pXAudio2->GetDeviceDetails(0, &devDetails);
在这里,当我获得设备详细信息时,ChannelMask 为 3(前置扬声器),即使声卡配置设置为 5.1。声卡是旧的 SoundMax AC'97 卡。稍后当我执行以下操作时:
float fMatrix[6] = {0};
pSourceVoice->GetOutputMatrix(pMasteringVoice, 1, 6, fMatrix);
fMatrix[0] = 0.0;
fMatrix[1] = 1.0;
fMatrix[2] = 1.0;
fMatrix[3] = 1.0;
fMatrix[4] = 1.0;
fMatrix[5] = 1.0;
hr = pSourceVoice->SetOutputMatrix(NULL,1,6, fMatrix);
pSourceVoice->GetOutputMatrix(pMasteringVoice, 1, 6, fMatrix);
在第一个 GetOutputMatrix 之后,fMatrix 的 [0] 和 [1] 索引设置为 1.0。当我调用 SetOutputMatrix 时,我试图将其他通道设置为 1.0,但在 GetOutputMatrix 之后,fMatrix 只有 [1] 设置为 1.0。其他都是0。
注意:当调用 SetOutputMatrix 并且它没有设置它不会失败的所有值时,它返回 OK。