blob: c6f2cbcf29b8fbc3c990b998def25af503b496dc (
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
|
#!/bin/bash
#MPV WINDOW / SOME OTHER OUTPUT
#pactl list sink-inputs | grep -E "^\s*Sink\ Input\ \#|^\s*media\.name\ \=\ " | tac | grep -A 1 -E "^\s*media\.name\ \=\ .*Onii.*" | grep -oP "Sink\ Input\ \#\K[0-9]+"
#SINK
#pacmd list-sinks | grep -E "^\s*name:|^\s*module:" | grep -A 1 -E "^\s*name: <CombinedDiscordSink>" | grep -oP "module: \K[0-9]+"
######################### VARIABLES #########################
MICROPHONE="alsa_input.pci-0000_00_1b.0.analog-stereo"
SPEAKERS="alsa_output.pci-0000_00_1b.0.analog-stereo"
SHORTCUTS=(
'FUNCTION | TERMINAL EQUIVALENT | RECOMMENDED KEYBIND'
'------------------------------------------------------------------------------------------'
'Change Sink | minivac.sh | Ctrl+Shift+F7'
'Load Sinks | minivac.sh -l | -'
'Unload Sinks | minivac.sh -u | -'
'Notify-send Sinks | minivac.sh -n | F7'
'Reset Sinks | minivac.sh -r | Shift+F7'
)
DMENU_APPEARANCE="mononoki;11;#191919;#AAAAAA;#890089;#FFFFFF;Select Input:"
for i in {1..7}
do
declare "dm$i=$(echo $DMENU_APPEARANCE | cut -f$i -d';')" # CONVERT DMENU APPEARANCE STRIP INTO SEPARATE PARAMETERS
done
mapfile -t INPUTS < <( pactl list sink-inputs | grep -B 30 -A 10 "application.process.binary" | grep "Sink Input\|application\.name\|media\.name" | grep -B 2 "application\.name" | sed -r "/--/d; s|Sink\ Input\ ||g; s|[[:space:]]*application\.name\ \=|\~|g; s|[[:space:]]*media\.name\ \=\ |\~\ |g" | paste -sd ' \n' )
mapfile -t SINKS < <( pactl list sinks | grep -A 3 "Sink #" | grep "Sink #\|Name:\|Description:" | sed -r "s|[[:space:]]*Name:\ |\~ |g; s|[[:space:]]*Description:\ |\~\ |g" | paste -sd ' \n' )
######################### HELPER FUNCTIONS #########################
treat_inputs () {
i=0
for INPUT in "${INPUTS[@]}"
do
SINK=$( pactl list sink-inputs | grep -A 5 "$( echo $INPUT | sed -r "s| .*||g" )" | grep "Sink:")
SINK_TRANSLATED=$( pactl list sinks | grep -A 3 "$( echo $SINK | sed -r 's|: | #|g')" | grep "Description" | sed -r "s|.*Description: ||g" )
INPUTS[i]=$( echo "$INPUT -> $SINK_TRANSLATED" )
((i++))
done
}
load_sinks () {
if [[ -z "$(pactl list short modules | grep "DiscordSink")" ]]; then
pactl load-module module-null-sink sink_name=VirtualDiscordSink
pactl load-module module-loopback source="$MICROPHONE" sink=VirtualDiscordSink
pactl load-module module-combine-sink slaves=VirtualDiscordSink,$SPEAKERS sink_name=CombinedDiscordSink
else
echo -e "\nSinks already loaded."
fi
}
unload_sinks () {
read -r -p "Are you sure? [y/N] " response
response=${response,,} # tolower
if [[ "$response" =~ ^(yes|y)$ ]]; then
pactl list short modules | grep "DiscordSink" | cut -f1 | xargs -L1 pactl unload-module
echo -e "\nSinks unloaded."
else
echo -e "\nSink unloading aborted."
fi
}
configure_mic () {
MIC_NAME=$( pactl list source-outputs | grep -B 18 "WEBRTC VoiceEngine" | grep "Source Output #" | sed -r "s|^.*#||g" )
MIC_SOURCE=$( pactl list source-outputs | grep -B 18 "WEBRTC VoiceEngine" | grep "Source:" | sed -r "s|^.*:\ ||g" )
SINK_SOURCE=$( pactl list sources | grep -B 3 "VirtualDiscordSink.monitor" | grep "Source #" | sed -r "s|^.*#||g" )
[[ "$MIC_SOURCE" -ne "$SINK_SOURCE" ]] && pactl move-source-output "$MIC_NAME" "VirtualDiscordSink.monitor" && $HOME/stuf/scripts/notification_wrapper.sh "\nMICROPHONE\nHAS BEEN MOVED TO SINK\n$SINK_SOURCE" "MINIVAC"
}
reset_sinks () {
echo -e "Yes\nNo" \
| dmenu -fn "$([[ $(fc-match "$dm1" | grep "$dm1") ]] && fc-match -f %{family} "$dm1" || fc-match -f %{family} mono)-$dm2" -l 10 -i -nb "$dm3" -nf "$dm4" -sb "#900D09" -sf "$dm6" -p "Reset all sinks?" \
| grep "Yes" &> /dev/null && for INPUT in "${INPUTS[@]}"; do pactl move-sink-input "$(echo $INPUT | awk -F' ~ ' '{print $1}' | sed "s|#||")" "alsa_output.pci-0000_00_1b.0.analog-stereo"; done \
&& $HOME/stuf/scripts/notification_wrapper.sh "\nALL SINKS HAVE BEEN RESET" "MINIVAC"
}
notify_sinks () {
treat_inputs
$HOME/stuf/scripts/notification_wrapper.sh "\nLIST OF CURRENT MAPPINGS\n$(for INPUT in "${INPUTS[@]}"; do echo "\n$INPUT"; done)" "MINIVAC"
}
change_sink () {
treat_inputs
CHOICE_INPUT=$( echo "$(for INPUT in "${INPUTS[@]}"; do echo $INPUT; done)" | uniq | dmenu -fn "$([[ $(fc-match "$dm1" | grep "$dm1") ]] && fc-match -f %{family} "$dm1" || fc-match -f %{family} mono)-$dm2" -l 10 -i -nb "$dm3" -nf "$dm4" -sb "$dm5" -sf "$dm6" -p "$dm7" )
CHI_COMMAND=$(echo $CHOICE_INPUT | awk -F' ~ ' '{print $1}' | sed "s|#||")
CHI_NOTIFY=$(echo $CHOICE_INPUT | awk -F' ~ ' '{print $2}' )
[[ -n $CHI_COMMAND ]] && CHOICE_SINK=$( echo "$(for SINK in "${SINKS[@]}"; do echo $SINK; done)" | uniq | dmenu -fn "$([[ $(fc-match "$dm1" | grep "$dm1") ]] && fc-match -f %{family} "$dm1" || fc-match -f %{family} mono)-$dm2" -l 10 -i -nb "$dm3" -nf "$dm4" -sb "$dm5" -sf "$dm6" -p "Select Sink:" )
CHS_COMMAND=$(echo $CHOICE_SINK | awk -F' ~ ' '{print $2}' )
CHS_NOTIFY=$(echo $CHOICE_SINK | awk -F' ~ ' '{print $3}' )
[[ -n $CHI_COMMAND && -n $CHS_COMMAND ]] && pactl move-sink-input "$CHI_COMMAND" "$CHS_COMMAND" && $HOME/stuf/scripts/notification_wrapper.sh "\nSOURCE\n$CHI_NOTIFY\nHAS BEEN MOVED TO SINK\n$CHS_NOTIFY" "MINIVAC"
}
######################### EXECUTION #########################
# [[ -z $( grep -E "^alsa_output.pci-0000_03_04.0.analog-stereo$" $HOME/.config/pulse/* ) || -z $( grep -E "^alsa_input.pci-0000_03_04.0.iec958-stereo$" $HOME/.config/pulse/* ) ]] \
# && $HOME/stuf/scripts/notification_wrapper.sh "\nSYSTEM CHANGE DETECTED, TERMINATING PROGRAM" "MINIVAC" && exit
load_sinks
configure_mic
while getopts "hlunr" opt; do
case $opt in
h) echo -e "usage: $0 [-h help] [-n notify-send sinks] [-l load sinks] [-u unload sinks] [-r reset sinks]\n\nSuggested Keyboard Shortcuts:\n"; printf '%s\n' "${SHORTCUTS[@]}"; exit ;; # PRINT HELP IN TERMINAL
l) load_sinks; exit ;; # LOAD ALL SINKS
u) unload_sinks; exit ;; # UNLOAD ALL SINKS
n) notify_sinks; exit ;; # LIST ALL SINKS VIA WRAPPER
r) reset_sinks; exit ;; # RESET ALL SINKS
?) echo "error: option -$OPTARG is not implemented"; exit ;;
esac
done
change_sink
# pacmd load-module module-loopback source=MICROPHONE_SOURCE sink=Virtual
# alsa_input.usb-C-Media_Electronics_Inc._YMC_1040-00.mono-fallback
# pacmd load-module module-combine-sink slaves=Virtual,SOUNDCARD_SINK
# alsa_output.pci-0000_03_04.0.analog-stereo
# set mpv playback to simultaneous output to null output, CMI...
# set recording to monitor of null output
# pactl list sinks -> Sink #1
# pactl list sink-inputs -> Sink: 1
|