IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback メソッド (audioclient.h)
IAudioEffectsChangedNotificationClient インターフェイスを登録します。 このコールバック インターフェイスを使用すると、アプリケーションは、オーディオ効果の一覧が変更されたとき、または効果の変更を有効にするために必要なリソース (つまり、関連付けられているAUDIO_EFFECTの canSetState フィールドの値が変更されたときに) 通知を受け取ることができます。
構文
HRESULT RegisterAudioEffectsChangedNotificationCallback(
IAudioEffectsChangedNotificationClient *client
);
パラメーター
client
登録する IAudioEffectsChangedNotificationClient インターフェイス。
戻り値
値 | 説明 |
---|---|
S_OK | Success |
AUDCLNT_E_DEVICE_INVALIDATED | 関連付けられているオーディオ ストリームが破棄されました。 |
注釈
UnregisterAudioEffectsChangedNotificationCallback を呼び出して、コールバック インターフェイスの登録を解除します。
例
次のコード例は、オーディオ効果の一覧が変更されたとき、または効果の変更を有効にするために必要なリソースが変更されたときに通知を受け取る IAudioEffectsChangedNotificationClient を実装するクラスを示しています。 OnAudioStreamEffectsChanged コールバックで、この例では GetAudioEffects を呼び出して、現在の効果の一覧を取得します。
class AudioEffectsChangedHandler :
public winrt::implements<AudioEffectsChangedHandler, IAudioEffectsChangedNotificationClient>
{
public:
AudioEffectsChangedHandler(_In_ IAudioClient *client) : m_client(client){}
STDMETHOD(OnAudioEffectsChanged)()
{
OnAudioStreamEffectsChanged(m_client.get());
return S_OK;
}
private:
wil::com_ptr_nothrow<IAudioClient> m_client;
};
wil::com_ptr_nothrow<IAudioEffectsChangedNotificationClient> g_effectsChangedHandler;
HRESULT RegisterAudioStreamEffectsChangedEvent(_In_ IAudioClient *client)
{
if (!g_effectsChangedHandler)
{
wil::com_ptr_nothrow<IAudioEffectsManager> audioEffectsManager;
RETURN_IF_FAILED(client->GetService(IID_PPV_ARGS(&audioEffectsManager)));
// Register for the audio effects changed notification
g_effectsChangedHandler = winrt::make<AudioEffectsChangedHandler>(client).get();
RETURN_IF_NULL_ALLOC(g_effectsChangedHandler);
return audioEffectsManager->RegisterAudioEffectsChangedNotificationCallback(
g_effectsChangedHandler.get());
}
return S_OK;
}
HRESULT UnregisterAudioStreamEffectsChangedEvent(_In_ IAudioClient *client)
{
if (g_effectsChangedHandler != nullptr)
{
wil::com_ptr_nothrow<IAudioEffectsManager> audioEffectsManager;
RETURN_IF_FAILED(client->GetService(IID_PPV_ARGS(&audioEffectsManager)));
// Unregister from the audio effects changed notification
return audioEffectsManager->UnregisterAudioEffectsChangedNotificationCallback(
g_effectsChangedHandler.get());
}
return S_OK;
}
HRESULT OnAudioStreamEffectsChanged(_In_ IAudioClient *client)
{
// Re-query the list of effects since there was some change
wil::com_ptr_nothrow<IAudioEffectsManager> audioEffectsManager;
RETURN_IF_FAILED(client->GetService(IID_PPV_ARGS(&audioEffectsManager)));
wil::unique_cotaskmem_array_ptr<AUDIO_EFFECT> effects;
UINT32 numEffects;
RETURN_IF_FAILED(audioEffectsManager->GetAudioEffects(&effects, &numEffects));
for (UINT32 i = 0; i < numEffects; i++)
{
// Here the app can check which effects are still enabled, and check if there are new
// effects that now can be enabled.
// As an example, the following code enables any effect that can be enabled, if it is not
// already enabled.
if (effects[i].canSetState && effects[i].state == AUDIO_EFFECT_STATE_OFF)
{
HRESULT hr = audioEffectsManager->SetAudioEffectState(effects[i].id, AUDIO_EFFECT_STATE_ON));
if (hr == AUDCLNT_E_EFFECT_NOT_AVAILABLE || hr == AUDCLNT_E_EFFECT_STATE_READ_ONLY)
{
hr = S_OK;
}
RETURN_IF_FAILED(hr);
}
}
return S_OK;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows ビルド 22000 |
Header | audioclient.h |