Pulseaudio

Tasks

set the default sink/source

pactl list short sinks
pactl set-default-sink <sink_name>
pactl list short sources
pactl set-default-source <source_name>

Restart the pulseaudio daemon

pulseaudio -k

Configuration files

default.pa - PulseAudio Sound Server Startup Script
~/.config/pulse/default.pa
/etc/pulse/default.pa

pulse-daemon.conf - PulseAudio daemon configuration file
~/.config/pulse/daemon.conf
/etc/pulse/daemon.conf

pulse-client.conf - PulseAudio client configuration file
~/.config/pulse/client.conf
/etc/pulse/client.conf

If Pulseaudio works system-wide and not per-user...
/etc/pulse/system.pa

man pulse-cli-syntax
pulse-cli-syntax - PulseAudio Command Line Interface Syntax

Concepts

Cards

Physical devices related to sound.

In the following example, I have three cards.

  • 0 is sound getting through HDMI, generally to an audio equipped display (output)
  • 1 is a webcam that can record sound (input)
  • 2 the sound card on the motherboard (can input and output)
$ pactl list cards short
0	alsa_card.pci-0000_0b_00.1	module-alsa-card.c
1	alsa_card.usb-046d_HD_Pro_Webcam_C920_F2CFBFEF-02	module-alsa-card.c
2	alsa_card.pci-0000_0d_00.4	module-alsa-card.c

Each card has one or more profiles.

definition/creation ?? ()

http://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/

pacmd set-card-profile index|name profile-name
Change the profile of a card.

pacmd set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-surround-51

Clients

$ pactl list clients short
0	module-systemd-login.c	(null)
2	protocol-native.c	wrapper-2.0
5	module-x11-xsmp.c	(null)
6	protocol-native.c	firefox
13	protocol-native.c	wine-preloader
36	protocol-native.c	sd_espeak-ng
37	protocol-native.c	sd_dummy
45	protocol-native.c	python3.8
51	protocol-native.c	pavucontrol
60	protocol-native.c	pactl

Sinks

Where an audio stream can be routed, “what you write/input into”.

Every sink has a monitor that can be used as a source (for loopback and routing).

In the following example, there is only a single sink: all audio goes to the main sound card.

$ pactl list sinks short
12	alsa_output.pci-0000_0d_00.4.analog-surround-51	module-alsa-card.c	s16le 6ch 44100Hz	RUNNING

Sink-Input

Audio stream connected to a sink.

In the following example, there’s only one sink-input. It’s an application (Quod Libet) inputting audio into the only one sink (“alsa_output.pci-0000_0d_00.4.analog-surround-51”).

$ pactl list sink-inputs short
155	12	66	protocol-native.c	s16le 2ch 44100Hz

Sources

Audio streams entering Pulseaudio, “what you read/record from”.

In the following example, there are two sources that an application could record from:

  • the webcam microphone
  • the monitor of the main sound card (acting as a loopback)
$ pactl list sources short
1	alsa_input.usb-046d_HD_Pro_Webcam_C920_F2CFBFEF-02.analog-stereo module-alsa-card.c	s16le 2ch 32000Hz	RUNNING
13	alsa_output.pci-0000_0d_00.4.analog-surround-51.monitor module-alsa-card.c	s16le 6ch 44100Hz	RUNNING

Why isn’t an application producing sound a source ?

Because the audio is not coming from a card. It is possible, though, to record the output of an audio application by creating a sink for this application to input into (we connect them through a sink-input). Then using the monitor of this sink, we have a source which can be recorded from.

Source-output

Stream going out of a Pulseaudio source to an application reading it.

ex: application recording/reading something, Pavucontrol connected to the source to read/set the recording volume (so, information is coming from this source towards Pavucontrol).

Pavucontrol has one general source-ouput for every source + 1 source-output per sink-input…

$ pactl list source-outputs short
16	1	51	protocol-native.c	float32le 1ch 25Hz
17	2	51	protocol-native.c	float32le 1ch 25Hz
18	2	51	protocol-native.c	float32le 1ch 25Hz
19	2	51	protocol-native.c	float32le 1ch 25Hz
20	2	51	protocol-native.c	float32le 1ch 25Hz

Modules

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/

module-native-protocol-{unix,tcp}

auth-ip-acl (only for -tcp)

A semicolon separated list of IP address range to which anonymous access is allowed. Example: auth-ip-acl=10.11.12.13;192.168.50.0/24;127.0.0.0/8

To allow all local users to use the sound server.

pactl load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

Commands

pacmd – Reconfigure a PulseAudio sound server during runtime

pacmd --help

pacmd suspend 1 && pacmd suspend 0

to get the “Default sample spec”
pacmd stat

pacmd list-modules
pacmd list-sinks
pacmd list-sources
pacmd list-clients
pacmd list-cards
pacmd list-samples

pacmd list-sink-inputs
pacmd list-source-outputs

