IAudioSessionEnumerator
COM公式ドキュメント
IAudioSessionEnumerator インターフェイスは、オーディオデバイス上のオーディオセッションを列挙します。
解説(Remarks)
アプリケーションが新しいセッションの作成時に通知を受け取りたい場合は、IAudioSessionNotification の実装をセッションマネージャーに登録する必要があります。登録に成功すると、セッションマネージャーはコールバックの形式でセッション作成通知をアプリケーションに送信します。これらの通知には、新しく作成されたセッションの IAudioSessionControl ポインターへの参照が含まれます。
セッション列挙子は、各セッションの IAudioSessionControl ポインターへの参照を保持することで、現在のセッションの一覧を維持します。ただし、セッション列挙子は IAudioSessionNotification を通じて報告される新しいセッションを認識できない場合があります。その場合、アプリケーションはセッションの部分的な一覧にしかアクセスできません。これは、セッション列挙子が初期化される前に(コールバック内の)IAudioSessionControl ポインターが解放された場合に発生する可能性があります。したがって、アプリケーションがオーディオエンドポイントの完全なセッションの集合を必要とする場合は、アプリケーション自身が独自の一覧を維持する必要があります。
セッション通知を受け取り、現在のセッションの一覧を管理するには、アプリケーションは次の手順を実行する必要があります。
- 非 UI スレッドで
CoInitializeEx(NULL, COINIT_MULTITHREADED)を呼び出して、マルチスレッドアパートメント (MTA) モデルで COM を初期化します。MTA が初期化されていない場合、アプリケーションはセッションマネージャーからセッション通知を受け取りません。注意 アプリケーションのユーザーインターフェイスを実行するスレッドは、アパートメントスレッドモデルで初期化する必要があります。 - オーディオエンドポイントデバイスから IAudioSessionManager2 インターフェイスをアクティブ化します。iid パラメーターに IID_IAudioSessionManager2 を設定して IMMDevice::Activate を呼び出します。この呼び出しにより、ppInterface パラメーターでセッションマネージャーの IAudioSessionManager2 インターフェイスへの参照を受け取ります。
- コールバック動作を提供するために IAudioSessionNotification インターフェイスを実装します。
- IAudioSessionManager2::RegisterSessionNotification を呼び出して、アプリケーションの IAudioSessionNotification の実装を登録します。
- IAudioSessionManager2::GetSessionEnumerator を呼び出して、セッション列挙子オブジェクトを作成および初期化します。このメソッドは、エンドポイントで利用可能な現在のセッションの一覧を生成し、まだ存在しない場合は一覧内の各セッションの IAudioSessionControl ポインターを追加します。
- 前の手順で返された IAudioSessionEnumerator インターフェイスを使用して、セッションの一覧を取得および列挙します。各セッションのセッションコントロールは、IAudioSessionEnumerator::GetSession を呼び出すことで取得できます。参照カウントを維持するために、各セッションコントロールに対して AddRef を呼び出すようにしてください。
- アプリケーションがセッション作成通知を受け取ったら、新しいセッションの IAudioSessionControl ポインター(IAudioSessionNotification::OnSessionCreated で受け取ったもの)を既存のセッションの一覧に追加します。
セッションコントロールは、アプリケーションが一覧内のセッションコントロールへの参照を保持している限り有効です。
Examples
次のコード例は、セッション列挙子オブジェクトを作成し、その後セッションを列挙する方法を示しています。
HRESULT EnumSessions(IAudioSessionManager2* pSessionManager)
{
if (!pSessionManager)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
int cbSessionCount = 0;
LPWSTR pswSession = NULL;
IAudioSessionEnumerator* pSessionList = NULL;
IAudioSessionControl* pSessionControl = NULL;
// Get the current list of sessions.
CHECK_HR( hr = pSessionManager->GetSessionEnumerator(&pSessionList));
// Get the session count.
CHECK_HR( hr = pSessionList->GetCount(&cbSessionCount));
for (int index = 0 ; index < cbSessionCount ; index++)
{
CoTaskMemFree(pswSession);
SAFE_RELEASE(pSessionControl);
// Get the <n>th session.
CHECK_HR(hr = pSessionList->GetSession(index, &pSessionControl));
CHECK_HR(hr = pSessionControl->GetDisplayName(&pswSession));
wprintf_s(L"Session Name: %s\n", pswSession);
}
done:
CoTaskMemFree(pswSession);
SAFE_RELEASE(pSessionControl);
SAFE_RELEASE(pSessionList);
return hr;
}
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetCount メソッドは、オーディオデバイス上で開かれているオーディオセッションの総数を取得します。
| SessionCount | INT* | out | オーディオセッションの総数を受け取ります。 |
戻り値
メソッドが成功した場合は S_OK を返します。
GetSession メソッドは、オーディオセッション番号で指定されたオーディオセッションを取得します。
| SessionCount | INT | in | セッション番号。n 個のセッションがある場合、セッションには 0 から n – 1 までの番号が付けられます。セッションの数を取得するには、IAudioSessionEnumerator::GetCount メソッドを呼び出します。 |
| Session | IAudioSessionControl** | out | セッション列挙子が維持するコレクション内のセッションオブジェクトの IAudioSessionControl インターフェイスへのポインターを受け取ります。呼び出し元はインターフェイスポインターを解放する必要があります。 |
戻り値
メソッドが成功した場合は S_OK を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAudioSessionEnumerator "{E2F5BB11-0570-40CA-ACDD-3AA01277DEE8}" #usecom global IAudioSessionEnumerator IID_IAudioSessionEnumerator "{}" #comfunc global IAudioSessionEnumerator_GetCount 3 var #comfunc global IAudioSessionEnumerator_GetSession 4 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IAudioSessionEnumerator "{E2F5BB11-0570-40CA-ACDD-3AA01277DEE8}" #usecom global IAudioSessionEnumerator IID_IAudioSessionEnumerator "{}" #comfunc global IAudioSessionEnumerator_GetCount 3 sptr #comfunc global IAudioSessionEnumerator_GetSession 4 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。