Win32 API 日本語リファレンス
ホームMedia.Audio › IAudioSessionControl

IAudioSessionControl

COM
IIDf4b1a599-7266-4319-a8ca-e70acb11e8cd継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IAudioSessionControl インターフェイスを使用すると、クライアントはオーディオセッションの制御パラメーターを構成し、セッション内のイベントを監視できます。

メソッド 9

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetState(AudioSessionState* pRetVal)

GetState メソッドは、オーディオセッションの現在の状態を取得します。

pRetValAudioSessionState*out

メソッドが現在のセッション状態を書き込む変数へのポインター。状態は、次の AudioSessionState 列挙値のいずれかになります。

AudioSessionStateActive

AudioSessionStateInactive

AudioSessionStateExpired

これらの値は、セッション状態がそれぞれアクティブ、非アクティブ、または期限切れであることを示します。詳細については「解説」を参照してください。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター pRetValNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

このメソッドは、セッションの状態がアクティブ、非アクティブ、または期限切れのいずれであるかを示します。セッションに実行中のストリームが1つ以上ある場合、状態はアクティブです。セッション内で最後に実行中だったストリームが停止すると、状態はアクティブから非アクティブに変わります。クライアントがストリームオブジェクトへのすべての参照を解放してセッション内の最後のストリームを破棄すると、セッション状態は期限切れに変わります。

Sndvol プログラムは、アクティブおよび非アクティブ状態のセッションについて音量とミュートのコントロールを表示します。セッションが期限切れになると、Sndvol はそのセッションのコントロールの表示を停止します。以前に期限切れになったセッションであっても、(セッション内のストリームが実行を開始したために)状態がアクティブに変わったり、(クライアントがセッションに新しいストリームを割り当てたために)非アクティブに変わったりした場合、Sndvol はそのセッションのコントロールの表示を再開します。

クライアントは、IAudioClient::Initialize メソッドを呼び出してストリームを作成します。ストリームを作成する時点で、クライアントはそのストリームをセッションに割り当てます。セッションは、クライアントが最初のストリームをセッションに割り当てた時点で開始します。当初、セッションは非アクティブ状態です。セッション内の最初のストリームが実行を開始すると、セッション状態はアクティブに変わります。クライアントがセッション内に残っている最後のストリームオブジェクトへの最終参照を解放すると、セッションは終了します。

vtbl 4 HRESULT GetDisplayName(LPWSTR* pRetVal)

GetDisplayName メソッドは、オーディオセッションの表示名を取得します。

pRetValLPWSTR*outメソッドが、表示名を含む null 終端のワイド文字文字列のアドレスを書き込むポインター変数へのポインター。メソッドはこの文字列用のストレージを割り当てます。呼び出し元は、そのストレージが不要になったときに CoTaskMemFree 関数を呼び出して解放する責任があります。CoTaskMemFree の詳細については、Windows SDK ドキュメントを参照してください。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター pRetValNULL です。
E_OUTOFMEMORY
メモリ不足です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

クライアントが IAudioSessionControl::SetDisplayName を呼び出して表示名を設定していない場合、文字列は空になります。Sndvol プログラムは、空の名前文字列を表示する代わりに、既定の自動生成された名前を使用してオーディオセッションの音量コントロールにラベルを付けます。

vtbl 5 HRESULT SetDisplayName(LPWSTR Value, GUID* EventContext)

SetDisplayName メソッドは、現在のセッションに表示名を割り当てます。

ValueLPWSTRinセッションの表示名を含む null 終端のワイド文字文字列へのポインター。
EventContextGUID*inイベントコンテキスト GUID へのポインター。このメソッドの呼び出しによって名前変更イベントが発生した場合、セッションマネージャーは、セッションマネージャーに IAudioSessionEvents インターフェイスを登録しているすべてのクライアントに通知を送信します。セッションマネージャーは各通知に EventContext ポインター値を含めます。通知を受け取ると、クライアントは EventContext 値を調べることで、自身が発生源なのか他のクライアントが発生源なのかを判別できます。この仕組みは、クライアントがこのパラメーターに対してセッション内のすべてのクライアント間で一意な値を選択することに依存します。呼び出し元がこのパラメーターに NULL ポインターを指定した場合、クライアントの通知メソッドは NULL コンテキストポインターを受け取ります。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター ValueNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

