オーディオ・セッション

公開:2011-05-15 11:55
更新:2017-09-22 05:39
カテゴリ:windows,windows core audio api,wasapi,audio,windows api

はじめに

オーディオ・セッションについて、MSDNのAudio Sessionsを意訳?して、図表を入れたり文章を追記してみた。

http://msdn.microsoft.com/en-us/library/dd370796(v=VS.85).aspx

オーディオ・セッションとは

オーディオ・セッションとはまとめて制御できるオーディオ・ストリームの集合である。既定でWASAPIで音を鳴らすとオーディオ・セッションはプロセスごとに1つ作られる。視覚的にみると下図となる。ついでに対応するインターフェースもわかる範囲で書いてみた。

sndvol.png

利用者は音量とミュート設定を個々のセッション単位でコントロールできる(具体的にはISimpleAudioVolumeを使用する)。セッションは利用者がオーディオ・ストリームを初期化 (IAudioClient::Initialize) するときにオーディオ・セッションを割り当てる。

IAudioClient≒ストリームという感じで、ストリームに関する管理はIAudioClientで行う。例えば音声データを送るにはIAudioRenderClientを使用するがこれはIAudioClientからGetServiceして取得する。
WASAPIには共有モードで音量をコントロールするインターフェースとしてISimpleAudioVolume,IAudioStreamVolume,IChannelAudioVolumeの 3種類がある。ISimpleAudioVolumeはセッション全体の音量コントロールを、ストリーム単位のコントロールはIAudioStreamVolumeかIChannelAudioVolumeを使用する。Channelという概念はなんなのかまだ理解していない。。
後でMSDNのBlog見たらこのあたりのことが詳しく書いてあった。IAudioEndpointVolumeのことも書いてあった。まあボリュームの種類が多いこと。。
Windows audio render volume settings, from local to global

オーディオ・セッションは再生(レンダリング)ストリームもしくは録音(キャプチャ)ストリームのいずれかを含む(両方を含むことはない)。既定では再生(レンダリング)セッションのミュートと音量設定を再起動を越えて保持する。 録音ストリームセッションはミュート・音量設定は再起動後も保持しない(ループ・バック状態で動作するストリームを含むセッションは録音セッションと同様に保持されない)。

すべてのオーディオ・ストリームは必ずセッションに属する。利用者はストリームオブジェクト初期化時に特定のセッションにオーディオ・ストリームを割り当てる。ストリームは生存期間中のセッション構成を保持する。ストリーム・オブジェクトはオブジェクトへの参照数が0となり、削除されるまで存在する。

セッションを明示的に生成するメソッドはなく、IAudioClient::Initialize時にセッションGUIDをどのように指定するかで決まるようである。GUID_NULLであれば既定セッションに追加され、GUIDを指定するとそれが新規であればセッションが作られ、既存であればセッションはつくられずストリームは既存のセッションに追加される。

利用者はセッションにすでに割り当てられているストリームを変更することができないが、変更したいストリームを削除し新しいストリームを作成し置き換えるか、新しいストリームを他のセッションに割り当てることによって同様の効果を得ることができる。

再生セッションはオーディオ・エンドポイント・デバイスで演奏される「グローバル・ミックス」ストリームの一部分を表わす。「グローバル・ミックス」はデバイスを共有するすべてのアプリケーションのすべてのセッションを合成する。

image/svg+xml セッション セッション グローバルミックス セッション セッション セッション エンドポイント・デバイス

複数のストリームを持つアプリケーションは同じセッションにすべてのストリームを割り当てることが一般的である。ただしアプリケー ションはオプションとして別のセッションにストリームを割り当てることができる。アプリケーションが明示的にセッションに割り当 てられていない場合ストリームは既定のセッションに属する。

オーディオ・アプリケーションはセッションの音量とミュートの設定を自身で変更することは避けるべきである。 代わりにユーザーはOSが用意するユーザーインターフェイスを介して制御するようにする。 たとえばWindows Vistaはシステム提供のプログラムであるSndvol.exeで、システム内のアクティブな再生(レンダリング)セッションの音量コントロールおよびミュート制御を行うことができる。

Sndvolはオーディオの再生(レンダリング)エンドポイントデバイスの音量コントロールが表示され, オーディオ録音(キャプチャ)デバイスの音量コントロールは表示しない。

ストリームおよびセッションの状態

ストリームは「実行」「停止」のいずれかの状態を取る。セッションは最初のストリームが「実行」状態となった場合「活動」状態となり、すべてのストリームが「停止」状態になると「無活動」状態となる。「無活動」状態から一定時間を経過すると「期限切れ」状態となる。SndVolはセッションが「活動」「無活動」状態の場合音量コントロールを表示し、「期限切れ」状態もしくはアプリケーション 終了(ストリームが削除される)の場合表示しない。例外としてシステム通知のためのセッションの音量コントロールはいずれの状態でも表示される。

ストリームの状態変化時の挙動はIAudioClient::Initializeの第2引数、StreamFlagsで制御できる。
意味
AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED交信するストリームがなく、なんの参照も保持していないセッションは期限切れとなる。
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE音量ミキサーに音量コントロールを表示しない。
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED期限切れの時は音量ミキサーに音量コントロールを表示しない。

