Pulseaudio

Aus TippvomTibb
Zur Navigation springen Zur Suche springen

Allgemeines

Pulseaudio-diagram.png

Wie so oft bietet Wikipedia einen guten Einstieg. Das brauche ich schon mal nicht alles selber schreiben. Darüber hinaus wird man auf der Homepage von Pulseaudio fündig.

Ich habe schon seit Jahren vor alle Audio-Quellen und Lautsprecher zu meshen. Pulseaudio scheint dafür gut geeignet. Hier schildere ich mein Vorgehen. Es fängt in soweit schon mal gut an, da ich von der Console meines Arbeitsplatzrechners die Bluetooth-Lautsprecher nicht ansprechen kann. Von der grafischen Benutzeroberfläche (KDE/Plasma) geht es.

Es gibt so ein paar Dinge, an die ich mich bei Pulseaudio erst gewöhnen musste.

Ein Pulseaudioserver pro user

Es gibt zwar einen "System-Mode". Von dem wird aber im Wesentlichen aus Sicherheitsgründen abgeraten. Nur bei Embedded-Systemen sollte er zum Einsatz kommen. Vielleicht brauche ich ihn einmal bei den AudioSink-RasPi-Clients.

pulseaudio -k zum Töten

Leider hat meine Installation 13.0-rebootstrapped (noch) keine systemctl-Unterstützung.

Connection-Errors

Wenn ich zwei pulseaudio-Daemons auf zwei Consolen mit zwei unterschiedlichen Usern starte und ich dann nicht gegenseitig darauf zugreifen kann, leuchtet mir mittlerweile ein. (Ein Daemon pro User!) Dass ich aber einen PA-Server nicht auf der Console starten kann und mit dem gleichen Nutzer in X/KDE darauf zugreifen kann war schon ein wenig strange. Die Erklärung dafür musste ich auch erst finden. Der Zugriff geschieht nicht (nur) über Berechtigungen, sondern über Cookies.

I get this error message: "Connection refused"
It is a network level error, which is caused by libpulse trying to connect to the daemon. The most likely reason for this error is that pulseaudio isn't running.
I get this error message: "Access denied"
This is likely caused by a mismatch in the cookie used to authenticate to the pulse daemon. You must connect with the same cookie that was used by the daemon when it started. Normally when the server starts it uses the cookie in ~/.config/pulse/cookie (this can be changed with $PULSE_COOKIE). Any client that connects needs to use the same cookie.

This means that if you want to connect to the daemon with a different user (root, for example) than what the daemon was started with, you need to manually copy the cookie to the other users home directory or use the PULSE_COOKIE environment variable to select a cookie file.

Probleme

Protocol not available

Nach Update und reboot:

Mai 23 14:47:47 worker kcmshell5[838]: org.kde.bluez: PendingCall Error: "Protocol not available"
Mai 23 14:47:47 worker bluetoothd[1603]: a2dp-sink profile connect failed for 00:18:91:XX:XX:XX: Protocol not available
Mai 23 14:47:47 worker kcmshell5[838]: org.kde.bluez: PendingCall Error: "Protocol not available"

Aus irgendeinem Grund war das Paket pulseaudio-module-bluetooth geloescht worden.

sudo zypper se module-blue

Metadaten von Repository 'Main Update Repository' abrufen ...........................................................................................[fertig]
Cache für Repository 'Main Update Repository' erzeugen ..............................................................................................[fertig]
Repository-Daten werden geladen...
Installierte Pakete werden gelesen...

S | Name                        | Summary                                           | Type
--+-----------------------------+---------------------------------------------------+------
  | pulseaudio-module-bluetooth | Bluetooth support for the PulseAudio sound server | Paket
(base) chris@worker:/opt/pasink> sudo zypper in pulseaudio-module-bluetooth
Repository-Daten werden geladen...
Installierte Pakete werden gelesen...
Paketabhängigkeiten werden aufgelöst...

Das folgende NEUE Paket wird installiert:
  pulseaudio-module-bluetooth

1 neues Paket zu installieren.
Gesamtgröße des Downloads: 83,8 KiB. Bereits im Cache gespeichert: 0 B. Nach der Operation werden zusätzlich 188,9 KiB belegt.
Fortfahren? [j/n/v/...? zeigt alle Optionen] (j): j
Paket pulseaudio-module-bluetooth-13.0-lp152.3.3.1.x86_64 abrufen                                                       (1/1),  83,8 KiB (188,9 KiB entpackt)
Abrufen: pulseaudio-module-bluetooth-13.0-lp152.3.3.1.x86_64.rpm ....................................................................................[fertig]

Überprüfung auf Dateikonflikte läuft: ...............................................................................................................[fertig]
(1/1) Installieren: pulseaudio-module-bluetooth-13.0-lp152.3.3.1.x86_64 .............................................................................[fertig]
(base) chris@worker:/opt/pasink> 

Nach einem 'sudo killall pulseaudio' lief die BT-Audio-Sink wieder.

Operation not permitted

