停用預設的鴨子體驗
使用者可以使用 Windows 多媒體控制面板 [通訊] 索引卷標上可用的選項,來停用系統所提供的預設鴨子體驗,Mmsys.cpl。
套用鴨子時,會使用淡出和淡入效果 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;
}
相關主題