Windows Vista では、システム提供のプログラム Sndvol.exe が表示名を使用してセッションの音量コントロールにラベルを付けます。クライアントが SetDisplayName を呼び出してセッションに表示名を割り当てていない場合、Sndvol プログラムは既定の自動生成された名前を使用してセッションにラベルを付けます。この既定の名前には、オーディオアプリケーションのウィンドウタイトルやバージョンリソースなどの情報が組み込まれます。

クライアントに複数のアクティブなセッションがある場合、クライアントが指定した表示名は、さまざまなセッションの音量コントロールを区別するのに特に役立ちます。

クロスプロセスセッションの場合、そのセッションには既定の表示名を生成する元となる、アプリケーション名やプロセス ID などの識別情報がありません。したがって、意味のない既定の表示名が表示されるのを避けるため、クライアントは SetDisplayName を呼び出す必要があります。

表示名は IAudioSessionControl オブジェクトの有効期間を超えて保持されません。したがって、オブジェクトへのすべての参照が解放された後に(同じアプリケーション、同じセッション GUID、同じエンドポイントデバイスで)新たに作成されたバージョンのオブジェクトは、クライアントが SetDisplayName を呼び出すまで、再び既定の自動生成された表示名を持つことになります。

クライアントは、IAudioSessionControl::GetDisplayName メソッドを呼び出してセッションの表示名を取得できます。

vtbl 6 HRESULT GetIconPath(LPWSTR* pRetVal)

GetIconPath メソッドは、オーディオセッションの表示アイコンのパスを取得します。

pRetValLPWSTR*outメソッドが、アイコンを含む .ico、.dll、または .exe ファイルの完全修飾パスを指定する null 終端のワイド文字文字列のアドレスを書き込むポインター変数へのポインター。メソッドはこの文字列用のストレージを割り当てます。呼び出し元は、そのストレージが不要になったときに CoTaskMemFree 関数を呼び出して解放する責任があります。アイコンパスと CoTaskMemFree の詳細については、Windows SDK ドキュメントを参照してください。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター pRetValNULL です。
E_OUTOFMEMORY
メモリ不足です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

クライアントが IAudioSessionControl::SetIconPath を呼び出して表示アイコンを設定していない場合、文字列は空になります。クライアントが指定したアイコンが利用できない場合、Sndvol プログラムはクライアントのアプリケーションウィンドウのアイコンを使用してオーディオセッションの音量コントロールにラベルを付けます。

vtbl 7 HRESULT SetIconPath(LPWSTR Value, GUID* EventContext)

SetIconPath メソッドは、現在のセッションに表示アイコンを割り当てます。

ValueLPWSTRinアイコンを含む .ico、.dll、または .exe ファイルのパスとファイル名を指定する null 終端のワイド文字文字列へのポインター。アイコンパスの詳細については、Windows SDK ドキュメントを参照してください。
EventContextGUID*inイベントコンテキスト GUID へのポインター。このメソッドの呼び出しによってアイコン変更イベントが発生した場合、セッションマネージャーは、セッションマネージャーに IAudioSessionEvents インターフェイスを登録しているすべてのクライアントに通知を送信します。セッションマネージャーは各通知に EventContext ポインター値を含めます。通知を受け取ると、クライアントは EventContext 値を調べることで、自身が発生源なのか他のクライアントが発生源なのかを判別できます。この仕組みは、クライアントがこのパラメーターに対してセッション内のすべてのクライアント間で一意な値を選択することに依存します。呼び出し元がこのパラメーターに NULL ポインターを指定した場合、クライアントの通知メソッドは NULL コンテキストポインターを受け取ります。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター ValueNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

