Deshabilitación de la experiencia de pato predeterminada
Un usuario puede deshabilitar la experiencia de pato predeterminada proporcionada por el sistema mediante las opciones disponibles en la pestaña Comunicaciones del panel de control multimedia de Windows, Mmsys.cpl.
Cuando se aplica el pato, se utiliza un efecto de atenuación y de atenuación durante un período de 1 segundo. Es posible que una aplicación de juego no quiera que la secuencia de comunicación interfiera con el audio del juego. Algunas aplicaciones multimedia pueden encontrar que la experiencia de reproducción es jarrante cuando la música vuelve a desaparecer. Estos tipos de aplicaciones pueden optar por no participar en la experiencia de pato.
Mediante programación, un cliente WASAPI directo puede optar por no usar el administrador de sesiones para la sesión de audio que proporciona control de volumen para las secuencias que no son de comunicación. Tenga en cuenta que aunque un cliente opte por no recibir notificaciones de pato del sistema.
Para no participar en el pato, el cliente debe obtener una referencia a la interfaz IAudioSessionControl2 del administrador de sesiones. Para no participar en la experiencia de pato, siga estos pasos:
- Cree una instancia del enumerador de dispositivos y úselo para obtener una referencia al punto de conexión del dispositivo que usa la aplicación multimedia para representar el flujo de no comunicación.
- Active el administrador de sesiones desde el punto de conexión del dispositivo y obtenga una referencia a la interfaz IAudioSessionManager2 del administrador de sesiones.
- Mediante el uso del puntero IAudioSessionManager2 , obtenga una referencia a la interfaz IAudioSessionControl del administrador de sesión.
- Consulte IAudioSessionControl2 desde la interfaz IAudioSessionControl .
- Llame a IAudioSessionControl2::SetDuckingPreference y pase TRUE o FALSE para especificar la preferencia de pato. La preferencia especificada se puede cambiar dinámicamente durante la sesión. Tenga en cuenta que el cambio de exclusión no surte efecto hasta que la secuencia se detenga e inicie de nuevo.
En el código siguiente se muestra cómo una aplicación puede especificar su preferencia de pato. El autor de la llamada de la función debe pasar TRUE o FALSE en el parámetro DuckingOptOutChecked. Según el valor pasado, el pato está habilitado o deshabilitado a través de 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;
}
Temas relacionados