aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdiscord_input.sh103
1 files changed, 103 insertions, 0 deletions
diff --git a/discord_input.sh b/discord_input.sh
new file mode 100755
index 0000000..e895f6b
--- /dev/null
+++ b/discord_input.sh
@@ -0,0 +1,103 @@
+#!/usr/bin/env bash
+
+switch_discord_input=ask # ask|yes|no
+sink_name=merged_streams
+sink_description=""
+
+while getopts 'n:s:N:S' flag; do
+ case "${flag}" in
+ n) no_of_streams="${OPTARG}" ;;
+ s) switch_discord_input="${OPTARG}" ;;
+ N) sink_name="${OPTARG}" ;;
+ D) sink_description="${OPTARG}" ;;
+ *) ;;
+ esac
+done
+
+if [ "$sink_description" == "" ]; then
+ sink_description="$sink_name"
+fi
+
+# get the amount of streams to merge if not specified
+if [ "$no_of_streams" = "" ]; then
+ printf "\033[1;36mEnter number of sinks/sources to merge: \033[0m"
+ read -r no_of_streams
+fi
+
+# create NULL sink to merge all the audio streams
+pacmd load-module module-null-sink sink_name="$sink_name"
+
+# change desc of NULL sink and it's monitor for visual purpose
+pacmd update-sink-proplist "$sink_name" device.description="$sink_description"
+pacmd update-source-proplist "$sink_name.monitor" device.description="\"Monitor of $sink_name\""
+
+i=0; while [ $i -lt "$no_of_streams" ]; do
+ # get sources and split
+ SAVEIFS=$IFS
+ IFS=$'\n'
+ # somebody help
+ sources=($(pacmd list-sources | awk '/name:/ {print $2}; /device.description/ {$1=$2=""; print $0}' | sed 's/^[ \t\"]*//; s/[ \t\"]$//' | awk 'NR%2==0 {printf "\033[34m"$0"\t \033[0;32m"f"\033[0m\n"} {f=$0}'))
+ IFS=$SAVEIFS
+
+ # print all the sources with their indices
+ for (( j=0; j<${#sources[@]}; j++ )); do
+ unformatted_sink_name="$(echo "${sources[j]}" | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g')"
+ new_sink_name="Monitor of $sink_name <$sink_name.monitor>"
+
+ # do not print the newly created NULL output's monitor
+ if [ "$unformatted_sink_name" != "$new_sink_name" ]; then
+ printf "\033[1;33m%s: %s\n" "$j" "${sources[$j]}"
+ fi
+ done
+
+ # ask to enter source number
+ printf "\033[1;36mEnter a value: \033[0m"
+ read -r source_idx
+
+ # extract source name and save it
+ source_sel=$(echo "${sources[source_idx]}" | sed 's/\x1B\[[0-9;]\{1,\}[A-Za-z]//g' | awk -F "\t" '{print $2}' | sed 's/^[ <]*//; s/>$//')
+
+ # finally create loopback
+ pacmd load-module module-loopback sink="$sink_name" source="$source_sel"
+
+ # get new loopback's index and rename loopback
+ loopback_idx=$(pacmd list-source-outputs | egrep '(.*index: .*)|(^\s+media.name = .*)' | awk "/Loopback to $sink_name/ {printf f} {f=\$2}")
+ pacmd update-source-output-proplist "$loopback_idx" media.name="\"Merged stream #$((i+1))\""
+
+ i=$((i + 1))
+done
+
+# check if switching disabled through flags
+if [ "$switch_discord_input" != no ]; then
+ # get index of discord's source output
+ discord_idx="$(pacmd list-source-outputs | egrep '(.*index: .*)|(^\s+application.process.binary = .*)' | awk '/Discord/ {printf f} {f=$2}')"
+
+ # ask the user and change discord's input to new input
+ if [ "$discord_idx" == "" ]; then
+ printf "\033[1;31mDiscord instance not found/recording. If it is running, please use Discord settings or pavucontrol to manually change its input.\033[0m\n"
+ else
+ if [ "$switch_discord_input" == ask ]; then
+ printf "\033[1;36mDiscord is running, switch discord's input to new merged input?(y/n)\033[0m "
+
+ # get response
+ while :; do
+ read -r response
+
+ if [ "$response" == y ] || [ "$response" == Y ]; then
+ echo did it
+ pacmd move-source-output "$discord_idx" "$sink_name.monitor"
+ break
+ elif [ "$response" == n ] || [ "$response" == N ]; then
+ break
+ else
+ printf "\033[1;36mPlease enter a valid input (y/n):\033[0m "
+ fi
+ done
+ else
+ echo did it
+ pacmd move-source-output "$discord_idx" "$sink_name.monitor"
+ fi
+ fi
+fi
+
+