ストリームの管理
システム内のオーディオ エンドポイント デバイスを列挙し、適切なレンダリングまたはキャプチャ デバイスを識別した後、オーディオ クライアント アプリケーションが行う次のタスクは、エンドポイント デバイスとの接続を開き、その接続を介したオーディオ データのフローを管理することです。 WASAPI を使用すると、クライアントはオーディオ ストリームを作成および管理することができます。
WASAPI には、オーディオ クライアントにストリーム管理サービスを提供するための複数のインターフェイスが実装されています。 プライマリ インターフェイスは IAudioClient です。 クライアントは、エンドポイント オブジェクトの IMMDevice::Activate メソッド (パラメーター iid を REFIID IID_IAudioClient に設定) を呼び出すことによって、オーディオ エンドポイント デバイスの IAudioClient インターフェイスを取得します。
クライアントは IAudioClient インターフェイスのメソッドを呼び出して、次の操作を行います。
- エンドポイント デバイスでサポートされているオーディオ形式を検出します。
- エンドポイント バッファー サイズを取得します。
- ストリームの形式と待機時間を取得します。
- エンドポイント デバイスを通過するストリームを開始、停止、リセットします。
- 追加のオーディオサービスにアクセスします。
ストリームを作成するために、クライアントは IAudioClient::Initialize メソッドを呼び出します。 このメソッドを使用してクライアントは、ストリームのデータ形式、エンドポイント バッファーのサイズ、およびストリームが共有モードと排他モードのどちらで動作するかを指定します。
IAudioClient インターフェイスの残りのメソッドは、次の 2 つのグループに分類されます。
- ストリームが IAudioClient::Initialize によって開かれた後にのみ呼び出すことができるメソッド。
- Initialize の呼び出し前と呼び出し後にいつでも呼び出すことができるメソッド。
次のメソッドは、IAudioClient::Initialize の呼び出し後にのみ呼び出すことができます。
- IAudioClient::GetBufferSize
- IAudioClient::GetCurrentPadding
- IAudioClient::GetService
- IAudioClient::GetStreamLatency
- IAudioClient::Reset
- IAudioClient::Start
- IAudioClient::Stop
次のメソッドは、IAudioClient::Initialize の呼び出し前または呼出し後に呼び出すことができます。
追加のオーディオ クライアント サービスにアクセスするために、クライアントは IAudioClient::GetService メソッドを呼び出します。 このメソッドを使用して、クライアントは次のインターフェイスへの参照を取得できます。
-
レンダリング データをオーディオ レンダリング エンドポイント バッファーに書き込みます。
-
オーディオ キャプチャ エンドポイント バッファーからキャプチャされたデータを読み取ります。
-
オーディオ セッション マネージャーと通信して、ストリームに関連付けられているオーディオ セッションを構成および管理します。
-
ストリームに関連付けられているオーディオ セッションのボリューム レベルを制御します。
-
ストリームに関連付けられているオーディオ セッション内の個々のチャネルのボリューム レベルを制御します。
-
ストリーム データ レートとストリームの位置を監視します。
さらに、セッション関連のイベントの通知を必要とする WASAPI クライアントでは、次のインターフェイスを実装する必要があります。
-
イベント通知を受信するために、クライアントは IAudioSessionEvents インターフェイスへのポインターを、呼び出しパラメーターとして IAudioSessionControl::RegisterAudioSessionNotification メソッドに渡します。
最後に、クライアントは上位レベルの API を使用してオーディオ ストリームを作成することができすが、ストリームを含むセッションのセッション コントロールとボリューム コントロールへのアクセスも必要な場合があります。 通常、上位レベルの API では、このアクセスは提供されません。 クライアントは、IAudioSessionManager インターフェイスを介して特定のセッションのコントロールを取得できます。 このインターフェイスを使用すると、クライアントは、IAudioClient インターフェイスを使用してストリームを作成し、セッションにストリームを割り当てる必要なく、セッションの IAudioSessionControl インターフェイスと ISimpleAudioVolume インターフェイスを取得することができます。 クライアントは、エンドポイント オブジェクトの IMMDevice::Activate メソッド (パラメーター iid を REFIID IID_IAudioSessionManager に設定) を呼び出すことによって、オーディオ エンドポイント デバイスの IAudioSessionManager インターフェイスを取得します。
IAudioSessionControl、IAudioSessionEvents、および IAudioSessionManager インターフェイスは、ヘッダー ファイル Audiopolicy.h で定義されています。 他のすべての WASAPI インターフェイスは、ヘッダー ファイル Audioclient.h で定義されます。
次のセクションでは、WASAPI を使用してオーディオ ストリームを管理する方法について説明します。
関連トピック