IAudioVolumeDuckNotification
COM公式ドキュメント
IAudioVolumeDuckNotification インターフェイスは、ストリーム減衰の変化に関する通知をシステムが送信するために使用されます。ストリーム減衰(ダッキング)は Windows 7 で導入された機能で、新しい通信ストリームが開かれたときに、システムが通信用でないストリームの音量を調整するものです。この機能の詳細については、「Default Ducking Experience」を参照してください。
解説(Remarks)
アプリケーションがシステムによる減衰動作をオプトアウトする必要がある場合は、IAudioSessionControl2::SetDuckingPreference を呼び出し、その設定を指定する必要があります。
他の WASAPI インターフェイスが WASAPI システムコンポーネントによって実装されているのとは異なり、IAudioVolumeDuckNotification インターフェイスは、カスタムのストリーム減衰動作を提供するためにアプリケーション側で実装します。イベント通知を受け取るには、アプリケーションが IAudioSessionManager2::RegisterDuckNotification メソッドに、アプリケーションが実装した IAudioVolumeDuckNotification へのポインターを渡します。
アプリケーションが IAudioVolumeDuckNotification インターフェイスを登録すると、セッションマネージャーはダッキング通知を送信する必要が生じたときに IAudioVolumeDuckNotification の実装を呼び出します。アプリケーションは、インターフェイスのメソッドを介したコールバックの形式でイベント通知を受け取ります。
アプリケーションが通知を受け取る必要がなくなったら、IAudioSessionManager2::UnregisterDuckNotification メソッドを呼び出します。UnregisterDuckNotification メソッドは、アプリケーションが以前に登録した IAudioVolumeDuckNotification インターフェイスの登録を解除します。
アプリケーションは、イベントコールバックの実行中に通知コールバックの登録または登録解除を行ってはなりません。
詳細については、「Implementation Considerations for Ducking Notifications」を参照してください。
例
次のサンプルコードは、IAudioVolumeDuckNotification インターフェイスの実装例を示しています。
class CDuckNotification : public IAudioVolumeDuckNotification
{
LONG _Cref;
HWND m_hwndMain;
CDuckNotification (HWND hWnd) :
_Cref(1),
m_hwndMain (hWnd)
{}
HRESULT OnVolumeDuckNotification (LPCWSTR SessionID, UINT32 CommunicationSessionCount)
{
PostMessage(m_hwndMain, WM_VOLUME_DUCK, 0, 0);
return S_OK;
}
HRESULT OnVolumeUnduckNotification (LPCWSTR SessionID)
{
PostMessage(m_hwndMain, WM_VOLUME_UNDUCK, 0, 0);
return S_OK;
}
protected:
~CDuckNotification() {}
public:
HRESULT QueryInterface (REFIID Iid, void** ReturnValue)
{
if (ReturnValue == NULL)
{
return E_POINTER;
}
*ReturnValue = NULL;
if (iid == IID_IUnknown)
{
*ReturnValue = static_cast<IUnknown *>(static_cast<IAudioVolumeDuckNotification *>(this));
AddRef();
}
else if (iid == __uuidof(IAudioVolumeDuckNotification))
{
*ReturnValue = static_cast<IAudioVolumeDuckNotification *>(this);
AddRef();
}
else
{
return E_NOINTERFACE;
}
return S_OK;
}
ULONG AddRef()
{
return InterlockedIncrement(&_Cref);
}
ULONG Release()
{
LONG ref = InterlockedDecrement(&_Cref);
if (ref == 0)
{
delete this;
}
return 0;
}
};
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
OnVolumeDuckNotification メソッドは、システムによる保留中のダッキングイベントに関する通知を送信します。
| sessionID | LPWSTR | in | 自動ダッキングイベントを発生させた通信セッションのセッションインスタンス識別子を格納した文字列です。セッションインスタンス識別子を取得するには、IAudioSessionControl2::GetSessionInstanceIdentifier を呼び出します。 |
| countCommunicationSessions | DWORD | in | アクティブな通信セッションの数です。n 個のセッションがある場合、セッションには 0 から n–1 までの番号が付けられます。 |
戻り値
メソッドが成功した場合は S_OK を返します。
解説(Remarks)
アプリケーションが IAudioVolumeDuckNotification インターフェイスの実装を IAudioSessionManager2::RegisterDuckNotification を呼び出して登録した後、セッションマネージャーはダッキングの開始に関する通知を送信したいときに OnVolumeDuckNotification を呼び出します。アプリケーションはコールバックの形式でイベント通知を受け取ります。
OnVolumeUnduckNotification メソッドは、システムによる保留中のアンダッキングイベントに関する通知を送信します。
| sessionID | LPWSTR | in | ダッキングを開始した、終了中の通信セッションのセッションインスタンス識別子を格納した文字列です。セッションインスタンス識別子を取得するには、IAudioSessionControl2::GetSessionInstanceIdentifier を呼び出します。 |
戻り値
メソッドが成功した場合は S_OK を返します。
解説(Remarks)
アプリケーションが IAudioVolumeDuckNotification インターフェイスの実装を IAudioSessionManager2::RegisterDuckNotification を呼び出して登録した後、セッションマネージャーはダッキングの終了に関する通知を送信したいときに OnVolumeUnduckNotification を呼び出します。アプリケーションはコールバックの形式でイベント通知を受け取ります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAudioVolumeDuckNotification "{C3B284D4-6D39-4359-B3CF-B56DDB3BB39C}"
#usecom global IAudioVolumeDuckNotification IID_IAudioVolumeDuckNotification "{}"
#comfunc global IAudioVolumeDuckNotification_OnVolumeDuckNotification 3 wstr,int
#comfunc global IAudioVolumeDuckNotification_OnVolumeUnduckNotification 4 wstr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。