Playing the Blues by the Skin of your Teeth

June 21, 2018
The Problem

While working on projects around our house, my wife Emily and I listen to music using our esteemed Bluetooth speaker. Often times, though, our quest takes us into different rooms of the house, as I emphasize to Emily the importance of parallelization for optimizing workloads. Two eye-rolls later, and at least one of us is unable to hear the music well from our new position. We need to connect another speaker.

I’ve been reluctant to buy a lavish set of speakers that wirelessly network with each other to sync up. And I definitely don’t need more wires in my house. I figured it could be more fun to attempt to build something to achieve this through some Linux utilities on a Raspberry Pi. Basically, what I wanted was to connect my phone or computer to a Pi and let the Pi manage connections between multiple speakers, routing audio from the source (phone) to 1 or more Bluetooth sinks (speakers).

A Possible Solution

Luckily for me, as I began my research searching for an existing solution or project, I came across a repository on GitHub called bluecast that was a work-in-progress attempt at exactly what I wanted. That never happens! (it actually happens all the time, which is quite handy).

The bluecast project README goes through the steps to get everything setup, but the main components are:

  • you need 3 total Bluetooth adapters (for me: 1 internal, 2 USB)
  • ensure BlueZ is installed and enabled for the Pi (or whatever Linux machine you want to try this on)
  • PulseAudio is the main utility that serves as the workhorse for routing audio between each of the devices

The steps after that seemed pretty straight-forward (checkout the bluecast README for the actual commands and config files):

  • Add users to the `pulse-access` group
  • Allow PulseAudio to interface with BlueZ through D-BUS
  • Adjust PulseAudio’s resample method
  • Configure the PulseAudio service, including loading module-bluetooth-discover
  • Scan for and connect to each of the bluetooth devices with bluetoothctl
  • Verify the phone is available as a source for PulseAudio
  • Verify the speakers are available as sinks for PulseAudio
  • Link the phone source to each of the speaker sinks

After getting everything in order and following the configuration steps from the README,  I was ready for the first test. I pressed play on my phone’s music app and immediately heard a loud screeching sound emanating from a nearby Bluetooth speaker. Something seemed off. I doubled-checked I wasn’t streaming one of my favourite Pink Floyd numbers, Several Species of Small Furry Animals Gathered Together in a Cave and Grooving with a Pict. Nope.

Deaf and defeated, I removed power from all offending devices and gathered my thoughts. I’ll have to revisit this another lab day.