如何:移動流覽音效
本主題說明如何設定單聲道來源語音的輸出矩陣,以輸出到立體主控語音,以達到左右喇叭之間的移動流覽。
若要設定移動流覽
使用 IXAudio2MasteringVoice::GetChannelMask 擷取說話者組態。
DWORD dwChannelMask; pMasteringVoice->GetChannelMask( &dwChannelMask );
建立陣列來保存輸出矩陣。 輸出矩陣的大小下限是來源語音中的通道數目與輸出語音中的通道數目。 在此情況下,八個元素陣列會處理單聲道語音輸出到最多 7.1 個環繞音效的任何輸出格式。
float outputMatrix[ 8 ]; for (int i=0; i<8; i++) outputMatrix[i] = 0;
根據左右喇叭之間的所需移動流覽來計算傳送層級。 在此範例中,移動流覽值的範圍從 -1 到 1,其中 -1 表示左側喇叭的所有音效,以及 1 表示右喇叭的所有音效。
// pan of -1.0 indicates all left speaker, // 1.0 is all right speaker, 0.0 is split between left and right float left = 0.5f - pan / 2; float right = 0.5f + pan / 2;
使用上一個步驟中計算的值,設定對應至左右喇叭的輸出矩陣索引。 左右喇叭是由查看 IXAudio2MasteringVoice::GetChannelMask所傳回的通道遮罩來決定。 由於通道必須一律依照 在「其報告」ATEXTENSIBLE 參考頁面上指定的順序進行編碼,因此可以判斷對應至個別喇叭的陣列索引。
switch (dwChannelMask) { case SPEAKER_MONO: outputMatrix[0] = 1.0; break; case SPEAKER_STEREO: case SPEAKER_2POINT1: case SPEAKER_SURROUND: outputMatrix[0] = left; outputMatrix[1] = right; break; case SPEAKER_QUAD: outputMatrix[0] = outputMatrix[2] = left; outputMatrix[1] = outputMatrix[3] = right; break; case SPEAKER_4POINT1: outputMatrix[ 0 ] = outputMatrix[ 3 ] = left; outputMatrix[ 1 ] = outputMatrix[ 4 ] = right; break; case SPEAKER_5POINT1: case SPEAKER_7POINT1: case SPEAKER_5POINT1_SURROUND: outputMatrix[ 0 ] = outputMatrix[ 4 ] = left; outputMatrix[ 1 ] = outputMatrix[ 5 ] = right; break; case SPEAKER_7POINT1_SURROUND: outputMatrix[ 0 ] = outputMatrix[ 4 ] = outputMatrix[ 6 ] = left; outputMatrix[ 1 ] = outputMatrix[ 5 ] = outputMatrix[ 7 ] = right; break; }
使用 IXAudio2Voice::SetOutputMatrix,將輸出矩陣套用至原始語音。 原始語音會是來源語音或傳送至副混音或主控語音的副混音。 您可以使用 IXAudio2Voice::GetVoiceDetails來取得原始和目的地語音的相關資訊,例如其頻道數目。
// Assuming pVoice sends to pMasteringVoice XAUDIO2_VOICE_DETAILS VoiceDetails; pVoice->GetVoiceDetails(&VoiceDetails); XAUDIO2_VOICE_DETAILS MasterVoiceDetails; pMasteringVoice->GetVoiceDetails(&MasterVoiceDetails); pVoice->SetOutputMatrix( NULL, VoiceDetails.InputChannels, MasterVoiceDetails.InputChannels, outputMatrix );
相關主題