raspberry pi als Bluetooth Audioschleuder

raspberry

Nachdem ich mir einen Bluetooth Kopfhörer zugelegt habe, war die Idee geboren, den Raspberry Pi als Musik Server zu nutzen. Meine Vorstellung für die Praxis ist es, den Kopfhörer einfach einzuschalten die Play Taste am Kopfhörer zu drücken und die Musikausgabe läuft weiter.

Als Image benutze ich das Darkbasic, ein minimalistisches Debian Wheezy Image welches ich dann mit rpi-update auf den neusten Firmware Stand aktualisiere.

Alternativ kann ich noch das Wheezy Server Image empfehlen.

Für die Bluetooth Funktionalität werden folgende Pakete benötigt

  • bluetooth
  • bluez-utils

Nach der Installation die Datei /etc/bluetooth/audio.conf anpassen.

[General]
Enable=Source,Sink,Media,Socket,Control

Den Kopfhörer in den Pairing Mode versetzen, und die Adresse ermitteln.

$ hcitool scan

Danach mit folgenden Befehlen den Kopfhörer verbinden.

$ bluez-simple-agent hci0 xx:xx:xx:xx:xx:xx
$ bluez-test-device trusted xx:xx:xx:xx:xx:xx yes
$ bluez-test-audio connect xx:xx:xx:xx:xx:xx

Wer beim Pairing mit der Fehlermeldung „Creating device failed: org.bluez.Error.AuthenticationRejected: Authentication Rejected“ konfrontiert wird, sollte in der /usr/bin/bluez-simple-agent die Zeile capability=“KeyboardDisplay“ auf capability=“DisplayYesNo“ ändern.

Den Kopfhörer für Alsa sichtbar machen und die Konfiguration in /etc/asound.conf anpassen.

pcm.btheadset {
  type plug
    slave {
      pcm {
        type bluetooth
        device xx:xx:xx:xx:xx:xx
        profile "auto"
      }
   }
   hint {
      show on
      description "SHB9100 black"
   }
}  

ctl.btheadset {
  type bluetooth
}

Als Player nutze ich den Music Player Daemon und benötige die Pakete

  • mpd
  • mpc

und danach in /etc/mpd.conf die Ausgabe für Bluetooth hinzufügen.

audio_output {
  type "alsa"
  name "btheadset"
  device "btheadset"
}

Als Datenquelle dient ein USB Stick den ich mit usbmount automatisch ins System einhängen lasse und als Symbolischen Link mpd zugänglich mache.

Um die Media Tasten am Kopfhörer mit Befehlen zu binden, nutze ich das Paket

  • esekeyd

und habe die Konfiguration /etc/esekeyd.conf wie folgt angepaßt.

PAUSECD(press):mpc pause
PLAYCD(press): mpc play
NEXTSONG(press):mpc next
PREVIOUSSONG(press):mpc prev

Der esekeyd Daemon entlädt sich leider selbstständig, wenn das Input Device dev/input/eventx nicht mehr existiert, was passiert, wenn der Kopfhörer ausgeschaltet wird. Damit der Daemon wieder genutzt werden kann, habe ich mir eine udev Rule unter /etc/udev/rules.d/100-bluetooth.rules angelegt

ACTION=="add", SUBSYSTEM=="input", RUN+="/lib/udev/bluetoothd"

und starte ein Script was den Daemon wieder erneut lädt.

An dieser Stelle ist mein Ziel erreicht. Den Kopfhörer einschalten, die Play Taste drücken und die Playlist läuft weiter. Der ein oder andere Linux Freak wird vermutlich den Kopf schütteln. Für mich zählt hier aber das Ergebnis ;-)

Anmerkungen oder Verbesserungen sind willkommen …