Wave と DirectSound コンポーネント

アプリケーション プログラムは、ユーザー モードとカーネル モードのコンポーネントの組み合わせに依存して、(入力) およびレンダリング (出力) ウェーブ ストリームをキャプチャします。 ウェーブ ストリームは、データ形式が WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造体によって記述されるデジタル オーディオ ストリームです。

アプリケーションでは、ウェーブ レンダリングとキャプチャに次のいずれかのソフトウェア インターフェイスを使用できます。

  • Microsoft Windows マルチメディア waveOutXxx と waveInXxx 関数

  • DirectSound API と DirectSoundCapture API

waveOutXxx 関数と waveInXxx 関数の動作は、レガシウェーブ ドライバーとデバイスの機能に基づいています。 Windows 98 以降、 WDMAud システム ドライバー は、これらの関数の呼び出しを WDM オーディオ ドライバーへのコマンドに変換します。 ただし、古いソフトウェアとハードウェアの動作をエミュレートすることで、waveOutXxx 関数は、DirectSound API を通じて現在使用できる 3-D サウンド効果とハードウェア アクセラレーションを犠牲にします。 DirectSound と Windows マルチメディアウェーブ関数の詳細については、Microsoft Windows SDKドキュメントを参照してください。

DirectSound と Windows マルチメディアウェーブ関数は 、SysAudio システム ドライバーのクライアントであり、Wave ストリームと DirectSound ストリームを処理するオーディオ フィルター グラフを構築します。 グラフの構築は、これらのソフトウェア インターフェイスを使用するアプリケーションに対して透過的です。

Wave コンポーネント

次の図は、Wave アプリケーションがウェーブ PCM データで構成されるデジタル オーディオ ストリームをレンダリングまたはキャプチャするために使用するユーザー モードとカーネル モードのコンポーネントを示しています。

ウェーブ レンダリングとキャプチャ用のユーザー モードコンポーネントとカーネルモード コンポーネントを示す図。

レンダリング コンポーネントは前の図の左側に表示され、キャプチャ コンポーネントは右側に表示されます。 Wave ミニポート ドライバーを表すボックスは、ベンダーが提供するコンポーネントであることを示すために暗くなります。 図の他のコンポーネントはシステム提供です。

図の左上にある wave-rendering (または "wave-out") アプリケーション は、ユーザー モードの WinMM システム コンポーネントで実装されている waveOutXxx 関数を介して WDM オーディオ ドライバーにインターフェイス Winmm.dll。 アプリケーションは、Wave オーディオ サンプルのブロックをファイルから読み取り、 waveOutWrite 関数を呼び出してレンダリングします。

WDMAud は、ユーザー モードとカーネル モードの両方のコンポーネント (Wdmaud.drv と Wdmaud.sys) で構成され、 waveOutWrite 呼び出しからウェーブ データをバッファーし、図の WDMAud の下に表示される KMixer システム ドライバーにウェーブ ストリームを出力します。

KMixer は、1 つ以上のソースからウェーブ PCM ストリームを受信し、それらを組み合わせて 1 つの出力ストリームを形成するシステム コンポーネントです。これは、波の PCM 形式でもあります。

KMixer は WaveCyclic または WavePci デバイスにウェーブ ストリームを出力します。このデバイスのポートドライバーとミニポート ドライバーは、前の図の左側にある KMixer の下に表示されます。 ミニポート ドライバーは、基になるオーディオ レンダリング デバイスを表す波フィルターを形成するポート ドライバーに自分自身をバインドします。 一般的なレンダリング デバイスは、一連のスピーカーまたは外部オーディオ ユニットを駆動するアナログ信号を出力します。 レンダリング デバイスは、S/PDIF コネクタを介してデジタル オーディオを出力する場合もあります。 WaveCyclic と WavePci の詳細については、「 Wave フィルター」を参照してください。

または、KMixer は、WaveCyclic または WavePci デバイスではなく、 USBAudio クラス システム ドライバー (図では示されていません) によって制御される USB オーディオ デバイスに出力ストリームを渡すことができます。

アダプター ドライバーは、それぞれ GUID 値が CLSID_PortWaveCyclic または CLSID_PortWavePciPcNewPort を呼び出して WaveCyclic または WavePci ポート ドライバーのインスタンスを作成します。

上の図の右側は、Wave データをファイルにキャプチャするアプリケーションをサポートするために必要なコンポーネントを示しています。 wave-capture (または "wave-in") アプリケーションは、WinMM システム コンポーネントに実装されている waveInXxx 関数を介して WDM オーディオ ドライバーと通信します。

図の右下隅にあるウェーブ キャプチャ デバイスは、ウェーブ ミニポートドライバーとポート ドライバーによって制御されます。 WaveCyclic 型または WavePci 型のポートドライバーとミニポート ドライバーは、一緒にバインドしてキャプチャ デバイスを表すウェーブ フィルターを形成します。 このデバイスは通常、マイクやその他のオーディオ ソースからアナログ信号をキャプチャし、それを波の PCM ストリームに変換します。 デバイスは、S/PDIF コネクタを介してデジタル オーディオ ストリームを入力することもできます。

