Bagikan melalui


Antarmuka IAudioEffectsChangedNotificationClient (audioclient.h)

Antarmuka panggilan balik memungkinkan aplikasi untuk menerima pemberitahuan ketika daftar efek audio untuk aliran audio terkait berubah atau ketika sumber daya diperlukan untuk mengaktifkan perubahan efek, yaitu ketika nilai bidang canSetState dari AUDIO_EFFECT terkait berubah.

Warisan

Antarmuka IAudioEffectsChangedNotificationClient mewarisi dari antarmuka IUnknown.

Metode

Antarmuka IAudioEffectsChangedNotificationClient memiliki metode ini.

 
IAudioEffectsChangedNotificationClient::OnAudioEffectsChanged

Dipanggil oleh sistem ketika daftar efek audio berubah atau sumber daya yang diperlukan untuk mengaktifkan perubahan efek.

Keterangan

Daftarkan antarmuka panggilan balik dengan memanggil IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback.

Contoh

Contoh kode berikut menunjukkan kelas yang mengimplementasikan IAudioEffectsChangedNotificationClient untuk menerima pemberitahuan ketika daftar efek audio berubah atau sumber daya yang diperlukan untuk mengaktifkan perubahan efek. Dalam panggilan balik OnAudioStreamEffectsChanged , contoh memanggil GetAudioEffects untuk mendapatkan daftar efek saat ini.

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

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Build 22000
Header audioclient.h

Lihat juga

AUDIO_EFFECT

IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback