Created
October 16, 2015 02:23
-
-
Save ephemient/40d0ce4aeef2d9b9224a to your computer and use it in GitHub Desktop.
paswitch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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