As @Teresa-e-Junior pointed out
pactl is the tool to use:
First of all we might want to get the IDs of our PA sinks. On my system this is what I get:
$ pactl list short sinks
0 alsa_output.pci-0000_01_00.1.hdmi-surround module-alsa-card.c s16le 6ch 44100Hz SUSPENDED
1 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
Sink 1 is currently my default sink.
But now I want all my current and future streams to be played via HDMI (i.e. sink 0).
There is a command to set the default sink for PulseAudio, but it doesn't seem to have any effect on my PC:
$ pacmd set-default-sink 0 #doesn't work on my PC :(
Instead, new streams seem to be connected to the sink that had a stream moved to it most recently.
So let's tell pactl to move all currently playing streams to sink
We'll first need to list them:
$ pactl list short sink-inputs
290 1 176 protocol-native.c float32le 2ch 44100Hz
295 1 195 protocol-native.c float32le 2ch 44100Hz
Ok, we've got two streams (IDs 290 and 295) that are both attached to sink
Let's move them to sink
$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0
So, that should be it. Now we just have to make a script that does the work for us:
if [ -z "$1" ]; then
echo "Usage: $0 <sinkId/sinkName>" >&2
echo "Valid sinks:" >&2
pactl list short sinks >&2
pactl list short sink-inputs|while read stream; do
streamId=$(echo $stream|cut '-d ' -f1)
echo "moving stream $streamId"
pactl move-sink-input "$streamId" "$newSink"
You can call it with either a sink ID or a sink name as parameter (i.e. either
0 or something like
Now you could attach this script to a udev event or key shortcut.