Pulseaudio

Pulseaudio is used for routing audio to a Bluetooth device. With additional configuration it can also be used to receive audio and stream to multi-device (multi-room) configurations.

The tutorials on this page are basically using four commands:

  • pactl load-module <name> to load a pulseaudio module (not all are loaded by default)

  • pactl set-default-sink to set the pulseaudio output device

  • pactl set-default-source to set the pulseaudio input device

  • pactl info to check the current sink/source configuration

Sample pactl info output:

LibreELEC:~ # pactl info
Server String: /var/run/pulse/native
Library Protocol Version: 31
Server Protocol Version: 31
Is Local: yes
Client Index: 41
Tile Size: 65472
User Name: root
Host Name: LibreELEC
Server Name: pulseaudio
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-aml_m8_snd.45.analog-stereo
Default Source: alsa_input.platform-aml_m8_snd.45.analog-stereo

Bluetooth Sending

This is the default configuration. Simply pair a Bluetooth audio device in the LibreELEC settings add-on and change the Kodi output device (in Kodi settings) to Bluetooth Audio.

Bluetooth Receiving

This allows you to stream Bluetooth audio from a smartphone or other Bluetooth device. Before you start, pair the device in the LibreELEC settings add-on.

Stop Kodi (else it holds onto the audio device):

systemctl stop kodi

Load the pulseaudio udev module:

pactl load-module module-udev-detect

List the names of pulseaudio output devices using the pactl utility:

pactl list short sinks

For example:

1    alsa_output.platform-aml_m8_snd.45.analog-stereo    module-alsa-card.c    s32le 2ch 44100Hz    SUSPENDED

Configure the pulseaudio output device:

pactl set-default-sink alsa_output.platform-aml_m8_snd.45.analog-stereo

Use pactl to find your Bluetooth audio device:

pactl list short sources

For example:

12    bluez_source.B8_53_AC_01_8F_E7    module-bluez5-device.c    s16le 2ch 44100Hz    SUSPENDED

Configure the pulseaudio source device:

pactl set-default-source bluez_source.B8_53_AC_01_8F_E7

Restart Kodi:

systemctl start kodi

Select the audio output device in Kodi if you want audio from your device, and from playing files in Kodi.

Network Sending

This requires another computer or device running pulseaudio, e.g. an MPD music player or another LibreELEC device.

On the pulseaudio target device, ensure the the native-protocol-tcp and zeroconf-publish modules are loaded:

pactl load-module module-native-protocol-tcp auth-anonymous=1
pactl load-module module-zeroconf-publish

On the pulseaudio source (LibreELEC) device, stop Kodi and find the output device:

systemctl stop kodi
pactl list short sinks

For example:

39    module-tunnel-sink    server=[[192.168.1.70]]:4713 sink=alsa_output.pci-0000_00_08.0.analog-stereo format=s16le channels=2 rate=44100 sink_name=tunnel.lukas-macbook-pro.local.alsa_output.pci-0000_00_08.0.analog-stereo channel_map=front-left,front-right

On the pulseaudio source, configure the pulseaudio output device:

pactl set-default-sink tunnel.lukas-macbook-pro.local.alsa_output.pci-0000_00_08.0.analog-stereo

Restart Kodi:

systemctl start kodi

You can now select the default pulseaudio output device in Kodi settings. Audio will be broadcast on the network and other pulseaudio devices can select it as their audio source.

Network Receiving

This requires another pulseaudio device in the network, e.g. an MPD player or another LibreELEC device.

Stop Kodi else it will hold onto the audio output device:

systemctl stop kodi

Load the pulseaudio udev module:

pactl load-module module-udev-detect

Use pactl to list pulseaudio output devices:

pactl list short sinks

For example:

1    alsa_output.platform-aml_m8_snd.45.analog-stereo    module-alsa-card.c    s32le 2ch 44100Hz    SUSPENDED

Configure the pulseaudio output device:

pactl set-default-sink alsa_output.platform-aml_m8_snd.45.analog-stereo

On the source pulseaudio device, load the native-protocol-tcp and zeroconf-discover modules:

pactl load-module module-native-protocol-tcp auth-anonymous=1
pactl load-module module-zeroconf-discover

On the target device, use pactl to list available input devices:

pactl list short sources

For example:

38    module-tunnel-source    server=[[192.168.1.70]]:4713 source=alsa_input.pci-0000_00_08.0.analog-stereo format=s16le channels=2 rate=44100 source_name=tunnel.lukas-macbook-pro.local.alsa_input.pci-0000_00_08.0.analog-stereo channel_map=front-left,front-right

Configure the pulseaudio input device:

pactl set-default-source tunnel.lukas-macbook-pro.local.alsa_input.pci-0000_00_08.0.analog-stereo

Restart Kodi:

systemctl start kodi

Configuration

Custom pulseaudio configuration is stored in /storage/.config/pulse-daemon.conf.d as /etc/pulse is inside the read-only filesystem. Files must have a .conf extension. The file daemon.conf is processed first, followed by other files in alphabetical order so if the same option is set in multiple files, the last one to be read will be used. If files have the same name as a default (embedded) file they override (replace) the embedded file.

To make custom configurations persistent, we must override /etc/pulse/default.pa which is read on startup. Create /storage/.config/pulse-daemon.conf.d/custom.conf and set the following to override the startup script file location:

default-script-file = /storage/.config/pulse-daemon.conf.d/custom.pa

Now create /storage/.config/pulse-daemon.conf.d/custom.pa to extend the default startup script:

#!/usr/bin/pulseaudio -nF

.fail
.include /etc/pulse/default.pa

# extend default startup script here e.g.
load-module module-rtp-recv latency_msec=250 sap_address=0.0.0.0

Sample Rates and Resampling

Create /storage/.config/pulse-daemon.conf.d/custom.conf with your custom options, e.g.

resample-method = soxr-vhq
default-sample-format = s16le
default-sample-rate = 44100

To see the available resample methods:

pulseaudio --dump-resample-methods

For example:

trivial
ffmpeg
auto
copy
peaks
soxr-mq
soxr-hq
soxr-vhq

Last updated