다음을 통해 공유


기본 더킹 환경 비활성화

사용자는 Mmsys.cpl Windows 멀티미디어 제어판의 통신 탭에서 사용할 수 있는 옵션을 사용하여 시스템에서 제공하는 기본 더킹 환경을 사용하지 않도록 설정할 수 있습니다.

더킹을 적용하면 페이드 아웃 및 페이드 인 효과가 1초 동안 사용됩니다. 게임 애플리케이션은 통신 스트림이 게임 오디오를 방해하지 않도록 할 수 있습니다. 일부 미디어 애플리케이션은 음악이 다시 페이드 인될 때 재생 환경이 혼란스럽다는 것을 발견할 수 있습니다. 이러한 유형의 애플리케이션은 더킹 환경에 참여하지 않도록 선택할 수 있습니다.

프로그래밍 방식으로 직접 WASAPI 클라이언트는 비 통신 스트림에 볼륨 제어를 제공하는 오디오 세션에 세션 관리자를 사용하여 옵트아웃할 수 있습니다. 클라이언트가 더킹을 옵트아웃하더라도 시스템에서 더킹 알림을 계속 받습니다.

더킹을 옵트아웃하려면 클라이언트가 세션 관리자의 IAudioSessionControl2 인터페이스에 대한 참조를 가져와야 합니다. 더킹 환경을 옵트아웃하려면 다음 단계를 사용합니다.

  1. 디바이스 열거자를 인스턴스화하고 이를 사용하여 미디어 애플리케이션이 비 통신 스트림을 렌더링하는 데 사용하는 디바이스의 엔드포인트에 대한 참조를 가져옵니다.
  2. 디바이스 엔드포인트에서 세션 관리자를 활성화하고 세션 관리자의 IAudioSessionManager2 인터페이스에 대한 참조를 가져옵니다.
  3. IAudioSessionManager2 포인터를 사용하여 세션 관리자의 IAudioSessionControl 인터페이스에 대한 참조를 가져옵니다.
  4. IAudioSessionControl 인터페이스에서 IAudioSessionControl2를 쿼리합니다.
  5. IAudioSessionControl2::SetDuckingPreference를 호출하고 TRUE 또는 FALSE를 전달하여 더킹 기본 설정을 지정합니다. 세션 중에 지정된 기본 설정을 동적으로 변경할 수 있습니다. 옵트아웃 변경은 스트림이 중지되고 다시 시작될 때까지 적용되지 않습니다.

다음 코드는 애플리케이션에서 더킹 기본 설정을 지정하는 방법을 보여 주는 코드입니다. 함수의 호출자는 DuckingOptOutChecked 매개 변수에서 TRUE 또는 FALSE 를 전달해야 합니다. 전달된 값에 따라 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;
}

통신 디바이스 사용

기본 더킹 환경

사용자 지정 더킹 동작 제공

Ducking 알림에 대한 구현 고려 사항

더킹 이벤트 가져오기