Отключение интерфейса утки по умолчанию
Пользователь можетотключитьь по умолчанию , предоставляемый системой, с помощью параметров, доступных на вкладке "Коммуникации " на панели управления мультимедиа Windows, Mmsys.cpl.
При применении утки эффект исчезания и угасания используется в течение 1 секунды. Игровое приложение может не потребовать, чтобы поток обмена данными вмешивался в звук игры. Некоторые приложения мультимедиа могут обнаружить, что воспроизведение является джарким, когда музыка исчезает обратно. Эти типы приложений могут не участвовать в процессе утки.
Программно прямой клиент WASAPI может отказаться от использования диспетчера сеансов для звукового сеанса, который предоставляет управление громкостями для потоков, не относящихся к обмену данными. Обратите внимание, что даже если клиент откаживается от утих, он по-прежнему получает уведомления о утках из системы.
Чтобы отказаться от утки, клиент должен получить ссылку на интерфейс IAudioSessionControl2 диспетчера сеансов. Чтобы отказаться от утиного интерфейса, выполните следующие действия.
- Создайте экземпляр перечислителя устройства и используйте его для получения ссылки на конечную точку устройства, используемого приложением мультимедиа для отрисовки потока, не связанного с обменом данными.
- Активируйте диспетчер сеансов из конечной точки устройства и получите ссылку на интерфейс IAudioSessionManager2 диспетчера сеансов.
- Используя указатель IAudioSessionManager2, получите ссылку на интерфейс IAudioSessionControl диспетчера сеансов.
- Запрос на IAudioSessionControl2 из интерфейса IAudioSessionControl.
- Вызовите IAudioSessionControl2::SetDuckingPreference и передайте значение TRUE или FALSE, чтобы указать предпочтения утки. Указанные предпочтения можно динамически изменять во время сеанса. Обратите внимание, что изменение отказа не вступают в силу, пока поток не будет остановлен и запущен снова.
В следующем коде показано, как приложение может указать его предпочтения утки. Вызывающий объект функции должен передать значение TRUE или FALSE в параметре DuckingOptOutChecked. В зависимости от переданного значения утка включена или отключена с помощью IAudioSessionControl2::SetDuckingPreference.
////////////////////////////////////////////////////////////////////
//Description: Specifies the ducking options for the application.
//Parameters:
// If DuckingOptOutChecked is TRUE system ducking is disabled;
// FALSE, system ducking is enabled.
////////////////////////////////////////////////////////////////////
HRESULT DuckingOptOut(bool DuckingOptOutChecked)
{
HRESULT hr = S_OK;
IMMDeviceEnumerator* pDeviceEnumerator NULL;
IMMDevice* pEndpoint = NULL;
IAudioSessionManager2* pSessionManager2 = NULL;
IAudioSessionControl* pSessionControl = NULL;
IAudioSessionControl2* pSessionControl2 = NULL;
// Start with the default endpoint.
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pDeviceEnumerator));
if (SUCCEEDED(hr))
{
hr = pDeviceEnumerator>GetDefaultAudioEndpoint(eRender, eConsole, &pEndpoint);
pDeviceEnumerator>Release();
pDeviceEnumerator = NULL;
}
// Activate session manager.
if (SUCCEEDED(hr))
{
hr = pEndpoint->Activate(__uuidof(IAudioSessionManager2),
CLSCTX_INPROC_SERVER,
NULL,
reinterpret_cast<void **>(&pSessionManager2));
pEndpoint->Release();
pEndpoint = NULL;
}
if (SUCCEEDED(hr))
{
hr = pSessionManager2->GetAudioSessionControl(NULL, 0, &pSessionControl);
pSessionManager2->Release();
pSessionManager2 = NULL;
}
if (SUCCEEDED(hr))
{
hr = pSessionControl->QueryInterface(
__uuidof(IAudioSessionControl2),
(void**)&pSessionControl2);
pSessionControl->Release();
pSessionControl = NULL;
}
// Sync the ducking state with the specified preference.
if (SUCCEEDED(hr))
{
if (DuckingOptOutChecked)
{
hr = pSessionControl2->SetDuckingPreference(TRUE);
}
else
{
hr = pSessionControl2->SetDuckingPreference(FALSE);
}
pSessionControl2->Release();
pSessionControl2 = NULL;
}
return hr;
}
См. также