Antarmuka IAudioEffectsManager (audioclient.h)
Menyediakan fungsionalitas manajemen untuk alur efek audio untuk aliran audio terkait, memungkinkan aplikasi untuk mendapatkan daftar efek saat ini, mengatur status efek, dan untuk mendaftar pemberitahuan ketika daftar efek atau status efek berubah.
Warisan
Antarmuka IAudioEffectsManager mewarisi dari antarmuka IUnknown.
Metode
Antarmuka IAudioEffectsManager memiliki metode ini.
IAudioEffectsManager::GetAudioEffects Mendapatkan daftar efek audio saat ini untuk aliran audio terkait. |
IAudioEffectsManager::RegisterAudioEffectsChangedNotificationCallback Mendaftarkan antarmuka AudioEffectsChangedNotificationClient. |
IAudioEffectsManager::SetAudioEffectState Metode IAudioEffectsManager::SetAudioEffectState (audioclient.h) mengatur status efek audio yang ditentukan. |
IAudioEffectsManager::UnregisterAudioEffectsChangedNotificationCallback Membatalkan pendaftaran antarmuka IAudioEffectsChangedNotificationClient. |
Keterangan
Dapatkan instans antarmuka ini dengan memanggil IAudioClient::GetService yang melewati pointer antarmuka antarmuka IAudioEffectsManager .
wil::com_ptr_nothrow<IAudioEffectsManager> audioEffectsManager;
RETURN_IF_FAILED(client->GetService(IID_PPV_ARGS(&audioEffectsManager)));
Contoh
Contoh berikut menunjukkan IAudioEffectsManager.GetAudioEffects untuk mendeteksi apakah efek AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION ada pada aliran audio yang ditentukan.
HRESULT IsPlatformDeepNoiseSuppressionPresent(_In_ IAudioClient *client, _Out_ bool *isPresent)
{
*isPresent = false;
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++)
{
// Check if noise suppression is part of the current effects
if (effects[i].id == AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION)
{
*isPresent = true;
return S_OK;
}
}
return S_OK;
}
Contoh berikut menunjukkan penggunaan IAudioEffectsManager.SetAudioEffectState untuk menonaktifkan efek AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION .
HRESULT TryDisablePlatformDeepNoiseSuppression(_In_ IAudioClient *client)
{
wil::com_ptr_nothrow<IAudioEffectsManager> audioEffectsManager;
RETURN_IF_FAILED(client->GetService(IID_PPV_ARGS(&audioEffectsManager)));
wil::unique_cotaskmem_array_ptr<AudioEffect> effects;
UINT32 numEffects;
RETURN_IF_FAILED(audioEffectsManager->GetAudioEffects(&effects, &numEffects));
for (UINT32 i = 0; i < numEffects; i++)
{
if (effects[i].id == AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION)
{
// Check if deep noise suppression can be set and if it is currently on
if (effects[i].canSetState && effects[i].state == AUDIO_EFFECT_STATE_ON)
{
HRESULT hr = audioEffectsManager->SetAudioEffectState(effects[i].id, AUDIO_EFFECT_STATE_OFF);
// If canSetState changed to false, or the effect was removed, SetAudioEffectState
// can fail with one of the following error codes.
if (hr != AUDCLNT_E_EFFECT_NOT_AVAILABLE && hr != AUDCLNT_E_EFFECT_STATE_READ_ONLY)
{
return hr;
}
}
return S_OK;
}
}
return S_OK;
}
Contoh berikut menunjukkan penggunaan IAudioEffectsManager.SetAudioEffectState untuk mengaktifkan efek AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION .
HRESULT TryEnablePlatformDeepNoiseSuppression(_In_ IAudioClient *client)
{
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++)
{
if (effects[i].id == AUDIO_EFFECT_TYPE_DEEP_NOISE_SUPPRESSION)
{
// Check if deep noise suppression can be set and if it is currently off
if (effects[i].canSetState && effects[i].state == AUDIO_EFFECT_STATE_OFF)
{
HRESULT hr = audioEffectsManager->SetAudioEffectState(effects[i].id, AUDIO_EFFECT_STATE_ON);
// If canSetState changed to false, or the effect was removed, SetAudioEffectState
// can fail with one of the following error codes.
if (hr != AUDCLNT_E_EFFECT_NOT_AVAILABLE && hr != AUDCLNT_E_EFFECT_STATE_READ_ONLY)
{
return hr;
}
}
return S_OK;
}
}
return S_OK;
}
Contoh kode berikut menunjukkan kelas yang mengimplementasikan IAudioEffectsChangedNotificationClient untuk menerima pemberitahuan saat 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 |