XAudio2 の既定のチャネル マッピング
XAudio2 クライアントは、音声のチャネルから各宛先音声のチャネルへのマッピングを完全に制御できます。 IXAudio2Voice::SetOutputMatrix メソッドを使用してマッピングを制御します。 ただし、状況によっては、既定の送信マトリックスを自動的に設定することで、XAudio2 によってこのタスクが簡略化されます。 これは、音声のオーディオ チャネルに関連付けられているチャネル マスク (存在する場合) を使用して行われます。 チャネル マスクは、X3DAudio.h などで定義されているSPEAKER_xxxビット マスクの組み合わせです。 XAudio2 では、チャネル マスクが 0 であるか、チャネル数と同じビット数が設定されている必要があります。
次の表は、XAudio2 でサポートされている形式のチャネル マスクの要件と既定値を示しています。
Format | チャネル マスクの要件 | 既定のマスク | 対応する構造体メンバー |
---|---|---|---|
PCM 0 | ファイルにチャネル マスクが含まれている可能性がある | チャネル マスクが 0 であるか、存在しない | WAVEFORMATEXTENSIBLE.dwChannelMask or none (WAVEFORMATEX) |
Adpcm | ファイルにチャネル マスクが含まれていない | 既定のチャネル マスクは常に使用されます | なし (ADPCMWAVEFORMAT) |
サブミックスとマスタリング音声の場合、およびチャネル マスクまたはチャネル マスクが 0 のソース音声の場合、XAudio2 は次の表に従って既定のスピーカー位置を想定します。
チャンネル | 暗黙的なチャネル位置 |
---|---|
1 | 常に両方のスピーカーでフルスケールで FrontLeft と FrontRight にマップします (モノラル サウンドの場合は特別なケース) |
2 | FrontLeft、FrontRight (基本的なステレオ構成) |
3 | FrontLeft、FrontRight、LowFrequency (2.1 構成) |
4 | FrontLeft、FrontRight、BackLeft、BackRight (quadraphonic) |
5 | FrontLeft、FrontRight、FrontCenter、SideLeft、SideRight (5.0 構成) |
6 | FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight (5.1 構成) (次の解説を参照) |
7 | FrontLeft、FrontRight、FrontCenter、LowFrequency、SideLeft、SideRight、BackCenter (6.1 構成) |
8 | FrontLeft、FrontRight、FrontCenter、LowFrequency、BackLeft、BackRight、SideLeft、SideRight (7.1 構成) |
9 以上 | 暗黙的な位置なし (1 対 1 のマッピング) |
オーディオ グラフ内の特定の音声ペアに、ソース音声またはターゲット音声 (1 つの音声に 8 つ以上のチャネルがある) に関連付けられているスピーカー位置がない場合、ソース音声に IXAudio2Voice::SetOutputMatrix メソッドを使用して明示的に送信マトリックスが設定されるまで、どちらの音声も再生できません。 いずれかの音声に対して IXAudio2SourceVoice::Start メソッドを呼び出すと、これを行うまで失敗します。
ソース音声とターゲット音声の話者位置の数が異なり、ソース音声で IXAudio2Voice::SetOutputMatrix が呼び出されていない場合、XAudio2 は、各ソース チャネルを、目的のスピーカーにどれだけ近いかに比例して、使用可能な最も近いターゲット スピーカー (またはスピーカー) に送信します。 既定の動作が異なる特殊なケースが 2 つあります。
- ソース オーディオがモノラルで、SPEAKER_FRONT_CENTERに配置されている場合、または定義された位置がない場合は、常にSPEAKER_FRONT_LEFTに送信され、出力オーディオに存在する場合はSPEAKER_FRONT_RIGHTされます。 存在しない場合は、通常のケースにフォールバックします。
- ソースと宛先の両方が 6 チャネルで、標準の 5.1 スピーカーセットアップ (左 + 右 + 中央 + Sub + BackL + BackR または Left + 右 + 中央 + Sub + SideL + SideR) のいずれかに配置されている場合、チャネルは 1 対 1 でマップされます。 つまり、SideLeft/Right と BackLeft/Right は同等に扱われます。 これは、これらのセットアップに関する歴史的な混乱が発生したためです。 したがって、想定される意図は常に 1 つにマップすることです。
関連トピック