Ohne Alsamixer den Ausgang mit einem Skript ändern (Xonar DGX)

Thunfischsalat

Lieutenant
Registriert
März 2012
Beiträge
791
Die Lösung für mich, um die selbe Funktion wie XonarSwitch für WIndows unter Linux zu haben:
Bash:
#!/bin/bash

STATE=$(amixer sget -D hw:DGX 'Analog Output' | grep Item0 | cut -d "'" -f2)

if [ "$STATE" = "Stereo Headphones" ]
then
  amixer sset -D hw:DGX 'Analog Output' 'Stereo Headphones FP' > /dev/null
  amixer sset Master 40%
else
  amixer sset -D hw:DGX 'Analog Output' 'Stereo Headphones' > /dev/null
  amixer sset Master 45%
fi
hw:DGX muss an den Namen der Soundkarte angepasst werden.
aplay -L gibt den Namen der Geräte aus und würde bei mir CARD=DGX auswerfen, was wir im amixer als hw:DGX nutzen.
'Analog Output' und 'Stereo Headphones' können wir mithilfe des alsamixers herausfinden.
Nachdem man in den alsamsixer geht, kann man mit F6 die entsprechende Soundkarte auswählen und dort den Namen des Outputs und des Ports sehen
Dieses Skript können wir nun mithilfe von KDE auf eine Taste legen und anwenden.
Bildschirmfoto.png

Moin,
ich habe hier im Forum dieses Skript gefunden, welches den Ausgang meiner DGX von Frontpanel zum Backpanel umschalten soll: https://www.computerbase.de/forum/t...ch-frontpanel-backpanel.1724207/post-20625104

Aktuell muss ich unter OpenSuse Tumbleweed immer in den Alsamixer, meine Xonar DGX auswählen und dann dort bei der Wiedergabe den 'Analog Output' umstellen.
Bei mir wird anstatt 'Multichannel' der normale Stereo Ausgang benötigt, daher habe ich das auf 'Stereo Headphones' geändert.
Leider funktioniert das Skript bei mir nicht wie erhofft.

Zu eurer Information: Ich habe zum aller ersten Mal in Linux anhand dieser Anleitung ein Skript erstellt.
Wirklich verstehen tue ich die ’cat >’ und ’chmod u+x'-Befehle aber nicht und auch die Funktionen im Skript sind mir nicht geläufig.
Zumindest If, then, else sind mir aus der Excel-Welt geläufig.

Bash:
#!/bin/bash

STATE=$(amixer sget 'Analog Output',0 | grep Item0 | cut -d "'" -f2)

if [ "$STATE" = "Stereo Headphones" ]
then
  amixer sset 'Analog Output',0 'Stereo Headphones FP' > /dev/null
else
  amixer sset 'Analog Output',0 'Stereo Headphones' > /dev/null
fi

Nur wird mit dem Skript in der Konsole folgendes ausgegeben:
Code:
User@OpenSuse:~/Scripts> bash DGX.sh
amixer: Unable to find simple control 'Analog Output',0

amixer: Unable to find simple control 'Analog Output',0
Ich kann nur vermuten es liegt daran, dass im alsamixer die DGX an vierter Stelle mit der Nummer 3 versehen ist?
Mit dem einfachen u.g. Skript kann ich den Ausgang entsprechend umstellen.
Bash:
#!/bin/bash
amixer -c 3 set 'Analog Output' 'Stereo Headphones FP'
Eine Änderung auf amixer sget 'Analog Output',3 wirft den selber Fehler nur mit einer 3 raus.
Daher bin ich jetzt überfragt und bräuchte eure Hilfe!

Edit: Ok mit dem kleinen Zusatz '-c 3' funktioniert das Skript.
Bash:
#!/bin/bash

STATE=$(amixer sget -c 3 'Analog Output',0 | grep Item0 | cut -d "'" -f2)

if [ "$STATE" = "Stereo Headphones" ]
then
  amixer sset -c 3 'Analog Output',0 'Stereo Headphones FP' > /dev/null
