Controles de volumen de sesión
Como se explicó anteriormente, los clientes WASAPI pueden controlar individualmente el nivel de volumen de cada sesión de audio. WASAPI aplica la configuración de volumen de una sesión uniformemente a todas las secuencias de la sesión. Cada nivel de volumen es un valor del intervalo de 0,0 a 1,0, donde 0,0 indica silencio y 1,0 indica volumen completo (sin atenuación).
Un cliente crea implícitamente una sesión asignando la primera secuencia a esa sesión. El nivel de volumen predeterminado de la nueva sesión es 1.0. Como se explicó anteriormente, el usuario puede ajustar el nivel de volumen de la sesión a través de la interfaz de usuario de un programa de control (por ejemplo, Sndvol) que es un cliente WASAPI. La configuración del control es persistente.
Además de la configuración de volumen controlada por el cliente, el sistema aplica su propia configuración de volumen a las sesiones. Esta configuración se basa en la directiva de audio y cambia dinámicamente en respuesta a los cambios en las secuencias que componen la combinación global de audio. Para obtener más información sobre la directiva de audio, consulte Componentes de audio en modo de usuario.
El software del sistema que implementa el control de volumen para cada flujo multiplica las muestras de PCM en la secuencia por el nivel de volumen efectivo. El nivel de volumen efectivo es el resultado de multiplicar la configuración del volumen del cliente y del sistema. Por lo tanto, el cambio resultante en la amplitud de señal es una combinación lineal de los niveles de volumen del cliente y del sistema. Por ejemplo, si el nivel de volumen de cliente es 0,8 y el nivel de volumen del sistema es 0,5, el nivel de volumen efectivo es (0,8). (0,5) = 0,4.
Tenga en cuenta que la intensidad percibido no es lineal con respecto a la amplitud de la señal. En su lugar, la intensidad varía aproximadamente como el logaritmo del nivel de volumen v:
ruido en decibelios = 20. log₁₀(v)
Por lo tanto, al establecer v = 0,5 atenua la intensidad de la señal original (la señal antes de que se aplique el nivel de volumen) por 6 decibelios, estableciendo v = 0,25 atenua la señal por 12 decibelios, etc. Un nivel de volumen v = 1,0, correspondiente a 0 decibelios, no modifica el nivel de señal original.
Las aplicaciones de audio con interfaces de usuario para controlar el nivel de volumen suelen mostrar controles deslizantes que generan cambios en la intensidad percibido que son linealmente proporcionales a los cambios en la posición del control deslizante. Para generar una relación lineal entre la intensidad percibido y la posición del control deslizante, la aplicación debe definir una relación no lineal entre el nivel de volumen v y la posición del control deslizante. Para obtener más información, vea Controles de volumen con cinta de audio.
Como se explicó anteriormente, el programa de control de volumen del sistema, Sndvol, muestra controles deslizantes de volumen para las sesiones de audio que se reproducen en cada dispositivo de representación de audio. Estos controles deslizantes aparecen en el cuadro de grupo denominado Aplicaciones en la ventana SndVol. Normalmente, cada sesión contiene todas las secuencias de reproducción desde una ventana de aplicación determinada. A través de los controles deslizantes de la ventana de Sndvol, los usuarios controlan los niveles de volumen de las aplicaciones de audio individuales.
Como regla general, una aplicación debe asignar todas sus secuencias de reproducción a la misma sesión de audio. WASAPI no impide que una aplicación distribuya sus secuencias de reproducción entre varias sesiones. Sin embargo, la proliferación resultante de controles deslizantes de volumen en Sndvol podría confundir a los usuarios.
Como opción, una ventana de aplicación puede mostrar un control deslizante de volumen. El control deslizante de la aplicación debe reflejar el estado del control deslizante Sndvol correspondiente en todo momento. Por lo tanto, si el usuario cambia el nivel de volumen moviendo el control deslizante en la ventana de la aplicación, el control deslizante correspondiente de la ventana de Sndvol debe moverse al unísono con el control deslizante de la aplicación. Del mismo modo, si el usuario mueve el control deslizante Sndvol, el control deslizante de la aplicación debe moverse al unísono con el control deslizante de Sndvol.
Para admitir este comportamiento, WASAPI implementa la interfaz ISimpleAudioVolume . Cuando el usuario mueve el control deslizante de la aplicación, la aplicación llama al método ISimpleAudioVolume::SetMasterVolume para ajustar el nivel de volumen de sesión en consecuencia. Sndvol supervisa los cambios de volumen realizados a través de este método y refleja los cambios en los controles deslizantes de volumen que muestra. Además, una aplicación puede recibir notificaciones de cambios en el volumen de sesión que realiza el usuario a través de Sndvol. Para ello, la aplicación implementa una interfaz IAudioSessionEvents y registra la interfaz con WASAPI. Después, cada vez que el usuario cambia el nivel de volumen de sesión a través de Sndvol, la aplicación recibe una llamada de notificación a través del método IAudioSessionEvents::OnSimpleVolumeChanged . Para obtener un ejemplo de código que implementa una interfaz IAudioSessionEvents , consulte Eventos de sesión de audio. Para obtener un ejemplo de código que registra una interfaz IAudioSessionEvents , consulte Eventos de audio para aplicaciones de audio heredadas.
La interfaz ISimpleAudioVolume aplica uniformemente el mismo nivel de volumen a todos los canales de una sesión de audio. Aunque esta interfaz debe satisfacer los requisitos de control de volumen de la mayoría de las aplicaciones, algunas aplicaciones pueden requerir funcionalidades de control de volumen más especializadas. La interfaz IAudioStreamVolume controla el volumen de una secuencia individual en una sesión con respecto a las demás secuencias de la sesión. IAudioStreamVolume también permite a un cliente controlar individualmente los niveles de volumen de todos los canales de la secuencia. Por ejemplo, una aplicación podría usar esta funcionalidad para lograr efectos de audio, como simular el movimiento espacial de un origen de audio desplazando de izquierda a derecha. Otra interfaz especializada, IChannelAudioVolume, controla los niveles de volumen de los canales individuales en una sesión. Por ejemplo, una aplicación podría usar IChannelAudioVolume para implementar controles de equilibrio para un sistema de sonido estéreofónico.
Los controles deslizantes de volumen del cuadro Aplicaciones de Sndvol reflejan solo los cambios de volumen realizados a través de la interfaz ISimpleAudioVolume . No reflejan los cambios de volumen realizados a través de las interfaces IAudioStreamVolume e IChannelAudioVolume . Aunque algunas aplicaciones podrían permitir a los usuarios controlar directa o indirectamente la configuración del volumen a través de IAudioStreamVolume e IChannelAudioVolume, los desarrolladores deben evitar presentar controles deslizantes de aplicación para esta configuración de volumen que es probable que los usuarios confundan con los controles deslizantes de volumen en Sndvol. De lo contrario, un usuario podría mover un control deslizante de la aplicación esperando ver el cambio reflejado en un control deslizante de Sndvol y confundirse cuando no se produce este cambio. Los desarrolladores pueden evitar este problema mediante un diseño cuidadoso de la interfaz de usuario.
El nivel de volumen efectivo de cualquier canal de la submezcla de sesión, como se escucha en los altavoces, es el producto de los siguientes cuatro factores de nivel de volumen:
- Los niveles de volumen por canal de las secuencias de la sesión, que los clientes pueden controlar a través de los métodos de la interfaz IAudioStreamVolume .
- Nivel de volumen por canal de la sesión, que los clientes pueden controlar a través de los métodos de la interfaz IChannelAudioVolume .
- Nivel de volumen maestro de la sesión, que los clientes pueden controlar a través de los métodos de la interfaz ISimpleAudioVolume .
- El nivel de volumen basado en directivas de la sesión, que el sistema modifica dinámicamente a medida que cambia la combinación global.
Cada uno de los cuatro factores de nivel de volumen de la lista anterior es un valor del intervalo de 0,0 a 1,0, donde 0,0 indica silencio y 1,0 indica volumen completo (sin atenuación). El nivel de volumen efectivo también es un valor del intervalo de 0,0 a 1,0.
El motor de audio aplica el nivel de volumen efectivo para cada canal a los canales de una secuencia antes de mezclar la secuencia con las otras secuencias de la sesión de audio. Si los valores de muestra de un canal superan los 0 decibelios después de que el motor de audio los haya multiplicado por el nivel de volumen efectivo, el motor recorta los ejemplos antes de agregarlos a la submezcla de sesión.
Temas relacionados