Coder Social home page Coder Social logo

bluez-alsa's Introduction

Bluetooth Audio ALSA Backend Build Status

This project is a rebirth of a direct integration between Bluez and ALSA. Since Bluez >= 5, the build-in integration has been removed in favor of 3rd party audio applications. From now on, Bluez acts as a middleware between an audio application, which implements Bluetooth audio profile, and a Bluetooth audio device.

The current status quo is, that in order to stream audio from/to a Bluetooth device, one has to install PulseAudio, or use Bluez < 5. However, Bluez version 4 is considered to be deprecated, so the only reasonable way to achieve this goal is to install PulseAudio.

With this application (later named as BlueALSA), one can achieve the same goal as with PulseAudio, but with less dependencies and more bare-metal-like. BlueALSA registers all known Bluetooth audio profiles in Bluez, so in theory every Bluetooth device (with audio capabilities) can be connected. In order to access the audio stream, one has to connect to the ALSA PCM device called bluealsa. The device is based on the ALSA software PCM plugin.

Installation

$ autoreconf --install
$ mkdir build && cd build
$ ../configure --enable-aac --enable-debug

or if you intend to stream audio from a Linux distribution using PulseAudio (see this issue)

$ ../configure --enable-aac --enable-debug --disable-payloadcheck

then

$ make && make install

Dependencies:

  • alsa-lib
  • bluez >= 5.0
  • glib with GIO support
  • sbc
  • fdk-aac (when AAC support is enabled with --enable-aac)
  • openaptx (when apt-X support is enabled with --enable-aptx)
  • libldac (when LDAC support is enabled with --enable-ldac)

Dependencies for bluealsa-rfcomm (when --enable-rfcomm is specified during configuration):

Dependencies for hcitop (when --enable-hcitop is specified during configuration):

If you are using Debian-based distribution, take a look at the .travis.yml file, it might give you a hint about required packages.

Configuration & Usage

The main component of the BlueALSA is a program called bluealsa. It should be run as a root during system startup (root privileges are not required per se, the only requirement is a write access to /var/run/bluealsa). This program acts as a proxy between Bluez and ALSA.

In order to stream audio to the e.g. Bluetooth headset, firstly one has to connect the device. The most straightforward method is to use Bluez CLI utility called bluetoothctl. When the device is connected one can use the bluealsa virtual PCM device as follows:

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

Setup parameters of the bluealsa PCM device can be set in the local .asoundrc configuration file like this:

$ cat ~/.asoundrc
defaults.bluealsa.interface "hci0"
defaults.bluealsa.device "XX:XX:XX:XX:XX:XX"
defaults.bluealsa.profile "a2dp"
defaults.bluealsa.delay 10000

BlueALSA also allows to capture audio from the connected Bluetooth device. To do so, one has to use the capture PCM device, e.g.:

$ arecord -D bluealsa capture.wav

Using this feature, it is possible to create Bluetooth-powered speaker. It is required to forward audio signal from the BlueALSA capture PCM to some other playback PCM (e.g. build-id audio card). In order to simplify this task, there is a program called bluealsa-aplay, which acts as a simple BlueALSA player. Connect your Bluetooth device (e.g. smartphone) and do as follows:

$ bluealsa-aplay XX:XX:XX:XX:XX:XX

In order to control input or output audio level, one can use provided bluealsa control plugin. This plugin allows adjusting the volume of the audio stream or simply mute/unmute it, e.g.:

$ amixer -D bluealsa sset '<control name>' 70%

where the control name is the name of a connected Bluetooth device with a control element suffix, e.g.:

$ amixer -D bluealsa sset 'Jabra MOVE v2.3.0 - A2DP' 50%

For more advanced ALSA configuration, consult the asoundrc on-line documentation provided by the AlsaProject wiki page.

Troubleshooting

  1. Using BlueALSA alongside with PulseAudio.

    Due to BlueZ limitations, it seems, that it is not possible to use BlueALSA and PulseAudio to handle Bluetooth audio together. BlueZ can not handle more than one application which registers audio profile in the Bluetooth stack. However, it is possible to run BlueALSA and PulseAudio alongside, but Bluetooth support has to be disabled in the PulseAudio. Any Bluetooth related module has to be unloaded - e.g. bluetooth-discover, bluez5-discover.

  2. ALSA thread-safe API (alsa-lib >= 1.1.2).

    Starting from ALSA library 1.1.2, it is possible to enable thread-safe API functions. It is a noble change, but the implementation leaves a lot to be desired. This "minor" change does not affect hardware audio devices (because for hardware devices, this change is disabled), but it affects A LOT all software plug-ins. Random deadlocks are inevitable. My personal advice is to disable it during alsa-lib configuration step (./configure --disable-thread-safety - of course, if one is compiling alsa-lib from source), or if it is not possible (installation from a package repository), disable it via an environmental variable, as follows: export LIBASOUND_THREAD_SAFE=0. Just take a look at involved hacks (search for "to avoid deadlock" comments) and decide for yourself.

  3. Couldn't bind controller socket: Address already in use

    It is not possible to run more than one instance of the BlueALSA server per HCI device. If one tries to run second instance, it fails with the "Couldn't bind controller socket: Address already in use" error message. This error message might also appear when the previous BlueALSA server has crashed unexpectedly. In order to recover from this error, one has to manually remove dangling socket located in the /var/run/bluealsa directory (this location might be different for non standard configuration).

Resources

  1. Bluetooth Adopted Specifications
  2. Bluetooth Design Guidelines
  3. RTP Payload Format for MPEG-4
  4. Coding of MPEG-4 Audio
  5. ALSA project library reference

bluez-alsa's People

Contributors

arkq avatar wberrier avatar guillaumezin avatar juyrjola avatar joerg-krause avatar kempniu avatar

Watchers

James Cloos avatar liuwenye2010 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.