DSSPEAKER_DIRECTOUT スピーカー構成

この情報は、Windows XP 以前のオペレーティング システムに適用されます。 Windows Vista 以降では、IDirectSound::GetSpeakerConfigIDirectSound::SetSpeakerConfig は非推奨になりました。

アプリケーション プログラムは、speaker-configuration パラメーターを DSSPEAKER_DIRECTOUT に設定して IDirectSound::SetSpeakerConfig メソッドを呼び出すことによって、DirectSound スピーカー構成をダイレクトアウト モードに変更できます (Microsoft Windows SDK のドキュメント参照)。 これは、アプリケーションからの再生ストリーム内のチャンネルがスピーカーの位置として解釈されることなくオーディオ アダプターに直接出力される、スピーカーレス構成を指定します。 ただし、入力ストリームは、チャンネルへのスピーカーの割り当てに関する前提条件を必要としないサンプル レート変換、減衰、フィルター処理、およびその他の種類の処理によって変更することができます。

これが有効になると、DSSPEAKER_DIRECTOUT speaker-configuration 設定がグローバルになり、オーディオ デバイス全体に影響します。 DirectSound が設定を再度変更するまで、その後実行されるすべてのオーディオ アプリケーションには新しい設定が適用されます。

ダイレクトアウト モードでは、オーディオ デバイスは、デバイス上の最初の出力コネクタに最初のチャンネルをレンダリングし、2 番目のチャンネルをデバイス上の 2 番目の出力にレンダリングします。 これにより、オーディオ オーサリング アプリケーションは、外部ミキサーやオーディオ ストレージ デバイス (ハードディスク、ADAT など) などのデバイスにマルチチャンネル データを直接出力できるようになります。 たとえば、次のテーブルに示すように、48 チャンネル ストリーム内のチャンネルを割り当てることができます。

チャンネル番号コンテンツ 0

ボーカル

1

ドラム

2

ギター

3

ベース

...

47

ピアノ

このような生のオーディオ データでは、スピーカーの位置は意味がなく、入力ストリームまたは出力ストリームにスピーカーの位置を割り当てると、不要な副次的影響が生じる可能性があります。 たとえば、KMixer などのコンポーネントが、3D 仮想化や Dolby Surround Pro Logic エンコードなどのスピーカー固有の効果をストリームに適用することで、不適切に介入する可能性があります。 生データ チャンネルの数は、チャンネル マスク内のビット数によって制限されないことに注意してください。

オーディオ編集用に特別に設計されていないデバイスでも、通常、KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 要求を受け入れて、スピーカーの構成を KSAUDIO_SPEAKER_DIRECTOUT に変更する必要があります。 一般に、デバイスは、出力がスピーカーに接続されていて、他の目的 (外部ミキサーへの入力など) に外部で使用できないことを何らかの方法で確認できる場合を除き、要求の失敗を回避する必要があります。

通常、ダイレクトアウト モードを使用するアプリケーションは、特定のハードウェア デバイス用に記述されます。 このため、アプリケーションでは、チャンネルの数や、それらのチャンネル内のデータを解釈する方法など、デバイスがサポートするダイレクトアウト データ形式を事前に把握することができます。 アプリケーションがダイレクトアウト モードで構成されているデバイスで IDirectSound::GetSpeakerConfig を呼び出すときに、デバイスがこのモードになっていることを確認するだけで済むため、この情報は必要です。ダイレクトアウト モードでサポートされるストリーム形式のチャンネルの数に関する追加情報は提供されません。 (ただし、デバイスのミキサー ピン上のスーパーミキサー ノードに KSPROPERTY_AUDIO_MIX_LEVEL_CAPS get-property 要求を送信することで、この情報が取得される場合があります。「DirectSound Node-Ordering Requirements」を参照してください。)

ダイレクトアウト ストリームのウェーブ形式を指定する場合、アプリケーションは WAVEFORMATEXTENSIBLE 構造体の dwChannelMask メンバーを、値 KSAUDIO_SPEAKER_DIRECTOUT (ゼロ) に設定する必要があります。 0 のチャンネル マスクは、スピーカーの位置が定義されていないことを示します。 ストリーム内のチャンネルの数は、常に Format.nChannels メンバーで指定されます。

