C# 当声卡仅报告通道掩码为3时,通过SlimDX XAudio2从后通道播放单声道编码音频

C# 当声卡仅报告通道掩码为3时,通过SlimDX XAudio2从后通道播放单声道编码音频,c#,playback,channel,directsound,xaudio2,C#,Playback,Channel,Directsound,Xaudio2,我有一个较旧的系统(XP),它允许我通过DirectX使用DirectSoundBuffer和WaveFormatTextensable对象(为后扬声器设置了ChannelMask),在后声道(右后和/或左后)播放单声道编码的PCM音频 我试图在旧系统和带有.Net和SlimDx XAudio2的新系统上重做相同的功能,但在旧系统上调用SetOutputMatrix时,它会忽略我为除左前和右前声道之外的所有声道设置的所有功能,即使声卡设置为5.1环绕声。在新系统上,它运行良好。当我在旧系统上调用

我有一个较旧的系统(XP),它允许我通过DirectX使用DirectSoundBuffer和WaveFormatTextensable对象(为后扬声器设置了ChannelMask),在后声道(右后和/或左后)播放单声道编码的PCM音频

我试图在旧系统和带有.Net和SlimDx XAudio2的新系统上重做相同的功能,但在旧系统上调用SetOutputMatrix时,它会忽略我为除左前和右前声道之外的所有声道设置的所有功能,即使声卡设置为5.1环绕声。在新系统上,它运行良好。当我在旧系统上调用GetDeviceDetails时,它会报告channelmask为3(只有前两个扬声器)。我猜,这就是为什么它只允许我玩前面,即使旧的C++直接音工作。我猜声音驱动程序出错了,但我找不到任何更新

有解决办法吗

这是一个XDOO2O2C++基本声音演示的示例,它具有相同的行为

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);
在这里,当我获得设备详细信息时,通道掩码为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。

是否可以添加代码示例?答案是新机器的驱动程序不好,只支持前L和前R(即使我将其设置为7.1环绕)