次の方法で共有


データインターセクション

オーディオ フィルター グラフでは、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 つずつ、 互いに交差するデータ範囲) を見つけることで構成されます。 次の場合、データ範囲のペアが交差します。

  • これらは、同じ一般的なウェーブ形式 (KSDATAFORMAT_WAVEFORMATEXまたはKSDATAFORMAT_DSOUND) をサポートします。

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

  • サンプル周波数範囲は重複します。

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

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

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

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

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

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

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

イテレーションの各ステップで、ポート ドライバーは、ミニポート ドライバーの独自のデータ交差ハンドラーを呼び出します。2 つのデータ範囲は、2 つのピンごとに 1 つずつです。 いずれかの手順で、独自のハンドラーが 2 つのデータ範囲間のデータ交差チェックを処理することを拒否した場合、ポート ドライバーのデータ交差ハンドラーは代わりにチェックを実行します。

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

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

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

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