Windows Vista では、システム提供のプログラム Sndvol.exe が表示アイコンを(表示名とともに)使用してセッションの音量コントロールにラベルを付けます。クライアントが SetIconPath を呼び出してセッションにアイコンを割り当てていない場合、Sndvol プログラムはアプリケーションウィンドウのアイコンをセッションの既定のアイコンとして使用します。

クロスプロセスセッションの場合、そのセッションは単一のアプリケーションプロセスに関連付けられていません。したがって、Sndvol には既定で使用するアプリケーション固有のアイコンがなく、意味のないアイコンが表示されるのを避けるため、クライアントは SetIconPath を呼び出す必要があります。

表示アイコンは IAudioSessionControl オブジェクトの有効期間を超えて保持されません。したがって、オブジェクトへのすべての参照が解放された後に(同じアプリケーション、同じセッション GUID、同じエンドポイントデバイスで)新たに作成されたバージョンのオブジェクトは、クライアントが SetIconPath を呼び出すまで、再び既定のアイコンを持つことになります。

クライアントは、IAudioSessionControl::GetIconPath メソッドを呼び出してセッションの表示アイコンを取得できます。

vtbl 8 HRESULT GetGroupingParam(GUID* pRetVal)

GetGroupingParam メソッドは、オーディオセッションのグループ化パラメーターを取得します。

pRetValGUID*outグループ化パラメーター GUID の出力ポインター。このパラメーターは、呼び出し元が割り当てた GUID 変数への、有効で非 NULL のポインターである必要があります。メソッドはグループ化パラメーターをこの変数に書き込みます。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター pRetValNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

同じグループ化パラメーター値を持つすべてのオーディオセッションは、システムの音量制御プログラム Sndvol 内の同じ音量レベルスライダーの制御下に置かれます。詳細については、グループ化パラメーターを参照してください。

クライアントは、IAudioSessionControl::SetGroupingParam メソッドを呼び出してセッションのグループ化パラメーターを変更できます。

クライアントが SetGroupingParam を一度も呼び出してオーディオセッションにグループ化パラメーターを割り当てていない場合、セッションのグループ化パラメーター値は既定で GUID_NULL となり、GetGroupingParam の呼び出しはこの値を取得します。グループ化パラメーター値が GUID_NULL の場合、そのセッションはどのグループにも属していないことを示します。この場合、セッションは Sndvol プログラム内に独自の音量レベルスライダーを持ちます。

vtbl 9 HRESULT SetGroupingParam(GUID* Override, GUID* EventContext)

SetGroupingParam メソッドは、セッションをセッションのグループ化に割り当てます。

OverrideGUID*in新しいグループ化パラメーター。このパラメーターは、グループ化パラメーター GUID への、有効で非 NULL のポインターである必要があります。詳細については「解説」を参照してください。
EventContextGUID*inイベントコンテキスト GUID へのポインター。このメソッドの呼び出しによってグループ化変更イベントが発生した場合、セッションマネージャーは、セッションマネージャーに IAudioSessionEvents インターフェイスを登録しているすべてのクライアントに通知を送信します。セッションマネージャーは各通知に EventContext ポインター値を含めます。通知を受け取ると、クライアントは EventContext 値を調べることで、自身が発生源なのか他のクライアントが発生源なのかを判別できます。この仕組みは、クライアントがこのパラメーターに対してセッション内のすべてのクライアント間で一意な値を選択することに依存します。呼び出し元がこのパラメーターに NULL ポインターを指定した場合、クライアントの通知メソッドは NULL コンテキストポインターを受け取ります。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター GroupingNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

クライアントは、このメソッドを呼び出してセッションのグループ化パラメーターを変更します。同じグループ化パラメーター値を持つすべてのオーディオセッションは、システムの音量制御プログラム Sndvol 内の同じ音量レベルスライダーの制御下に置かれます。詳細については、グループ化パラメーターを参照してください。

