Samstag, 18. Mai 2013

Teil 3/3 - Musikstreaming per Bluetooth (A2DP) auf den Raspberry Pi

Musik streamen per Bluetooth (A2DP) auf den Raspberry Pi

Anmerkung vorneweg:
Audiostreaming per A2DP ist eine fummelige Angelegenheit. Viele Nutzer des Pi's berichten, die gleichen im Netz kursierenden Anleitungen befolgt zu haben ohne, einheitlichen Erfolg. Mein Pi wollte zuerst auch keine Streams abspielen. Irgendwann ging es merkwürdigerweise. Die gleiche Konfiguration habe ich bei einem anderen Pi angewendet und dort funktioniert sie merkwürdigerweise nicht. Daher muss an dieser Stelle einfach ausprobiert werden, ob es funktioniert.

Um von vorne herein Fehler auszuschließen, muss festgestellt werden ob der verwendete Bluetooth-Dongle auch korrekt vom System erkannt wird. Dazu tippt man folgendes ins Terminal:
lsusb
Dieses Kommando listet alle angeschlossenen USB-Geräte auf. Hier sollte euer Bluetooth Stick auftauchen. Ist der von mir verwendete Bluetooth Stick von Hama verwendet worden wird er bspw. als Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) erkannt.

An erster stelle installieren wir die nötigen Pakete:
sudo apt-get install bluez blueman bluetooth bluez-utils pulseaudio-module-bluetooth python-gobject python-gobject-2
Damit unser Benutzer Pi Zugriff auf die Bluetoothdienste hat, muss er einer Gruppe namens lp zugeordnet werden.
sudo usermod -a -G lp pi
Bluetooth hat viele Einsatzmöglichkeiten. A2DP ist eine von ihnen und muss vor der Nutzung erst konfiguriert werden:
sudo nano /etc/bluetooth/audio.conf
Es öffnet sich der Texteditor. Oben befindet sich ein Abschnitt in dem [General] steht. Direkt in die freie Zeile darunter muss folgenes geschrieben werden:
Enable=Source,Sink,Media,Socket

Als nächstes muss der sogenannt Resample Algorythm configuriert werden. Folgende Datei im Texteditor öffnen...
sudo nano /etc/pulse/daemon.conf
und die Zeile suchen
resample-method = speex-float-3
und direkt dahinter einen Absatz erstellen und folgenden Inhalt hinzufügen:
resample-method = trivial
Nun muss noch die folgende Datei geändert werden:
sudo nano /etc/pulse/system.pa
Dort muss hinter die vorhandene Zeile
load-module module-udev-detect
der Zusatz tsched=0 geschrieben werden, so dass die Zeile wie folgt aussieht:
load-module module-udev-detect tsched=0
Damit ist auch schon das Gröbste geschafft. Was wir jetzt noch brauchen ist ein Skript, dass automatisch das Audiosignal des verbundenen Smartphones an den Pi leitet. Dazu müssen wir diese Datei öffnen...
sudo nano /etc/udev/rules.d/99-input.rules
... und folgendes reinschreiben:
SUBSYSTEM=="input", GROUP="input", MODE="0660"
KERNEL=="input[0-9]*", RUN+="/usr/lib/udev/bluetooth"
Im letzten Schritt müssen wir noch das Skript an sich erstellen. Dafür erstellen wir einen neuen Ordner:
sudo mkdir /usr/lib/udev
und wechseln direkt in das eben erstellte Verzeichnis:
cd /usr/lib/udev
Nun erstellen wir eine Datei mit dem Namen Bluetooth:
sudo nano bluetooth
Folgendes einfügen
#!/bin/sh
#!/bin/bash  
#change if you don't use default analog audio out.  
#THIS DIDN'T WORK FOR MY PI SO I ADDED A amixer COMMAND BELOW  
AUDIOSINK="alsa_output.platform-bcm2835_AUD0.0.analog-stereo"  
echo "Executing bluetooth script...|$ACTION|" >> /var/log/bluetooth_dev  
  
ACTION=$(expr "$ACTION" : "\([a-zA-Z]\+\).*")  
if [ "$ACTION" = "add" ]  
then  
  
# Turn off BT discover mode before connecting existing BT device to audio  
hciconfig hci0 noscan  
  
# set the audio output to the analog  
# COMMENT THIS LINE OUT IF YOU WANT TO OUTPUT AUDIO THROUGH HDMI  
amixer cset numid=3 1  
  
   for dev in $(find /sys/devices/virtual/input/ -name input*)
   do
      if [ -f "$dev/name" ]
      then
         mac=$(cat "$dev/name" | sed 's/:/_/g')
         bluez_dev=bluez_source.$mac
  
         sleep 1
  
         CONFIRM=`sudo -u pi pactl list short | grep $bluez_dev`
         if [ ! -z "$CONFIRM" ]
         then
            echo "Setting bluez_source to:  $bluez_dev" >> /var/log/bluetooth_dev
            echo pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
            sudo -u pi pactl load-module module-loopback source=$bluez_dev sink=$AUDIOSINK rate=44100 adjust_time=0 >> /var/log/bluetooth_dev
         fi
      fi
   done
fi
  
if [ "$ACTION" = "remove" ]
then
# Turn on bluetooth discovery if device disconnects
sudo hciconfig hci0 piscan
fi

Nachdem die Datei gespeichert wurde machen wir die Datei bluetooth ausführbar:
sudo chmod 755 bluetooth
Dieses Skript verbindet lediglich Smartphones, die vom Pi als vertrauenswürdig eingestuft wurden. Dazu muss aber das Smartphone erst einmal den Pi finden. Standartmäßig ist die Sichtbarkeit des Bluetooth-Adapters aber deaktiviert. Mit folgendem Kommando wird der Pi für Bluetoothgeräte sichtbar:
sudo hciconfig hci0 piscan
Über die GUI kann nun am einfachsten das ersonnene Bluetoothdevice als vertrauenswürdiges Gerät gespeichert werden.
startx
Nun unter Einstellungen --> Bluetooth-Manager mit einem Rechtsklick in die Liste der vertrauensvollen Geräte aufnehmen.


Weiter zu Teil 1 des Tutorials in dem aufgezeigt wird, wie man Apple's Airplay auf dem Raspberry Pi installiert um Musik direkt aus iTunes oder iOs auf den Pi zu streamen oder zu Teil 3 in dem erklärt wird, wie man über Bluetooth Musik auf den Pi streamen kann.

Auch besteht die Möglichkeit den Vorgang über ein NFC-Tag zu automatisieren.

2 Kommentare :

  1. Vielen Dank für deine Anleitung. Leider hat es auf Anhieb nicht funktioniert.
    Hiermit hat es allerdings dann geklappt (http://www.instructables.com/id/Turn-your-Raspberry-Pi-into-a-Portable-Bluetooth-A/all/?lang=de). Die Anleitung ist fast so ähnlich wie deine - an der ein oder anderen Stelle aber anders. Ebenso wird erklärt wie alle sich verbindenden Bluetooth-Endgeräte automatisch akzeptiert werden, da ich die Liste nicht manuell pflegen möchte.

    AntwortenLöschen