various fixes
[distro-setup] / toggle-mute
1 #!/bin/bash
2 # I, Ian Kelling, follow the GNU license recommendations at
3 # https://www.gnu.org/licenses/license-recommendations.en.html. They
4 # recommend that small programs, < 300 lines, be licensed under the
5 # Apache License 2.0. This file contains or is part of one or more small
6 # programs. If a small program grows beyond 300 lines, I plan to change
7 # to a recommended GPL license.
8
9 # Copyright 2024 Ian Kelling
10
11 # Licensed under the Apache License, Version 2.0 (the "License");
12 # you may not use this file except in compliance with the License.
13 # You may obtain a copy of the License at
14
15 # http://www.apache.org/licenses/LICENSE-2.0
16
17 # Unless required by applicable law or agreed to in writing, software
18 # distributed under the License is distributed on an "AS IS" BASIS,
19 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 # See the License for the specific language governing permissions and
21 # limitations under the License.
22
23 # mutes or unmutes ffmpeg stream
24 # usage: toggle-mute [mute|unmute|mute notify]
25 #
26 #
27 # gets state from $HOME/.iank-stream-muted
28
29 if ! test "$BASH_VERSION"; then echo "error: shell is not bash" >&2; exit 1; fi
30 shopt -s inherit_errexit 2>/dev/null ||: # ignore fail in bash < 4.4
31 set -eE -o pipefail
32 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" exit status: $?, PIPESTATUS: ${PIPESTATUS[*]}" >&2' ERR
33
34
35 v=0
36 notify=false
37 # note: condition duplicated in stream-clip, myi3statsus
38 if pgrep -fc '^ffmpeg.*icecast://source.*/fsf' >/dev/null; then
39 if [[ $1 ]]; then
40 case $1 in
41 mute)
42 v=0
43 if [[ $2 == notify ]]; then
44 notify=true
45 fi
46 ;;
47 unmute)
48 v=1
49 ;;
50 *)
51 i3-nagbar -m "INVALID mute argument:$1" -t error -f "pango:monospace 30"
52 ;;
53 esac
54
55 else
56 v_state=$(cat $HOME/.iank-stream-muted) ||:
57 case $v_state in
58 1) : ;; # default action
59 0) v=1 ;;
60 *)
61 i3-nagbar -m "FAILED GETTING MUTE STATE:$v" -t error -f "pango:monospace 30"
62 ;;
63 esac
64 fi
65
66 out=$(echo Parsed_volume_1 volume $v | zmqsend ||:)
67 if [[ $out == "0 Success" ]]; then
68 echo $v >$HOME/.iank-stream-muted
69 if $notify; then
70 dunstify -h string:x-dunst-stack-tag:alert "automuted"
71 fi
72 else
73 i3-nagbar -m "FAILED ffmpeg volume:$v out:$out" -t error -f "pango:monospace 30"
74 fi
75 fi
76
77
78 # note: i figured out how to do system input level muting, but I don't
79 # really have a use case for it other than being doubly sure that i'm
80 # muted. leaving it commented in case I figure out a use case, or I
81 # find the application level muting to be unreliable.
82
83 # uncomment and refactor for system muting
84 # muted=$(pactl get-source-mute @DEFAULT_SOURCE@ | awk '{print $2}' ||:)
85 # case $muted in
86 # no) v=0 ;;
87 # yes) v=1 ;;
88 # esac
89
90
91
92 # uncomment for system muting, and set $mute_p
93 # pactl set-source-mute @DEFAULT_SOURCE@ $mute_p