IAudioSessionManager2
COM公式ドキュメント
IAudioSessionManager2 インターフェイスは、アプリケーションがオーディオデバイスのサブミックスを管理できるようにします。
解説(Remarks)
アプリケーションは、このインターフェイスを使用して次のタスクを実行できます。
- ダッキング通知を受け取るための登録を行う。
- セッションが作成されたときに通知を受け取るための登録を行う。
- インターフェイスポインターの取得に使用したオーディオデバイス上のセッションを列挙する。
このインターフェイスは、Windows 7 の新機能であるストリーム減衰(ダッキング)のカスタム実装をサポートします。メディアストリームを再生しているアプリケーションは、既定の通信デバイス上で新しい通信ストリームが開かれたときに、そのストリームの動作を変えることができます。たとえば、新しい通信ストリームが開いている間、元のメディアストリームを一時停止できます。この機能の詳細については、「Using a Communication Device」を参照してください。
メディアストリームを管理し、カスタムのダッキング実装を提供したいアプリケーションは、セッションイベントが発生したときに通知を受け取るための登録を行う必要があります。ストリーム減衰では、既定の通信デバイス上で通信ストリームが開かれたり閉じられたりしたときに、システムによってセッションイベントが発生します。詳細については、「Providing a Custom Ducking Behavior」を参照してください。
例
次のコード例は、オーディオデバイスの IAudioSessionManager2 インターフェイスへの参照を取得する方法を示しています。
HRESULT CreateSessionManager(IAudioSessionManager2** ppSessionManager)
{
HRESULT hr = S_OK;
IMMDevice* pDevice = NULL;
IMMDeviceEnumerator* pEnumerator = NULL;
IAudioSessionManager2* pSessionManager = NULL;
// Create the device enumerator.
CHECK_HR( hr = CoCreateInstance(
__uuidof(MMDeviceEnumerator),
NULL, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnumerator));
// Get the default audio device.
CHECK_HR( hr = pEnumerator->GetDefaultAudioEndpoint(
eRender, eConsole, &pDevice));
// Get the session manager.
CHECK_HR( hr = pDevice->Activate(
__uuidof(IAudioSessionManager2), CLSCTX_ALL,
NULL, (void**)&pSessionManager));
// Return the pointer to the caller.
*(ppSessionManager) = pSessionManager;
(*ppSessionManager)->AddRef();
done:
// Clean up.
SAFE_RELEASE(pSessionManager);
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pDevice);
return hr;
}
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetSessionEnumerator メソッドは、オーディオセッション列挙子オブジェクトへのポインターを取得します。
| SessionEnum | IAudioSessionEnumerator** | out | クライアントがオーディオデバイス上のオーディオセッションを列挙するために使用できる、セッション列挙子オブジェクトの IAudioSessionEnumerator インターフェイスへのポインターを受け取ります。このメソッドを通じて、呼び出し側はインターフェイスへのカウント付き参照を取得します。呼び出し側は、インターフェイスが不要になったときに、そのインターフェイスの Release メソッドを呼び出して解放する責任があります。 |
戻り値
メソッドが成功した場合、S_OK を返します。
解説(Remarks)
セッションマネージャーは、オーディオエンジンに問い合わせることで、オーディオデバイス上でアクティブなオーディオセッションのコレクションを保持します。GetSessionEnumerator は、コレクション内の各セッションに対してセッションコントロールを作成します。列挙されたコレクション内のセッションの IAudioSessionControl インターフェイスへの参照を取得するには、アプリケーションは IAudioSessionEnumerator::GetSession を呼び出す必要があります。コード例については、「IAudioSessionEnumerator Interface」を参照してください。
セッション列挙子は、IAudioSessionNotification を通じて報告される新しいセッションを認識していない場合があります。そのため、アプリケーションがオーディオエンドポイントのすべてのセッションを取得するためにセッション列挙子だけに依存している場合、結果が正確でないことがあります。これを回避するには、アプリケーションが手動でリストを保持する必要があります。詳細については、「IAudioSessionEnumerator」を参照してください。
RegisterSessionNotification メソッドは、セッションが作成されたときに通知を受け取るようにアプリケーションを登録します。
| SessionNotification | IAudioSessionNotification* | in | アプリケーションによる IAudioSessionNotification インターフェイスの実装へのポインター。メソッド呼び出しが成功すると、アプリケーションの IAudioSessionNotification インターフェイスに対して AddRef メソッドが呼び出されます。 |
戻り値
メソッドが成功した場合、S_OK を返します。 失敗した場合、返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| SessionNotification が NULL です。 | |
| メモリ不足のため、内部オブジェクトを作成できませんでした。 |
解説(Remarks)
アプリケーションは、IAudioSessionNotification インターフェイスのメソッドを通じて、セッションが作成されたときに通知を受け取るように登録できます。アプリケーションは IAudioSessionNotification インターフェイスを実装します。このインターフェイスで定義されているメソッドは、セッションが作成されたときにシステムからコールバックを受け取ります。このインターフェイスを実装する方法を示すコード例については、
「IAudioSessionNotification Interface」を参照してください。
通知の受け取りを開始するには、アプリケーションは IAudioSessionManager2::RegisterSessionNotification メソッドを呼び出して、その IAudioSessionNotification インターフェイスを登録します。アプリケーションが通知を必要としなくなったときは、IAudioSessionManager2::UnregisterSessionNotification メソッドを呼び出して登録を削除します。
通知の受け取りを開始するには、IAudioSessionEnumerator::GetCount を呼び出す必要があります。セッション列挙 API は、アプリケーションが既存のセッションのリストを最初に取得するまで、新しいセッション通知を破棄します。これは、セッション API を使用するアプリケーションの起動中にセッション通知が到着したときに発生し得る競合状態を防ぐためです。GetCount を呼び出すと、列挙 API がセッション通知の送信を開始するようになります。
CoInitializeEx(NULL, COINIT_MULTITHREADED) を呼び出して、マルチスレッドアパートメント(MTA)モデルで COM を初期化していることを確認してください。MTA が初期化されていない場合、アプリケーションはセッションマネージャーからセッション通知を受け取りません。
アプリケーションのユーザーインターフェイスを実行するスレッドは、アパートメントスレッドモデルで初期化する必要があります。
UnregisterSessionNotification メソッドは、セッションが作成されたときに通知を受け取るための登録を削除します。
| SessionNotification | IAudioSessionNotification* | in | アプリケーションによる IAudioSessionNotification インターフェイスの実装へのポインター。通知を登録するために IAudioSessionManager2::RegisterSessionNotification の前回の呼び出しでセッションマネージャーに指定したものと同じインターフェイスポインターを渡します。 UnregisterSessionNotification メソッドが成功すると、アプリケーションの IAudioSessionNotification インターフェイスに対して Release メソッドが呼び出されます。 |
戻り値
メソッドが成功した場合、S_OK を返します。 失敗した場合、返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| SessionNotification が NULL です。 |
解説(Remarks)
アプリケーションは、通知を受け取る必要がなくなったときにこのメソッドを呼び出します。UnregisterSessionNotification メソッドは、アプリケーションが以前に IAudioSessionControl::RegisterAudioSessionNotification メソッドを呼び出してセッションマネージャーに登録した IAudioSessionNotification インターフェイスの登録を削除します。
RegisterDuckNotification メソッドは、ダッキング通知を受け取るために、アプリケーションをセッションマネージャーに登録します。
| sessionID | LPWSTR | in | セッションインスタンス識別子を含む null で終わる文字列へのポインター。メディアストリームを再生しており、カスタムのストリーム減衰またはダッキング動作を提供したいアプリケーションは、自身のセッションインスタンス識別子を渡します。詳細については、「解説」を参照してください。 ストリームを変更したくないが、すべてのダッキング通知を取得したいその他のアプリケーションは、NULL を渡す必要があります。 |
| duckNotification | IAudioVolumeDuckNotification* | in | アプリケーションによる IAudioVolumeDuckNotification インターフェイスの実装へのポインター。オーディオシステムによってダッキングイベントが発生し、登録済みのアプリケーションに通知が送信されると、この実装が呼び出されます。 |
戻り値
メソッドが成功した場合、S_OK を返します。 失敗した場合、返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| duckNotification が NULL です。 | |
| メモリ不足のため、内部オブジェクトを作成できませんでした。 |
解説(Remarks)
ストリーム減衰(ダッキング)は、Windows 7 の新機能です。メディアストリームを再生しているアプリケーションは、既定の通信デバイス上で新しい通信ストリームが開かれたときに、そのストリームの動作を変えることができます。たとえば、新しい通信ストリームが開いている間、元のメディアストリームを一時停止できます。このストリーム減衰のカスタム実装を提供するには、アプリケーションは IAudioSessionControl::SetDuckingPreference を呼び出して既定のストリーム減衰動作をオプトアウトし、その後、セッションイベントが発生したときに通知を受け取るように自身を登録できます。ストリーム減衰では、既定の通信デバイス上で通信ストリームが開かれたり閉じられたりしたときに、システムによってセッションイベントが発生します。この機能の詳細については、「Getting Ducking Events」を参照してください。
通知の受け取りを開始するには、アプリケーションは RegisterDuckNotification メソッドを呼び出して、その IAudioVolumeDuckNotification インターフェイスをセッションマネージャーに登録します。アプリケーションが通知を必要としなくなったときは、IAudioSessionManager2::UnregisterDuckNotification メソッドを呼び出して登録を削除します。
アプリケーションは、IAudioVolumeDuckNotification インターフェイスのメソッドを通じて、ダッキングイベントに関する通知を受け取ります。アプリケーションは IAudioVolumeDuckNotification を実装します。登録呼び出しが成功すると、セッションイベントが発生したときにシステムがこのインターフェイスのメソッドを呼び出します。
UnregisterDuckNotification メソッドは、通知を受け取るためにアプリケーションが以前に行った登録を削除します。
| duckNotification | IAudioVolumeDuckNotification* | in | アプリケーションによって実装された IAudioVolumeDuckNotification インターフェイスへのポインター。IAudioSessionManager2::RegisterDuckNotification メソッドの前回の呼び出しでセッションマネージャーに指定したものと同じインターフェイスポインターを渡します。UnregisterDuckNotification メソッドが成功すると、アプリケーションの IAudioVolumeDuckNotification インターフェイスに対して Release メソッドが呼び出されます。 |
戻り値
メソッドが成功した場合、S_OK を返します。 失敗した場合、返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| duckNotification が NULL です。 |
解説(Remarks)
アプリケーションは、通知を受け取る必要がなくなったときにこのメソッドを呼び出します。UnregisterDuckNotification メソッドは、アプリケーションが以前に IAudioSessionManager2::RegisterDuckNotification メソッドを呼び出してセッションマネージャーに登録した IAudioVolumeDuckNotification インターフェイスの登録を削除します。
アプリケーションが UnregisterDuckNotification を呼び出した後は、保留中のイベントはアプリケーションに報告されません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAudioSessionManager2 "{77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F}"
#usecom global IAudioSessionManager2 IID_IAudioSessionManager2 "{}"
#comfunc global IAudioSessionManager2_GetSessionEnumerator 5 sptr
#comfunc global IAudioSessionManager2_RegisterSessionNotification 6 sptr
#comfunc global IAudioSessionManager2_UnregisterSessionNotification 7 sptr
#comfunc global IAudioSessionManager2_RegisterDuckNotification 8 wstr,sptr
#comfunc global IAudioSessionManager2_UnregisterDuckNotification 9 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。