Sound-Funktionen

Betrifft:

Andere Sound-Funktionen:

Endpunktgeräte

Die "Geräte", auf die die SoundGet- und SoundSet-Funktionen verweisen, sind Audioendpunktgeräte (engl. audio endpoint devices). Ein einzelner Gerätetreiber oder ein physisches Gerät hat oft mehrere Endpunkte, z.B. für verschiedene Arten von Aus- und Eingängen. Zum Beispiel:

NameBeschreibung
Lautsprecher (Beispiel HD Audio)Die analogen Hauptausgänge dieses Geräts (verwendet mehrere Buchsen bei Surround-Sound).
Digital Output (Beispiel HD Audio)Ein optischer oder koaxialer Digitalausgang.
Mikrofon (Beispiel HD Audio)Erfasst Audioeingaben über eine Mikrofonbuchse.
Stereo Mix (Beispiel HD Audio)Erfasst alles, was am Lautsprecher-Endpunkt erzeugt wird.

Gerätenamen bestehen typischerweise aus einem Endpunktnamen wie "Lautsprecher", gefolgt vom Namen des Audiotreibers in Klammern. Skripte können den vollständigen Namen oder nur den beginnenden Teil des Namens verwenden, wie z.B. "Mikro" oder "Mikrofon". Ein Audiotreiber hat einen festen Namen, während die Endpunktnamen jederzeit von einem Administrator via Sound-Systemsteuerung geändert werden können.

Eine Auflistung aller Audiogeräte finden Sie in der Sound-Systemsteuerung, die durch Ausführen von mmsys.cpl via Befehlszeile, Ausführen-Dialogfenster (Win+R) oder Run-Funktion geöffnet werden kann. Standardmäßig listet die Systemsteuerung nur Geräte auf, die aktiviert und angeschlossen sind (sofern möglich), was aber über das Rechtsklickmenü geändert werden kann. AutoHotkey erkennt nicht-angeschlossene Geräte, aber keine deaktivierten Geräte.

Komponenten

Komponenten sind jene, die im Pegel-Tab des Eigenschaftenfensters eines Audiogeräts aufgelistet sind.

Pegel

Ganz oben sind die Master-Regler, gefolgt von den ersten vier Komponenten: Microphone, FrontMic, Line In, und Side. All diese Komponenten haben ihre eigenen Lautstärke- und Stummschaltregler, mit Ausnahme der vierten Komponente, die nur einen Lautstärkeregler aufweist.

Das Eigenschaftenfenster eines Audiogeräts kann via Sound-Systemsteuerung geöffnet werden.

Audiotreiber sind in der Lage, andere Regler wie Bass und Höhen sichtbar zu machen. Allerdings haben gewöhnliche Audiotreiber üblicherweise nur Lautstärke- und Stummschaltregler oder überhaupt keine Komponenten. Lautstärke- und Stummschaltregler werden direkt über SoundGetVolume, SoundSetVolume, SoundGetMute und SoundSetMute unterstützt. Alle anderen Regler werden nur indirekt über SoundGetInterface und ComCall unterstützt.

Fortgeschrittene Details

Komponenten werden mit der DeviceTopology API ausfindig gemacht, die ein Diagramm von Konnektoren und Untereinheiten aufzeigt. Jede der oben gezeigten Komponenten hat einen Konnektor - genau dieser Konnektor definiert den Namen der Komponente. Jeder Regler (z.B. Lautstärke oder Stummschaltung) wird durch eine Untereinheit repräsentiert, die sich zwischen dem Konnektor und dem Endpunkt befindet. Daten "fließen" vom oder zum Konnektor und werden geändert, während sie durch jede Untereinheit fließen, z.B. um die Lautstärke zu ändern oder alle Klänge zu unterdrücken (stumm zu schalten).

Die SoundGet- und SoundSet-Funktionen identifizieren Komponenten, indem sie das Gerätetopologie-Diagramm schrittweise durchgehen und Konnektoren mit dem angegebenen Namen zählen (oder alle Konnektoren, wenn kein Name angegeben ist). Sobald der passende Konnektor gefunden wurde, wird ein Regler-Interface (z.B. IAudioVolumeLevel oder IAudioMute) abgerufen, indem jede Untereinheit auf diesem spezifischen Zweig des Diagramms abgefragt wird, beginnend beim nächstmöglichen Konnektor.

