Partager via


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é 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 la combinaison audio globale. Pour plus d’informations sur la stratégie audio, consultez User-Mode Composants audio.

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 résultant de l’amplitude du signal est une combinaison linéaire des niveaux de volume client et système. Par exemple, si le niveau de volume client est 0,8 et que le niveau de volume système est 0,5, le niveau de volume effectif est (0,8).(0,5) = 0,4.

Notez que la voix perçue n’est pas linéaire par rapport à l’amplitude du signal. Au lieu de cela, la voix varie approximativement en tant que logarithme du niveau de volume v :

voix en décbels = 20.log₁₀(v)

Par conséquent, la définition de v = 0,5 atténue l’intensité du signal d’origine (le signal avant l’application du niveau de volume) par 6 décbels, en définissant v = 0,25 atténuation du signal par 12 décbels, et ainsi de suite. Un niveau de volume v = 1,0, correspondant à 0 décbels, 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 de la voix perçue proportionnellement aux modifications de la position du curseur. Pour produire une relation linéaire entre la hauteur perçue 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 Audio-Tapered contrôles de volume.

Comme expliqué précédemment, le programme de contrôle de volume système, Sndvol, affiche les curseurs de volume pour les sessions audio qui sont lues sur chaque appareil 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 à partir d’une fenêtre d’application particulière. Par le biais des curseurs dans 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 résultante des curseurs de volume dans Sndvol peut confondre les utilisateurs.

En guise d’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. Par conséquent, si l’utilisateur modifie le niveau du 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 en unon avec le curseur de l’application. De même, si l’utilisateur déplace le curseur Sndvol, le curseur de l’application doit se déplacer union avec le curseur Sndvol.

Pour prendre en charge ce comportement, WASAPI implémente l’interface ISimpleAudioVolume. Lorsque l’utilisateur déplace le curseur de l’application, l’application appelle la méthode ISimpleAudioVolume ::SetMasterVolume pour ajuster le niveau de volume de session en conséquence. Sndvol surveille les modifications apportées au volume par le biais de cette méthode et reflète les modifications apportées aux curseurs de volume qu’elle 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 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’équilibre pour un système audio stéréophonique.

Les curseurs de volume dans la zone Applications dans Sndvol reflètent uniquement les modifications de volume apporté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 s’attendre à voir la modification reflétée dans un curseur Sndvol et devenir confus lorsqu’aucune modification de ce type ne se produit. Les développeurs peuvent éviter ce problème par le biais d’une conception minutieuse de l’interface utilisateur.

Le niveau de volume effectif de n’importe quel canal dans le sous-mélange de session, comme entendu aux haut-parleurs, est le produit des quatre facteurs de niveau volume suivants :

  • Les niveaux de volume par canal des flux de 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.
  • Niveau de volume principal de la session, que les clients peuvent contrôler via les méthodes de l’interface ISimpleAudioVolume.
  • Niveau de volume basé sur la stratégie de la session, que le système modifie dynamiquement à mesure que la combinaison globale change.

Chacun des quatre facteurs au niveau du 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 pour 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écbels une fois 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-mélange de session.

contrôles de volume