else
  amixer sset -c 3 'Analog Output',0 'Stereo Headphones' > /dev/null
fi

Nun bleibt wahrscheinlich die ID der Soundkarte nicht immer gleich. Wie bekomme ich das hin, dass das Skript die Soundkarte automatisch identifiziert?
 
Zuletzt bearbeitet:
@Uridium Danke für die Rückmeldung
Wenn ich -C auf -D setzte, dann kommt folgende Meldung:
Code:
User@OpenSuse:~/Scripts> bash DGX.sh
ALSA lib control.c:1570:(snd_ctl_open_noupdate) Invalid CTL 0
amixer: Mixer attach 0 error: No such file or directory
ALSA lib control.c:1570:(snd_ctl_open_noupdate) Invalid CTL 0
amixer: Mixer attach 0 error: No such file or directory
Wenn ich auch die 0 weglase kommt diese Meldung:
Code:
User@OpenSuse:~/Scripts> bash DGX.sh
Specify a scontrol identifier: 'name',index
Specify what you want to set...

Ich habe auch in die Manuals geschaut und ich muss mit -D den Namen des Gerätes benennen.
Nur bin ich wirklich nicht bewandert und wahrscheinlich offensichtliche Dinge sind mir nicht geläufig.
An welcher Stelle des Skripts mit -D muss der Name in welcher Form?
Also in Klammern, eckigen Klammer, Anführungszeichen oder Apostroph und muss dann ein Komma zum 'Analog Output' ?
Der Befehl -D ist nicht bei den Beispielen genannt.
Auch die immer wiederkehrende 0 bereitet mir Kopfschmerzen.
 
Mit aplay -L die Geräte/Karten anzeigen lassen, z.B. CARD=NVidia. Daraus macht man hw:NVidia.
Also amixer -D hw:NVidia set 'Analog Output' 'Stereo Headphones FP'.

Mit aplay -l kann man sich die Geräte und ihre Notation anschauen. Bei Karte 0, Gerät 0, Sub-Gerät #0 wäre das hw:0,0,0. Die jeweils letzten Zahlen kann man auch weglassen, also hw:0,0 oder hw:0. Ein Mischen der Notation mit den Namen ist auch möglich, also hw:NVidia,0,0.

Grundsätzlich würde ich aber zuerst schauen, ob die Karte nicht mittlerweile in Pipewire unterstützt wird. Dazu kannst Du pavucontrol benutzen und dort bei Configuration schauen, ob nicht ein Profil für Front/Back vorhanden ist.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Thunfischsalat
Die Profile bei Pavucontrol sind die selben wie in den KDE Soundeinstellungen.
Witziger weise kann ich dort beim Eingang/Mikrophon mit dem Port zwischen Front- und Backpanel umschalten, aber nicht für den Ausgang.
Ich probiere mich mal mit deiner Hilfe aus und versuche das anzuwenden.
Vielen Dank für die Erklärung!
 
Thunfischsalat schrieb:
Aktuell muss ich unter OpenSuse Tumbleweed immer in den Alsamixer, meine Xonar DGX auswählen und dann dort bei der Wiedergabe den 'Analog Output' umstellen.
Musst Du das nach jedem Neustart erneut machen? Probiere mal (nachdem Du alles richtig eingestellt hast) ein 'sudo alsactl store'. Wenn da einige Fehler kommen ist das egal. Das speichert die ALSA Settings nach '/var/lib/alsa/asound.state'. Wenn nach dem Neustart die Settings nicht stimmen, mache ein 'sudo alsactl restore'. Das lädt sie wieder ein und die Werte sollten stimmen. Wenn nicht, wurden sie mit falschen Werten überschrieben (beim Runterfahren).

Das könnte bedeuten, dass die Karte entweder gar nicht initialisiert wird (Standardwerte verbleiben), jemand anderes die Werte (auch) setzt (vielleicht Pipewire) oder dass Tumbleweed die 'asound.state' evtl. woanders oder falsch speichert.

