Steuerung der Sitzungslautstärke

Wie bereits erläutert, können WASAPI-Clients die Lautstärke jeder Audiositzung individuell steuern. WASAPI wendet die Volumeeinstellung für eine Sitzung einheitlich auf alle Streams in der Sitzung an. Jede Volumeebene ist ein Wert im Bereich von 0,0 bis 1,0, wobei 0,0 die Stille und 1,0 die volle Lautstärke (keine Dämpfung) angibt.

Ein Client erstellt implizit eine Sitzung, indem er dieser Sitzung den ersten Stream zuweist. Die Standardvolumeebene der neuen Sitzung ist 1.0. Wie bereits erläutert, kann der Benutzer die Volumeebene der Sitzung über die Benutzeroberfläche eines Steuerungsprogramms (z. B. Sndvol) anpassen, bei dem es sich um einen WASAPI-Client handelt. Die Steuerelementeinstellungen sind persistent.

Zusätzlich zu den vom Client gesteuerten Volumeeinstellungen wendet das System eigene Volumeeinstellungen auf Sitzungen an. Diese Einstellungen basieren auf der Audiorichtlinie und ändern sich dynamisch als Reaktion auf Änderungen in den Streams, aus denen der globale Audiomix besteht. Weitere Informationen zur Audiorichtlinie finden Sie unter Audiokomponenten im Benutzermodus.

Die Systemsoftware, die die Lautstärkeregelung für jeden Stream implementiert, multipliziert die PCM-Beispiele im Stream mit der effektiven Volumeebene. Die effektive Volumeebene ist das Ergebnis einer Multiplikation der Client- und Systemvolumeeinstellungen. Die resultierende Änderung der Signalamplitude ist also eine lineare Kombination aus Client- und Systemlautstärke. Wenn beispielsweise die Clientvolumeebene 0,8 und die Systemvolumeebene 0,5 ist, ist die effektive Volumeebene (0,8). (0,5) = 0,4.

Beachten Sie, dass die wahrgenommene Lautstärke hinsichtlich der Signalamplitude nicht linear ist. Stattdessen variiert die Lautstärke ungefähr mit dem Logarithmus der Lautstärkestufe v:

Lautstärke in Dezibel = 20. log₁₀(v)

Das Festlegen von v = 0,5 dämpft also die Lautstärke des ursprünglichen Signals (das Signal vor dem Anwenden der Lautstärke) um 6 Dezibel, das Festlegen von v = 0,25 das Signal um 12 Dezibel usw. Eine Lautstärkestufe v = 1,0, die 0 Dezibel entspricht, ändert den ursprünglichen Signalpegel nicht.

Audioanwendungen mit Benutzeroberflächen zum Steuern der Lautstärke zeigen in der Regel Schieberegler an, die Änderungen der wahrgenommenen Lautstärke erzeugen, die linear proportional zu Änderungen der Schiebereglerposition sind. Um eine lineare Beziehung zwischen wahrgenommener Lautstärke und Schiebereglerposition zu erzeugen, muss die Anwendung eine nichtlineare Beziehung zwischen der Lautstärkestufe v und der Schiebereglerposition definieren. Weitere Informationen finden Sie unter Audioverknippte Lautstärkesteuerungen.

Wie bereits erläutert, zeigt das Systemlautstärkensteuerungsprogramm Sndvol Lautstärkeregler für die Audiositzungen an, die auf jedem Audiorenderinggerät wiedergegeben werden. Diese Schieberegler werden im Gruppenfeld Anwendungen im SndVol-Fenster angezeigt. In der Regel enthält jede Sitzung alle Wiedergabestreams aus einem bestimmten Anwendungsfenster. Über die Schieberegler im Sndvol-Fenster steuern Benutzer die Lautstärken einzelner Audioanwendungen.

In der Regel sollte eine Anwendung alle Wiedergabestreams derselben Audiositzung zuweisen. WASAPI verhindert nicht, dass eine Anwendung ihre Wiedergabestreams auf mehrere Sitzungen verteilt. Die daraus resultierende Verbreitung von Lautstärkeschiebereglern in Sndvol kann benutzer jedoch verwirren.

Optional kann ein Anwendungsfenster einen Lautstärkeregler anzeigen. Der Anwendungsschieberegler sollte jederzeit den Zustand des entsprechenden Sndvol-Schiebereglers widerspiegeln. Wenn der Benutzer also die Lautstärkeebene ändert, indem er den Schieberegler im Anwendungsfenster bewegt, sollte sich der entsprechende Schieberegler im Sndvol-Fenster im Einklang mit dem Anwendungsschieberegler bewegen. Wenn der Benutzer den Sndvol-Schieberegler bewegt, sollte sich der Anwendungsschieberegler im Einklang mit dem Sndvol-Schieberegler bewegen.

