Contrôles de volume de session
Comme expliqué précédemment, les clients WASAPI peuvent contrôler individuellement le niveau de volume de chaque session audio. WASAPI applique uniformément le paramètre de volume d’une session à tous les flux de la session. Chaque niveau de volume est une valeur comprise entre 0,0 et 1,0, où 0,0 indique le silence et 1,0 indique le volume complet (aucune atténuation).
Un client crée implicitement une session en affectant le premier flux à cette session. Le niveau de volume par défaut de la nouvelle session est 1.0. Comme indiqué précédemment, l’utilisateur peut ajuster le niveau de volume de la session via l’interface utilisateur d’un programme de contrôle (par exemple, Sndvol) qui est un client WASAPI. Les paramètres de contrôle sont persistants.
En plus des paramètres de volume contrôlés par le client, le système applique ses propres paramètres de volume aux sessions. Ces paramètres sont basés sur la stratégie audio et changent dynamiquement en réponse aux modifications apportées aux flux qui composent le mixage audio global. Pour plus d’informations sur la stratégie audio, consultez Composants audio en mode utilisateur.
Le logiciel système qui implémente le contrôle de volume pour chaque flux multiplie les échantillons PCM dans le flux par le niveau de volume effectif. Le niveau de volume effectif est le résultat de la multiplication des paramètres de volume client et système. Ainsi, le changement d’amplitude du signal qui en résulte est une combinaison linéaire des niveaux de volume du client et du système. Par exemple, si le niveau de volume client est 0,8 et le niveau de volume système est 0,5, le niveau de volume effectif est (0,8). (0,5) = 0,4.
Notez que l’intensité sonore perçue n’est pas linéaire par rapport à l’amplitude du signal. Au lieu de cela, le bruit varie approximativement en fonction du logarithme du niveau de volume v :
sons en décibels = 20. log₁₀(v)
Ainsi, la définition de v = 0,5 atténue le bruit du signal d’origine (le signal avant l’application du niveau de volume) de 6 décibels, la définition de v = 0,25 atténue le signal de 12 décibels, et ainsi de suite. Un niveau de volume v = 1,0, correspondant à 0 décibels, ne modifie pas le niveau de signal d’origine.
Les applications audio avec interfaces utilisateur permettant de contrôler le niveau de volume affichent généralement des curseurs qui génèrent des modifications du son perçu qui sont proportionnelles linéairement aux changements de position du curseur. Pour produire une relation linéaire entre le bruit perçu et la position du curseur, l’application doit définir une relation non linéaire entre le niveau de volume v et la position du curseur. Pour plus d’informations, consultez Contrôles de volume à coniques audio.
Comme expliqué précédemment, le programme système de contrôle du volume, Sndvol, affiche des curseurs de volume pour les sessions audio qui sont lues sur chaque périphérique de rendu audio. Ces curseurs apparaissent dans la zone de groupe intitulée Applications dans la fenêtre SndVol. En règle générale, chaque session contient tous les flux de lecture d’une fenêtre d’application particulière. Grâce aux curseurs de la fenêtre Sndvol, les utilisateurs contrôlent les niveaux de volume des applications audio individuelles.
En règle générale, une application doit affecter tous ses flux de lecture à la même session audio. WASAPI n’empêche pas une application de distribuer ses flux de lecture entre plusieurs sessions. Toutefois, la prolifération des curseurs de volume dans Sndvol peut perturber les utilisateurs.
En option, une fenêtre d’application peut afficher un curseur de volume. Le curseur d’application doit refléter l’état du curseur Sndvol correspondant à tout moment. Ainsi, si l’utilisateur modifie le niveau de volume en déplaçant le curseur dans la fenêtre d’application, le curseur correspondant dans la fenêtre Sndvol doit se déplacer à l’unisson avec le curseur d’application. De même, si l’utilisateur déplace le curseur Sndvol, le curseur d’application doit se déplacer à l’unisson avec le curseur Sndvol.
Pour prendre en charge ce comportement, WASAPI implémente l’interface ISimpleAudioVolume . Lorsque l’utilisateur déplace le curseur d’application, l’application appelle la méthode ISimpleAudioVolume::SetMasterVolume pour ajuster le niveau de volume de session en conséquence. Sndvol surveille les modifications de volume effectuées via cette méthode et reflète les modifications dans les curseurs de volume qu’il affiche. En outre, une application peut recevoir des notifications de modifications de volume de session que l’utilisateur effectue via Sndvol. À cet effet, l’application implémente une interface IAudioSessionEvents et inscrit l’interface auprès de WASAPI. Par la suite, chaque fois que l’utilisateur modifie le niveau du volume de session via Sndvol, l’application reçoit un appel de notification via la méthode IAudioSessionEvents::OnSimpleVolumeChanged . Pour obtenir un exemple de code qui implémente une interface IAudioSessionEvents , consultez Événements de session audio. Pour obtenir un exemple de code qui inscrit une interface IAudioSessionEvents , consultez Événements audio pour les applications audio héritées.
L’interface ISimpleAudioVolume applique uniformément le même niveau de volume à tous les canaux d’une session audio. Bien que cette interface réponde aux exigences de contrôle de volume de la plupart des applications, certaines applications peuvent nécessiter des fonctionnalités de contrôle de volume plus spécialisées. L’interface IAudioStreamVolume contrôle le volume d’un flux individuel dans une session par rapport aux autres flux de la session. IAudioStreamVolume permet également à un client de contrôler individuellement les niveaux de volume de tous les canaux du flux. Par exemple, une application peut utiliser cette fonctionnalité pour obtenir des effets audio tels que la simulation du mouvement spatial d’une source audio en effectuant un mouvement panoramique de gauche à droite. Une autre interface spécialisée, IChannelAudioVolume, contrôle les niveaux de volume des canaux individuels dans une session. Par exemple, une application peut utiliser IChannelAudioVolume pour implémenter des contrôles d’équilibrage pour un système audio stéréophonique.
Les curseurs de volume dans la zone Applications de Sndvol reflètent uniquement les modifications de volume effectuées via l’interface ISimpleAudioVolume . Ils ne reflètent pas les modifications de volume effectuées via les interfaces IAudioStreamVolume et IChannelAudioVolume . Bien que certaines applications puissent permettre aux utilisateurs de contrôler directement ou indirectement les paramètres de volume via IAudioStreamVolume et IChannelAudioVolume, les développeurs doivent éviter de présenter des curseurs d’application pour ces paramètres de volume que les utilisateurs sont susceptibles de confondre avec les curseurs de volume dans Sndvol. Sinon, un utilisateur peut déplacer un curseur d’application en s’attendant à voir la modification reflétée dans un curseur Sndvol et devenir confus quand aucune modification de ce type ne se produit. Les développeurs peuvent éviter ce problème grâce à une conception minutieuse de l’interface utilisateur.
Le niveau de volume effectif de n’importe quel canal dans le sous-mix de session, tel qu’il est entendu aux intervenants, est le produit des quatre facteurs de niveau volume suivants :
- Niveaux de volume par canal des flux dans la session, que les clients peuvent contrôler via les méthodes de l’interface IAudioStreamVolume .
- Niveau de volume par canal de la session, que les clients peuvent contrôler via les méthodes de l’interface IChannelAudioVolume .
- Le master niveau de volume de la session, que les clients peuvent contrôler via les méthodes de l’interface ISimpleAudioVolume.
- Niveau de volume basé sur une stratégie de la session, que le système modifie dynamiquement à mesure que la combinaison globale change.
Chacun des quatre facteurs de niveau volume de la liste précédente est une valeur comprise entre 0,0 et 1,0, où 0,0 indique le silence et 1,0 indique le volume complet (aucune atténuation). Le niveau de volume effectif est également une valeur comprise entre 0,0 et 1,0.
Le moteur audio applique le niveau de volume effectif de chaque canal aux canaux d’un flux avant de mélanger le flux avec les autres flux de la session audio. Si des valeurs d’échantillon dans un canal dépassent 0 décibels après que le moteur audio les a multipliées par le niveau de volume effectif, le moteur extrait les échantillons avant de les ajouter au sous-mix de session.
Rubriques connexes