Simple script for PulseAudio, to quickly switch between headphones and speakers
I often switch between phones and speakers, but I'm too lazy to do it through the sound preferences window. So I came up with this script*, and I'm sharing it here as others might find it useful.
You'll need to tweak it a bit to work in your machine, but once you do it you can run it from a launcher or a keyboard shortcut, it's really comfy.
Okay, here's the code:
#!/bin/bash
# You'll need to swap those four values with the ones that work in your machine.
# Check the rest of the post for further info. mainCard="pci-0000_06_00.1" mainProfile="hdmi-stereo-extra1" altCard="pci-0000_00_09.2" altProfile="analog-stereo"
# If the current default source is main, your new source is alt. Else, your new is main. if [[ $(pactl get-default-source) == "alsa_output.$mainCard.$mainProfile.monitor" ]] then declare -g newCard="$altCard" newProfile="$altProfile" else declare -g newCard="$mainCard" newProfile="$mainProfile" fi
# Tells PulseAudio to shift the card profile and default sink to the new. pactl set-card-profile "alsa_card.${newCard}" "output:${newProfile}" pacmd set-default-sink "alsa_output.${newCard}.${newProfile}" &> /dev/null\
# Tells PulseAudio to shift the currently running programs to use the new output. for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}') do pacmd move-sink-input "$i" "alsa_output.${newCard}.${newProfile}" &> /dev/null done
# Optional text notification. if [[ $(pactl get-default-source) == "alsa_output.$mainCard.$mainProfile.monitor" ]] then notify-send -t 500 "Main sound output on!" elif [[ $(pactl get-default-source) == "alsa_output.$altCard.$altProfile.monitor" ]] then notify-send -t 500 "Alt sound output on!" else notify-send -t 2000 "Something weird happened." fi
# Optional audio notification. It runs VLC but it's easy to adapt or remove if you want. cvlc --play-and-exit /usr/share/sounds/freedesktop/stereo/message-new-instant.oga
Check the first four lines of code. You'll need to replace that "pci.blahblah" and "audio.stereo.whatever" junk with the ones from your machine. To know them, run pacmd list-sources | grep name: in a terminal. The output will look like this:
Ignore ⟨alsa_output and monitor⟩. The second-to-last chunk (e.g. hdmi-stereo-extra1) is the profile. The rest (e.g. pci-0000_06_00.1) is the card. Now replace those in the script.