データ交差

オーディオ フィルター グラフでは、2 つのピンがストリームの共通形式をサポートしている場合にのみ、1 つのフィルターのソース ピンから別のフィルターのシンク ピンにオーディオ ストリームを流すことができます。 同様に、クライアントは、クライアントとピンが共通のストリーム形式をサポートしている場合にのみ、フィルターのシンク ピンにオーディオ ストリームを送信したり、フィルターのソース ピンからオーディオ ストリームを受信したりできます。 オーディオ フィルターは、データ交差 (データ範囲の交差の略) と呼ばれる手法を使用して、2 つのピンまたはクライアントとピンに共通するストリーム形式を識別します。

たとえば、Windows Server 2003、Windows XP、Windows 2000、Windows Me/98 では、SysAudio システム ドライバーが、互換性のあるオーディオ データ形式をサポートするフィルター ピンのペアを接続することで、データ交差手法を使用してオーディオ フィルター グラフを構築します。

ピン ファクトリは、各ピンがデータ範囲の配列としてサポートする形式のセットを指定します。各データ範囲は KSDATARANGE_AUDIO の構造体型です。 データ範囲は、KSDATAFORMAT_WAVEFORMATEX または KSDATAFORMAT_DSOUND のいずれかの一般的な形式の種類を指定します。 さらに、データ範囲は、次の各パラメーターの値の範囲を指定します。

  • サンプルあたりのビット数

  • サンプルの頻度

  • チャンネル数

KSDATARANGE_AUDIO 構造体は、サンプルごとのビット数とサンプル周波数範囲については最小値と最大値の両方を指定しますが、チャンネル数の範囲については最大値のみを指定します。 チャンネルの最小数は暗黙的に 1 です。

2 つのピンの共通データ形式をネゴシエートするジョブは、互いに交差する 2 つのデータ範囲 (各ピンから 1 つずつ) を見つけることです。 2 つのデータ範囲は、次の場合に交差します。

  • 2 つのデータ範囲が、同じ一般的な Wave 形式 (KSDATAFORMAT_WAVEFORMATEX または KSDATAFORMAT_DSOUND) をサポートしている。

  • サンプルごとのビット数の範囲が重複している。

  • サンプル周波数範囲が重複している。

前述のように、KSDATAFORMAT_AUDIO 構造体は、ピンでサポートされるチャンネルの最小数が常に 1 であるハードウェア モデルを意味します。 このモデルによると、両方のピンが少なくとも 1 つのチャンネルをサポートしているため、どの 2 つのピンでも、チャンネル数範囲は常に重複する必要があります。 明らかに、最小チャンネル数が 1 より大きいハードウェア アダプターは、このモデルに準拠していませんが、アダプター ドライバーには、この種類の問題に対処するための独自のデータ交差ハンドラーを含めることができます (「独自のデータ交差ハンドラー」の例を参照)。

2 つのピンの交差するデータ範囲のペアを見つけると、ハンドラーは交差する領域から共通データ形式を次のように選択します。

  • サンプルあたりのビット数は、サンプルごとの 2 つのビット範囲が重なる領域から選択されます。

  • サンプル周波数は、2 つのサンプル周波数範囲が重なる領域から選択されます。

  • チャンネル数は、2 つのチャンネル数範囲が重なる領域から選択されます。

たとえば、オーディオ ポート ドライバーのシンク ピンと別のフィルターのソース ピン (通常は KMixer システム ドライバー) の共通の形式をネゴシエートする場合、SysAudio は最初にソース ピンのデータ範囲配列を取得します。 その後、SysAudio は、KSPROPERTY_PIN_DATAINTERSECTION 要求をシンク ピンに送信し、この要求にソース ピンのデータ範囲配列を含めます。 カーネル ストリーミング レイヤーは要求をインターセプトし、ポート ドライバーのデータ交差ハンドラーを、ソース ピンのデータ範囲配列の各要素に対して 1 回、最初の要素から順に、ハンドラがデータ交差を見つけることに成功するまで、繰り返し呼び出します。

SysAudio がポート ドライバーのデータ交差ハンドラーに対して呼び出しを行うたびに、ハンドラーはまずミニポート ドライバーからシンク ピンのデータ範囲配列を取得します。 次に、シンク ピン データ範囲と現在のソース ピン データ範囲の間の交差を見つけるのに成功するまで、最初の要素から順に配列を反復処理します。 ハンドラーは、交差内にある共通の形式を選択し、この形式を呼び出し元に出力します。

反復処理の各ステップで、ポート ドライバーは、2 つのデータ範囲 (2 つのピンのそれぞれに 1 つずつ) でミニポート ドライバーの独自のデータ交差ハンドラーを呼び出します。 いずれかの手順で、独自のハンドラーによって 2 つのデータ範囲間のデータ交差チェックの処理が拒否された場合は、ポート ドライバーのデータ交差ハンドラーが代わりにチェックを実行します。

要約すると、ソース ピン データ範囲とシンク ピン データ範囲の交差部分の検索は、反復的なプロセスです。

  • 外側のループでは、カーネル ストリーミング レイヤーが、ソース ピンのデータ範囲配列の連続する要素を、最初の配列要素から順に反復処理します。

  • 内部ループでは、ポート ドライバーが、シンク ピンのデータ範囲配列の連続する要素を、最初の配列要素から順に反復処理します。

検索は、最初のデータ交差部分を見つけると停止します。 この処理では、各ピンのデータ範囲配列の先頭の要素が優先される傾向があります。 ピンのデータ範囲の配列を指定する場合、アダプター ドライバーは配列の先頭に優先する形式のデータ範囲を配置することによって配列要素を並べ替える必要があります。