プロセス固有セッションとプロセス間セッション

通常ストリームはアプリケーションの単一プロセス内のセッション(プロセス固有セッション)に属する。オプションを設定することで、2つ以上のプロセスのストリームを1つのセッション(プロセス間セッション)にすることができる。

image/svg+xml Layer 1 image/svg+xml プロセス固有セッション プロセス間セッ ション プロセス セッ ション ス トリーム

プロセス間セッションオプションはプロセス固有のセッションと同様にミュートと音量設定を再起動を越えて保持する。

Sndvolはセッションごとの音量コントロールに名前とアイコンを表示する。利用者は表示するセッションに名前とアイコンを 明示的に設定することができる。明示的に提供しない場合は既定の名前とアイコンが表示される。

明示的に名前とアイコンを設定するにはIAudioClient::GetServiceでIAudioSessionControlインターフェースを取得し、設定する。

既定の名前およびアイコンはアプリケーションウィンドウのタイトルおよびアイコンである。名前とアイコンの設定は再起動をまたいで保持されない。そのため 利用者自身のアプリで名前とアイコンを設定した場合、アプリケーションの起動の都度再設定する必要がある。

20110514-01.png

各セッションはセッションGUIDによって識別される。ストリームオープン時に、利用者が特定のセッションに割り当てる。利用者はセッションを特定するために以下の2つの情報をOSに提供する:

プロセス固有セッションの場合はセッションGUIDはプロセスの範囲内で一意である。プロセス間セッションの場合セッションIDはコンピュータ上で実行されているプロセスの範囲で一意である。

プロセス固有セッションの場合OSはセッションGUIDとプロセスIDの組み合わせでコンピュータ上でユニーク性を保つ。同じセッションGUIDを持つ2つのプロセス固有セッションはプロセスIDが異なるため、システムはそれぞれ個別のセッションとして扱う。プロセス間セッションは1つ以上のプロセス固有セッションと同じセッションGUIDを使用している場合、OSは同じセッションGUIDをであるがプロセス固有セッションと重複しないように分離してプロセス間セッションを扱う。

image/svg+xml Layer 1 プロセス固有セッション プロセス間セッション プロセスA プロセスB セッションGUID A セッションGUID A プロセスA プロセスB セッションGUID A セッションGUID A プロセスC プロセス固有セッション プロセス AとプロセスBのセッション GUID は同じAだが、セッションはプロ セスID で分離される。 プロセス 間セッションとプロセス 固有セッ ションは同じセッション GUID を持つが、セッションはプロ セス間 セッションとプロセス固有 セッショ ンとで分離される。

たとえばWindowsVistaではマルチメディアAPI(waveOutXxx)やDirectSoundなどの高レベルAPIはセッションGUIDをGUID_NULLでプロセス固有セッションにストリームを割り当てる。これらのAPIのために、セッションGUIDはプロセス間で同じだけれども、それぞれのプロセスの既定セッションは他のプロセスの既定セッションと分離される。またプロセス間セッションのセッションIDがGUID_NULLの場合他のプロセス固有セッションの同じGUIDを共有するプロセス固有セッションとは分離される。したがってSndVolは既定の場合プロセス固有セッション毎に音量コントロールが表示され、もしあればプロセス間セッションの音量コントロールを表示する。

各セッションは1つのオーディオ・エンドポイント・デバイスに関連付けられている。もし2つのセッションが異なるエンドポイント・デバイスに交信している場合を除いて同じセッションGUIDかつ同じプロセス内にある場合は、OSは分離して2つのセッションであるとみなす。再生ストリームは再生デバイスとのみ交信し、録音セッションは録音デバイスとのみ交信するため、再生ストリームと録音ストリームを同じセッションに含めることはできない。

前述したように、セッションのために音量とミュート設定は、システムを再起動しても保持される。アプリケーションを複数立ち上げることで同じセッションGUIDのプロセス固有セッションを作ることができる場合は、それぞれ個別に音量コントロールできるものの保持するのは最後に終了した音量コントロールが保存される。次に同じアプリケーションを立ち上げたとき、同じセッションGUIDでセッションを作成して最後に保存した音量設定を再現する。

つまりWindows Core AudioではセッションGUIDをキーにして音量設定を保存・復元しているということである。

アプリケーションは、他のアプリケーションのセッションの音量コントロールをしたり、ストリームを追加したりすべきではない。 また システムが通知するためのシステム管理セッションの音量コントロールをすべきでない。しかしながら、アプリケーションはPlaySound関数を使用することにより通知音をシステム管理セッションを通じて鳴らすことができる。詳細はNotification Sounds for Legacy Audio Applications. を参照すること。

アプリケーションはセッション状態変更通知を受け取ることができる。

詳細はAudio Session Events.を参照すること。

まれにアプリケーションは複数インスタンスのプロセス固有セッションを統合する必要がある。その場合はグルーピングパラメータを使用することができる。これはIEを実装するために用意されたもので、プロセス固有セッションとプロセス間セッションをまとめて音量コントロールできるものである。これはIEはマルチプロセスのアプリケーションであり、プロセス毎にプロセス固有セッションとプロセス間セッションが混在するためである。

Grouping Parameters.を参照すること。