sunny26a
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo Zusammen, bin noch sehr neu in Linux und fange gerade an mich mit Skripten zu beschäfteigen. Kann mir jemand bei folgendem Vorhaben helfen: Ich habe bereits ein kleines Skript das per CRONJOB läuft und überprüft ob eine gewisser Prozess läuft. Falls nein dann startet er ein Program. Das klappt alles soweit. Nun ist es aber so dass ich dieses programm mit einer gewissen option starten muss je nachdem ob ich meine USB Soundkarte dran habe oder nicht. Dieses müsste ich also vorher auslesen und dann damit starten. Das bekomme ich noch nicht ganz hin. Über sudo cat /proc/asound/cards werden schonmal alle Sounddevices ausgegeben. Da drinnen befindet sich der Name den ich bräuchte. In meinem Fall ist es diese Ausagebe: | audiosys@Audio-WZ:~/programs$ sudo cat /proc/asound/cards
0 [HDMI ]: HDA-Intel - HDA Intel HDMI
HDA Intel HDMI at 0xf7d34000 irq 46
1 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7d30000 irq 45
|
Das HDMI bzw. PCH is der Name. Wenn mein USB Gerät angesteckt ist taucht das Zusätzlich auf. Dieser Name muss nun in das folgende Skript eingebaut werden | #!/bin/sh
if [ $(pgrep squeezelite) ];
then
else
/home/audiosys/programs/squeezelite
fi;
|
Und zwar genau hinter dem squeezelite... Sinngemäß müsste es also beispielsweise so aussehen: | #!/bin/sh
if [ $(pgrep squeezelite) ];
then
else
/home/audiosys/programs/squeezelite -o hw:CARD=PCH,DEV=0
fi;
|
wobei das PCH in diesem Fall genau die Variable wäre die vorher ausgelesen und dann eingesetzt wird. Das CARD und DEV=0 bleibt immer gleich. Danke euch und VG S
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
sunny26a schrieb:
sudo cat /proc/asound/cards werden schonmal alle Sounddevices ausgegeben. Da drinnen befindet sich der Name den ich bräuchte. In meinem Fall ist es diese Ausagebe: | audiosys@Audio-WZ:~/programs$ sudo cat /proc/asound/cards
0 [HDMI ]: HDA-Intel - HDA Intel HDMI
HDA Intel HDMI at 0xf7d34000 irq 46
1 [PCH ]: HDA-Intel - HDA Intel PCH
HDA Intel PCH at 0xf7d30000 irq 45
|
Das HDMI bzw. PCH is der Name. Wenn mein USB Gerät angesteckt ist taucht das Zusätzlich auf. Dieser Name muss nun in das folgende Skript eingebaut werden
Was ist denn jetzt immer da und was kommt extra? Welche zwei Fälle willst Du unterscheiden?
wobei das PCH in diesem Fall genau die Variable wäre die vorher ausgelesen und dann eingesetzt wird. Das CARD und DEV=0 bleibt immer gleich.
Vielleicht ist dies eine Lösung, aber nur, wenn entweder das eine ("PCH") oder andere ("HDMI") auftaucht: | if pgrep squeezelite >/dev/null; then
echo whatever
else
/home/audiosys/programs/squeezelite -o "hw:CARD=$(egrep -o 'PCH|HDMI' /proc/asound/cards),DEV=0"
fi
|
Anmerkung: man kann den Rückgabewert von pgrep direkt auswerten. Das habe ich hier gemacht. PS: Nutze doch bitte das passende Format für Deine Codeblöcke.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Mir ist auch nicht klar geworden, was das Entscheidungskriterium ist: bitte sag nochmal genauer, wann was geschehen soll. Zum Handwerklichen hätte ich noch 3 Anmerkungen:
Das cat /proc/asound/cards funktioniert auch ohne sudo - das vereinfacht die Sache. (→ kein sudoers - Eintrag nötig) Zum auseinanderklamüsern der Ausgabe empfiehlt sich auch hier wieder awk : track@lucid:~$ awk -F "[ []" '/\[/ { print $2,$4 }' /proc/asound/cards
0 SI7012
1 UART Diese Ausgabe kannst Du mit einer Command Substitution in ein Array übernehmen, dann hast Du alle Daten griffbereit. - z.B.: | sk=( $( awk -F "[ []" '/\[/ { print $2,$4 }' /proc/asound/cards ) )
|
LG, track
|
cornix
Anmeldungsdatum: 9. März 2007
Beiträge: 4763
Wohnort: Ringenberg
|
track schrieb: Mir ist auch nicht klar geworden, was das Entscheidungskriterium ist: bitte sag nochmal genauer, wann was geschehen soll.
Ich habe es so verstanden: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | #!/usr/bin/env bash
preferred=PCH
# all cards:
cards=($(awk -F "[ []" '/\[/ { print $4 }' /proc/asound/cards))
#first one as fallback
card=${cards[0]}
# test for preferred card
for s in ${cards[@]}
do
if [ ${s} = ${preferred} ]; then
card=${preferred}
fi
done
# if program is not running, start it
if [ ! $(pgrep squeezelite) ]; then
/home/audiosys/programs/squeezelite -o hw:CARD=${card},DEV=0
fi
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
cornix schrieb: track schrieb: Mir ist auch nicht klar geworden, was das Entscheidungskriterium ist: bitte sag nochmal genauer, wann was geschehen soll.
Ich habe es so verstanden:
Du meinst also, es gibt eine bevorzugte Karte und, wenn die nicht gefunden wird, wird eine andere (die erste gefundene) genommen. Ich finde übrigens die Logik aller hier aufgeführten Skripte falsch: die Information über die Karten wird ja nur benötigt, wenn es keinen Prozess "squeezelite" gibt. Dann müsste man die Info auch nur in dem Fall ermitteln. Also z.B. so: | #!/bin/sh
pgrep squeezelite >/dev/null || /home/audiosys/programs/squeezelite -o "hw:CARD=$(
if fgrep -wq PCH /proc/asound/cards; then
echo PCH
else
egrep -o 'PCH|HDMI' /proc/asound/cards | head -1
fi
),DEV=0"
|
Gut, das ist jetzt vielleicht etwas komprimiert. So ist es lesbarer: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/sh
preferred=PCH
if ! pgrep squeezelite >/dev/null; then
if fgrep -wq "$preferred" /proc/asound/cards; then
card="$preferred"
else
card=$(egrep -o 'PCH|HDMI|ANDERE|WERTE' /proc/asound/cards | head -1)
fi
if [ -n "$card" ]; then
/home/audiosys/programs/squeezelite -o "hw:CARD=$card,DEV=0"
else
echo "ERROR: no card found." >&2
exit 1
fi
fi
|
Ciao robert
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo Zusammen, erstmal vielen Lieben Dank für eure sehr hilfreichen Antworten. Das hat meine Frage perfekt beantwortet auch wenn nicht ganz klar war was ich eigentlich wollte. Der Sinn war dass sobald mein USB Device auftaucht dieses auch verwendet wird. Mit Hilfe eurer Beispiele konnte ich das auch umsetzen und squeezelite mit USB Ausgabe starten lassen. Sobald das entfernt wird ist die Karte von Intel mit PCH wieder Default und squeezelite startet damit. Nochmals vielen Dank ihr habt mein Vorhaben gerettet ☺ Grüße und schönen Sonntag S
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12834
|
sunny26a schrieb:
Der Sinn war dass sobald mein USB Device auftaucht dieses auch verwendet wird. Mit Hilfe eurer Beispiele konnte ich das auch umsetzen und squeezelite mit USB Ausgabe starten lassen. Sobald das entfernt wird ist die Karte von Intel mit PCH wieder Default und squeezelite startet damit.
Dann poste doch mal die endgültige Lösung für die anderen Mitleser. Ach ja, das Thema kannst Du dann auch als "gelöst" markieren.
Nochmals vielen Dank ihr habt mein Vorhaben gerettet ☺
Fein. Bis dann robert
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo, aber gerne doch. Das Skript sieht so aus: 1
2
3
4
5
6
7
8
9
10
11
12 | #!/usr/bin/env bash
# all cards:
cards=($(awk -F "[ []" '/\[/ { print $4 }' /proc/asound/cards))
#first one as fallback
card=${cards[0]}
# if program is not running, start it
if [ ! $(pgrep squeezelite) ]; then
/home/audiosys/programs/squeezelite -o hw:CARD=${card},DEV=0
fi
|
Zusätzlich habe ich in der /etc/modprobe.d/alsa-base.conf folgendes verändert: Beide Teile: options snd-usb-audio index=-2 auskommentiert und folgendes Ergänzt: | alias snd-card-0 snd-usb-audio
# UB Card index = 0
options snd-usb-audio index=0 vid=0x249c pid=0x930b
|
Sobald also die USB Soundkarte dran ist bekommt diese den Index 0 und wird squeezlite wird automatisch mit dieser gestartet. Steckt diese nicht dann nimmt Squeezlite automatisch das Device PCH welches sich per Default auf Index 0 platziert. (Könnte man auch noch fest definieren in der alsa-base.conf) Jetzt ist mir noch etwas zusätzliches aufgefallen. Aus irgendeinem Grund den ich leider noch nicht ganz erschließen konnte stellt sich das USB Geräte nach dem Einstecken auf Mute. Ich habe das in ein paar Beitträgen aus diversen Foren bereits gehört aber eben noch keine Lösung gefunden. Damit es zumindest mal kurzfristig funktioniert: Gibt es denn eine Möglichkeit über ein Skript die entsprechende Karte zu unmuten. Momentan mache ich das manuell über den alsamixer also und dann die Taste m jeweils pro Kanal. Danke nochmals und Viele Grüße S
|
cornix
Anmeldungsdatum: 9. März 2007
Beiträge: 4763
Wohnort: Ringenberg
|
Zeile 10 kannst du nach Zeile 2 verschieben (Hinweis zur Logik von rklm). Rein Interessehalber: wenn deine USB-Karte nicht angeschlossen ist, wie lautet die Ausgabe von cat /proc/asound/cards ? Zu der anderen Sache schaue dir amixer an (und sudo sollte an der Stelle nicht nötig sein).
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo nochmals, also ich habe mich eine zeitlang mit dem amixer beschäftigt aber das übersteigt so ein bisschen meine Fähigkeiten. Das Prinzip hab ich verstanden: Z.B. kann man den Master der default Soundkarte mit amixer set Master 0
amixer set Master 100 entsprechend anmpassen. Nun ist es aber so dass die USB Soundkarte vollkommen andere "Subcontrols" hat als z.B. der Standard Chip auf dem Mainboard. Am liebsten wäre mir also einfach alle verfügbaren Ausgänge zu unmuten. Nach einiger Sucherei habe ich einen Beitrag in einem anderen Forum gefunden mit dem es gehen sollte | amixer -c 1 scontrols | grep -oE "'.*'" | awk -F\' \ '{print "amixer -c 1 set \""$2"\" unmute 100"}' | sh
|
Sinngemäß schreibt der Verfasser dass hiermit alle Subcontrols der jeweiligen Karte ausgelesen werden und dann per Amixer alles unmuted wird bzw auf 100% gesetzt wird. Leider funktioniert das bei mir nicht es wird lediglich einer der beiden Kanäle auf 35% gesetzt der andere ist nach wie vor unmuted. Kann mir hier nochmals jemand helfen. Danke und Grüße S
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo nochmals, jetzt bin ich schon etwas schlauer geworden. Im Prinzip ist das Ganze garnicht so schwer wenn man reguläre Ausrücke richtig verstehen würde ☺ Folgendes konnte ich bereits umsetzen: Mit | amixer -c 1 |grep -o \'.*
|
bekomme ich beide Subcontrols meiner USB Soundkarte. Das ganze sieht so aus: | audiosys@audioserver:~$ amixer -c 1 |grep -o \'.*
'TRINITY Clock Selector',0
'TRINITY Clock Selector',1
|
Genau diese Beiden Subcontrols benötige ich um zu "unmuten". Dieser muss im Endeffekt lauten: | amixer -c 1 sset 'TRINITY Clock Selector',0 unmute
|
bzw. für den zweiten Kanal
| amixer -c 1 sset 'TRINITY Clock Selector',1 unmute
|
Man müsste das Ganze also nur noch in ein Skript bauen das zunächst die Subcontrols ausliest dann in eine Variable packt und dann für jedes ausführt. Und genmau hier stecke ich fest ☺ Bin für jede Hilfe dankbar VG S
|
cornix
Anmeldungsdatum: 9. März 2007
Beiträge: 4763
Wohnort: Ringenberg
|
Öhm, du hast da einen kleinen Denkfehler... Du kennst die genauen Befehle, warum willst Du sie dann erst ermitteln? | #!/usr/bin/env bash
amixer -c 1 sset 'TRINITY Clock Selector',0 unmute
amixer -c 1 sset 'TRINITY Clock Selector',1 unmute
|
Dazu erstellst Du eine udev-Regel, die das Skript aufruft, wenn die USB-Soundkarte verbunden wird. Und beantworte bitte noch meine Frage: „wenn deine USB-Karte nicht angeschlossen ist, wie lautet die Ausgabe von cat /proc/asound/cards? “
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hi, danke für deine Antwort. Sorry das hatte ich oben ganz übersehen aber ich hab sowieso nochmal alles umgebaut da offenbar durch das Verändern der alsa.conf einige Sachen nicht mehr richtig funktionierten. Das ging dann soweit dass auf einmal der alsamixer nicht mehr aufzurufen war oder die Soundkarte nicht mehr auftauchte. Von daher hab ich mich entschieden die Datei so zu lassen wie sie ist und über folgendes Skript die richtige Karte aufzurufen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/usr/bin/env bash
if [ ! $(pgrep squeezelite) ]; then
cards=($(awk -F "[ []" '/\[/ { print $4 }' /proc/asound/cards))
#Default Card
card=PCH
for s in ${cards[@]}
do
if [ ${s} != "PCH" ] && [ ${s} != "Audio" ]; then
card=${s}
fi
done
#echo $card
/home/audiosys/programs/squeezelite -o hw:CARD=${card},DEV=0
fi
|
Damit erreiche ich jetzt dass PCH erstmal Default ist und sobald eine weitere Karte auftaucht diese zugewiesen wird egal welchen Index diese hat. Das klappt soweit ganz gut - kann man sicherlich noch schöner machen ☺ Aber wieder zum Amixer: Du hast natürlich recht ich kenne die Befehle. Hintergrund ist der, dass ich hier momentan mit 3 unterschiedlichen USB Soundkarten rumexperimentiere, d.h. die Subcontrols die ich unten beschrieben habe treffen nur bei einer zu. Ich werde auf jeden Fall 2 der Karten behalten von daher wäre mir das schon das liebste die vorher auszulesen und dann zu unmuten. Ich bin mir auch sicher dass das nicht allzu schiwerig ist aber ich bekomme es einfach nicht hin die einzelnen Subcontrols ordentlich einzulesen. Zudem hast du mich jetzt noch weiter angespitzt ☺ Das wäre natürlich der Traum wenn das Ganze auch noch beim einstöpseln ausgelöst wird. Nun kenne ich mich noch gar nicht mit udev aus ich vermute mal das erkennt ein spezifisches Devices oder kann man dem auch mitteilen dass sobald eine USB Soundkarte eingesteckt wird das das Ganze ausgelöst wird. Nochmals vielen vielen Dank für Eure Mühen. Das hat mir schon sehr weitergeholfen (auch wenn ich ein paar graue Haare mehr hab ☺ ) VG S
|
cornix
Anmeldungsdatum: 9. März 2007
Beiträge: 4763
Wohnort: Ringenberg
|
Schau bitte einmal über den Artikel udev, bevor Du fragst, was dŕin steht. 😬 btw.: statt /proc/asound/cards auszulesen ist es vielleicht günstiger sich die Dateien /proc/asound/card*/id vorzunehmen.
|
sunny26a
(Themenstarter)
Anmeldungsdatum: 8. Oktober 2014
Beiträge: 55
|
Hallo, ich denke dass mit den udev Regeln werde ich hinbekommen sollte es da Probleme geben melde ich mich. Danke nochmal für den Tipp.
Was mcih viel mehr fuchst ist dieser amixer. Gibt es denn vielleicht auch noch eine elegantere Methode als das? VG S
|