Controles de volume de sessão
Como explicado anteriormente, os clientes WASAPI podem controlar individualmente o nível de volume de cada sessão de áudio. O WASAPI aplica a configuração de volume de uma sessão uniformemente a todos os fluxos da sessão. Cada nível de volume é um valor no intervalo de 0,0 a 1,0, onde 0,0 indica silêncio e 1,0 indica volume total (sem atenuação).
Um cliente cria implicitamente uma sessão atribuindo o primeiro fluxo a essa sessão. O nível de volume padrão da nova sessão é 1.0. Conforme discutido anteriormente, o usuário pode ajustar o nível de volume da sessão por meio da interface do usuário de um programa de controle (por exemplo, Sndvol) que é um cliente WASAPI. As configurações de controle são persistentes.
Além das configurações de volume controladas pelo cliente, o sistema aplica suas próprias configurações de volume às sessões. Essas configurações são baseadas na política de áudio e mudam dinamicamente em resposta a alterações nos fluxos que compõem a mixagem de áudio global. Para obter mais informações sobre a política de áudio, consulte Componentes de áudio no modo de usuário.
O software do sistema que implementa o controle de volume para cada fluxo multiplica as amostras de PCM no fluxo pelo nível de volume efetivo. O nível de volume efetivo é o resultado da multiplicação das configurações de volume do cliente e do sistema. Assim, a mudança resultante na amplitude do sinal é uma combinação linear dos níveis de volume do cliente e do sistema. Por exemplo, se o nível de volume do cliente for 0,8 e o nível de volume do sistema for 0,5, o nível de volume efetivo será (0,8).(0,5) = 0,4.
Note que a intensidade percebida não é linear em relação à amplitude do sinal. Em vez disso, a intensidade varia aproximadamente como o logaritmo do nível de volume v:
loudness em decibéis = 20.log₁₀(v)
Assim, a configuração v = 0,5 atenua a intensidade do sinal original (o sinal antes que o nível de volume seja aplicado) em 6 decibéis, a configuração v = 0,25 atenua o sinal em 12 decibéis, e assim por diante. Um nível de volume v = 1,0, correspondente a 0 decibéis, não altera o nível original do sinal.
Os aplicativos de áudio com interfaces de usuário para controlar o nível de volume normalmente exibem controles deslizantes que geram alterações no volume percebido que são linearmente proporcionais às mudanças na posição do controle deslizante. Para produzir uma relação linear entre a intensidade percebida e a posição do controle deslizante, o aplicativo deve definir uma relação não linear entre o nível de volume v e a posição do controle deslizante. Para obter mais informações, consulte Controles de volume cônicos de áudio.
Como explicado anteriormente, o programa de controle de volume do sistema, Sndvol, exibe controles deslizantes de volume para as sessões de áudio que estão sendo reproduzidas em cada dispositivo de renderização de áudio. Esses controles deslizantes aparecem na caixa de grupo rotulada Aplicativos na janela do SndVol. Normalmente, cada sessão contém todos os fluxos de reprodução de uma janela de aplicativo específica. Através dos controles deslizantes na janela do Sndvol, os usuários controlam os níveis de volume de aplicativos de áudio individuais.
Como regra geral, um aplicativo deve atribuir todos os seus fluxos de reprodução à mesma sessão de áudio. O WASAPI não impede que um aplicativo distribua seus fluxos de reprodução entre várias sessões. No entanto, a proliferação resultante de controles deslizantes de volume no Sndvol pode confundir os usuários.
Como opção, uma janela do aplicativo pode exibir um controle deslizante de volume. O controle deslizante do aplicativo deve refletir o estado do controle deslizante Sndvol correspondente em todos os momentos. Assim, se o usuário alterar o nível de volume movendo o controle deslizante na janela do aplicativo, o controle deslizante correspondente na janela do Sndvol deverá se mover em uníssono com o controle deslizante do aplicativo. Da mesma forma, se o usuário mover o controle deslizante Sndvol, o controle deslizante do aplicativo deverá se mover em uníssono com o controle deslizante Sndvol.
Para oferecer suporte a esse comportamento, WASAPI implementa a interface ISimpleAudioVolume . Quando o usuário move o controle deslizante do aplicativo, o aplicativo chama o método ISimpleAudioVolume::SetMasterVolume para ajustar o nível de volume da sessão de acordo. O Sndvol monitora as alterações de volume feitas por meio desse método e reflete as alterações nos controles deslizantes de volume que ele exibe. Além disso, um aplicativo pode receber notificações de alterações de volume de sessão que o usuário faz por meio do Sndvol. Para isso, o aplicativo implementa uma interface IAudioSessionEvents e registra a interface com WASAPI. Depois disso, cada vez que o usuário altera o nível de volume da sessão por meio do Sndvol, o aplicativo recebe uma chamada de notificação por meio do método IAudioSessionEvents::OnSimpleVolumeChanged. Para obter um exemplo de código que implementa uma interface IAudioSessionEvents , consulte Eventos de sessão de áudio. Para obter um exemplo de código que registra uma interface IAudioSessionEvents , consulte Eventos de áudio para aplicativos de áudio herdados.
A interface ISimpleAudioVolume aplica o mesmo nível de volume uniformemente a todos os canais em uma sessão de áudio. Embora essa interface deva satisfazer os requisitos de controle de volume da maioria dos aplicativos, alguns aplicativos podem exigir recursos de controle de volume mais especializados. A interface IAudioStreamVolume controla o volume de um fluxo individual em uma sessão em relação aos outros fluxos na sessão. IAudioStreamVolume também permite que um cliente controle individualmente os níveis de volume de todos os canais no fluxo. Por exemplo, um aplicativo pode usar esse recurso para obter efeitos de áudio, como simular o movimento espacial de uma fonte de áudio por movimento panorâmico da esquerda para a direita. Outra interface especializada, IChannelAudioVolume, controla os níveis de volume dos canais individuais em uma sessão. Por exemplo, um aplicativo pode usar IChannelAudioVolume para implementar controles de equilíbrio para um sistema de som estereofônico.
Os controles deslizantes de volume na caixa Aplicativos no Sndvol refletem apenas as alterações de volume feitas por meio da interface ISimpleAudioVolume . Eles não refletem as alterações de volume feitas por meio das interfaces IAudioStreamVolume e IChannelAudioVolume . Embora alguns aplicativos possam permitir que os usuários controlem direta ou indiretamente as configurações de volume por meio de IAudioStreamVolume e IChannelAudioVolume, os desenvolvedores devem evitar apresentar controles deslizantes de aplicativo para essas configurações de volume que os usuários provavelmente confundirão com os controles deslizantes de volume no Sndvol. Caso contrário, um usuário pode mover um controle deslizante de aplicativo esperando ver a alteração refletida em um controle deslizante do Sndvol e ficar confuso quando nenhuma alteração ocorrer. Os desenvolvedores podem evitar esse problema por meio de um design cuidadoso da interface do usuário.
O nível de volume efetivo de qualquer canal na submistura de sessão, conforme ouvido nos alto-falantes, é o produto dos quatro fatores de nível de volume a seguir:
- Os níveis de volume por canal dos fluxos na sessão, que os clientes podem controlar por meio dos métodos na interface IAudioStreamVolume .
- O nível de volume por canal da sessão, que os clientes podem controlar por meio dos métodos na interface IChannelAudioVolume .
- O nível de volume mestre da sessão, que os clientes podem controlar por meio dos métodos na interface ISimpleAudioVolume .
- O nível de volume baseado em políticas da sessão, que o sistema modifica dinamicamente à medida que a combinação global muda.
Cada um dos quatro fatores de nível de volume na lista anterior é um valor no intervalo de 0,0 a 1,0, onde 0,0 indica silêncio e 1,0 indica volume total (sem atenuação). O nível de volume efetivo também é um valor no intervalo de 0,0 a 1,0.
O mecanismo de áudio aplica o nível de volume efetivo para cada canal aos canais em um fluxo antes de misturar o fluxo com os outros fluxos na sessão de áudio. Se quaisquer valores de amostra em um canal excederem 0 decibéis depois que o mecanismo de áudio os tiver multiplicado pelo nível de volume efetivo, o mecanismo cortará as amostras antes de adicioná-las à submistura da sessão.
Tópicos relacionados