次の方法で共有


ストリーム ルーティングに関連する通知

Windows 7 では、Media Foundation、DirectSound、Wave API などのコア オーディオ API を使用する高度なプラットフォーム API が、既存のデバイスから新しい既定のオーディオ エンドポイントへのストリーム切り替えを処理することで、ストリーム ルーティング機能を実装します。 これらの API を使用するメディア アプリケーションは、ソースに変更を加えることなくストリーム ルーティング動作を使用します。 直接 WASAPI クライアントは、コア オーディオ コンポーネントによって送信された通知を使用して、ストリーム ルーティング機能を実装できます。

ストリーム ルーティング機能を実装するには、クライアントはデバイス変更通知とセッション切断通知という 2 種類のイベントをリッスンする必要があります。 高レベル API によって提供される実装では、IMMDeviceEnumerator::GetDefaultAudioEndpoint を呼び出すことによって作成された既定のデバイス エンドポイントに対してこれらのイベントが送信されます。 詳細については、「ストリーム ルーティング用のデバイス エンドポイントの取得」を参照してください。

コア オーディオ コンポーネント MMDeviceAPI は、オーディオ デバイスが追加、削除、または変更されたときに通知コールバックを配信します。 フォーマットとオーディオ セッションの変更は、WASAPI を介してイベントとして報告されます。

デバイス変更通知

MMDeviceAPI は、オーディオ デバイスが追加、削除、または変更されたときにイベントを発生させます。 クライアントがストリーム ルーティング機能を提供する場合は、IMMNotificationClient インターフェイスを実装し、その実装を MMDeviceAPI に登録する必要があります。

デバイス変更通知を取得するには、クライアントで次のタスクを実行する必要があります。

これらのインターフェイスのクライアントの実装が登録されると、クライアントはこれらのインターフェイスのメソッドを介してコールバックの形式で通知を受け取ります。 IMMNotificationClient メソッドは、このメソッドがエンドポイント レベルのイベント (エンドポイントの状態の変更、新しいエンドポイントの到着、エンドポイントの削除、既定のエンドポイントの変更、エンドポイント プロパティの変更) を発生させると、MMDeviceAPI によって呼び出されます。

クライアントが既定のデバイスのストリーム ルーティングを提供する場合、クライアントは IMMNotificationClient::OnDefaultDeviceChanged コールバックを介して通知を受信するときに、デバイス変更動作を実装する必要があります。

オーディオ セッション変更通知

オーディオ セッションの変更と形式の変更は、WASAPI を通じてオーディオ セッション イベントとして報告されます。 WASAPI クライアントは、IAudioSessionEvents インターフェイスを実装し、その実装を WASAPI に登録します。

オーディオ セッションの変更通知を取得するには、クライアントで次のタスクを実行する必要があります。

IAudioSessionEvents メソッドは、オーディオ セッションの変更が発生したときに WASAPI によって呼び出されます。 これらのイベントは、セッションの表示名、アイコン パス、ボリューム、グループ化パラメーター、または状態が変更されたときに発生します。

ストリーム ルーティング機能を実装するには、クライアントはセッション切断通知を待機する必要があります。 オーディオ セッションが切断されたとき、またはデバイスの形式が変更されると、WASAPI は IAudioSessionEvents::OnSessionDisconnected を介してコールバックの形式でクライアント通知を送信します。 切断通知を使用すると、WASAPI はセッションが切断された理由を示す値も送信します。 これは、デバイスが削除された、サーバーが停止したなどの、いくつかの理由で発生する可能性があります。 理由の全一覧については、AudioPolicy.h で定義されている AudioSessionDisconnectReason 列挙を参照してください。 既定のデバイスが変更された場合、クライアントは DisconnectReasonDeviceRemoval 値を伴う通知を (まだ受信していない場合は) 待機する必要があります。 このような通知に応答して、クライアントは新しい既定のデバイスでストリームを再度開く可能性があります。

これらの操作はすべて非同期であるため、アプリケーションが通知を受信する順序は予測できません。 ただし、通常アプリケーションは、既定のデバイス変更通知の前に AudioSessionDisconnect 値を受け取ります。

形式変更通知

オーディオ形式の変更は、ストリームの形式が変更されたときに発生します。 これは、ユーザーが[サウンド] コントロール パネルで新しい形式を選択した場合、または新しい既定のデバイスが新しい形式をサポートしている場合 (たとえば、HDMI または手動のサンプル レート調整を使用した特定のプロフェッショナル オーディオ インターフェイス) に、発生する可能性があります。 これらの種類の形式変更についてクライアントに通知するために、WASAPI は、DisconnectReasonFormatChanged の切断理由とともに IAudioSessionEvents::OnSessionDisconnected の登録済み実装によってセッション通知を送信します。 クライアントは、新しい形式でストリームを再度開くことで、通知を処理できます。

MMDevice API について

WASAPI について

ストリーム ルーティング