Volumio auf dem Raspberry Pi als Bluetooth Lautsprecher verwenden

Seit einigen Wochen habe ich einen Raspberry Pi 3 mit einer Hifiberry Amp2 „Soundkarte“ und zwei alten Regallautsprechern im Einsatz.

Als Software kommt die Opensource Lösung Volumio zum Einsatz. Volumio kann out-of-the-box als AirPlay Lautsprecher verwendet werden. Was aber fehlt ist bisher die Möglichkeit ein Gerät via Bluetooth zu verbinden von dort Musik oder Podcasts über diese Verbindung auf Volumio wiederzugeben.

Da direkt daneben ein Amazon Echo fand ich diese Einschränkung sehr ärgerlich. Auch nach längerer Suche habe ich keine fertige Lösung für das Problem gefunden und so habe ich mich nach möglichen Lösungen umgeschaut. Hier und da habe ich zwar mal etwas in Foren gefunden, funktioniert hat davon aber nichts bei mir.

Auf GitHub habe ich schließlich ein sehr vielversprechendes Script gefunden: lukasjapan/bt-speaker. Was mir daran besonders gefällt, das Script kommt ohne großes Pairing aus. Jedes beliebige Gerät kann sich direkt damit verbinden. Ohne Eingabe von irgendwelchen PINs oder dass man vorher in einen Suchmodus wechseln müsste. Natürlich kann das ein Sicherheitsrisiko sein. Wenn die Volumio Installation zum Beispiel im Kinderzimmer steht oder ihr Angst vor AC/DCs „Hells Bells“ am frühen Morgen habt könnt ihr das Script etwas erweitern und eine feste Pin hinterlegen.

Ein Problem bleibt jedoch. Volumio verwendet Alsa für die Soundausgabe. Ohne eine Sound-Middleware wie PulseAudio kann bei Alsa jeweils nur ein Programm exklusiv auf die Soundkarte zugreifen. Zum Glück gibt es Dmix, ein PCM Plugin das genau diese Einschränkung aufhebt. Scheinbar ist Dmix mittlerweile bei Soundkarten ohne Hardware Mixer Standard. Ob das auch bei Volumio der Fall ist kann ich nicht sagen. Meine Hifiberry hat einen Hardware Mixer.

Installation

Als erstes installieren wir Volumio indem wir das Image herunterladen und auf eine SD Karte schreiben. Ich denke hierfür gibt es bereits genug Anleitungen darum gehe ich da nicht weiter drauf ein.

Dann müssen wir den SSH Zugang aktivieren. Dafür reicht es wenn wir eine Datei mit dem Namen ssh auf der Boot Partition anlegen. Alternativ, so habe ich es gemacht, kann man den SSH Zugang auch über das Webinterface aktivieren. Über die URL volumio.local/DEV kann der entsprechende Schalter umgelegt werden.

Der Username für den Login lautete volumio, das Kennwort ebenfalls.

Nach dem Login wechseln wir mit sudo su auf den Root user. Hierfür müssen wir dann das Kennwort volumio erneut eingeben. Sobald wir das getan haben sollten wir direkt mal alle Pakete updaten. Hierfür wird das Kommando apt verwendet. Falls irgendwelche Fragen dabei aufpoppen einfach mit Enter bestätigen. Ich verwende zusätzlich noch deinen Equalizer für Alsa. Wenn wir eh an der Alsa Konfiguration

Update des Systems
sudo su
apt update
apt upgrade
apt install libasound2-plugin-equal pi-bluetooth

Als nächstes muss die Datei /etc/asound.conf angelegt werden.

/etc/asound.conf
pcm.snd_card {
 type hw
 card 1
 device 0
 }

ctl.equal {
 type equal;
 }

pcm.plugequal {
 type equal;
 # Modify the line below if you don't
 # want to use sound card 0.
 #slave.pcm "plughw:1,0";
 # or if you want to use with multiple applications output to dmix
 slave.pcm "plug:dmixer"
 }

#pcm.equal {
 # Or if you want the equalizer to be your
 # default soundcard uncomment the following
 # line and comment the above line.
 pcm.!default {
 type plug;
 slave.pcm plugequal;
 }

