IAudioSessionNotification
COM公式ドキュメント
IAudioSessionNotification インターフェイスは、オーディオセッションが作成されたときに通知を提供します。
解説(Remarks)
WASAPI システムコンポーネントによって実装される他の WASAPI インターフェイスとは異なり、IAudioSessionNotification インターフェイスはアプリケーション側で実装します。イベント通知を受け取るには、アプリケーションは自身の IAudioSessionNotification 実装へのポインターを IAudioSessionManager2::RegisterSessionNotification メソッドに渡します。
IAudioSessionNotification インターフェイスを登録すると、アプリケーションはインターフェイス内のメソッドを通じてコールバックの形でイベント通知を受け取ります。
アプリケーションが通知を受け取る必要がなくなったら、IAudioSessionManager2::UnregisterSessionNotification メソッドを呼び出します。このメソッドは、アプリケーションが以前に登録した IAudioSessionNotification インターフェイスの登録を解除します。
アプリケーションは、イベントコールバックの実行中に通知コールバックの登録や登録解除を行ってはなりません。
セッション列挙子は、IAudioSessionNotification を通じて報告される新しいセッションを認識していない場合があります。そのため、アプリケーションがオーディオエンドポイントのすべてのセッションを取得するためにセッション列挙子のみに依存している場合、結果が正確でないことがあります。これを回避するには、アプリケーションが手動でリストを管理する必要があります。詳細については、IAudioSessionEnumerator を参照してください。
CoInitializeEx(NULL, COINIT_MULTITHREADED) を呼び出し、マルチスレッドアパートメント (MTA) モデルで COM を初期化していることを確認してください。MTA が初期化されていない場合、アプリケーションはセッションマネージャーからセッション通知を受け取りません。
アプリケーションのユーザーインターフェイスを実行するスレッドは、アパートメントスレッドモデルで初期化する必要があります。
例
次のコード例は、IAudioSessionNotification インターフェイスの実装のサンプルを示しています。
class CSessionNotifications: public IAudioSessionNotification
{
private:
LONG m_cRefAll;
HWND m_hwndMain;
~CSessionManager(){};
public:
CSessionManager(HWND hWnd):
m_cRefAll(1),
m_hwndMain (hWnd)
{}
// IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv)
{
if (IID_IUnknown == riid)
{
AddRef();
*ppvInterface = (IUnknown*)this;
}
else if (__uuidof(IAudioSessionNotification) == riid)
{
AddRef();
*ppvInterface = (IAudioSessionNotification*)this;
}
else
{
*ppvInterface = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG STDMETHODCALLTYPE AddRef()
{
return InterlockedIncrement(&m_cRefAll);
}
ULONG STDMETHODCALLTYPE Release)()
{
ULONG ulRef = InterlockedDecrement(&m_cRefAll);
if (0 == ulRef)
{
delete this;
}
return ulRef;
}
HRESULT OnSessionCreated(IAudioSessionControl *pNewSession)
{
if (pNewSession)
{
PostMessage(m_hwndMain, WM_SESSION_CREATED, 0, 0);
}
}
};
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
OnSessionCreated メソッドは、オーディオセッションが作成されたことを登録済みのプロセスに通知します。
| NewSession | IAudioSessionControl* | in | 作成されたオーディオセッションの IAudioSessionControl インターフェイスへのポインター。 |
戻り値
メソッドが成功した場合、S_OK を返します。
解説(Remarks)
IAudioSessionNotification インターフェイスを登録すると、アプリケーションはインターフェイスのメソッドを通じてコールバックの形でイベント通知を受け取ります。
オーディオエンジンは、デバイスエンドポイント上で新しいセッションがアクティブ化されたときに OnSessionCreated を呼び出します。 このメソッドはセッションマネージャースレッドから呼び出されます。この呼び出しが完了した後もセッションへの参照を保持したい場合は、このメソッドは NewSession パラメーターのセッションへの参照を取得する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAudioSessionNotification "{641DD20B-4D41-49CC-ABA3-174B9477BB08}"
#usecom global IAudioSessionNotification IID_IAudioSessionNotification "{}"
#comfunc global IAudioSessionNotification_OnSessionCreated 3 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。