Wave と DirectSound コンポーネント

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

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

  • Microsoft Windows マルチメディアの waveOut Xxx 関数と waveInXxx 関数

  • DirectSound および DirectSoundCapture API

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

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

波のコンポーネント

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

Diagram illustrating user-mode and kernel-mode components for wave rendering and capture.

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

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

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

KMixer は、1 つ以上のソースからウェーブ PCM ストリームを受信し、それらをミックスして、ウェーブ PCM 形式でもある 1 つの出力ストリームを形成するシステム コンポーネントです。

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

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

アダプター ドライバーは、それぞれ CLSID_PortWaveCyclic または CLSID_PortWavePciの GUID 値を使用して PcNewPortを呼び出すことによって、WaveCyclic または WavePci ポート ドライバーのインスタンスを作成します。

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

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

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

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

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

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

DirectSound コンポーネント

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

Diagram illustrating user-mode and kernel-mode components for DirectSound rendering and capture.

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

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

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

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

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

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

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

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