# Das dmix-Plugin wird definiert.
 pcm.dmixer {
 type dmix
 ipc_key 1024
 ipc_perm 0666 # Andere Benutzer können ebenfalls dmix gleichzeitig nutzen
 slave.pcm "snd_card"
 slave {
 ### buffer_size kann bei Problemen der jeweiligen Karte angepasst werden.
 period_time 0
 period_size 1024
 buffer_size 4096
 ### bei Störungen kann die Konvertierung auf die Rate 44100 eingeschaltet werden.
 rate 44100
 ### einige Soundkarten benötigen das exakte Datenformat (zB ice1712)
 # format S32_LE
 ### Verfügbare Formate: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE U24_LE U24_BE
 ### S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE
 ### IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM
 ### Anzahl channels muss mit den bindings übereinstimmen
 channels 2
 }
 bindings {
 0 0
 1 1
 }
 }

Ganz oben müsst ihr eure Soundkarte angeben. Mit aplay -l könnt ihr eine Übersicht über eure Soundkarten bekommen um card und device Nummer herauszufinden.

# aplay -l
**** List of PLAYBACK Hardware Devices ****
 card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
 Subdevices: 7/7
 Subdevice #0: subdevice #0
 Subdevice #1: subdevice #1
 Subdevice #2: subdevice #2
 Subdevice #3: subdevice #3
 Subdevice #4: subdevice #4
 Subdevice #5: subdevice #5
 Subdevice #6: subdevice #6
 card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
 Subdevices: 1/1
 Subdevice #0: subdevice #0
 card 1: sndrpihifiberry [snd_rpi_hifiberry_dacplus], device 0: HiFiBerry DAC+ HiFi pcm512x-hifi-0 []
 Subdevices: 0/1
 Subdevice #0: subdevice #0

Nun müssen wir noch Volumio beibringen das virtuelle Device für die Soundwiedergabe zu verwenden.

Hierfür passen wir die mpd.conf an. Diese liegt in /etc. Aber Achtung! Es gibt auch eine mpd.conf.tmpl in /volumio/app/plugins/music_service/mpd. Diese sollten wir direkt mit anpassen, damit unsere Änderung auch  aktiv bleibt falls wir etwas an der Volumio Konfiguration ändern.

 /etc/mpd.conf bzw. /volumio/app/plugins/music_service/mpd/mpd.conf.tmpl
[...]
audio_output {
 type "alsa"
 name "alsa"
 device "plug:plugequal"
 dop "no"
}
[...]

Damit AirPlay ebenfalls das neue Device verwendet passen wir nun noch /volumio/app/plugins/music_service/airplay_emulation/shairport-sync.conf.tmpl an.

/volumio/app/plugins/music_service/airplay_emulation/shairport-sync.conf.tmpl
[...]
alsa =
{
 output_device = "plug:plugequal";
};
[...]

OK, schauen wir mal ob nun alles weiterhin funktioniert. Dafür starten wir das System ein mal neu.

reboot

Wenn alles funktioniert installieren wir nun das bt-speaker Script.

curl -s https://raw.githubusercontent.com/lukasjapan/bt-speaker/master/install.sh | bash

Das Install-Script installiert automatisch alle Dependencies, richtet einen User ein und installiert  bt-speaker unter /opt/bt-speaker.

Nach der Installation passen wir noch die Konfiguration an um wieder Sound über das virtuelle Gerät anstelle der echten Soundkarte wiederzugeben.

Für den User btspeaker wird kein Home-Verzeichnis angelegt. Da der Equalizer aber seine Konfiguration im Home-Verzeichnis ablegt holen wir dies rasch nach:

mkdir /home/btspeaker
chown btspeaker.btspeaker /home/btspeaker
/etc/bt_speaker/config.ini
[bt_speaker]
play_command = aplay -Dplug:plugequal -f cd -
connect_command = /etc/bt_speaker/hooks/connect
disconnect_command = /etc/bt_speaker/hooks/disconnect

[bluez]
device_path = /org/bluez/hci0
discoverable = yes