E: [null-sink] rtp.c: sendmsg() failed: Operation not permitted

Mögliche Ursache: Die für RTP notwenidgen Ports sind durch Firewallregeln gefiltert.


Kein pulseaudio.service/pulseaudio.socket

TODO


Falsches Symbol/Icon von pasystray

pasystray hat auf einmal das Lautsprecher-Symbol als Icon in der Kontrollleiste. Ein pulseaudio -k und danach automatisches Respawn brachte das gewuenschte Ergebnis, das Lautsprecher Icon ueberdeckte nicht mehr das korrekte Icon des Pulseaudio System Tray. Die Einstellung war irgendwo in der KDE Config ->TODO

Kein Server nach Boot

Unter user in der der Console:
Als root bzw. sudo:
journalctl -n100 -x

Feb 17 09:06:42 worker pulseaudio[5222]: Unknown command: module-bluetooth-policy Feb 17 09:06:42 worker pulseaudio[5222]: Failed to initialize daemon due to errors while executing startup commands. Source of commands: /etc/pulse/default.pa

Die fehlerhaften Einträge in der default.pa (habe ich selbst verursacht) habe den ordnungsgemäßen Start verhindert. Wie schon weiter ober erläutert funktioniert jetzt nicht den Daemon über eine Konsole (Cookie und so) zu starten. Wenn ich allerdings "pulseaudio -D" über "KDE command execute" (Alt+F2 oder Alt-Space) ausführe habe ich unter KDE wieder Ton.


Kein Audio auf der Console

Aktuelle Vermutung: Da kommen zwei Probleme zusammen. Zum einen startet jeder Client scheinbar seinen eigenen Pulseaudio-Server (client.conf autospwan auf true) und mein Bluetooth-Dongle ist als Sink in der Console nicht erreichbar. Wenn ich pavucontrol oder pacmd lst-sinks ausführe sehe ich nur meine internen Sound-Devices. Das Programm pasink von Github verspricht Abhilfe.

git clone https://github.com/Heckie75/pasink

Im Ordner befindet sich ein Bash-Script. Ausgeführt. Eingefroren. Toll.

Im Script den bash-Pfad angepasst und die 2 folgenden Zeilen ergänzt. Danach im Debug durchgestept.

#!/usr/bin/bash
set -x
trap read debug

Aha. Das Script bleibt in der Funktion 'lookup_bluez_audio_candidates()' in dieser Zeile hängen.

for controller in $(bluetoothctl list | egrep -o [0-9A-F:]{17})

Das rührt daher, dass bluetoothctl durch die list Option in den interaktiven Modus wechselt und auf eine Eingabe wartet. Also muss man irgendwie erreichen, dass das list-Kommando ausgeführt wird und der Befehl zurückkehrt. Dies habe ich kurzerhand durch folgende Änderung erreicht.

for controller in $(bluetoothctl <<< "list" | egrep -o [0-9A-F:]{17}) 

Und siehe da, es läuft. Jetzt wird auch mein Problem immer deutlicher.

worker:/opt/pasink # ./pasink.sh -l

Default sink:
No PulseAudio daemon running, or not running as session daemon.
Connection failure: Access denied

Plugged Alsa card devices:
Connection failure: Access denied

Sinked Bluetooth A2DP device:
Connection failure: Access denied

Paired Bluetooth A2DP devices:
Connection failure: Access denied

Volume:
Connection failure: Access denied

oder als Benutzer (chris) ausgefuehrt:

(base) chris@worker:/opt/pasink> ./pasink.sh -l
rm: cannot remove '/tmp/bluez_audio_devices': Operation not permitted
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied
./pasink.sh: line 147: /tmp/bluez_audio_devices: Permission denied

Default sink:
        GP107GL High Definition Audio Controller Digital Stereo (HDMI)

Plugged Alsa card devices:
        Internes Audio Analog Stereo
        GP107GL High Definition Audio Controller Digital Stereo (HDMI)

Sinked Bluetooth A2DP device:

Paired Bluetooth A2DP devices:

Combined sink:
        Internes Audio Analog Stereo
        GP107GL High Definition Audio Controller Digital Stereo (HDMI)

Volume:

(base) chris@worker:/opt/pasink>

Aber auch zuweisen der rwx an den Nutzer chris brachte nicht den gewuenschten Erfolg. Der Zugriff war zwar moeglich, aber kein Loeschen!

20210529

Heute ist mir doch tatsaechlich mein HIFI-Verstaerker ueber die Wupper gegangen. Meinen Reparaturversuch schildere ich auf einer eigenen Seite (TODO). Darauf hin schnell mal einen anderen Verstärker aus dem Regal gezogen und angeschlossen. Alles prima bis auf die Tatsache, dass sich der Bluetooth-Empfaenger nicht meht connecten liesz.