Edit:
Poste mal die Ausgabe von diesen Befehlen:
Code:
$ systemctl --no-pager -l status alsa-restore.service
$ systemctl --no-pager -l status alsa-state.service
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Thunfischsalat
Moin,
ich dachte eigentlich, dass es die Einstellung beibehält, aber das scheint nicht durchgehend zu sein.
Bei zwei von drei Neustarts gerade eben, hat er auf das Front Panel umgeschaltet und beim dritten Neustart das Backpanel beibehalten.
Da beim Umschalten von vorne nach hinten auch etwas physisch bei der Soundkarte umgeschaltet wird, kann mein ein Klicken dabei hören.
Dies passiert unter Linux auch beim Herunter- und Hochfahren. Daher bleibt nach zweimaligen umschalten (hoch- und runterfahren) bei Linux die Position gleich. Wenn ich in Windows auf dem Frontpanel das System ausschalte und dann aber in Linux wieder einschalte, schaltet er auf Backpanel.
Wenn ich zwischendurch in Windows boote, dann kann ich nicht dieses Klicken hören.

Edit: Es ist auch bei Windows zu hören, aber anscheinend habe ich nie darauf geachtet. Es passiert nur halt nicht immer. Ich gehe davon aus, dass es mit der Soundkarte zu tun hat.

Auch bleibt jetzt durchgehend die DGX Soundkarte auf Platz 0 im alsamixer/amixer. Keine Ahnung ob ich unbedacht etwas verstellt habe?
Uridium schrieb:
Probiere mal (nachdem Du alles richtig eingestellt hast) ein 'sudo alsactl store'.
Es kamen keine Fehler, aber ich muss eigentlich nichts fest einstellen. Oder?

Uridium schrieb:
Poste mal die Ausgabe von diesen Befehlen:
Ich gehe davon aus, ohne das $? War das nicht etwas aus Arch?
Code:
User@OpenSuse:~> systemctl --no-pager -l status alsa-restore.service
● alsa-restore.service - Save/Restore Sound Card State
     Loaded: loaded (/usr/lib/systemd/system/alsa-restore.service; static)
     Active: active (exited) since Sun 2024-09-15 13:41:32 CEST; 8min ago
 Invocation: ee784def679947ff8cd547ae562773db
    Process: 1420 ExecStart=/usr/sbin/alsactl restore (code=exited, status=0/SUCCESS)
   Main PID: 1420 (code=exited, status=0/SUCCESS)
        CPU: 4ms

Warning: some journal files were not opened due to insufficient permissions.
Code:
User@OpenSuse:~> systemctl --no-pager -l status alsa-state.service
○ alsa-state.service - Manage Sound Card State (restore and store)
     Loaded: loaded (/usr/lib/systemd/system/alsa-state.service; static)
     Active: inactive (dead)
Condition: start condition unmet at Sun 2024-09-15 13:41:32 CEST; 10min ago
             └─ ConditionPathExists=/etc/alsa/state-daemon.conf was not met

Edit2: Nochmal zu deinem Befehl aplay -L:
Da kommen extrem viele Ergebnisse und allein neun mal DGX raus:
Code:
User@OpenSuse:~> aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
sysdefault
    Default Audio Device
iec958
    IEC958 (S/PDIF) Digital Audio Output
speexrate
    Rate Converter Plugin Using Speex Resampler
pipewire
    PipeWire Sound Server
upmix
    Plugin for channel upmix (4,6,8)
default
    Default ALSA Output (currently PipeWire Media Server)
sysdefault:CARD=DGX
    Xonar DGX, Multichannel
    Default Audio Device
front:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    Front output / input
surround21:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    4.0 Surround output to Front and Rear speakers
surround41:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=DGX,DEV=0
    Xonar DGX, Multichannel
    IEC958 (S/PDIF) Digital Audio Output
sysdefault:CARD=Microphone
    USB Microphone, USB Audio
    Default Audio Device
front:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    Front output / input
surround21:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Microphone,DEV=0
    USB Microphone, USB Audio
    IEC958 (S/PDIF) Digital Audio Output