クライアントは、IAudioSessionControl::GetGroupingParam メソッドを呼び出してセッションの現在のグループ化パラメーターを取得できます。

クライアントが SetGroupingParam を一度も呼び出してセッションにグループ化パラメーターを割り当てていない場合、そのセッションはどのグループにも属していません。どのグループにも属していないセッションは、Sndvol プログラム内に独自の専用音量レベルスライダーを持ちます。

vtbl 10 HRESULT RegisterAudioSessionNotification(IAudioSessionEvents* NewNotifications)

RegisterAudioSessionNotification メソッドは、ストリーム状態の変化を含むセッションイベントの通知を受け取るためにクライアントを登録します。

NewNotificationsIAudioSessionEvents*inクライアントが実装した IAudioSessionEvents インターフェイスへのポインター。メソッドが成功した場合、クライアントの IAudioSessionEvents インターフェイスに対して AddRef メソッドを呼び出します。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター NewNotificationsNULL です。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオエンドポイントデバイスが取り外されたか、オーディオハードウェアまたは関連するハードウェアリソースが再構成、無効化、削除、またはその他の理由で使用できなくなりました。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオサービスが実行されていません。

解説(Remarks)

このメソッドは、クライアントが実装した IAudioSessionEvents インターフェイスをセッションマネージャーに渡します。このメソッドの呼び出しが成功すると、セッションマネージャーは IAudioSessionEvents インターフェイス内のメソッドを呼び出して、さまざまなセッションイベントをクライアントに通知します。これらのメソッドを通じて、クライアントは次のセッション関連イベントの通知を受け取ります。

通知が不要になった場合、クライアントは IAudioSessionControl::UnregisterAudioSessionNotification メソッドを呼び出して通知を終了できます。

クライアントは、IAudioSessionEvents インターフェイスへの最終参照を解放する前に、UnregisterAudioSessionNotification を呼び出してインターフェイスの登録を解除する必要があります。そうしないと、アプリケーションは IAudioSessionEvents オブジェクトと IAudioSessionControl オブジェクトが保持するリソースをリークします。RegisterAudioSessionNotification はクライアントの IAudioSessionEvents::AddRef メソッドを呼び出し、UnregisterAudioSessionNotificationIAudioSessionEvents::Release メソッドを呼び出すことに注意してください。クライアントが誤って UnregisterAudioSessionNotification を呼び出す前に IAudioSessionEvents インターフェイスへの参照を解放すると、セッションマネージャーは IAudioSessionEvents インターフェイスへの参照を決して解放しません。たとえば、設計が不十分な IAudioSessionEvents 実装では、IAudioSessionEvents オブジェクトのデストラクターから UnregisterAudioSessionNotification を呼び出す可能性があります。この場合、セッションマネージャーが IAudioSessionEvents インターフェイスへの参照を解放するまでクライアントは UnregisterAudioSessionNotification を呼び出さず、クライアントが UnregisterAudioSessionNotification を呼び出すまでセッションマネージャーは IAudioSessionEvents インターフェイスへの参照を解放しません。AddRef メソッドと Release メソッドの詳細については、Windows SDK ドキュメントの IUnknown インターフェイスに関する説明を参照してください。

さらに、クライアントは、IAudioSessionControl オブジェクトと IAudioSessionManager オブジェクトへのすべての参照を解放する前に UnregisterAudioSessionNotification を呼び出す必要があります。クライアントがこれら 2 つのオブジェクトのうち少なくとも 1 つへの参照を保持していない限り、セッションマネージャーは登録情報を保持するために割り当てたストレージをリークします。通知インターフェイスを登録した後、クライアントはこれら 2 つのオブジェクトのうち少なくとも 1 つが存在する間だけ通知を受け取り続けます。

RegisterAudioSessionNotification メソッドを呼び出すコード例については、レガシーオーディオアプリケーションのオーディオイベントを参照してください。

