기본 더킹 환경 비활성화
사용자는 Mmsys.cpl Windows 멀티미디어 제어판의 통신 탭에서 사용할 수 있는 옵션을 사용하여 시스템에서 제공하는 기본 더킹 환경을 사용하지 않도록 설정할 수 있습니다.
더킹을 적용하면 페이드 아웃 및 페이드 인 효과가 1초 동안 사용됩니다. 게임 애플리케이션은 통신 스트림이 게임 오디오를 방해하지 않도록 할 수 있습니다. 일부 미디어 애플리케이션은 음악이 다시 페이드 인될 때 재생 환경이 혼란스럽다는 것을 발견할 수 있습니다. 이러한 유형의 애플리케이션은 더킹 환경에 참여하지 않도록 선택할 수 있습니다.
프로그래밍 방식으로 직접 WASAPI 클라이언트는 비 통신 스트림에 볼륨 제어를 제공하는 오디오 세션에 세션 관리자를 사용하여 옵트아웃할 수 있습니다. 클라이언트가 더킹을 옵트아웃하더라도 시스템에서 더킹 알림을 계속 받습니다.
더킹을 옵트아웃하려면 클라이언트가 세션 관리자의 IAudioSessionControl2 인터페이스에 대한 참조를 가져와야 합니다. 더킹 환경을 옵트아웃하려면 다음 단계를 사용합니다.
- 디바이스 열거자를 인스턴스화하고 이를 사용하여 미디어 애플리케이션이 비 통신 스트림을 렌더링하는 데 사용하는 디바이스의 엔드포인트에 대한 참조를 가져옵니다.
- 디바이스 엔드포인트에서 세션 관리자를 활성화하고 세션 관리자의 IAudioSessionManager2 인터페이스에 대한 참조를 가져옵니다.
- IAudioSessionManager2 포인터를 사용하여 세션 관리자의 IAudioSessionControl 인터페이스에 대한 참조를 가져옵니다.
- IAudioSessionControl 인터페이스에서 IAudioSessionControl2를 쿼리합니다.
- 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;
}
관련 항목