Wave ポート ドライバーは、波ストリームを KMixer または WDMAud に直接出力します。 ストリームは、WDMAud が受け取る前にサンプル レートを変換する必要がある場合、KMixer を通過する必要があります。 オーディオ ストリームのレンダリングとキャプチャを同時に実行するシステムでは、図に示すように KMixer の 2 つのインスタンスが必要になる場合があります。 これらのインスタンスは、必要に応じて SysAudio によって自動的に作成されることに注意してください。

または、キャプチャされたウェーブ ストリームのソースは、WaveCyclic または WavePci デバイスの代わりに USB オーディオ デバイスにすることができます。 この場合、USBAudio ドライバー (図に示されていません) は、ストリームを KMixer に渡します。

波ストリームが USB デバイスによってキャプチャされるか、WaveCyclic または WavePci デバイスによってキャプチャされるかに関係なく、KMixer は必要に応じてストリームでサンプル レート変換を実行しますが、他のストリームと混在することはありません。 KMixer は、結果のストリームを WDMAud システム ドライバーのカーネル モードの半分である Wdmaud.sys に出力します。 ユーザー モード ハーフ Wdmaud.drv は、waveInXxx 関数を介してアプリケーション プログラムにウェーブ ストリームを出力します。これは、Winmm.dll で実装されます。 最後に、図の上部にある wave-capture アプリケーションは、ウェーブ データをファイルに書き込みます。

wave-capture アプリケーションが waveInOpen 関数を呼び出してキャプチャ ストリームを開く時点で、コールバック ルーチンへのポインターを渡します。 ウェーブ キャプチャ イベントが発生すると、オペレーティング システムは、キャプチャ デバイスからの次のウェーブ サンプル ブロックを含むバッファーを使用してコールバック ルーチンを呼び出します。 コールバックに応答して、アプリケーションは次のウェーブ データ ブロックをファイルに書き込みます。

DirectSound コンポーネント

次の図は、DirectSound アプリケーション プログラムがウェーブ データをレンダリングまたはキャプチャするために使用するユーザー モードコンポーネントとカーネル モード コンポーネントを示しています。

DirectSound レンダリングとキャプチャ用のユーザー モードコンポーネントとカーネルモード コンポーネントを示す図。

前の図の左半分にレンダリング コンポーネントが表示され、キャプチャ コンポーネントが右側に表示されます。 Wave ミニポート ドライバーは、ベンダーが提供するコンポーネントであることを示すために、暗くされたボックスとして表示されます。 図の他のコンポーネントはシステム提供です。

図の左上にある DirectSound アプリケーションは、ユーザー モードの DirectSound システム コンポーネント (Dsound.dll) が管理するサウンド バッファーに、ファイルからウェーブ データを読み込みます。 このコンポーネントは、WaveCyclic または WavePci デバイスにウェーブ ストリームを送信します。このデバイスのポートドライバーとミニポート ドライバーは、図の左下に表示されます。 デバイスでハードウェア ミキサー ピンが使用可能な場合、ストリームは、KMixer をバイパスして、ウェーブ ポート ドライバーに直接渡されます。 それ以外の場合、ストリームは最初に KMixer を通過し、同時に再生されている他のストリームと混在します。 KMixer は、混合ストリームをポート ドライバーに出力します。

前と同様に、ミニポート ドライバーは、基になるオーディオ レンダリング デバイスを表す波フィルターを形成するポート ドライバーに自分自身をバインドします。 このデバイスは、たとえば、一連のスピーカーを介してストリームを再生する場合があります。

または、WaveStream は、WaveCyclic または WavePci デバイスではなく USB オーディオ デバイスによってレンダリングできます。 この場合、ストリームは KMixer をバイパスできません。USBAudio クラス システム ドライバー (図に示されていません) は常にストリームを KMixer に渡します。

前の図の右側は、DirectSoundCapture アプリケーションをサポートするコンポーネントを示しています。 アプリケーションは、WaveCyclic または WavePci キャプチャ デバイスから受信したウェーブ データを記録します。 このデバイスは、たとえば、マイクからのアナログ信号を波ストリームに変換します。 デバイスのウェーブ ポートとミニポート ドライバーは、図の右下隅に表示されます。 図に示すように、ポート ドライバーはミニポート ドライバーからストリームを入力として受け取り、ユーザー モードの DirectSound コンポーネントに直接、Dsound.dll、または KMixer を介して間接的に出力します。 これは、ハードウェア キャプチャ ピンがキャプチャ デバイスから使用できるかどうかによって異なります。

または、キャプチャされた波ストリームのソースを USB オーディオ デバイスにすることができます。 この場合、ストリームは KMixer をバイパスできません。USBAudio ドライバー (図に示されていません) は常にストリームを KMixer に渡します。

KMixer をキャプチャ ストリームのパスに挿入すると、必要に応じてストリームに対してサンプル レート変換が実行されますが、他のストリームとの混在は行われません。

前の図の右上隅にあるアプリケーションは、DirectSoundCapture バッファーからウェーブ データを読み取り、ファイルに書き込みます。