journalctl |grep bluetoothd
May 29 12:34:39 worker bluetoothd[1463]: profiles/audio/avdtp.c:avdtp_connect_cb() connect to 00:18:91:XX:XX:XX: Invalid exchange (52)
Als naechstes mal direkt auf der Console nachgeschaut.
worker:~ # bluetoothctl 
Agent registered
[bluetooth]# devices
...
Device 00:18:91:XX:XX:XX Avantree Saturn Pro


Mal genauer nach dem Device geschaut.

[bluetooth]# info 00:18:91:XX:XX:XX
Device 00:18:91:D5:F7:21 (public)
        Name: Avantree Saturn Pro
        Alias: Avantree Saturn Pro
        Class: 0x00240414
        Icon: audio-card
        Paired: yes
        Trusted: yes
        Blocked: no
        Connected: no
        LegacyPairing: no
        UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
        UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
        UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
        RSSI: -72
        TxPower: 4

Vielleicht mal neu pairen. Avvantree ausschalten (Signalton ok), einschalten und halten (Signalton ok und Quittung zum pairen), schnelles blinken ok. Das Device wird allerdings nicht im Scan angezeigt. Pairing loeschen.

bluetooth]# cancel-pairing 00:18:91:XX:XX:XX
Attempting to cancel pairing with 00:18:91:XX:XX:XX
Failed to cancel pairing: org.bluez.Error.DoesNotExist

Also komplett Device loeschen.

[bluetooth]# remove 00:18:91:XX:XX:XX
[DEL] Device 00:18:91:XX:XX:XX Avantree Saturn Pro
Device has been removed

Ah jetzt. Im Scan gelistet. Neu Verbinden. Geht. Musik wieder da. Zusammenfassung: Obwohl das Device gepaired angezeigt wurde, hatte es das Pairing "verloren".

to be continued ...

RasPi als AudioSink-Client/Server?

Als ersten Schritt denke ich an ein Übertagen von Audiodaten z.B. von meinem Arbeitsplatzrechner an einen RasPi-Client auf dem auch Pulseaudio läuft und der dann die Aufgabe hat die Musik zu verteilen. Im einfachsten Fall an einen Bluetooth-Box. Besser aber noch sein Audio einigermaßen HIFI-like an einen "alten" Verstärker ausgibt und dann auch noch dessen Management übernimmt. Den Verstärker habe ich bei mir in einer Zwischendecke eingebaut, da fast kein rankommen mehr. Folgende Darstellung soll mein Vorhaben verdeutlichen.

PulseaudioSystem.png

pulseaudio --help

worker:~ # pulseaudio --help pulseaudio [options]

COMMANDS:

 -h, --help                            Show this help
     --version                         Show version
     --dump-conf                       Dump default configuration
     --dump-modules                    Dump list of available modules
     --dump-resample-methods           Dump available resample methods
     --cleanup-shm                     Cleanup stale shared memory segments
     --start                           Start the daemon if it is not running
 -k  --kill                            Kill a running daemon
     --check                           Check for a running daemon (only returns exit code)

OPTIONS:

     --system[=BOOL]                   Run as system-wide instance
 -D, --daemonize[=BOOL]                Daemonize after startup
     --fail[=BOOL]                     Quit when startup fails
     --high-priority[=BOOL]            Try to set high nice level
                                       (only available as root, when SUID or
                                       with elevated RLIMIT_NICE)
     --realtime[=BOOL]                 Try to enable realtime scheduling
                                       (only available as root, when SUID or
                                       with elevated RLIMIT_RTPRIO)
     --disallow-module-loading[=BOOL]  Disallow user requested module
                                       loading/unloading after startup
     --disallow-exit[=BOOL]            Disallow user requested exit
     --exit-idle-time=SECS             Terminate the daemon when idle and this
                                       time passed
     --scache-idle-time=SECS           Unload autoloaded samples when idle and
                                       this time passed
     --log-level[=LEVEL]               Increase or set verbosity level
 -v  --verbose                         Increase the verbosity level
     --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}
                                       Specify the log target
     --log-meta[=BOOL]                 Include code location in log messages
     --log-time[=BOOL]                 Include timestamps in log messages
     --log-backtrace=FRAMES            Include a backtrace in log messages
 -p, --dl-search-path=PATH             Set the search path for dynamic shared
                                       objects (plugins)
     --resample-method=METHOD          Use the specified resampling method
                                       (See --dump-resample-methods for
                                       possible values)
     --use-pid-file[=BOOL]             Create a PID file
     --no-cpu-limit[=BOOL]             Do not install CPU load limiter on
                                       platforms that support it.
     --disable-shm[=BOOL]              Disable shared memory support.
     --enable-memfd[=BOOL]             Enable memfd shared memory support.

STARTUP SCRIPT:

 -L, --load="MODULE ARGUMENTS"         Load the specified plugin module with
                                       the specified argument
 -F, --file=FILENAME                   Run the specified script
 -C                                    Open a command line on the running TTY
                                       after startup
 -n                                    Don't load default script file

Request for Comments


Kommentar hinzufügen
TippvomTibb freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, registriere dich bitte oder melde dich an.

Quellen

https://wiki.archlinux.org/index.php/bluetooth_headset