ハードウェア ベンダーには、デバイスがダイレクトアウト モードで構成されている場合に、DirectSound ハードウェア アクセラレーションをサポートするオプションがあります。 DirectSound アプリケーションは、デバイスのミキシング ピンの 1 つ (使用可能な場合) を介して、ダイレクトアウト ストリームを再生できます。 使用可能なすべてのハードウェア ピン インスタンスが使い果たされると、新しいストリームはすべて、再生されずに KMixer を通過します。

ダイレクトアウト モードで構成されているデバイスのストリームをミックスさせる場合、KMixer は、アプリケーションからの入力ストリームのチャンネルと、デバイスに出力するミックス ストリームのチャンネルの間に 1 対 1 のマッピングを適用します。 つまり、アプリケーションが同じ数のチャンネルを持つ複数のダイレクトアウト ストリームを生成する場合は、たとえば、出力ミックスの各チャンネル N は、KMixer に入るすべてのストリームのチャンネル N の合計です。

含まれるチャンネルの数が異なる複数のダイレクトアウト ストリームをミックスさせると、KMixer のミキシング アルゴリズムは少し複雑になります。 この場合、ミックスの各チャンネル N は、チャンネル N を有するすべての入力ストリームのチャンネル N の合計です。たとえば、KMixer がクワッドとステレオの入力ストリームをミックスしてクワッド出力ミックスを形成する場合、チャンネル 0 と出力ミックスの 1 つは、入力ステレオ ストリームとクワッド ストリームのチャンネル 0 と 1 の合計になります。 ただし、ステレオ入力ストリームは、クワッド入力ストリームの最後の 2 つのチャンネルからのみ取得されるミックスのチャンネル 2 と 3 には、何も寄与しません。

次のいずれかの操作を試みるアプリケーションでは、予測できない動作が発生する可能性があります。

  • ダイレクトアウト モードで構成されているデバイスを介した、ダイレクトアウト形式ではないストリームの再生。

  • ダイレクトアウト モードで構成されていないデバイスを介したダイレクトアウト ストリームの再生。

これらのケースのいずれかに直面した場合、KMixer は単にストリームを開く試みに失敗することを回避します。 代わりに、上述した一対一のマッピング アルゴリズムを使用して、明らかな非互換性の処理を試みます。 その結果は、ユーザーが満足できるものである場合と、満足できないものである場合があります。 他のオーディオ コンポーネントで、KMixer と同じ方法でこれらのケースが処理されると想定することはできません。 たとえば、ダイレクトアウト モードで構成されているデバイスのドライバーは、ダイレクトアウト形式ではない出力ストリームのハードウェア バッファーを開く試みに失敗する必要があります。その逆も同様です。

オーディオ作成アプリケーションでは、ユーザーが出力ストリームの最初のいくつかのチャンネルに混在しているデータをリッスンし、ストリームの残りのチャンネルにまだ含まれている生データを無視することが必要になる場合があります。 KMixer の動作では、これを簡単にしています。 たとえば、24 チャンネルの再生ストリームにチャンネル 0 と 1 にステレオ ミックスが含まれており、チャンネル 2 から 23 に生データが含まれている場合、アプリケーションは次の処理を行います。

  • DSSPEAKER_STEREOで SetSpeakerConfig を呼び出して、ターゲット オーディオ デバイス (これは必ずしも、アプリケーションがストリームの編集に使用するデバイスとは限りません) をステレオ モードで構成します。

  • 再生ストリームの WAVEFORMATEXTENSIBLE 構造体の dwChannelMask をKSAUDIO_SPEAKER_STEREOに変更しますが、Format.nChannels はストリーム内のチャンネルの合計数である 24 に設定されたままにします。

KMixer は、チャンネル マスクに記述されている再生ストリームのステレオ チャンネルのみをミックスし、生データを含む残りの 22 チャンネルを破棄します。 DirectSound speaker-configuration 設定に加えられた変更は、現在の DirectSound オブジェクトが破棄され、別のオブジェクトが作成されるまで有効になることはまずないという点を覚えておいてください (「Speaker-Configuration 設定の適用」を参照)。