私は古いシステム(XP)を使用しており、DirectSoundBufferとWAVEFORMATEXTENSIBLEオブジェクトをバックスピーカー用のChannelMaskセットで使用して、DirectXを介してリアチャンネル(右後ろおよび/または左後ろ)からモノラルエンコードされたPCMオーディオを再生できました。
古いシステムと.NetおよびSlimDxXAudio2を使用した新しいシステムでも同じ機能をやり直そうとしていますが、古いシステムでSetOutputMatrixを呼び出すと、フロントの左右のチャンネル以外に設定したすべてのものが無視されます。サウンドカードは5.1サラウンドサウンド用に設定されています。新しいシステムでは、正常に動作します。古いシステムでGetDeviceDetailsを呼び出すと、チャネルマスクが3(フロント2スピーカーのみ)であると報告されます。古いC++DirectSoundが機能していても、フロントを再生することしかできないのはそのためだと思います。サウンドドライバにエラーがあると思いますが、これに対する更新が見つかりません。
これに対する回避策はありますか?
これは、同じ動作をするXAudio2C++ベーシックサウンドデモのサンプルです。
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(フロントスピーカー)です。サウンドカードは古いSoundMaxAC'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が返されます。