ubuntuusers.de

Bash Skript: Audioausgabe zw. Threshold

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

b0wie

Anmeldungsdatum:
28. Mai 2022

Beiträge: Zähle...

Liebe Linux Freunde,

ich stehe nun das erste mal vor ein kleines Problem. Ich möchte gerne über eine Bestimmte Soundkarte prüfen, ob eine Audioausgabe stattfindet und falls ja, soll das Skript ein RTS Pin (USB) schalten. Habe hier etwas ähnliches, was aber nicht funktioniert. Kurze Anmerkung noch zu meinem Scripting Kenntnissen: Totaler Neuling.

Hier nun ein Beispielskript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

# audio device
device=/dev/audio-line-in

# below this threshold audio will not be recorded.
noise_threshold=10

# run indefenitly, until Ctrl-C is pressed
while true; do
   # noise_level() represents a function to determine
   # the noise level from device
   if noise_level( $device ) > $noise_threshold; then
     # Befehl ausführen, RTS Pin schalten  
   fi;
done;

Kann einer Helfen?

Moderiert von sebix:

Thema in einen passenden Forenbereich verschoben. Bitte beachte die als wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“) in jedem Forenbereich. Danke.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Moin!,

ernsthaft?, Du willst dabei

noise_level

prüfen?

Ob, und Wohin eine Audioausgabe stattfindet kannst Du bspw. mit

pactl list sinks short

sehen. (RUNNING). Soll es nicht per Soundserver sein geht das auch anders.

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Guten morgen,

nein das war nicht mein ernst. Das ist ein Beispielskript. Ich möchte nichts abfangen, sondern nur prüfen, ob ein Sound aus den Lautsprechern gesendet wird. Ich habe eine Anwendung die eine Sprachkommuniktion zulassen. Sobald dort gesprochen wird, möchte ich lediglich einen RTS oder alternativ ein DTR Pin schalten.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Ich möchte nichts abfangen,

??

Läuft ein Soundserver?

ps -C pipewire
ps -C pulseaudio

Sobald dort gesprochen wird, möchte ich lediglich einen RTS oder alternativ ein DTR Pin schalten.

Wie willst Du das schalten? Im Terminal das per Hand auszulösen probiert?

Geht es um einen Raspi?

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Marantkurz schrieb:

Ich möchte nichts abfangen,

??

Läuft ein Soundserver?

ps -C pipewire
ps -C pulseaudio

Sobald dort gesprochen wird, möchte ich lediglich einen RTS oder alternativ ein DTR Pin schalten.

Wie willst Du das schalten? Im Terminal das per Hand auszulösen probiert?

Geht es um einen Raspi?

Ob ein Soundserver läuft weiß ich ehrlich gesagt nicht. So weiter hinter bin ich noch nie gestiegen. Ich erhalte folgende Ausgabe:

ps -C pipewire
--------------
   PID TTY          TIME CMD
   1945 ?        00:28:15 pipewire
   1946 ?        00:00:00 pipewire

ps -C pulseaudio
    PID TTY          TIME CMD

Wie ich den RTS Pin bei Bash oder über die Konsole schalte weiß ich ehrlich gesagt auch noch nicht. Ich habe das bisher immer mit einem Python Skript erledigt:

1
2
3
4
5
6
7
8
9
import serial
import time

# COM Port
com_a = '/dev/ttyUSB1'
serial_a = serial.Serial(str(com_a), baudrate = 38400, timeout = 3.0)

serial_a.setDTR(1)
serial_a.setRTS(1)

Nein, ich nutze dafür keinen Raspi. Nutze einen normalen ausgesonderten "TinyPC" von meiner Firma.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

OK, das Python Script kannst Du auch jetzt nutzen.

Vorerst zeige mal wenn Ausgabe auf der betreffenden Soundkarte erfolgt:

pactl list sinks short

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Das Schalten des RTS/DTR Pins funktioniert üebr Pyhton hervorragend, allerdings etwas träge. Wenn ein Sound die Lautsprecher verlässt, dann erhalte ich folgende Ausgabe:

1
2
3
49	alsa_output.pci-0000_00_09.2.analog-stereo	PipeWire	s32le 2ch 48000Hz	SUSPENDED
52	alsa_output.usb-BurrBrown_from_Texas_Instruments_USB_AUDIO_CODEC-00.analog-stereo	PipeWire	s16le 2ch 48000Hz	RUNNING
1372	alsa_output.pci-0000_00_01.1.hdmi-stereo-extra1	PipeWire	s32le 2ch 48000Hz	SUSPENDED

Die selbe Ausgabe erhalte ich, auch wenn kein Sound über die Lautsprecher geht. Die Sound Ein- und Ausgabe funktioniert jedoch einwandfrei.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Die selbe Ausgabe erhalte ich, auch wenn kein Sound über die Lautsprecher geht.

