Freigeben über


IAudioEffectsChangedNotificationClient-Schnittstelle (audioclient.h)

Eine Rückrufschnittstelle ermöglicht Es Anwendungen, Benachrichtigungen zu empfangen, wenn sich die Liste der Audioeffekte für den zugehörigen Audiostream ändert oder wenn sich die Ressourcen ändern, die zum Aktivieren eines Effekts erforderlich sind, d. h. wenn sich der Wert des Felds canSetState des zugeordneten AUDIO_EFFECT ändert.

Vererbung

Die IAudioEffectsChangedNotificationClient-Schnittstelle erbt von der IUnknown-Schnittstelle.

Methoden

Die IAudioEffectsChangedNotificationClient-Schnittstelle verfügt über diese Methoden.

 
IAudioEffectsChangedNotificationClient::OnAudioEffectsChanged

Wird vom System aufgerufen, wenn sich die Liste der Audioeffekte ändert oder die zum Aktivieren eines Effekts erforderlichen Ressourcen geändert werden.

Hinweise

Registrieren Sie die Rückrufschnittstelle, indem Sie IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback aufrufen.

Beispiele

Im folgenden Codebeispiel wird eine Klasse veranschaulicht, die IAudioEffectsChangedNotificationClient implementiert, um Benachrichtigungen zu empfangen, wenn sich die Liste der Audioeffekte ändert oder die zum Aktivieren eines Effekts erforderlichen Ressourcen geändert werden. Im Rückruf OnAudioStreamEffectsChanged ruft das Beispiel GetAudioEffects auf, um die aktuelle Liste der Effekte abzurufen.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Build 22000
Kopfzeile audioclient.h

Weitere Informationen

AUDIO_EFFECT

IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback