Bluetooth A2DP Lautsprecher am Raspberry Pi

Wäre es nicht schön wenn man seine Musik in jeden Raum mitnehmen könnte? Bluetooth Lautsprecher machen das möglich. Ungleich schwerer wird es aber wenn die Musik von einem Raspberry Pi aus an den Lautsprecher geschickt werden soll…

Zunächst ein mal gibt es unter Linux ein fülle an Sound- und Bluetooth- Bibliotheken. Alle mit unterschiedliche Funktionen, Kompatibilitäten und  Abhängigkeiten.

Das den meisten Distributionen zu Grunde liegende Audiosystem ist  Advanced Linux Sound Architecture (ALSA). Dies stellt die Kernelmodule für die Audiohardware bereit. Darauf aufbauend gibt es verschiedene Soundserver wie z.B. PulseAudio(PA) oder ähnliche.

Sowohl ALSA als auch PA stellen Erweiterungen für Bluetooth bereit. Da man den Overhead auf eingebetteten Systemen gerne klein hält versuche wir hier den Weg direkt über ALSA.

Blue-ALSA stellt eine Kopplung zwischen dem Bluetooth Stack BlueZ und ALSA wieder her, welche mit BlueZ 5 eingestellt wurde.

Setup

  • Raspberry Pi
  • Bluetooth Lautsprecher

Installation

Zunächst müssen die Abhängigkeiten von Blue-Alsa erfüllt werden:

sudo apt-get update
sudo apt-get install -y libasound2-dev dh-autoreconf libortp-dev bluez pi-bluetooth bluez-tools libbluetooth-dev libusb-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libsbc1 libsbc-dev

danach kann Blue-Alsa gebaut werden:

git clone https://github.com/Arkq/bluez-alsa.git
cd bluez-alsa
autoreconf --install
mkdir build && cd build
../configure --disable-hcitop --with-alsaplugindir=/usr/lib/arm-linux-gnueabihf/alsa-lib
make && sudo make install

Damit BlueAlsa nicht jedes mal gestartet werden muss legen wir einen Service dafür unter  /lib/systemd/system/bluezalsa.service an:

[Unit]
Description=BluezAlsa proxy
Requires=bluetooth.service
After=bluetooth.service
[Service]
Type=simple
User=<user>
Group=audio
ExecStart=/usr/bin/bluealsa --disable-hfp
[Install]
WantedBy=multi-user.target

Die Option –disable-hfp verhindert, dass sich Lautsprecher mit den Hands Free Protocol verbinden und die Audioqualität verschlechtern.

Der Service wird mit folgenden Befehlen aktiviert:

sudo systemctl daemon-reload
sudo systemctl enable bluealsa.service

Die Verbindung zum Lautsprecher kann z.B. mittels bluetootctl hergestellt werden:

bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on 
[NEW] Device xx:xx
[bluetooth]# pair xx:xx
[bluetooth]# trust xx:xx            #oder
[bluetooth]# connect xx:xx
[bluetooth]# exit

Die Verwendung von trust erlaubt ein automatisches Verbinden während connect nur eine einmalige Verbindung herstellt.

Nun kann über den Bluetooth LautsprecherSound abgespielt werden.

aplay -D bluealsa:HCI=hci0,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp funky.wav

Um den Bluetooth Lautsprecher als Standard Ausgabe über A2DP  festzulegen muss im home-Verzeichnis noch eine .asoundrc angelegt werden:

# Specify the parameters of the Bluetooth connection
defaults.bluealsa {
     interface "hci0"            # host Bluetooth adapter
     device "xx:xx:x:x:xx:x"     # Bluetooth headset MAC address
     profile "a2dp"
}

 

5 Gedanken zu „Bluetooth A2DP Lautsprecher am Raspberry Pi“

    1. Hallo Michael,

      hast wohl alles richtig gemacht, sowie ich das verstanden habe liegt es an dem Plugin weil die Node.js Version vom volumio neuer als die vom Plugin version ist. Das ist echt doof weil ich mich auch für diese Lösung sehr interresiere.

      MfG

    2. Hallo Michael,

      im Grunde brauchst Du auch die GUI nicht dafür damit es läuft wichtig ist nur dass Du die Geräte koppelst von einer SSH Console aus. Wie hier oben beschrieben und dann nur noch zwei Sachen machst genau so wie es da oben steht die .asoundrc anlegen mit der Mac Addresse deines Lautsprechers. Nun um das Ganze dauerhaft, aber nicht volumio upgrade sicher zu haben musst nur noch die template dateien für mpd.conf editieren und erweitern um:

      audio_output {
      type “alsa”
      name “Speaker Name goes Here”
      device “bluealsa:HCI=hci0,DEV=XX:XX:XX:XX:XX:XX,PROFILE=a2dp”
      mixer_type “software”
      }

      sobald Du das gemacht hast und mpd neugestartet ist, bzw kannst dann den Wizard starten und durchlaufen ist dein raspi soweit in der regel auf Bluetooth Box etwas wiederzugeben. Mit neusten Version von Volumio geht das leider nicht so einfach zumindest nicht mit dem Plugin, die manuelle Geschichte funktioniert allerdings halbwegs gut. Nicht vergessen wenn dein Raspi Wlan und bluetooth eingebaut hat, dann am besten auf ein Wlan Dongle umsteigen und internes WLAN deaktivieren, sonst kommt kein sauberer Sound raus.

      VG

  1. Hallo,

    ich konnte dank der Anleitung bluealsa auf einem RPi3 mit Rasbian zum Laufen bewegen.
    Da einiges nicht sofot klappte will ich aber meine Änderungen hier für andere oder ein Update des Blogposts festhalten

    > /lib/systemd/system/bluezalsa.service
    Nur ein kleiner Typo. Hier hat sich ein z in den Namen eingeschlichen.

    > [Im Systemd-Skript]
    > ExecStart=/usr/bin/bluealsa –disable-hfp
    Das Argument –disable-hfp gibt es nicht mehr (zumindest wenn man der Installations weiter oben folgt).
    Man muss es daher entferen, damit der Dienst startet.
    Außerdem muss man vor dem Start /run/bluealsa (mit den passenden Zugriffsrechten :audo )
    anlegen.
    Das geht beispielsweise durch folgendens Hilfsskript, welches man den Vorraussetzung von
    bluealsa.service hinzufügen kann:

    [Unit]
    Description=Prepare system for bluealsa daemon
    After=bluetooth.service

    [Service]
    Type=simple
    # Pfad zu mkdir, chown kann variieren!
    ExecStartPre=-/bin/mkdir /run/bluealsa
    ExecStart=/bin/chown :audio /run/bluealsa
    Restart=on-abort

    [Install]
    WantedBy=multi-user.target

    > Pulseaudio
    Hier ist vielleicht der Hinweis nützlich, dass man entweder die bluetooth-relavanten module
    nicht läd/entfernt oder pulseaudio für den Nutzer deaktiviert.
    Letzteres kann man für den aktuellen Nuzter mit der Zeile
    “autospawn = no” in ~/.config/pulse/client.conf erreichen.

    Gruß Yggdrasil

  2. Debian Stretch kommt mit bluealsa installiert und es gilt die folgende linie, die ersetzt ExecStart=/usr/bin/bluealsa –disable-hfp :

    ExecStart=/usr/bin/bluealsa -i hci0 -p a2dp-sink -p a2dp-source

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.