hdmi:CARD=HDMI,DEV=0
    HDA ATI HDMI, XF270HU
    HDMI Audio Output
hdmi:CARD=HDMI,DEV=1
    HDA ATI HDMI, HDMI 1
    HDMI Audio Output
hdmi:CARD=HDMI,DEV=2
    HDA ATI HDMI, HDMI 2
    HDMI Audio Output
hdmi:CARD=HDMI,DEV=3
    HDA ATI HDMI, HDMI 3
    HDMI Audio Output
hdmi:CARD=HDMI,DEV=4
    HDA ATI HDMI, LG ULTRAGEAR
    HDMI Audio Output
hdmi:CARD=HDMI,DEV=5
    HDA ATI HDMI, HDMI 5
    HDMI Audio Output

Edit3: Mit dem von dir vorgeschlagenen amixer -D hw:NVidia set 'Analog Output' 'Stereo Headphones FP' scheint es zu funktionieren.
Code:
#!/bin/bash

STATE=$(amixer sget -D hw:DGX 'Analog Output',0 | grep Item0 | cut -d "'" -f2)

if [ "$STATE" = "Stereo Headphones" ]
then
  amixer sset -D hw:DGX 'Analog Output',0 'Stereo Headphones FP' > /dev/null
else
  amixer sset -D hw:DGX 'Analog Output',0 'Stereo Headphones' > /dev/null
fi
 
Zuletzt bearbeitet:
Nun habe ich mich daran versucht auch die Lautstärke beim Umschalten zu fixieren, damit ich die Nachbarn und auch mich beim Umschalten auf die Lautsprecher nicht quäle.
Komischerweise gibt mir der Befehl amixer -D hw:DGX sset 'Headphone' 40% zwar im amixer 40% (
Playback 102 [40%] [-75.30dB]), aber im alsamixer und in den KDE-Einstellungen werden 6% ausgegeben.

amixer -D hw:DGX sset 'Headphone' 40% = 3%
amixer -D hw:DGX sset 'Headphone' 60% = 14%
amixer -D hw:DGX sset 'Headphone' 70% = 23%
amixer -D hw:DGX sset 'Headphone' 80% = 38%
amixer -D hw:DGX sset 'Headphone' 90% = 62%

Der Befehl: amixer set Master 40% funktioniert wie vorgesehen.
Kann man in einer Kommandozeile mithilfe -D hw:NAME etwas verstellen und in der gleichen Zeile den Master verstellen?
Wenn set Master 40% nach dem Ändern des Ports anwendet kann für einen Bruchteil der Sekunde der Ton noch mit 100% über die Lautsprecher kommen.
Klar könnte ich die Reihenfolge ändern, aber eine saubere Lösung wäre mir lieber.
amixer sset Master 0% -D hw:DGX 'Analog Output' 'Stereo Headphones FP' > /dev/null wirft mir amixer: Unable to find simple control 'Master',0 aus.
 
Eigentlich ist das viel zu kompliziert mit den ganzen ALSA Tools rumzufummeln.

Du kannst die ALSA Einstellungen speichern mit:
sudo alsactl store (default /var/lib/alsa/asound.state)
oder in eine separate Datei:
alsactl store -f ~/myasound.state
('~' ist dein HOME Ordner)

Laden mit:
sudo alsactl restore
alsactl restore -f ~/myasound.state

Das erlaubt dir mehrere Zustände abzuspeichern, die Du vorher mit allen möglichen ALSA Tools eingestellt hast, z.B. mit alsamixer, der ja einfacher (grafisch) zu bedienen ist.

Die default Werte werden beim Systemstart geladen und beim Runterfahren gespeichert. Wenn das nicht richtig funktioniert, musst Du herausfinden, welcher der beiden Befehle (Laden/Speichern) nicht funktioniert. Dazu kannst Du (wenn die Einstellungen direkt nach dem Systemstart nicht stimmen) den Befehl einfach nochmal manuell ausführen (sudo alsactl restore).
 
  • Gefällt mir
Reaktionen: Thunfischsalat
Zurück
Oben