Posts mit dem Label A2DP werden angezeigt. Alle Posts anzeigen
Posts mit dem Label A2DP werden angezeigt. Alle Posts anzeigen

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.

Dreiteiliges Tutorial: RaspberryPi als Radio und Streaming-Client

In diesem dreiteiligem Tutorial werde ich zeigen, wie man einen Raspberry Pi in ein erstklassiges Radio verwandeln kann. Jedoch kein herkömmliches UKW-Radio, sondern ein funktionales kleines Medienradio was sich nahtlos in die heimische digitale Infrastruktur ingeriert und Konnektivität für nahezu jedes Device und OS bietet.

Das Tutorial wird an dieser Stelle in drei Posts aufgeteilt. Nachdem diese befolgt wurden sollte der Pi folgendes bieten:
  • TEIL 1: Apple Airplay Streaming um Musik direkt aus iTunes auf den Raspberry Pi zu streamen. Ich benutze dafür ein Paket namens Shairport, was leicht zu konfigurieren ist und seinen Dienst mehr oder minder gut leistet.
  • TEIL 2: Music Player Daemon (MPD) um auf dem Raspi abgespeicherte Musik abzuspielen. MPD lässt sich wunderbar per Smartphone steuern und beherrscht neben der Wiedergabe lokaler Musikdateien auch die Wiedergabe von Streams, das Anlegen von Playlists, eine einfache Bedienung über das Terminal und noch vieles weitere.
  • TEIL 3: Musik-Streaming per Bluetooth A2DP-Protokoll um bspw. Musik von Android oder iOs auf das Gerät zu streamen. Der große Vorteil besteht darin, dass nahezu jedes Smartphone mit Bluetoothmodul von Haus aus dieses Protokoll spricht und somit ohne zusätzliche App Musik streamen kann. Zusätzlich kann der Pairing-Vorgang mittels eines NFC-Tags vereinfacht und automatisiert werden.
Bevor eine dieser Anleitungen befolgt wird, muss jedoch eingangs die Quelle angegeben werden, aus der der gestreamte Sound aus dem Pi kommen soll. Dies kann über HDMI oder Analog-Klinke erfolgen. Standardmäßig ist der Pi so eingestellt, dass er automatisch erkennt an welchem der beiden Anschlüsse ein entsprechender Stecker eingesetzt wurde. Probleme gibt es jedoch wenn man den Sound altmodisch über den 3,5mm-Klinkenport nutzen möchte aber gleichzeitig einen Monitor über HDMI angeschlossen hat. Dann bleibt der Pi stumm, da er denkt dass das Audiosignal über HDMI übertragen werden soll. In meinem Fall habe ich den Pi so eingestellt, dass alles Audio über den Klinkenport ausgegeben wird. Dies geht folgendermaßen:
sudo amixer cset numid=3 1
Dabei steht die letzte Zahl "1" für den Klinkenport. Soll der Sound über HDMI ausgegeben werden muss hier eine "2" stehen. Steht dort eine "0" ist der bereits erwähnte automatische Modus aktiviert.