オーディオ セッション
オーディオ セッション は、WASAPI クライアントがまとめて管理できる関連するオーディオ ストリームのグループです。 クライアントは、個々のセッションのボリューム レベルとミュート状態を制御できます。 システムは、クライアント指定のボリュームとミュート設定をセッション内のすべてのストリームに均一に適用します。
クライアントがオーディオ ストリームを初期化すると、オーディオ ストリームがオーディオ セッションに割り当てられます。 詳細については、「IAudioClient::Initialize」を参照してください。
オーディオ セッションには、レンダリング ストリームまたはキャプチャ ストリームのいずれかが含まれますが、両方は含まれません。 既定では、レンダリング セッションのボリュームとミュートの設定は、システムの再起動後も永続的です。 キャプチャ セッションのボリュームとミュートの設定は永続的ではありません。 (ループバック モードで動作するストリームを含むセッションは、キャプチャ セッションと同じように扱われます。つまり、セッション設定は永続的ではありません。ループバック モードの詳細については、「ループバック記録を参照してください。
すべてのオーディオ ストリームは、1 つのセッションに属します。 クライアントは、ストリーム オブジェクトを初期化する時点で、特定のセッションにオーディオ ストリームを割り当てます。 ストリームは、ストリームの有効期間中、セッションのメンバーシップを保持します。 ストリーム オブジェクトが作成されると、クライアントがオブジェクトへの最後にカウントされた参照を解放し、オブジェクトが削除されるまでオブジェクトが存在します。
クライアントは、既存のストリームが割り当てられているセッションを変更することはできませんが、ストリームを削除し (ストリームへのすべての参照を解放することによって)、削除されたストリームを置き換える新しいストリームを作成し、新しいストリームを別のセッションに割り当てることによって、同様の効果を実現できます。
各レンダリング セッションは、特定の オーディオ エンドポイント デバイスを介して再生されるグローバル ミックスを形成するストリームのサブセットを表します。 グローバル ミックスは、デバイスを共有するすべてのアプリケーションのすべてのセッションを結合します。
多くの場合、複数のストリームを持つアプリケーションでは、すべてのストリームが同じセッションに割り当てられます。 ただし、アプリケーションはオプションとして、異なるセッションに異なるストリームを割り当てることができます。 アプリケーションがセッションに明示的に割り当てないストリームは、既定のセッションに属します。
一般的なオーディオ アプリケーションでは、セッションの音量とミュートの設定を変更しないようにする必要があります。 代わりに、ユーザーは制御プログラムのユーザー インターフェイスを使用してこれらの設定を制御します。 たとえば、Windows Vista では、システムが提供するプログラム Sndvol.exeでは、システム内のアクティブまたは最近アクティブなレンダリング セッションごとにボリューム コントロールとミュート コントロールが表示されます。 これらのコントロールを使用して、ユーザーはシステム内のすべてのセッションの音量とミュート設定を調整できます。
現在、Sndvol プログラムでは、オーディオ レンダリング エンドポイント デバイスのみのボリューム コントロールが表示されます。 オーディオ キャプチャ デバイスのボリューム コントロールは表示されません。
セッションに 1 つ以上のアクティブなストリームが含まれている場合、セッションはアクティブです。 アクティブなストリームは、実行中の状態。 非アクティブなストリームは、停止状態。 セッションは、最初のストリームがアクティブになるとアクティブになります。 最後にアクティブなストリームが非アクティブになると、セッションは非アクティブになります。 セッションが一定期間非アクティブになると、システムはセッションの状態を非アクティブから期限切れに変更します。
Sndvol では、アクティブおよび非アクティブのすべてのレンダリング セッションのボリューム コントロールとミュート コントロールが表示されます。 Sndvol は、セッションの状態が非アクティブから期限切れに変わるとき、またはセッションが終了したときに、セッションのボリュームコントロールとミュートコントロールを削除します。 (セッションは、最後のストリームが削除されると終了します。つまり、クライアントがセッション内の最後の残りのストリーム オブジェクトの最終的な参照カウントを解放するとき)。このルールの 1 つの例外は、システム通知サウンドです。 Sndvol は、これらのサウンドのセッションの状態に関係なく、システム通知サウンドの音量とミュート コントロールを常に表示します。
通常、ストリームは、ストリームを作成したアプリケーションを含むプロセスのみを対象とするセッションに属します。 ただし、アプリケーションには、2 つ以上のプロセスからのストリームを結合するクロスプロセス セッションを定義するオプションがあります。
WASAPI では、主にクロスプロセス セッションがサポートされるため、次のことが行われます。
- Sndvolプログラムは、すべてのアプリケーションでシステム通知音を管理するための単一のボリュームコントロールをユーザーに提示することができます。
- あるプロセスで実行されるメディア プレーヤーは、保護されたコンテンツを、別のプロセスで実行される復号化プログラムにストリーミングできます。
プロセス固有のレンダリング セッションの制御設定と同様に、クロスプロセス レンダリング セッションの制御設定は、既定ではシステムの再起動間で永続的です。 WASAPI は、主にシステム通知音の利点のためにこの動作を提供します。これは、アプリケーションのミックスが時間の経過とともに変化する際に、ユーザーの音量とミュートの設定を保持する必要があります。
Sndvol プログラムは、各セッションのボリューム コントロールに表示名とアイコンのラベルを付けます。 クライアントには、セッションに表示名とアイコンを明示的に割り当てるオプションがあります。 クライアントがこれらの項目を提供しない場合、Sndvol は代わりに既定の名前と既定のアイコンを表示します。 既定の名前には、アプリケーション ウィンドウのタイトルなどの情報が組み込まれています。 既定のアイコンは、アプリケーション ウィンドウのアイコンです。 プロセス固有のセッションの場合にのみ、これらの既定値はユーザーに意味のある情報を提供します。 クロスプロセス セッションは複数のアプリケーションに関連付けることができることに注意してください。 この場合、クライアントが指定した表示名とアイコンのみが意味を持つ。
レンダリング セッションのボリュームとミュートの設定は、既定ではシステムの再起動後も永続的ですが、クライアントが提供する表示名とアイコンは保持されません。 Sndvol でクライアント指定の名前とアイコンが表示されるようにするには、クライアントがセッションに最初のストリームを割り当てる時点で、クライアントがセッションに名前とアイコンを明示的に割り当てる必要があります。 システムは、セッションが終了するまでのみ、セッションの表示名とアイコンを保持します。
各セッションは、セッション GUID によって識別されます。 クライアントがストリームを開くと、クライアントはそのストリームを特定のセッションに割り当てます。 クライアントは、そのセッションを識別するために次の 2 つの情報を提供します。
- セッション GUID。
- セッションがプロセス間またはプロセス固有のセッションのいずれであっても、プロセス固有のセッションには、クライアントのプロセスからのストリームのみが含まれます。
この情報は、特定のセッションを同じコンピューター内の他のすべてのセッションと区別するのに十分です。 プロセス固有のセッションのセッション GUID は、セッションを所有するプロセスのスコープ内でのみセッションを一意に識別します。 これに対し、クロスプロセス セッションのセッション GUID は、コンピューター上で実行されているすべてのプロセスのスコープ内で一意です。
プロセス固有のセッションの場合、システムはセッション GUID とプロセス ID の組み合わせを使用して、コンピューターのスコープ内のセッションを一意に識別します。 したがって、2 つの異なるプロセスのクライアントが、同じセッション GUID を持つ 2 つのプロセス固有のセッションにそれぞれのストリームを割り当てる場合、システムはプロセス ID が異なるため、セッションを個別として扱います。 さらに、クロスプロセス セッションで同じセッション GUID が 1 つ以上のプロセス固有のセッションとして使用されている場合、システムは、同じセッション GUID を共有していても、プロセス固有のセッションとは異なるプロセス セッションとして扱います。
たとえば、Windows Vista では、Windows マルチメディア waveOutXxx 関数や DirectSound などの上位レベルの API は、通常、作成するオーディオ ストリームを、セッション GUID 値GUID_NULLで識別される既定のプロセス固有のセッションに割り当てます。 これらの API のクライアントの場合、セッションに同じセッション GUID がある場合でも、各クライアント プロセスの既定のセッションは、他のクライアント プロセスの既定のセッションとは異なります。 さらに、1 つ以上のアプリケーションがセッション GUID 値GUID_NULLで識別されるクロスプロセス セッションにストリームを割り当てる場合、システムはこのクロスプロセス セッションを、同じセッション GUID を共有する既定のプロセス固有のセッションとは別のものとして扱います。 したがって、Sndvol プログラムは、クライアントの既定のプロセス固有のセッションごとに個別のボリューム コントロールを表示し、そのセッションが存在する場合は、GUID_NULLセッション GUID 値によって識別されるクロスプロセス セッションの追加のボリューム コントロールを表示します。
各セッションは、1 つのオーディオ エンドポイント デバイスにのみ関連付けられます。 2 つのセッションに同じセッション GUID とプロセス ID があるが、異なるデバイスに関連付けられている場合、システムは 2 つのセッションを別々のセッションとして扱います。 キャプチャ ストリームはキャプチャ デバイスにのみ関連付けることができ、レンダリング ストリームはレンダリング デバイスにのみ関連付けることができるため、セッションにはキャプチャ ストリームとレンダリング ストリームの両方を含められません。
前述のように、セッションのボリュームとミュートの設定は、システムの再起動間で永続的に行われます。 アプリケーションの 2 つ以上のインスタンスは、同じセッション GUID を持つプロセス固有のセッションを作成できます。 Sndvol プログラムを使用すると、ユーザーはこれらのセッションごとに異なるボリュームとミュート設定を選択できます。 これらのセッションが終了した後、システムは、これらのセッションのうちの 1 つだけ (最後に終了するセッション) の制御設定を保持します。 後で、アプリケーションの新しいインスタンスが以前と同じセッション GUID を使用してプロセス固有のセッションを作成した場合、そのセッションは以前に保存したボリュームとミュート設定を継承します。
アプリケーションは、関連のない別のアプリケーションが所有するセッションのボリューム レベルにストリームを追加したり、そのボリューム レベルを制御したりしないでください。 さらに、アプリケーションは、通知音のシステム管理セッションのボリューム レベルを制御しないようにする必要があります。 ただし、アプリケーションは、PlaySound 関数を呼び出すことによって、通知サウンドのシステム セッションを通じてサウンドを再生できます。 詳細については、「レガシ オーディオ アプリケーション の通知サウンド」を参照してください。
アプリケーションは、セッションの状態が変化したときに通知を受け取るために登録できます。 詳細については、「オーディオ セッション イベントの」を参照してください。
まれに、プロセス固有のセッションを作成するアプリケーションでは、Sndvol の単一ボリューム制御下にある 2 つ以上のアプリケーション インスタンスのプロセス固有セッションの制御を統合する必要がある場合があります。 詳細については、「グループ化パラメータ を参照してください。
関連トピック