Skip to content

Instantly share code, notes, and snippets.

@ephemient
Created October 16, 2015 02:23
Show Gist options
  • Save ephemient/40d0ce4aeef2d9b9224a to your computer and use it in GitHub Desktop.
Save ephemient/40d0ce4aeef2d9b9224a to your computer and use it in GitHub Desktop.
paswitch
#!/bin/bash
set -e
IFS=$'\t'
list_devices() {
local line default_sink_name default_source_name
local sink source name driver format state
while read -r line; do
case ${line} in
'Default Sink: '*) default_sink_name=${line#Default Sink: } ;;
'Default Source: '*) default_source_name=${line#Default Source: } ;;
esac
done < <(pactl info)
echo 'Sinks:'
pactl list short sinks |
while read -r sink name driver format state; do
[[ "${name}" = "${default_sink_name}" ]] && echo -n '* ' || echo -n ' '
printf '%s %s\n' "${sink}" "${name}"
done
echo
echo 'Sources:'
pactl list short sources |
while read -r source name driver format state; do
[[ "${name}" = "${default_source_name}" ]] && echo -n '* ' || echo -n ' '
printf '%s %s\n' "${source}" "${name}"
done
echo
}
set-default-sink() {
local default_sink=${1}
local sink name driver format state
while read -r sink name driver format state; do
if [[ "${sink}" = "${default_sink}" || "${name}" = "${default_sink}" ]]; then
default_sink=${name}
break
fi
done < <(pactl list short sinks)
pactl set-default-sink "${default_sink}"
}
set-default-source() {
local default_source=${1}
local source name driver format state
while read -r source name driver format state; do
if [[ "${source}" = "${default_source}" || "${name}" = "${default_source}" ]]; then
default_source=${name}
break
fi
done < <(pactl list short sources)
pactl set-default-source "${default_source}"
}
move-sink-inputs() {
pactl list short sink-inputs |
while read -r input sink client driver format; do
pactl move-sink-input "${input}" @DEFAULT_SINK@
done
}
move-source-outputs() {
pactl list short source-outputs |
while read -r output source client driver format; do
pactl move-source-output "${output}" @DEFAULT_SOURCE@
done
}
usage() {
cat <<EOF
Usage:
$0 [options] -- [sink] [source]
Options:
-h, --help This usage message
-l, --list List available sinks and sources
-i, --sink[=sink] Move streams to the [new] default sink
-o, --source[=source] Move streams to the [new] default source
EOF
}
TEMP=$(getopt -o hlo::i:: -l help,list,sink::,source:: -n "$0" -- "$@") || { usage; exit 1; }
eval set -- "${TEMP}"
DO_HELP= DO_LIST= DO_SINK= DO_SOURCE=
while (($#)); do
case ${1} in
-h|--help) DO_HELP=1; shift ;;
-l|--list) DO_LIST=1; shift ;;
-o|--sink) DO_SINK=${2:-'*'}; shift 2 ;;
-i|--source) DO_SOURCE=${2:-'*'}; shift 2 ;;
--) shift; break ;;
*) echo 'Internal error!' >&2; exit 1 ;;
esac
done
[[ -n ${DO_SINK} ]] || DO_SINK=${1}; shift || :
[[ -n ${DO_SOURCE} ]] || DO_SOURCE=${1}; shift || :
[[ $# -eq 0 ]] || { usage; exit 1; }
[[ -z ${DO_HELP} ]] || { usage; exit; }
[[ -z ${DO_LIST} && ( -n ${DO_SINK} || -n ${DO_SOURCE} ) ]] || list_devices
[[ -z ${DO_SINK} ]] || {
[[ ${DO_SINK} = '*' ]] || set-default-sink "${DO_SINK}"
move-sink-inputs
}
[[ -z ${DO_SOURCE} ]] || {
[[ ${DO_SOURCE} = '*' ]] || set-default-source "${DO_SOURCE}"
move-source-outputs
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment