オーディオ セッション
オーディオ セッションは、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 つ以上のアプリケーション インスタンスのプロセス固有セッションの制御を統合する必要が生じることがあります。 詳細については、「グループ化のパラメーター」をご覧ください。
関連トピック