vtbl 11 HRESULT UnregisterAudioSessionNotification(IAudioSessionEvents* NewNotifications)

UnregisterAudioSessionNotification メソッドは、通知を受け取るためにクライアントが行った以前の登録を削除します。

NewNotificationsIAudioSessionEvents*inクライアントが実装した IAudioSessionEvents インターフェイスへのポインター。クライアントは、以前に IAudioSessionControl::RegisterAudioSessionNotification メソッドを呼び出した際に、この同じインターフェイスポインターをセッションマネージャーに渡しました。UnregisterAudioSessionNotification メソッドが成功した場合、クライアントの IAudioSessionEvents インターフェイスに対して Release メソッドを呼び出します。

戻り値

メソッドが成功した場合は S_OK を返します。失敗した場合、戻り値には次の表に示す値が含まれますが、これらに限定されません。

戻り値 説明
E_POINTER
パラメーター NewNotificationsNULL です。
E_NOTFOUND
指定されたインターフェイスは、クライアントによって以前に登録されていないか、既に削除されています。

解説(Remarks)

クライアントは、通知を受け取る必要がなくなったときにこのメソッドを呼び出します。UnregisterAudioSessionNotification メソッドは、クライアントが以前に IAudioSessionControl::RegisterAudioSessionNotification メソッドを呼び出してセッションマネージャーに登録した IAudioSessionEvents インターフェイスの登録を削除します。

クライアントは、IAudioSessionEvents インターフェイスへの最終参照を解放する前に、UnregisterAudioSessionNotification を呼び出してインターフェイスの登録を解除する必要があります。そうしないと、アプリケーションは IAudioSessionEvents オブジェクトと IAudioSessionControl オブジェクトが保持するリソースをリークします。RegisterAudioSessionNotification はクライアントの IAudioSessionEvents::AddRef メソッドを呼び出し、UnregisterAudioSessionNotificationIAudioSessionEvents::Release メソッドを呼び出すことに注意してください。クライアントが誤って UnregisterAudioSessionNotification を呼び出す前に IAudioSessionEvents インターフェイスへの参照を解放すると、セッションマネージャーは IAudioSessionEvents インターフェイスへの参照を決して解放しません。たとえば、設計が不十分な IAudioSessionEvents 実装では、IAudioSessionEvents オブジェクトのデストラクターから UnregisterAudioSessionNotification を呼び出す可能性があります。この場合、セッションマネージャーが IAudioSessionEvents インターフェイスへの参照を解放するまでクライアントは UnregisterAudioSessionNotification を呼び出さず、クライアントが UnregisterAudioSessionNotification を呼び出すまでセッションマネージャーは IAudioSessionEvents インターフェイスへの参照を解放しません。AddRef メソッドと Release メソッドの詳細については、Windows SDK ドキュメントの IUnknown インターフェイスに関する説明を参照してください。

UnregisterAudioSessionNotification メソッドを呼び出すコード例については、レガシーオーディオアプリケーションのオーディオイベントを参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IAudioSessionControl "{F4B1A599-7266-4319-A8CA-E70ACB11E8CD}"
#usecom global IAudioSessionControl IID_IAudioSessionControl "{}"
#comfunc global IAudioSessionControl_GetState                            3 var
#comfunc global IAudioSessionControl_GetDisplayName                      4 var
#comfunc global IAudioSessionControl_SetDisplayName                      5 wstr,var
#comfunc global IAudioSessionControl_GetIconPath                         6 var
#comfunc global IAudioSessionControl_SetIconPath                         7 wstr,var
#comfunc global IAudioSessionControl_GetGroupingParam                    8 var
#comfunc global IAudioSessionControl_SetGroupingParam                    9 var,var
#comfunc global IAudioSessionControl_RegisterAudioSessionNotification    10 sptr
#comfunc global IAudioSessionControl_UnregisterAudioSessionNotification  11 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。