Partager via


Interface IAudioEffectsChangedNotificationClient (audioclient.h)

Une interface de rappel permet aux applications de recevoir des notifications lorsque la liste des effets audio pour le flux audio associé change ou lorsque les ressources nécessaires pour activer un effet changent, c’est-à-dire lorsque la valeur du champ canSetState du AUDIO_EFFECT associé change .

Héritage

L’interface IAudioEffectsChangedNotificationClient hérite de l’interface IUnknown.

Méthodes

L’interface IAudioEffectsChangedNotificationClient contient ces méthodes.

 
IAudioEffectsChangedNotificationClient ::OnAudioEffectsChanged

Appelé par le système lorsque la liste des effets audio change ou que les ressources nécessaires pour activer un effet changent.

Remarques

Inscrivez l’interface de rappel en appelant IAudioEffectsManager ::RegisterAudioEffectsChangedNotificationCallback.

Exemples

L’exemple de code suivant illustre une classe qui implémente IAudioEffectsChangedNotificationClient pour recevoir des notifications lorsque la liste des effets audio change ou que les ressources nécessaires pour activer un effet changent. Dans le rappel OnAudioStreamEffectsChanged , l’exemple appelle GetAudioEffects pour obtenir la liste actuelle des effets.

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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows Build 22000
En-tête audioclient.h

Voir aussi

AUDIO_EFFECT

IAudioEffectsManager ::RegisterAudioEffectsChangedNotificationCallback