pacmd set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-surround-51

pactl – Control a running PulseAudio sound server

pactl list sources
-> Input devices (in pavucontrol)

leopardb@neptune:~$ pactl list short sources
2	alsa_output.pci-0000_00_1b.0.analog-surround-51.monitor	module-alsa-card.c	s16le 6ch 44100Hz	RUNNING
4	alsa_input.pci-0000_00_1b.0.analog-stereo	module-alsa-card.c	s16le 2ch 44100Hz	RUNNING

pactl list sinks
-> Output devices (in pavucontrol)

leopardb@neptune:~$ pactl list short sinks  
2	alsa_output.pci-0000_00_1b.0.analog-surround-51	module-alsa-card.c	s16le 6ch 44100Hz	IDLE

pactl list sink-inputs
-> applications playing sound

active inputs to sinks a.k.a. playback streams
lister les paires: “ce qui est connecté à/rentre dans un sink” (j’ai un sink, qu’est-ce qui rentre dedans ?)
ex: source “Alsa sc2” connecté au sink “speakers”


The "Buffer Latency" field shows the amount of audio in the stream buffer (not yet written to the sink). The "Sink Latency" field shows the latency of the sink. The sum of these two values is the full server-side latency for the stream. In addition to the server-side latency, there's the transport latency between the client and the server (very low for local streams).

corked= paused


pactl list source-outputs
source = audio-generating *thing* (application, line-in, microphone etc...)
outputs of sources a.k.a. recording streams

lister les paires: “ouput connecté à une source” “What is reading a Source ?”
ex: Pavucontrol connecté aux sources “Input Devices” (micro etc...)

pactl list short clients
leopardb@neptune:~$ pactl list short clients
0	module-systemd-login.c	(null)
33	protocol-native.c	chrome
353	protocol-native.c	rhythmbox
356	protocol-native.c	pactl

pactl list samples

pactl list short cards

leopardb@neptune:~$ pactl list short cards
0	alsa_card.pci-0000_00_1b.0	module-alsa-card.c

paman, paprefs, pavumeter

not yet documented…

Problems

Ubuntu-flavored distributions set sink automatically to last inserted USB device

And that’s because of this in /etc/pulse/default.pa:

### Use hot-plugged devices like Bluetooth or USB automatically (LP: #1702794)
.ifexists module-switch-on-connect.so
load-module module-switch-on-connect
.endif

Script

#!/bin/bash

# Pulseaudio stuff for my twitch stream

# intermediary sink for music/other stuff
pactl load-module module-null-sink sink_name="temp_sink" sink_properties=device.description="stream_stuff_i_want_to_hear"

# what is sent directly to this sink will only be heard on stream
pactl load-module module-null-sink sink_name="twitch_stream" sink_properties=device.description="Twitch_Stream"


# sends all that goes to the intermediary sink also to my headphones
pactl load-module module-loopback source=temp_sink.monitor sink=alsa_output.pci-0000_0d_00.4.analog-stereo rate=44100

# sends all that goes to the intermediary sink also to the stream sink
pactl load-module module-loopback source=temp_sink.monitor sink=twitch_stream rate=44100

# sends microphone source directly to the twitch sink (i don’t want to hear it)
pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=twitch_stream rate=44100

We want people in Skype to hear our music directly (not through our speakers + some larsen/reverb)

In order to do this we start by creating two null-sink to send our audio to:

pactl load-module module-null-sink sink_name="skype_sink" sink_properties=device.description="skype_sink"
pactl load-module module-null-sink sink_name="music" sink_properties=device.description="music"

Skype will “record” the source “skype_sink.monitor” (automatically created), and we will output our music to the “music” sink. All this can be accomplished using pavucontrol.

We do not hear our music anymore ! we need to send the music to our audio card using the module “module-loopback”:

pactl load-module module-loopback source="music.monitor" sink=alsa_output.pci-0000_0d_00.4.analog-stereo

Then we send it to Skype as well:

pactl load-module module-loopback source="music.monitor" sink=skype_sink

Now, for our contacts to hear us, we need to send our microphone source to the “skype_sink” sink:

pactl load-module module-loopback source=alsa_input.usb-046d_HD_Pro_Webcam_C920_F2CFBFEF-02.analog-stereo sink=skype_sink

In one go:


#!/bin/bash

# create two sinks 
pactl load-module module-null-sink sink_name="skype_sink" sink_properties=device.description="skype_sink"
pactl load-module module-null-sink sink_name="music" sink_properties=device.description="music"

# send my microphone to skype
pactl load-module module-loopback source=alsa_input.usb-Razer_Inc._Razer_Seiren_Elite_UC1829L01000232-01.analog-stereo sink=skype_sink

# sends music to my speakers and to skype
pactl load-module module-loopback source="music.monitor" sink=alsa_output.pci-0000_0d_00.4.analog-stereo
pactl load-module module-loopback source="music.monitor" sink=skype_sink