diff options
Diffstat (limited to 'bin/set_volume')
-rwxr-xr-x | bin/set_volume | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/bin/set_volume b/bin/set_volume new file mode 100755 index 0000000..1652312 --- /dev/null +++ b/bin/set_volume @@ -0,0 +1,142 @@ +#!/usr/bin/env bash + +FUNCTIONS=$HOME/bin/functions.sh +[ -e $FUNCTIONS ] || exit 1 +. $FUNCTIONS + +state_muted="/tmp/$(whoami)/state_muted" +state_muted_headphone="" +state_muted_speaker="" +state_bt_headphone="" +name_bt_headphone="bluez_sink.00_1B_66_02_36_41" +cardselector="" +card_icon="/usr/share/icons/gnome/48x48/devices/audio-speakers.png" # gnome-icon-theme + +function increase_volume() +{ + mute amixer $cardselector sset Master 5%+ + local state_master=$(amixer $cardselector sget Master |grep "%" | cut -d'%' -f1 | cut -d '[' -f2 | uniq) + #update pactl bluetooth audio to same level if present + if [ $state_bt_headphone = "[on]" ];then + pactl set-sink-volume $name_bt_headphone "$state_master%" + fi + print_volumes $state_master +} + +function decrease_volume() +{ + mute amixer $cardselector sset Master 5%- + local state_master=$(amixer $cardselector sget Master |grep "%" | cut -d'%' -f1 | cut -d '[' -f2 | uniq) + #update pactl bluetooth audio to same level if present + if [ $state_bt_headphone = "[on]" ];then + pactl set-sink-volume $name_bt_headphone "$state_master%" + fi + print_volumes $state_master +} + +function print_volumes() +{ + local state_master=$1 + local state_headphone=$(amixer $cardselector sget Headphone |grep "%" | cut -d'%' -f1 | cut -d '[' -f2 | uniq) + local state_speaker=$(amixer $cardselector sget Speaker |grep "%" | cut -d'%' -f1 | cut -d '[' -f2 | uniq) + if [ $state_bt_headphone = "[on]" ]; then + send_notify "Master: $state_master% \nHeadphone: $state_headphone% \nSpeaker: $state_speaker%\nBT Headphone: $state_master%" + else + send_notify "Master: $state_master% \nHeadphone: $state_headphone% \nSpeaker: $state_speaker%" + fi +} + +function toggle_volume() +{ + local state_master=$(amixer $cardselector sget Master | grep -o '\[o[n|f]*\]' | head -n 1) + local state_headphone=$(amixer $cardselector sget Headphone | grep -o '\[o[n|f]*\]' | head -n 1) + local state_speaker=$(amixer $cardselector sget Speaker | grep -o '\[o[n|f]*\]' | head -n 1) + case "$state_master" in + "[on]") + mute amixer $cardselector sset Master mute + state_master="[off]" + # if headphones are off already, don't mute, instead save state to tmp file + if [ "$state_headphone" = "[off]" ];then + echo "headphone [off]" >> "$state_muted" + else + mute amixer $cardselector sset Headphone mute + state_headphone="[off]" + fi + # if speakers are off already, don't mute, instead save state to tmp file + if [ "$state_speaker" = "[off]" ];then + echo "speaker [off]" >> "$state_muted" + else + mute amixer $cardselector sset Speaker mute + state_speaker="[off]" + fi + # if present, also mute bluetooth headphone + if [ $state_bt_headphone = "[on]" ]; then + pactl set-sink-mute $name_bt_headphone 1 + fi + ;; + "[off]") + mute amixer $cardselector sset Master unmute + state_master="[on]" + # if headphones are meant to be off, don't unmute them again + if [ "$state_muted_headphone" != "[off]" ];then + mute amixer $cardselector sset Headphone unmute + state_headphone="[on]" + fi + # if headphones are meant to be off, don't unmute them again + if [ "$state_muted_speaker" != "[off]" ];then + mute amixer $cardselector sset Speaker unmute + state_speaker="[on]" + fi + # if present, also unmute bluetooth headphone + if [ $state_bt_headphone = "[on]" ]; then + pactl set-sink-mute $name_bt_headphone 0 + fi + ;; + esac + if [ $state_bt_headphone = "[on]" ]; then + send_notify "Master: $state_master \nHeadphone: $state_headphone \nSpeaker: $state_speaker\nBT Headphone: $state_master" 2000 + else + send_notify "Master: $state_master \nHeadphone: $state_headphone \nSpeaker: $state_speaker" 2000 + fi +} + +function send_notify() +{ + # allow timeout to be set by 2nd argument + local timeout=500 + if [ $2 -gt 0 ]; then + timeout=$2 + fi + notify-send -t $timeout \ + -i /usr/share/icons/gnome/48x48/devices/audio-speakers.png \ + "Volume" "$1" +} + +if [ $HOSTNAME = "dvzrv" ];then + cardselector=" -M -c 1 " + if [ -n "$(pactl list sinks short | grep $name_bt_headphone)" ]; then + state_bt_headphone="[on]" + fi + #TODO: also check pactl for JACK sink +fi + +case "$1" in + increase) + increase_volume + ;; + decrease) + decrease_volume + ;; + toggle) + if [ -f "$state_muted" ]; then + state_muted_headphone=$(cat "$state_muted" | grep headphone | cut -d' ' -f2) + state_muted_speaker=$(cat "$state_muted" | grep speaker | cut -d' ' -f2) + rm "$state_muted" + else + touch "$state_muted" + fi + toggle_volume + ;; + *) + ;; +esac |