IAudioSessionControl2
COM公式ドキュメント
IAudioSessionControl2 インターフェイスは、クライアントがオーディオセッションに関する情報を取得するために使用できます。
解説(Remarks)
このインターフェイスは、Windows 7 で追加された新機能であるストリーム減衰(ダッキング)のカスタム実装をサポートします。メディアストリームを再生しているアプリケーションは、既定の通信デバイスで新しい通信ストリームが開かれたときに、その動作を変更できます。たとえば、新しい通信ストリームが開いている間、元のメディアストリームを一時停止することができます。この機能の詳細については、既定のダッキングエクスペリエンスを参照してください。
アプリケーションは、このインターフェイスを使用して次のタスクを実行できます。
- システムが提供する既定のストリーム減衰エクスペリエンスをオプトアウトすることを指定します。
- ストリームに関連付けられているオーディオセッション識別子を取得します。この識別子は通知の登録時に必要です。アプリケーションは、システムからダッキング通知を受け取るように自身を登録できます。
- オーディオセッションに関連付けられているストリームがシステムサウンドかどうかを確認します。
例
次のサンプルコードは、IAudioSessionControl2 インターフェイスへの参照を取得し、そのメソッドを呼び出して、オーディオセッションに関連付けられているストリームがシステムサウンドかどうかを判別する方法を示します。
HRESULT SetDuckingForSystemSounds()
{
HRESULT hr = S_OK;
IMMDevice* pDevice = NULL;
IMMDeviceEnumerator* pEnumerator = NULL;
IAudioSessionControl* pSessionControl = NULL;
IAudioSessionControl2* pSessionControl2 = NULL;
IAudioSessionManager* pSessionManager = NULL;
CHECK_HR( hr = CoInitialize(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 audio client.
CHECK_HR( hr = pDevice->Activate(
__uuidof(IID_IAudioSessionManager), CLSCTX_ALL,
NULL, (void**)&pSessionManager));
// Get a reference to the session manager.
CHECK_HR( hr = pSessionManager->GetAudioSessionControl (GUID_NULL, FALSE, &pSessionControl));
// Get the extended session control interface pointer.
CHECK_HR( hr = pSessionControl->QueryInterface(
__uuidof(IAudioSessionControl2), (void**) &pSessionControl2));
// Check whether this is a system sound.
CHECK_HR( hr = pSessionControl2->IsSystemSoundsSession());
// If it is a system sound, opt out of the default
// stream attenuation experience.
CHECK_HR( hr = pSessionControl2->SetDuckingPreference(TRUE));
done:
// Clean up.
SAFE_RELEASE(pSessionControl2);
SAFE_RELEASE(pSessionControl);
SAFE_RELEASE(pEnumerator);
SAFE_RELEASE(pDevice);
return hr;
}
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetSessionIdentifier メソッドは、オーディオセッション識別子を取得します。
| pRetVal | LPWSTR* | out | オーディオセッション識別子を受け取る、null で終わるワイド文字列のアドレスへのポインター。この文字列はこのメソッドによって割り当てられ、呼び出し側が CoTaskMemFree を呼び出して解放する必要があります。CoTaskMemFree の詳細については、Windows SDK のドキュメントを参照してください。 |
戻り値
メソッドが成功すると S_OK を返します。 失敗した場合に返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| pRetVal が NULL です。 | |
| 既定のオーディオデバイスでオーディオセッションが切断されています。 |
解説(Remarks)
各オーディオセッションは識別子文字列によって識別されます。このセッション識別子文字列は、すべてのインスタンスにわたって一意ではありません。アプリケーションのインスタンスが 2 つ再生されている場合、両方のインスタンスは同じセッション識別子を持ちます。GetSessionIdentifier によって取得される識別子は、すべてのセッションにわたって一意であるセッションインスタンス識別子とは異なります。セッションインスタンス識別子を取得するには、IAudioSessionControl2::GetSessionInstanceIdentifier を呼び出します。
GetSessionIdentifier は、既定のデバイスでセッションが切断されているかどうかを確認します。このメソッドは、デバイスのオーディオクライアントによってキャッシュされている識別子文字列を取得します。セッション識別子が見つからない場合、このメソッドはオーディオエンジンから取得します。
GetSessionInstanceIdentifier メソッドは、オーディオセッションインスタンスの識別子を取得します。
| pRetVal | LPWSTR* | out | オーディオセッションの特定のインスタンスの識別子を受け取る、null で終わるワイド文字列のアドレスへのポインター。この文字列はこのメソッドによって割り当てられ、呼び出し側が CoTaskMemFree を呼び出して解放する必要があります。CoTaskMemFree の詳細については、Windows SDK のドキュメントを参照してください。 |
戻り値
メソッドが成功すると S_OK を返します。 失敗した場合に返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| pRetVal が NULL です。 | |
| 既定のオーディオデバイスでオーディオセッションが切断されています。 |
解説(Remarks)
各オーディオセッションインスタンスは、一意の文字列によって識別されます。この文字列はオーディオセッションの特定のインスタンスを表し、セッション識別子とは異なり、すべてのインスタンスにわたって一意です。アプリケーションのインスタンスが 2 つ再生されている場合、それらは異なるセッションインスタンス識別子を持ちます。GetSessionInstanceIdentifier によって取得される識別子は、すべてのセッションインスタンスで共有されるセッション識別子とは異なります。セッション識別子を取得するには、IAudioSessionControl2::GetSessionIdentifier を呼び出します。
GetSessionInstanceIdentifier は、既定のデバイスでセッションが切断されているかどうかを確認します。このメソッドは、デバイスのオーディオクライアントによってキャッシュされている識別子文字列を取得します。セッションインスタンス識別子が見つからない場合、このメソッドはオーディオエンジンから取得します。セッションインスタンス識別子を取得するサンプルコードについては、通信デバイスからのダッキングイベントの取得を参照してください。
GetProcessId メソッドは、オーディオセッションのプロセス識別子を取得します。
| pRetVal | DWORD* | out | オーディオセッションのプロセス識別子を受け取る DWORD 変数へのポインター。 |
戻り値
メソッドが成功すると S_OK を返します。 失敗した場合に返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| pRetVal が NULL です。 | |
|
セッションが複数のプロセスにまたがっています。この場合、pRetVal はセッションを作成したプロセスの最初の識別子を受け取ります。この値を使用するには、次の定義を含めます。
|
| 既定のオーディオデバイスでオーディオセッションが切断されています。 |
解説(Remarks)
このメソッドは、アプリケーションが pRetVal で渡した値を上書きします。
GetProcessId は、既定のデバイスでオーディオセッションが切断されているかどうか、またはセッションが別のストリームに切り替わったかどうかを確認します。ストリームの切り替えが発生した場合、このメソッドは新しいストリームの状態情報をセッションに転送します。状態情報には、ボリュームコントロール、メタデータ情報(表示名、アイコンパス)、およびセッションのプロパティストアが含まれます。
IsSystemSoundsSession メソッドは、セッションがシステムサウンドセッションかどうかを示します。
戻り値
返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻りコード | 説明 |
|---|---|
| セッションはシステムサウンドセッションです。 | |
| セッションはシステムサウンドセッションではありません。 |
SetDuckingPreference メソッドは、システムが提供する既定のストリーム減衰エクスペリエンス(自動ダッキング)を有効または無効にします。
| optOut | BOOL | in | システムの自動ダッキングを有効または無効にする BOOL 変数。 |
戻り値
メソッドが成功すると S_OK を返します。 失敗した場合に返される可能性のあるコードには、次の表に示す値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 既定のオーディオデバイスでオーディオセッションが切断されています。 |
解説(Remarks)
既定では、システムが通信セッションを開始し、既定の通信デバイスで新しい通信ストリームを受信すると、システムは現在再生中のすべてのサウンドのボリュームを調整します。この機能の詳細については、通信デバイスの使用を参照してください。
アプリケーションが optOut に TRUE を渡すと、システムは既定のダッキングエクスペリエンスを無効にします。詳細については、既定のダッキングエクスペリエンスの無効化を参照してください。
カスタム実装を提供するには、アプリケーションは通信ストリームを開いたり閉じたりするときにシステムから通知を受け取る必要があります。通知を受け取るには、アプリケーションは IAudioSessionManager2::RegisterForDuckNotification を呼び出して自身を登録する前に、このメソッドを呼び出す必要があります。詳細とサンプルコードについては、ダッキングイベントの取得を参照してください。
アプリケーションが optOut に FALSE を渡すと、アプリケーションはシステムが提供する既定のストリーム減衰エクスペリエンスを利用します。
アプリケーションは、ストリームの作成時に SetDuckingPreference を呼び出すことをお勧めします。ただし、このメソッドはセッション中に動的に呼び出して、初期設定を変更することもできます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAudioSessionControl2 "{BFB7FF88-7239-4FC9-8FA2-07C950BE9C6D}" #usecom global IAudioSessionControl2 IID_IAudioSessionControl2 "{}" #comfunc global IAudioSessionControl2_GetSessionIdentifier 12 var #comfunc global IAudioSessionControl2_GetSessionInstanceIdentifier 13 var #comfunc global IAudioSessionControl2_GetProcessId 14 var #comfunc global IAudioSessionControl2_IsSystemSoundsSession 15 #comfunc global IAudioSessionControl2_SetDuckingPreference 16 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IAudioSessionControl2 "{BFB7FF88-7239-4FC9-8FA2-07C950BE9C6D}" #usecom global IAudioSessionControl2 IID_IAudioSessionControl2 "{}" #comfunc global IAudioSessionControl2_GetSessionIdentifier 12 sptr #comfunc global IAudioSessionControl2_GetSessionInstanceIdentifier 13 sptr #comfunc global IAudioSessionControl2_GetProcessId 14 sptr #comfunc global IAudioSessionControl2_IsSystemSoundsSession 15 #comfunc global IAudioSessionControl2_SetDuckingPreference 16 int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。