ストリーム ルーティング
ストリーム ルーティングは、再生またはキャプチャ セッションの中断を最小限に抑えてデバイス間でストリームを切り替えるメディア アプリケーションの機能です。
1 つのコンピューターに複数のレンダリング デバイスとキャプチャ デバイスを含めることができます。 システムは、[サウンド コントロール パネル] にこれらのデバイスを一覧表示します。 この一覧から、ユーザーは、再生、録音、または 4 つの通信ロール (コンソール レンダリング、コンソール キャプチャ、通信レンダリング、または通信キャプチャ) の各ロールの既定のデバイスとしてデバイスを設定できます。 デバイスの一覧は、USB ヘッドセットなどのこれらのデバイスの一部は一時的に利用可能であるため、動的に変更される可能性があります。 複数のデバイスが使用可能な場合は、ユーザーは既定値を別のデバイスに変更することができます。 ユーザーは、デバイスのプロパティの [詳細] タブで、デバイスの形式 (サンプル レート、サンプルごとのビット数など) を変更することもできます。
ユーザーがオーディオ ストリームをレンダリングするための既定のデバイスとしてスピーカーを選択するシナリオを考えてみましょう。 ユーザーは次に、USB ヘッドセットを接続して、新しい既定のデバイスとしてヘッドセットを選択し、デバイスのサンプル レートを 44.1 kHz から 48 kHz に変更します。 ユーザーは、ストリーミング セッションの中断を最小限に抑えながら、新しいサンプル レートでヘッドセットを使用してオーディオ ストリームを再生したいと考えています。
このシナリオでは、メディア アプリケーションで次の 2 つのケースを処理する必要があります。
- 再生の中断を最小限に抑えて、ストリームを新しい既定のデバイスに転送する必要があります。
- 新しいデバイスは、新しい形式で再生を再開する必要があります (ユーザーは、サンプル レートの他にも変更を行うことができます)。
Windows Vista では、このシナリオをサポートするために、メディア アプリケーションでストリーム ルーティングの実装を提供する必要がありました。 アプリケーションは、既存のストリームを終了して、新しいデバイスでストリームを再起動する役割を担いました。 ユーザーが既定のデバイスまたはそのミックス形式を変更した場合は、関連付けられているすべてのセッションが閉じられ、アプリケーションは回復の処理をする必要がありました。
Windows 7 では、アプリケーションは既存の既定のデバイスから新しい既定のオーディオ エンドポイントにストリームをシームレスに転送できます。 Media Foundation、DirectSound、WAVE の API などの高レベルのオーディオ API セットは、ストリーム ルーティング機能を実装します。 これらの API セットを使用して既定のデバイスからストリームを再生またはキャプチャするメディア アプリケーションでは、既定の実装が使用されるため、アプリケーションに変更を加える必要はありません。 ただし、メディア アプリケーションで MMDeviceAPI または WASAPI を直接使用する場合は、アプリケーションはストリーム ルーティングの実装を提供する必要があります。
Note
MMDeviceAPI と WASAPI は、アプリケーションがデバイス上のストリームをレンダリングまたはキャプチャするために使用できるコア オーディオ API コンポーネントです。 MMDeviceAPI は新しいオーディオ エンドポイント デバイスを検出し、WASAPI はメディア アプリケーションとオーディオ エンドポイント デバイスの間のオーディオ データのフローを管理します。
ストリーム ルーティング機能を実装するには、次の場合に MMDeviceAPI と WASAPI によって送信された通知をアプリケーションでリッスンする必要があります。
- 既定のデバイスはユーザーによって変更されます。
- 既存の既定のデバイスが削除され、新しい既定のデバイスが追加されます。
- デバイスの形式が変更されます。
これらの通知を処理することで、アプリケーションは新しい既定のデバイスにストリームを転送しながら、必要なストリーム管理操作を実行できます。 さらに、アプリケーションは、レンダリング セッションがアクティブな間、ユーザーが指定した新しい形式を使用して、既存のストリームをレンダリングまたはキャプチャできます。
このセクションでは、以下のトピックについて説明します:
Windows SDK に含まれる次のサンプルは、アプリケーションがストリーム ルーティング通知を処理する方法を示しています。
- RenderSharedTimerDriven
- RenderSharedEventDriven
- RenderExclusiveTimerDriven
- RenderExclusiveEventDriven
- CaptureSharedTimerDriven
- CaptureSharedEventDriven
関連トピック