Zur Unterstützung dieses Verhaltens implementiert WASAPI die ISimpleAudioVolume-Schnittstelle . Wenn der Benutzer den Anwendungsschieberegler verschiebt, ruft die Anwendung die ISimpleAudioVolume::SetMasterVolume-Methode auf, um die Sitzungslautstärke entsprechend anzupassen. Sndvol überwacht Lautstärkeänderungen, die über diese Methode vorgenommen wurden, und spiegelt die Änderungen in den angezeigten Lautstärkeschiebereglern wider. Darüber hinaus kann eine Anwendung Benachrichtigungen über Änderungen des Sitzungsvolumes empfangen, die der Benutzer über Sndvol vornimmt. Zu diesem Zweck implementiert die Anwendung eine IAudioSessionEvents-Schnittstelle und registriert die Schnittstelle bei WASAPI. Danach erhält die Anwendung jedes Mal, wenn der Benutzer die Sitzungsvolumeebene über Sndvol ändert, einen Benachrichtigungsaufruf über die IAudioSessionEvents::OnSimpleVolumeChanged-Methode . Ein Codebeispiel, das eine IAudioSessionEvents-Schnittstelle implementiert, finden Sie unter Audiositzungsereignisse. Ein Codebeispiel, das eine IAudioSessionEvents-Schnittstelle registriert, finden Sie unter Audioereignisse für Legacy-Audioanwendungen.

Die ISimpleAudioVolume-Schnittstelle wendet die gleiche Lautstärke gleichmäßig auf alle Kanäle in einer Audiositzung an. Obwohl diese Schnittstelle die Volumesteuerungsanforderungen der meisten Anwendungen erfüllen sollte, benötigen einige Anwendungen möglicherweise speziellere Volumesteuerungsfunktionen. Die IAudioStreamVolume-Schnittstelle steuert die Lautstärke eines einzelnen Datenstroms in einer Sitzung relativ zu den anderen Streams in der Sitzung. IAudioStreamVolume ermöglicht es einem Client auch, die Lautstärkestufen aller Kanäle im Stream individuell zu steuern. Beispielsweise kann eine Anwendung diese Funktion verwenden, um Audioeffekte zu erzielen, z. B. die Simulation der räumlichen Bewegung einer Audioquelle durch Schwenken von links nach rechts. Eine weitere spezialisierte Schnittstelle, IChannelAudioVolume, steuert die Lautstärkepegel der einzelnen Kanäle in einer Sitzung. Beispielsweise kann eine Anwendung IChannelAudioVolume verwenden, um Balancesteuerungen für ein stereophones Soundsystem zu implementieren.

Die Lautstärkeschieberegler im Feld Anwendungen in Sndvol spiegeln nur Volumeänderungen wider, die über die ISimpleAudioVolume-Schnittstelle vorgenommen werden. Sie spiegeln keine Volumeänderungen wider, die über die Schnittstellen IAudioStreamVolume und IChannelAudioVolume vorgenommen werden. Obwohl einige Anwendungen es Benutzern möglicherweise ermöglichen, Lautstärkeeinstellungen direkt oder indirekt über IAudioStreamVolume und IChannelAudioVolume zu steuern, sollten Entwickler es vermeiden, Anwendungsschieberegler für diese Volumeeinstellungen zu präsentieren, die Benutzer wahrscheinlich mit den Lautstärkereglern in Sndvol verwechseln. Andernfalls kann ein Benutzer einen Anwendungsschieberegler verschieben, der erwartet, dass die Änderung in einem Sndvol-Schieberegler widerspiegelt wird, und wird verwirrt, wenn keine solche Änderung auftritt. Entwickler können dieses Problem durch einen sorgfältigen Entwurf der Benutzeroberfläche vermeiden.

Die effektive Lautstärke eines beliebigen Kanals im Sitzungs-Submix, wie er an den Lautsprechern zu hören ist, ist das Produkt der folgenden vier Faktoren auf Lautstärkeebene:

  • Die Kanalvolumeebenen der Streams in der Sitzung, die Von Clients über die Methoden in der IAudioStreamVolume-Schnittstelle gesteuert werden können.
  • Die Volumeebene der Sitzung pro Kanal, die Clients über die Methoden in der IChannelAudioVolume-Schnittstelle steuern können.
  • Die master Volumeebene der Sitzung, die Clients über die Methoden in der ISimpleAudioVolume-Schnittstelle steuern können.
  • Die richtlinienbasierte Volumeebene der Sitzung, die das System dynamisch ändert, wenn sich der globale Mix ändert.

Jeder der vier Faktoren auf Volumeebene in der vorherigen Liste ist ein Wert im Bereich von 0,0 bis 1,0, wobei 0,0 die Stille und 1,0 die volle Lautstärke (keine Dämpfung) angibt. Die effektive Volumeebene ist ebenfalls ein Wert im Bereich von 0,0 bis 1,0.

Die Audio-Engine wendet die effektive Lautstärke für jeden Kanal auf die Kanäle in einem Stream an, bevor der Stream mit den anderen Streams in der Audiositzung gemischt wird. Wenn Beispielwerte in einem Kanal 0 Dezibel überschreiten, nachdem die Audio-Engine sie mit der effektiven Lautstärke multipliziert hat, schneidet die Engine die Beispiele ab, bevor sie dem Sitzungsuntermix hinzugefügt werden.

Lautstärkeregler