Nö, nicht ganz, Status "RUNNING" bei der "usb-BurrBrown_from_Texas_Instruments_USB_AUDIO_CODEC-00.analog-stereo" sollte sich ändern. Teste mal.

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Nein leider nicht. Ob mit oder ohne Sound: Status "Running" steht nach wie vor da.

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Die betreffende Anwendung wird das offenhalten. Weniger gut.

Zeige mal während LS Ausgabe und ohne LS Ausgabe:(warte mal ca. 5s wenn keine Ausgabe mehr da war)

pactl list sink-inputs

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Marantkurz schrieb:

Die betreffende Anwendung wird das offenhalten. Weniger gut.

Zeige mal während LS Ausgabe und ohne LS Ausgabe:(warte mal ca. 5s wenn keine Ausgabe mehr da war)

pactl list sink-inputs

Ohne LS Ausgabe: https://pastebin.com/MFz0RMnL

Mit LS Ausgabe: https://pastebin.com/eMUgyKtq

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

OK, das sieht so aus als wäre eine Messung des Pegels notwendig. Muss ich aber auch erst etwas recherchieren.

Falls Jmd. weitermachen will, mglw lässt sich Hieraus was machen:

https://stackoverflow.com/questions/5046975/how-to-read-out-volume-level-of-clients-of-pulseaudio-in-the-console

oder per arecord, etc.

Was ist eigentlich das Folgende? Abtastwert-Angabe: u8 1ch 1Hz, application.name = "PipeWire ALSA [sox]"

Ziel-Eingabe #1166
	Treiber: PipeWire
	Besitzer-Modul: k. A.
	Client: 1165
	Ziel: 1475
	Abtastwert-Angabe: u8 1ch 1Hz
	Kanalzuordnung: mono
	Format: pcm, format.sample_format = "\"u8\""  format.rate = "1"  format.channels = "1"  format.channel_map = "\"mono\""
	Unterbrochen: nein
	Stumm: nein
	Lautstärke: mono: 65536 / 100% / 0,00 dB
	        Verteilung 0,00
	Pufferlatenz: 0 usec
	Ziel-Latenz: 0 usec
	Resample-Methode: PipeWire
	Eigenschaften:
		application.name = "PipeWire ALSA [sox]"
		node.name = "alsa_playback.sox"
		device.description = "ALSA Playback [sox]"
		media.name = "ALSA Playback"
		media.type = "Audio"
		media.category = "Playback"
		node.latency = "536/1"
		node.rate = "1/1"
		stream.is-live = "true"
		node.want-driver = "true"
		node.autoconnect = "true"
		media.class = "Stream/Output/Audio"
		adapt.follower.spa-node = ""
		object.register = "false"
		factory.id = "8"
		clock.quantum-limit = "8192"
		factory.mode = "split"
		audio.adapt.follower = ""
		library.name = "audioconvert/libspa-audioconvert"
		client.id = "188"
		object.id = "189"
		object.serial = "1166"
		module-stream-restore.id = "sink-input-by-application-name:PipeWire ALSA [sox]"

b0wie

(Themenstarter)

Anmeldungsdatum:
28. Mai 2022

Beiträge: 12

Guten Morgen,

habe etwas probiert und schaffe es nicht zu prüfen ob dein Sound aus der Karte kommt, oder eben nicht. Hab es auch so probiert, nur keine Chance.

1
2
3
4
5
if grep -q RUNNING /proc/asound/card1/pcm0p/sub0/status 2>&1; then
   echo "Playing"
else
   echo "Idle"
fi

Hat jemand noch eine Möglichkeit zu prüfen, ob ein Sound wiedergegeben wird?

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Moin,

cat /proc/asound/card1/pcm0p/sub0/status

wird tatsächlich zwischendurch auf "closed" geschalten?

Hatte Gestern das (mit sox) gefunden:

sox -q -t alsa pipewire -d -n stats trim 0 0.1

Zeigt Level.

Wie? Die 0.1 auf > 5 setzen, laufen lassen, dann "pavucontrol -t 2", dort Monitor der Karte wählen, dann die 5 wieder runter setzen.

edit

Periodische Abfrage:

watch -n0.3 cat /proc/asound/card1/pcm0p/sub0/status

Marantkurz

Anmeldungsdatum:
7. September 2023

Beiträge: 941

Also, wenn Du ca. 0.5-1s Verzögerung(da wäre py bestimmt schon mit drin) verkraften kannst könnte man das über die (welche auch immer) Aufnahmeauswertung machen.

Korrektur:

sox -q -t alsa -d -n stats trim 0 0.1

Der nimmt wenn Pipewire default Gerät ist automatisch "pipewire". Zu sehen Hier:

arecord -L
Antworten |