[alsa]
enabled = yes
mixer = Digital
id = 0
cardindex = 1

Im Abschnitt [alsa] müsst ihr wieder die richtige Karte und den Namen des Mixers angeben. Falls ihr damit Probleme bekommt könnt ihr enabled = no eintragen, habt dann aber nicht mehr die Möglichkeit die Lautstärke direkt am verbundenen Gerät zu ändern.

Wer seinen Raspberry Pi per WLAN verbunden hat bekommt unter Umständen fiese Knacks-Geräusche oder der Ton stottert. Ich habe daher bei mir konfiguriert, dass mein WLAN abgeschaltet wird sobald sich ein Gerät per Bluetooth verbindet und wieder einschaltet sobald die Bluetooth Verbindung getrennt wird.

Ich verwende hierfür sudo.

/etc/sudoers.d/btspeaker-user
btspeaker ALL=(ALL) NOPASSWD: /sbin/ifconfig

Bt-speaker kann über Hooks entsprechende Befehle beim Starten und Trennen von Verbindungen ausführen.

/etc/bt_speaker/hooks/connect
#!/bin/bash -x
mpc pause &
sudo ifconfig wlan0 down &
/etc/bt_speaker/hooks/disconnect
#!/bin/bash -x
sudo ifconfig wlan0 up &

Nun noch ein reboot und ihr könnt ein Gerät via Bluetooth verbinden.

Falls es dennoch Probleme gibt: Prüft folgende Ausgaben:

systemctl | grep blue
systemctl status -l bt_speaker

Viel Spaß!

Kurzes Update:

Wer auch Spotify auf Volumio verwenden möchte muss noch die Konfiguration davon anpassen. Ich hatte das vergessen und mich gewundert warum BT-Speaker nicht mehr funktionierte.

Einfach die Konfigurationsdatei vom Spopd ändern.

/etc/spopd.conf

[spop]
spotify_username = **********
spotify_password = **********

high_bitrate = true
audio_output = sox
pretty_json = true
search_results = 50
cache_path =/run/shm

[sox]
output_type = alsa
output_name = plug:plugequal

Es gibt ausserdem noch das Volumio Spotify Connect2 Plugin. Auch hier muss kurz Hand angelegt werden damit es mit dem neuen Audio-Setup funktioniert.

/data/plugins/music_service/volspotconnect2/volspotconnect2.tmpl

[...]
./librespot -b 320 -c /tmp ${shared} ${normalvolume} --name '${devicename}' --backend alsa --device plug:plugequal --disable-audio-cache --initial-volume ${initvol}

Damit eine neue Config aus der Vorlage erstellt wird solltet ihr zuletzt noch irgendwas in den Einstellungen des Volumio Spotify Connect2 Plugins ändern (z.B. initiale Lautstärke).

Falls ihr euch auch ein Volumio System installieren möchtet habe ich hier ein paar Produkte von Amazon verlinkt.

