Let’s make a bluetooth audio receiver allowing you hook up your R-Pi to your stereo and use your phone as the sound source.
To be honest, this is not a unique project. Plenty of people have attempted to get a bluetooth receiver working, some (less) have succeeded. After spending way to much time on trying to get the features that I want by combining sniplets from various guides I eventually got it right. In fact, I would like to give credit to Google and everybody on the internet for sharing their pain and experience. Without you I couldn’t have done it!
The wish list:
- R-Pi Bluetooth and Airplay audio receiver: I want to be able to stream Spotify and other audio sources from a phone to my stereo. We have both Android and iOS-devices in our household so both should work.
- The receiver shall auto-pair and auto-trust phones trying to connect
- There should be a synthesized voice connect announcement (This is new, I think. I haven’t seen anyone else doing this).
- There should be support for A2DP and A2CP profiles for meta data and playback control.
- Stand-alone operation. No display required. No login and manual steps, i. e. just plug it in and use it.
- Easy, predictable scripted install
As it turns out, A2DP and A2CP profiles mandate the use of Bluez 5 which in turn needs Pulse Audio 5.
What is Bluez? Bluez is the Linux bluetooth stack. It handles all the low level bluetooth stuff (pairing, audio data transfer, etc.)
What is Pulse Audio? It is a sound proxy. It will take the digital bluetooth audio stream, resample it and send it through to the analog headphone jack.
Step 1: What you need
This is what you need to complete this project:
- Raspberry Pi (B+ v2 or Pi 2)
- Bluez-compatible bluetooth 4.0 dongle
- 8GB MicroSD
- A good solid power source for the Raspberry Pi
- A keyboard and display for initial setup
- Optional: R-Pi compatible WiFi dongle, e. g. Realtek RTL8188CUS
A note on the Pi version. I have used a Pi 2 during installation since it saves time. Then I move the completed MicroSD to a B+ V2. Running this application on a Pi 2 is a bit of a waste of CPU cycles.
Step 2: Basic Prep
- Download Raspbian image here
- Transfer image to sdcard using Win32 Disk Imager following instructions on www.raspberrypi.org.
- Insert sdcard and power up
- Important! Expand file system to full 8GB capacity (see screenshots)
- Login as user pi (password: raspberry). Please note that for the rest of this guide it is assumed that you are logged in as “pi”.
- Update operating system and reboot:
sudo apt-get update sudo apt-get -y upgrade sudo reboot
Step 3: Install helper-scripts
After too many manyal trial and error attempts of trying to get this working I realized I had to script the install. That way I will get the same result every time. The scripts can be found on bitbucket.
This is how to install:
[email protected] ~ $ cd ~ [email protected] ~ $ git clone https://[email protected]/ehsmaes/raspberry-pi-audio-receiver-install.git [email protected] ~ $ cd raspberry-pi-audio-receiver-install/ [email protected] ~/raspberry-pi-audio-receiver-install $
Are you lazy? Skip to step 10!
Step 4: Bluez & Pulse – Install dependencies
Next, you need to install required packages for Bluez 5 and Pulse Audio 5. Usually you don’t need to worry about dependencies because the debian installer does it for you. We will install our software from source.
Simply run the script “bt_pa_prep.sh”:
[email protected] ~/raspberry-pi-audio-receiver-install $ ./bt_pa_prep.sh
Step 5: Bluez & Pulse – Install from source
Neither Bluez 5 or Pulse Audio 5 are available in the Raspbian repositories; hence they have to be downloaded, built (compiled) and installed. In addition, the two software packages need to interact. For this purpose users and permissions have to be set up right. Run “bt_pa_prep.sh”.
[email protected] ~/raspberry-pi-audio-receiver-install $ ./bt_pa_install.sh
Did anything go wrong? The first thing to check – are you on a 8 GB card and did you remember to expand the file system? Not that? Start over and run each part of the script manually.
Step 6: Bluez & Pulse – Configure
The next script configures the following:
- Creates the file /etc/udev/rules.d/99-input.rules. This file triggers execution of /usr/local/bin/bluez-udev when bluetooth devices are connected or disconnected.
- Copies custom utility files to /usr/local/bin:
- simple-agent.autotrust: Python script mostly stolen from Bluez sample code. I modified a few lines to have it auto-accept any connection attempt. The script is depending on bluezutils.py, which is also copied.
- bluez-udev: Executes when devices are connected and links the incoming bluetooth source (input) with the pulseaudio sink (output) and reverses the process on disconnect. The script also triggers voice annoucements: “Device XYZ Connected” using supplied script say.sh.
- say.sh: Text to voice script. If the RPi is on-line, the TTS-voice from Google Translate is used. Off-line fall back uses espeak.
- Creates a startup script for Pulse Audio (/etc/init.d/pulseaduio)
- Creates a startup script for Bluez (/etc/init.d/bluetooth)
- Creates a startup script for simple-agent.autotrust as described above (/etc/init.d/bluetooth-agent)
- Modifies /etc/bluetooth/main.conf for:
- Device name
- Bluetooth Class (Portable audio)
- Disable discoverable timer so the device stays discoverable
- Modifies /etc/pulse/daemon.conf for:
- Resample method. The default resample method is not suitable for Raspberry Pi.
- Various parameter adjustments to improve sound quality (I used to have problems with crackles and poor sound).
Run the script and enter the device name (what you will see when you attach from your phone):
[email protected] ~/raspberry-pi-audio-receiver-install $ ./bt_pa_config.sh Bluetooth device name: RpiAudio
For more detail: Raspberry Pi Bluetooth+Airplay Audio Receiver combo