Untereinheiten, die für mehrere Konnektoren gelten, werden ausgeschlossen - wie z.B. Untereinheiten, die für die Master-Regler von Lautstärke und Stummschaltung zuständig sind. Ein Konnektor wird gezählt, wenn (und nur wenn) er mindestens eine eigene Untereinheit hat, auch wenn die Untereinheit nicht vom gewünschten Typ ist.

In der Praxis führt dies dazu, dass die Verfügbarkeit und Reihenfolge der Komponenten identisch zur Auflistung im Pegel-Tab sind. Dieses Verfahren basiert jedoch auf Beobachtung, Versuch und Irrtum, so dass die Genauigkeit nicht zu 100 % garantiert werden kann.

Allgemeine Parameter

Komponente

Typ: Zeichenkette oder Integer

Dies kann folgendes sein:

Wenn nur eine Indexnummer angegeben ist, werden die Anzeigenamen ignoriert. Zum Beispiel verwenden 1, "1" und ":1" die erste Komponente unabhängig vom Namen, während "" auf die Master-Regler zugreift.

Wenn das Audiogerät die angegebene Komponente nicht besitzt, wird ein TargetError ausgelöst.

Gerät

Typ: Zeichenkette oder Integer

Dies kann folgendes sein:

Das Soundkartenanalyse-Skript kann helfen, den zu verwendenden Namen bzw. Nummer zu ermitteln.

Beispiele

Soundkartenanalyse. Das folgende Skript kann verwendet werden, um die Namen der verfügbaren Audiogeräte und Komponenten zu ermitteln und herauszufinden, ob das Gerät oder die Komponente Lautstärke- und/oder Stummschaltregler unterstützt. Es zeigt die Ergebnisse in einer einfachen ListView an. Die aktuellen Lautstärke- und Stummschalteinstellungen werden nur angezeigt, wenn sie abgerufen werden können, aber nicht in Echtzeit aktualisiert.

scGui := Gui(, "Audiokomponenten")
scLV := scGui.Add('ListView', "w600 h400"
    , ["Komponente", "#", "Gerät", "Lautstärke", "Stumm"])

devMap := Map()

loop
{
    ; Pro Schleifenwiederholung versuchen, das entsprechende Gerät abzurufen.
    try
        devName := SoundGetName(, dev := A_Index)
    catch  ; Keine weiteren Geräte.
        break
    
    ; Namen mit ":index" qualifizieren, wenn nötig.
    devName := Qualify(devName, devMap, dev)
    
    ; Master-Einstellung von Lautstärke & Stummschaltung abrufen, wenn möglich.
    vol := mute := ""
    try vol := Round(SoundGetVolume( , dev), 2)
    try mute := SoundGetMute( , dev)
    
    ; Master-Einstellungen nur anzeigen, wenn min. eine abgerufen wurde.
    if vol != "" || mute != ""
        scLV.Add("", "", dev, devName, vol, mute)
    
    ; Für jede Komponente zunächst ihren Namen abrufen.
    cmpMap := Map()
    
    loop
    {
        try
            cmpName := SoundGetName(cmp := A_Index, dev)
        catch
            break
        ; Lautstärke- und Stummschalteinstellung dieser Komponente abrufen,
        ; wenn möglich.
        vol := mute := ""
        try vol := Round(SoundGetVolume(cmp, dev), 2)
        try mute := SoundGetMute(cmp, dev)
        ; Komponente auch anzeigen, wenn sie keine Lautstärke oder
        ; Stummschaltung unterstützt, da sie vielleicht andere Regler via
        ; SoundGetInterface() unterstützt.
        scLV.Add("", Qualify(cmpName, cmpMap, A_Index), dev, devName, vol, mute)
    }
}

loop 5
    scLV.ModifyCol(A_Index, 'AutoHdr Logical')
scGui.Show()

; Vollständige Namen mit ":index" qualifizieren, wenn nötig.
Qualify(name, names, overallIndex)
{
    if name = ''
        return overallIndex
    key := StrLower(name)
    index := names.Has(key) ? ++names[key] : (names[key] := 1)
    return (index > 1 || InStr(name, ':') || IsInteger(name)) ? name ':' index : name
}