Controles de volume de sessão
Conforme explicado anteriormente, os clientes WASAPI podem controlar individualmente o nível de volume de cada sessão de áudio. WASAPI aplica a configuração de volume de uma sessão uniformemente a todos os fluxos na sessão. Cada nível de volume é um valor no intervalo de 0,0 a 1,0, em que 0,0 indica silêncio e 1,0 indica volume completo (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 são alteradas dinamicamente em resposta às alterações nos fluxos que compõem a combinação de áudio global. Para obter mais informações sobre a política de áudio, consulte User-Mode Componentes de Áudio.
O software do sistema que implementa o controle de volume para cada fluxo multiplica os exemplos 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 alteração 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.
Observe que a intensidade percebida não é linear em relação à amplitude do sinal. Em vez disso, a intensidade varia aproximadamente conforme o logaritmo do nível de volume v:
loudness in decibels = 20.log₁₀(v)
Portanto, a configuração v = 0,5 atenua a intensidade do sinal original (o sinal antes que o nível de volume seja aplicado) por 6 decibéis, a configuração v = 0,25 atenua o sinal por 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 de sinal original.
Aplicativos de áudio com interfaces de usuário para controlar o nível de volume normalmente exibem controles deslizantes que geram alterações na intensidade percebida que são linearmente proporcionais às alterações na posição do controle deslizante. Para produzir uma relação linear entre a altura 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 Audio-Tapered controles de volume.
Conforme 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 SndVol. Normalmente, cada sessão contém todos os fluxos de reprodução de uma janela de aplicativo específica. Por meio dos controles deslizantes na janela 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. A 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 o tempo todo. Portanto, se o usuário alterar o nível de volume movendo o controle deslizante na janela do aplicativo, o controle deslizante correspondente na janela 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 dar suporte a esse comportamento, a 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 adequadamente. O Sndvol monitora as alterações de volume feitas por meio desse método e reflete as alterações nos controles deslizantes de volume exibidos. Além disso, um aplicativo pode receber notificações de alterações de volume de sessão feitas pelo usuário por meio do Sndvol. Para essa finalidade, o aplicativo implementa uma interface IAudioSessionEvents e registra a interface com WASAPI. Depois disso, sempre 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 de 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 atender aos 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 essa funcionalidade para obter efeitos de áudio, como simular o movimento espacial de uma fonte de áudio fazendo 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 estereotipado.
Os controles deslizantes de volume na caixa aplicativos no Sndvol refletem apenas as alterações de volume feitas por meio da interface ISimpleAudioVolume. Elas 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 poderá mover um controle deslizante de aplicativo esperando ver a alteração refletida em um controle deslizante Sndvol e ficar confuso quando nenhuma alteração desse tipo 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 no submixamento 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ítica da sessão, que o sistema modifica dinamicamente conforme a combinação global é alterada.
Cada um dos quatro fatores de nível de volume na lista anterior é um valor no intervalo de 0,0 a 1,0, em que 0,0 indica silêncio e 1,0 indica volume completo (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 algum valor de exemplo em um canal exceder 0 decibéis após o mecanismo de áudio multiplicá-los pelo nível de volume efetivo, o mecanismo cortará os exemplos antes de adicioná-los ao submixo de sessão.
Tópicos relacionados