Microsoft DirectX 8.0

オーディオ キャプチャ フィルタの開発

このトピックでは、オーディオ キャプチャ フィルタを作成する際に考慮する重要な点について説明する。Microsoft® DirectShow® には標準のオーディオ キャプチャ フィルタが含まれる。

このトピックは、以下のセクションを含んでいる。

オーディオ キャプチャ ピンの要件

キャプチャ フィルタのキャプチャ ピンとプレビュー ピン (存在する場合) は、IKsPropertySet インターフェイスをサポートする必要がある。詳細については、「キャプチャ ピンとプレビュー ピンの要件」を参照すること。このトピックには、キャプチャ ピンに IKsPropertySet を実装するためのサンプル コードも含まれる。

キャプチャ カードはオーディオをデジタル化する前にいくつかのサウンドをミキシングすることができるが、ミキシングする各サウンド ソースについて、それぞれ 1 つの入力ピンが必要である。たとえば、サウンド カードにライン入力、マイク入力、および CD-ROM 入力がある場合は、3 つの入力ピンを使用する。通常、これらの入力ピンを他のフィルタに接続することはない。単に各ピン上で IAMAudioInputMixer インターフェイスをサポートするだけであり、アプリケーションはこのインターフェイスを使用して各ピンの録音レベル、バランス、高音域などを設定する。

オーディオ キャプチャ フィルタの登録

フィルタはオーディオ キャプチャ フィルタのカテゴリに登録する必要がある。詳細については、AMovieDllRegisterServer2 関数の説明を参照すること。

データの生成

キャプチャ ピンでのデータの生成は、フィルタ グラフが実行状態の場合にだけ行う。フィルタ グラフがポーズしている間は、ピンからデータを送信してはならない。もし送信すると、フィルタ グラフに混乱が生じる。これを避けるには CBaseFilter::GetState 関数から VFW_S_CANT_CUE を返すことで、フィルタ グラフに対して、ポーズ中はデータを送信しないことを警告する。これを次のコード サンプルに示す。

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *State)
{
*State = m_State;
if (m_State == State_Paused)
return VFW_S_CANT_CUE;
else
return S_OK;
}

個々のストリームの制御

出力ピンはすべて IAMStreamControl インターフェイスをサポートする必要があるため、アプリケーションは各ピンを個別にオンまたはオフにすることができる (たとえば、キャプチャせずにプレビューする場合など)。IAMStreamControl を使用すると、別のグラフを再作成しなくとも、プレビューとキャプチャの間で切り替えることができる。

タイム スタンプ

キャプチャされたオーディオ サンプルを送信する場合、各グループの開始タイム スタンプは、パケット内の最初のサンプルがキャプチャされたときのグラフのクロックの開始タイムに等しい。終了タイム スタンプは、開始タイムにオーディオ パケットが表す時間幅を加えた値に等しい。オーディオ キャプチャ フィルタがクロックを提供しない場合、タイム スタンプは厳密には一致しない (1 つのパッケージの終わりが次のパッケージの開始タイム スタンプに等しい) が、これは許容範囲である。タイム スタンプ設定の例については、「ビデオ キャプチャ フィルタの開発」を参照すること。

通常のタイム スタンプに加えて、配送するサンプルのメディア タイムも設定する必要がある。メディア タイムは、パケット内のサンプル番号である。したがって、44.1 kHz オーディオの 1 秒パケットを送信する場合は、メディア タイム値を (0, 44100)、(44100, 88200) ... のように設定する。これにより、使用されているクロックがオーディオ デジタル化用のクロックではなく通常のタイム スタンプがややランダムな場合でも、オーディオ サンプルにドロップが生じると、ダウンストリーム フィルタでそれを検出できる

もう 1 つの注意点として、フィルタ グラフが実行状態からポーズされ、再び実行された場合、ポーズの前に生成した最後のタイム スタンプよりも小さいタイム スタンプでサンプルを生成してはならない。タイム スタンプは時間をさかのぼることはできず、ポーズ前の時間に戻ることもできない。

必要なインターフェイス

以下のインターフェイスの説明を読み、その実装を考慮すること。これらのインターフェイスはアプリケーションが使用する可能性のある機能を提供するので、実装することを強く推奨する。