我有一个较旧的系统(XP),允许我使用DirectSoundBuffer和WAVEFORMATEXTENSIBLE对象以及后置扬声器的ChannelMask Set,通过DirectX从后声道(右后和/或左后)播放单声道编码的PCM音频。 / p>
我正在尝试在旧系统上重做相同的功能以及使用.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);
当我得到设备详细信息时,即使SoundCard配置设置为5.1,ChannelMask也是3(前置扬声器)。声卡是一张旧的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。