aboutsummaryrefslogtreecommitdiffstats
path: root/bin/set_volume
blob: 165231214f873ee3d030a84edd6aa132cce0302d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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