既定のダッキング エクスペリエンスの無効化
ユーザーは、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;
}
関連トピック