当声卡仅报告通道掩码3时,通过SlimDX XAudio2播放单声道编码音频输出后声道

时间:2012-09-27 01:29:40

标签: c# playback channel directsound xaudio2

我有一个较旧的系统(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。

0 个答案:

没有答案