[gelöst]: Bash Skript, Alarmsound mit individueller Lautstaerke

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
wurst10
Beiträge: 72
Registriert: 22.07.2019 09:19:17
Lizenz eigener Beiträge: MIT Lizenz

[gelöst]: Bash Skript, Alarmsound mit individueller Lautstaerke

Beitrag von wurst10 » 10.03.2021 09:05:56

Hallo zusammen,

ich nutze Debian stable mit xfce4.
Das Panel Plugin "xfce4-Zeitschaltuhr" ermöglicht das Ausführen eines Befehls/Skripts wenn die Alarmzeit abgelaufen ist.
Dazu habe ich ein bash Skript geschrieben, dass bei Ablauf der Alarmzeit
via "notify-send" eine visuelle Meldung ausgibt,
via "pactl" das Volume auf 60% setzt,
via "paplay" einen Sound abspielt,
via "pactl" das Volume auf 35% setzt.

Code: Alles auswählen

#!/bin/bash
notify-send -i /home/htpc/.local/share/icons/elementary-kde-blue/actions/128/hook-notifier.svg "Fertig!" "Die  eingestellte Zeit ist abgelaufen" && 
pactl -- set-sink-volume 0 60% && 
paplay /usr/share/sounds/freedesktop/stereo/complete.oga && 
#sleep 1s && 
pactl -- set-sink-volume 0 35%
Wenn ich Nachrichten schaue oder Musik höre während das Nudelwasser kocht,
wird das aktuelle Volume von z.B. 50% durch das Skript am Ende auf 35% gesetzt.

Wie kann ich das obige Skript so umbauen, dass der Alarmsound deutlich lauter abgespielt wird,
und danach das vorherige Volume von 50% wiederhergestellt wird?

Oder gibt es eine Möglichkeit das aktuelle Mastervolume auszulesen
um diesen Wert dann am Ende (nach dem Alarmsound) wieder einzustellen?

Das übersteigt leider meine einfachen bash-skript Kenntnisse und ich komme nicht weiter.
Zuletzt geändert von wurst10 am 10.03.2021 13:12:35, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Moderator
Beiträge: 7784
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Bash Skript, Alarmsound mit individueller Lautstaerke

Beitrag von smutbert » 10.03.2021 10:19:41

Prinzipiell ist alles kein Problem. Ich schreibe mir auch gerade in paar Skripte, die ein paar Dinge mit Pulseaudio anstellen und kann dir glaube ich zu so ziemlich allen erwähnten Zwecken mit Code-Schnipseln aushelfen, zB Namen der aktuellen Sink herausfinden (und in einer Variablen speichern), denn Namen sind beständiger als Nummern:

Code: Alles auswählen

Sink=$(pacmd dump | awk '/set-default-sink/ { print $2 }')
dann die Lautstärke dieser Sink herausfinden (bei Stereo oder noch mehr Kanälen ist das die Lautstärke eines Kanals, aber im Normalfall unterscheiden sich die Lautstärken der Kanäle eh nicht und ich hätte auch keine Idee wie man mit unterschiedlichen Lautstärken der Kanäle in einem einfachen Skript sinnvoll umgehen könnte)

Code: Alles auswählen

pacmd dump | awk -F"0x" "/set-sink-volume ${Sink}/"'{ print $NF }'
Allerdings erfolgt die Ausgabe als Hexadezimalwert, was nicht sehr praktisch ist. Um die Lautstärke in % in einer Variablen zu speichern wird es etwas länger

Code: Alles auswählen

Volume=$(echo "obase=10;ibase=16; $(pacmd dump | awk -F"0x" "/set-sink-volume ${Sink}/"'{ print toupper($NF) }') / 28F" | bc)
den Rest hast du ja eh bereits, also etwa

Code: Alles auswählen

pactl set-sink-volume ${Sink} ${Volume}%
zum Wiederherstellen der gespeicherten Lautstärke.

Du weißt, dass in Pulseaudio jedes Programm auch seinen eigenen Lautstärkeregler hat?
Eventuell wäre es eleganter nicht den Masterregler sondern nur den Regler von paplay zu „bedienen“, wobei ich zugeben muss, dass ich da auch erst recherchieren müsste wie man das am einfachsten anstellt. EDIT: Ohne es selbst ausprobiert zu haben – wie verhält sich denn

Code: Alles auswählen

paplay --volume=39322 /usr/share/sounds/freedesktop/stereo/complete.oga
(39322 sind ~60% von 65536 – 2^16, das sind die 65536, ist auf der normalen Pulseaudio-Skala der Maximalwert bzw. 100% – ich glaube nicht, dass Pulseaudio an der Stelle auch %-Angaben akzeptiert)

Benutzeravatar
wurst10
Beiträge: 72
Registriert: 22.07.2019 09:19:17
Lizenz eigener Beiträge: MIT Lizenz

[gelöst]: Bash Skript, Alarmsound mit individueller Lautstaerke

