方法: サウンドをパンする
このトピックでは、左右のスピーカー間のパンを実現するために、ステレオ マスタリング音声に出力するモノラル ソース音声の出力マトリックスを設定する方法について説明します。
パンを設定するには
IXAudio2MasteringVoice::GetChannelMask を使用してスピーカー構成を取得します。
DWORD dwChannelMask; pMasteringVoice->GetChannelMask( &dwChannelMask );
出力マトリックスを保持する配列を作成します。 出力マトリックスの最小サイズは、ソース音声のチャネル数と出力音声のチャネル数です。 この場合、8 つの要素配列は、最大 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 によって返されるチャネル マスクを調べることで決定されます。 チャネルは常に WAVEFORMATEXTENSIBLE 参照ページで指定された順序でエンコードする必要があるため、個々の話者に対応する配列インデックスを決定できます。
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 );
関連トピック