11 Antworten auf „Volumio auf dem Raspberry Pi als Bluetooth Lautsprecher verwenden“

  1. Schöner Beitrag!

    Hab’s nachgebaut und es läuft sehr gut soweit.
    Eine Bitte: ändere doch mal ‚/etc/bt-speaker/config.ini‘ in ‚/etc/bt_speaker/config.ini‘. Hab mich gewundert, warum mein vi eine neues Verzeichnis anlegen wollte ;-).

    Danke und Gruß, Alex.

    1. Cool! Freut mich, dass es bei dir auch funktioniert. Ich habe den Verzeichnisnamen angepasst.

      Auf einem Pi mit USB Soundkarte hatte ich noch ein Problem und konnte es mit folgendem Eintrag in der config.ini lösen:

      play_command = aplay -Dplug:plugequal -f cd –

  2. Hallo Thorsten,

    ich habe das ganze versucht nachzubauen. Einzig mit der config.ini habe ich ein Problem. Wenn ich das ganze auf enabled stelle läuft’s nicht. Ich denke es liegt am Name des mixer. Wie aber finde ich heraus, was ich dort eintragen muss? Kannst du mir da weiterhelfen.
    Danke und Gruß
    Ebenfalls Thorsten 🙂

    1. versuch erstmal (du kannst dann die Lautstärke aber nicht mehr via Bluetooth ändern):

      [Alsa]
      enabled = No

      Ansonsten sollte mixer = PCM meist funktionieren.

      Ich glaube mit amixer -c 1 info kannst du was herausfinden. Anstelle von 1 natürlich deine Karten-ID (cat /proc/asound/cards).

    2. Ach ich sehe gerade mit enabled = No hat es bei dir ja schon geklappt.

      Was hast du denn für eine „Soundkarte“? Wenn du einfach alsamixer -c 1 auf der Shell startest solltest du sehen was es für Mixer gibt.

  3. Hallo Thorsten,
    eben hat es dann funktioniert. Ich hab die Hifiberry Amp+. Ich musste den mixer auf Master setzen, dann läuft es.
    Ich muss jetzt nur noch schauen, denn es ist schon recht laut, auch wenn die Lautstärke recht niedrig eingestellt ist. Und mit jedem Klick am Handy geht er ganz schön hoch. Vielleicht finde ich da auch noch etwas raus. Aber auf jeden Fall vielen Dank für die tolle Anleitung und den klasse Support.
    Danke und beste Grüße
    Thorsten

  4. Hallo Thorsten und alle Mitleser hier die vielleicht mehr im Thema drin sind. Ich kämpfe schon eine Weile damit einen Raspberry mit Airplay UND eben als Audio BT-Empfänger zu konfigurieren. Mir sind zwei Projekte dort ins Auge gefallen, dieses hier von Herrn Voss und Moodeaudio. Leider scheitere ich bei Beiden es hinzubekommen. Die Anleitung hier ist mir oft zu wenig idiotensicher.

    Bsp dafür:
    Nach einem Update was empfohlen wird, fragt Linux welche Konfigurationsdateien verbleiben sollen (die alten, oder die neuen) Ich weiss es nicht?!

    Es sollen gewisse Dateien angepasst werden- es würde so immens helfen die Quelldateien (also vorher-nachher) Dateiinhalte zu sehen. Denn oft sind die Dateien weiter unten mit Parametern ausgestattet, wo man (ich) nicht weiss, ob die bleiben sollen oder besser auskommmentiert werden sollen.

    Ich habe Herrn Voss schon verucht auf seinem Twitter-Account zu kontaktieren, aber vermutlich hat er auch gerade viel zu tun. Wenn wer sich für einen Austausch melden würde, wäre ich sehr froh. Danke und Gruß aus Berlin

    1. Hallo Charles,

      zum einen: wenn du selbst nicht an keinen Konfigurationsdateien geschraubt hast kannst du beim Update in der Regel die neue Version nehmen.

      Bei den Dateien die ich aufliste gilt immer: wenn ich […] angebe soll nur der Teil geändert werden den ich auch hingeschrieben habe – alle anderen Zeilen sollen unverändert bleiben. Wenn kein […] zu sehen ist kannst du die ganze Datei mit meinem Listing ersetzt werden.

      Teilweise muss aber noch etwas an den Dateien für dein System angepasst werden. Zum Beispiel kann es ja sein, dass deine Karte eine andere „Adresse“ (bei mir Card 1 Device 0) hat.

      Mehr kann ich leider echt nicht tun.

    1. Hallo Benjamin,

      danke für den Tipp. Werde ich mal so in meine Anleitung aufnehmen. Eine Frage hätte ich aber noch: hattest du keinen Part mit den Hooks auch probiert? Da würde ja das Wifi komplett abgeschaltet und dann sollte es auch keine Glitches geben. Aber wenn es mit deinem Tipp auch ohne das geht wäre das perfekt.

  5. Vielen Dank für dieses Tutorial. Ich versuche gerade den Spotify-output von volumio (verwendet spop als spotify-client) per icecast zu streamen damit ich mich morgens von meinem internet-radiowecker von meiner eigenen spotify-playlist wecken lassen kann.

    Kannst Du mir ein paar Tips geben wie ich den Output von spop in icecast reinbringe? Das wäre total super. Besten Dank schon mal.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.