Beitrag von wurst10 » 10.03.2021 11:49:41

Danke dir, das funktioniert perfekt. :hail:

Code: Alles auswählen

#!/bin/bash
Sink=$(pacmd dump | awk '/set-default-sink/ { print $2 }')
Volume=$(echo "obase=10;ibase=16; $(pacmd dump | awk -F"0x" "/set-sink-volume ${Sink}/"'{ print toupper($NF) }') / 28F" | bc)
notify-send -i /home/htpc/.local/share/icons/elementary-kde-blue/actions/128/hook-notifier.svg "Fertig!" "Die  eingestellte Zeit ist abgelaufen"
pactl -- set-sink-volume ${Sink} 60%
paplay /usr/share/sounds/clown-hupe.oga
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
paplay /usr/share/sounds/clown-hupe.oga
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
paplay /usr/share/sounds/clown-hupe.oga
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
pactl set-sink-volume ${Sink} ${Volume}%
Die individuelle Lautstärke von paplay muss ich mir noch genauer anschauen.
Nutze das eigentlich nur um die Systemsounds abzuspielen, 100% wird in pavucontrol kurz angezeigt.

Code: Alles auswählen

paplay --volume=39322 /usr/share/sounds/freedesktop/stereo/complete.oga
Die Einstellung wird nicht angwendet, der Sound wird mit Volume 20% abgespielt,
wenn das Mastervolume bei 20% eingestellt ist.


EDIT:
Komisch...
Wenn das Mastervolume auf 70% eingestellt ist, dann spielt

Code: Alles auswählen

paplay --volume=39322 /usr/share/sounds/freedesktop/stereo/complete.oga
den Sound mit 60% Lautstärke ab.
Das Mastervolume scheint die "obere" Grenze zu definieren, leiser als das Mastervolume abspielen, funktioniert.


EDIT:
Jetzt habe ich verstanden was du meintest...

Code: Alles auswählen

paplay --volume=65536 /usr/share/sounds/freedesktop/stereo/complete.oga
spielt den Sound mit 100% Lautstärke des eingestellten Mastervolume ab, ohne diesen verändern oder kennen zu müssen.

Das Skript könnte somit auf 2 Zeilen gekürzt werden:

Code: Alles auswählen

notify-send -i /home/htpc/.local/share/icons/elementary-kde-blue/actions/128/hook-notifier.svg "Fertig!" "Die  eingestellte Zeit ist abgelaufen"
paplay --volume=65536 /usr/share/sounds/freedesktop/stereo/complete.oga
Der Wert "--volume=65536" (=100% Lautstärke des Mastervolume) kann beliebig variieren z.B. "--volume=32768" (=50% Lautstärke des Mastervolume). Sogar der Wert "--volume=131072" (=200% Lautstärke des Mastervolume) wird abgespielt,
klingt aber sehr komisch.

Ich werde die längere Skriptvariante verwenden,
damit wird der Alarmsound deutlich lauter abgespielt als das eingestellte Mastervolume für TV oder Musik.

Vielen Dank nochmal :D

Benutzeravatar
smutbert
Moderator
Beiträge: 7784
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: [gelöst]: Bash Skript, Alarmsound mit individueller Lautstaerke

Beitrag von smutbert » 10.03.2021 20:46:51

wurst10 hat geschrieben: ↑ zum Beitrag ↑
10.03.2021 11:49:41
Jetzt habe ich verstanden was du meintest...
So weit etwas zu meinen war ich noch gar nicht :wink:
Es war nur eine Idee, die ich selbst nicht ausprobiert habe – ich wusste vorher nicht welche Lautstärke diese Option beeinflusst.

Hast du in der /etc/pulse/daemon.conf gegenüber den Standardeinstellungen etwas geändert (flat-volumes = ?).

Benutzeravatar
wurst10
Beiträge: 72
Registriert: 22.07.2019 09:19:17
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst]: Bash Skript, Alarmsound mit individueller Lautstaerke

Beitrag von wurst10 » 11.03.2021 05:37:25

smutbert hat geschrieben: ↑ zum Beitrag ↑
10.03.2021 20:46:51
Hast du in der /etc/pulse/daemon.conf gegenüber den Standardeinstellungen etwas geändert (flat-volumes = ?).
Nein, diese Datei ist unberührt, ich habe folgende Einstellungen via
"/home/NUTZERNAME/.config/pulse/daemon.conf" vorgenommen:

Code: Alles auswählen

default-sample-format = float32le
default-sample-rate = 48000
alternate-sample-rate = 44100
default-sample-channels = 2
default-channel-map = front-left,front-right
default-fragments = 8
default-fragment-size-msec = 10
resample-method = soxr-vhq
; avoid-resampling = true
; enable-lfe-remixing = no
remixing-produce-lfe = no
remixing-consume-lfe = no
high-priority = yes
nice-level = -11
realtime-scheduling = yes
realtime-priority = 9
rlimit-rtprio = 9
daemonize = no

Antworten