Поделиться через


Отключение интерфейса утки по умолчанию

Пользователь можетотключитьь по умолчанию , предоставляемый системой, с помощью параметров, доступных на вкладке "Коммуникации " на панели управления мультимедиа Windows, Mmsys.cpl.

При применении утки эффект исчезания и угасания используется в течение 1 секунды. Игровое приложение может не потребовать, чтобы поток обмена данными вмешивался в звук игры. Некоторые приложения мультимедиа могут обнаружить, что воспроизведение является джарким, когда музыка исчезает обратно. Эти типы приложений могут не участвовать в процессе утки.

Программно прямой клиент WASAPI может отказаться от использования диспетчера сеансов для звукового сеанса, который предоставляет управление громкостями для потоков, не относящихся к обмену данными. Обратите внимание, что даже если клиент откаживается от утих, он по-прежнему получает уведомления о утках из системы.

Чтобы отказаться от утки, клиент должен получить ссылку на интерфейс IAudioSessionControl2 диспетчера сеансов. Чтобы отказаться от утиного интерфейса, выполните следующие действия.

  1. Создайте экземпляр перечислителя устройства и используйте его для получения ссылки на конечную точку устройства, используемого приложением мультимедиа для отрисовки потока, не связанного с обменом данными.
  2. Активируйте диспетчер сеансов из конечной точки устройства и получите ссылку на интерфейс IAudioSessionManager2 диспетчера сеансов.
  3. Используя указатель IAudioSessionManager2, получите ссылку на интерфейс IAudioSessionControl диспетчера сеансов.
  4. Запрос на IAudioSessionControl2 из интерфейса IAudioSessionControl.
  5. Вызовите 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;
}

Использование устройства связи

Взаимодействие с утками по умолчанию

Предоставление пользовательского поведения утки

Рекомендации по реализации для уведомлений о утках

Получение событий утки