Better Bluetooth Audio

  • October 25, 2008
  • Avatar for jacob

Earlier this year, I showed you how to get high-quality A2DP audio streaming to your Bluetooth headphones. And while that method of connecting your headphones to a music player does work fine, it really only works with media players and anything else set up to specifically play to your headset. What if you want to watch a Flash video with A2DP audio? How about play a game of Nexuiz through the headset? Well, with that implementation, you can't.

And next week, with the release of Ubuntu 8.10, that method will not even work anymore due to a new incompatible version of Bluez. But on the flipside, we really don't even need to do that anymore.

Most distributions include a somewhat recent version of PulseAudio. Love it or hate it, it becomes an excellent tool for the job. Using PulseAudio sinks (outputs), we are able to create a new device visible for Pulse to play to. This means not only your music player, but also your games, websites, and everything else, can play through your wireless headset.

Note: If you used any of the instructions from the previous article, undo them entirely. First make sure your GStreamer output is set back to speaker mode if you used it. Then, delete the .a2dp folder in your home directory. Finally, remove the A2DP Connection script from System > Preferences > Sessions. Leaving anything laying around could interfere with the new process.

Also note that these are merely some things to try out. They are by no means complete; real, full Bluetooth support will come in a later PulseAudio release. PulseAudio 0.9.13 includes the start of this work, but it isn't too use-friendly at the moment.

Let's get started. Open up the file .asoundrc in your home directory (create it if you can't find it), and change its contents to something like this:
pcm.bluetooth {
type bluetooth
device "00:00:00:00:00:00"

Replace the device line with the MAC address of your headphones. To find the MAC address, put the headset in pairing mode, and run hcitool scan. Also, if you headphones aren't already paired with your computer, do that now using the Bluetooth applet in the notification area.

Save that file and log out and back in again to make ALSA re-read the configuration. Now we can set up PulseAudio with a simple one-liner:

pactl load-module module-alsa-sink device="bluetooth"

Be sure your headphones are on. When you see a number appear on the command line, they are ready. Pulse will automatically turn on and off the headphones as needed when it wants to play sound. Caveat: You cannot set this to run at startup, as it will sometimes fail. You can, however, add it as a panel launcher and enable your headphones with a single click.

Now go ahead and open up Rhythmbox or another music player (or something else you know uses PulseAudio) and play a track. If you don't get any audio, check to make sure your headphones are on and paired properly, and try the above command again. If the audio still comes out of your speakers, then you will want to re-route the audio.

To do this, install the pavucontrol (PulseAudio Volume Control) application, which may be present on some distributions already. Open it up, and go to the Output Devices tab. Find your headset in the list (labeled "bluetooth") and click the down arrow on the right. Check Default, and try playing audio again. If it still comes out of the speakers, then Pulse is remembering previous settings. Leave the music playing, and go to the Playback tab. Click the down arrow next to the active stream (probably labeled as your music player and current song) and select Move To and then "bluetooth". Wait a moment, and the audio should then route to the headphones. From that point on, Pulse should remember that it should always play to your headphones for that application if they are available.

Feel free to experiment with different setups to find out what works best for you. If things don't work out the first time, simply keep trying. Share your findings in the comments below.

Bonus tip: AVRCP

Just like in the last article, you can enable AVRCP (play/next button) support by adding uinput to the end of /etc/modules. Reboot and your headphones should work!

Avatar for jacob Jacob Peddicord

Home » Articles »