Besturingselementen voor sessievolume
Zoals eerder uitgelegd, kunnen WASAPI-clients het volumeniveau van elke audiosessie afzonderlijk beheren. WASAPI past de volumeinstelling voor een sessie uniform toe op alle streams in de sessie. Elk volumeniveau is een waarde in het bereik 0,0 tot 1.0, waarbij 0,0 aangeeft dat stilte en 1,0 het volledige volume aangeeft (geen vertenuatie).
Een client maakt impliciet een sessie door de eerste stream toe te wijzen aan die sessie. Het standaardvolumeniveau van de nieuwe sessie is 1.0. Zoals eerder besproken, kan de gebruiker het volumeniveau van de sessie aanpassen via de gebruikersinterface van een besturingsprogramma (bijvoorbeeld Sndvol) dat een WASAPI-client is. De besturingsinstellingen zijn permanent.
Naast de door de client beheerde volume-instellingen past het systeem zijn eigen volume-instellingen toe op sessies. Deze instellingen zijn gebaseerd op audiobeleid en worden dynamisch gewijzigd als reactie op wijzigingen in de streams waaruit de globale audiomix bestaat. Zie User-Mode audioonderdelenvoor meer informatie over audiobeleid.
De systeemsoftware waarmee de volumeregeling voor elke stream wordt geïmplementeerd, vermenigvuldigt de PCM-voorbeelden in de stroom met het effectieve volumeniveau. Het effectieve volumeniveau is het resultaat van het vermenigvuldigen van de client- en systeemvolumeinstellingen. De resulterende verandering in signaalamplitude is dus een lineaire combinatie van de client- en systeemvolumeniveaus. Als het clientvolumeniveau bijvoorbeeld 0,8 is en het systeemvolumeniveau 0,5 is, is het effectieve volumeniveau (0,8).(0,5) = 0,4.
Houd er rekening mee dat waargenomen luidheid niet lineair is met betrekking tot de amplitude van het signaal. In plaats daarvan varieert de luidheid ongeveer als de logaritme van het volumeniveau v:
luidheid in decibel = 20.logboek₁₀(v)
Het instellen van v = 0,5 verzwapt dus de luidheid van het oorspronkelijke signaal (het signaal voordat het volumeniveau wordt toegepast) met 6 decibel, waarbij het instellen v = 0,25 het signaal met 12 decibels attenueert, enzovoort. Een volumeniveau v = 1,0, dat overeenkomt met 0 decibel, verandert het oorspronkelijke signaalniveau niet.
Audiotoepassingen met gebruikersinterfaces voor het regelen van het volumeniveau geven doorgaans schuifregelaars weer die wijzigingen genereren in waargenomen luidheid die lineair evenredig zijn aan wijzigingen in schuifregelaarpositie. Voor het produceren van een lineaire relatie tussen waargenomen luidheid en schuifregelaarpositie moet de toepassing een niet-lineaire relatie tussen het volumeniveau v en de schuifregelaarpositie definiëren. Zie Audio-Tapered Volumebesturingselementenvoor meer informatie.
Zoals eerder uitgelegd, geeft het systeem volumebesturingsprogramma, Sndvol, volumeschuifregelaars weer voor de audiosessies die worden afgespeeld op elk audiorenderingsapparaat. Deze schuifregelaars worden weergegeven in het groepsvak met het label Toepassingen in het SndVol-venster. Normaal gesproken bevat elke sessie alle afspeelstreams uit een bepaald toepassingsvenster. Via de schuifregelaars in het Sndvol-venster regelen gebruikers de volumeniveaus van afzonderlijke audiotoepassingen.
In de regel moet een toepassing alle afspeelstreams toewijzen aan dezelfde audiosessie. WASAPI voorkomt niet dat een toepassing de afspeelstreams over meerdere sessies distribueert. De resulterende toename van volumeschuifregelaars in Sndvol kan gebruikers echter verwarren.
Als optie kan een toepassingsvenster een volumeschuifregelaar weergeven. De schuifregelaar van de toepassing moet altijd de status van de bijbehorende Sndvol-schuifregelaar weerspiegelen. Dus als de gebruiker het volumeniveau wijzigt door de schuifregelaar in het toepassingsvenster te verplaatsen, moet de bijbehorende schuifregelaar in het Sndvol-venster in één richting worden verplaatst met de schuifregelaar van de toepassing. Als de gebruiker de Sndvol-schuifregelaar verplaatst, moet de schuifregelaar van de toepassing zich op één manier verplaatsen met de Sndvol-schuifregelaar.
Ter ondersteuning van dit gedrag implementeert WASAPI de interface ISimpleAudioVolume. Wanneer de gebruiker de schuifregelaar van de toepassing verplaatst, roept de toepassing de ISimpleAudioVolume::SetMasterVolume methode aan om het niveau van het sessievolume dienovereenkomstig aan te passen. Sndvol bewaakt volumewijzigingen die via deze methode zijn aangebracht en weerspiegelt de wijzigingen in de volumeschuifregelaars die worden weergegeven. Daarnaast kan een toepassing meldingen ontvangen van wijzigingen in sessievolumes die de gebruiker via Sndvol aanbrengt. Voor dit doel implementeert de toepassing een IAudioSessionEvents interface en registreert de interface met WASAPI. Telkens wanneer de gebruiker het niveau van het sessievolume wijzigt via Sndvol, ontvangt de toepassing vervolgens een meldingsaanroep via de methode IAudioSessionEvents::OnSimpleVolumeChanged methode. Zie Audio session eventsvoor een codevoorbeeld waarmee een IAudioSessionEvents interface wordt geïmplementeerd. Zie Audio-gebeurtenissen voor verouderde audiotoepassingenvoor een codevoorbeeld waarmee een IAudioSessionEvents interface wordt geregistreerd.
De ISimpleAudioVolume interface past hetzelfde volumeniveau gelijkmatig toe op alle kanalen in een audiosessie. Hoewel deze interface moet voldoen aan de vereisten voor volumebeheer van de meeste toepassingen, vereisen een paar toepassingen mogelijk meer gespecialiseerde mogelijkheden voor volumebeheer. De interface IAudioStreamVolume bepaalt het volume van een afzonderlijke stream in een sessie ten opzichte van de andere streams in de sessie. IAudioStreamVolume stelt een client ook in staat om de volumeniveaus van alle kanalen in de stream afzonderlijk te beheren. Een toepassing kan deze mogelijkheid bijvoorbeeld gebruiken om audio-effecten te bereiken, zoals het simuleren van ruimtelijke beweging van een audiobron door van links naar rechts te pannen. Een andere gespecialiseerde interface, IChannelAudioVolume, bepaalt de volumeniveaus van de afzonderlijke kanalen in een sessie. Een toepassing kan bijvoorbeeld IChannelAudioVolume gebruiken om balansbesturingselementen voor een stereofonisch geluidssysteem te implementeren.
De volumeschuifregelaars in het vak Toepassingen in Sndvol geven alleen volumewijzigingen weer die zijn aangebracht via de interface ISimpleAudioVolume. Ze weerspiegelen geen volumewijzigingen die worden aangebracht via de IAudioStreamVolume en IChannelAudioVolume interfaces. Hoewel sommige toepassingen gebruikers in staat stellen om volume-instellingen rechtstreeks of indirect te beheren via IAudioStreamVolume en IChannelAudioVolume, moeten ontwikkelaars voorkomen dat toepassingsschuifregelaars worden weergegeven voor deze volumeinstellingen die gebruikers waarschijnlijk zullen verwarren met de volumeschuifregelaars in Sndvol. Anders kan een gebruiker een toepassingsschuifregelaar verplaatsen die verwacht dat de wijziging wordt weerspiegeld in een Sndvol-schuifregelaar en in de war raakt wanneer er geen dergelijke wijziging plaatsvindt. Ontwikkelaars kunnen dit probleem voorkomen door zorgvuldig ontwerp van de gebruikersinterface.
Het effectieve volumeniveau van elk kanaal in de sessiesubmix, zoals gehoord bij de luidsprekers, is het product van de volgende vier factoren op volumeniveau:
- De volumeniveaus per kanaal van de streams in de sessie, die clients kunnen beheren via de methoden in de IAudioStreamVolume interface.
- Het volumeniveau per kanaal van de sessie, die clients kunnen beheren via de methoden in de IChannelAudioVolume interface.
- Het hoofdvolumeniveau van de sessie, die clients kunnen beheren via de methoden in de ISimpleAudioVolume interface.
- Het volumeniveau op basis van beleid van de sessie, dat het systeem dynamisch wijzigt als de globale mix verandert.
Elk van de vier factoren op volumeniveau in de voorgaande lijst is een waarde in het bereik 0,0 tot 1.0, waarbij 0,0 stilte aangeeft en 1,0 een volledig volume aangeeft (geen vertenuatie). Het effectieve volumeniveau is ook een waarde in het bereik 0,0 tot 1,0.
De audio-engine past het effectieve volumeniveau voor elk kanaal toe op de kanalen in een stream voordat de stream wordt gemengd met de andere streams in de audiosessie. Als een voorbeeldwaarde in een kanaal groter is dan 0 decibel nadat de audio-engine deze heeft vermenigvuldigd met het effectieve volumeniveau, worden de voorbeelden geclipd voordat deze worden toegevoegd aan de sessiesubmix.
Verwante onderwerpen