summaryrefslogtreecommitdiff
path: root/miscripts/minivac_pulse.sh
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