From 0120c6b6b046e95211a09f17f463744c849d2e35 Mon Sep 17 00:00:00 2001 From: William Bell <62452284+Ugric@users.noreply.github.com> Date: Fri, 2 Jan 2026 15:25:09 +0000 Subject: [PATCH] add all the script needed (hopefully this means i dont need to even make anymore commits lol) --- play.sh | 30 ++++++++++++++++++++++++++++++ start_soundboard.sh | 40 ++++++++++++++++++++++++++++++++++++++++ stop_all.sh | 13 +++++++++++++ stop_soundboard.sh | 10 ++++++++++ 4 files changed, 93 insertions(+) create mode 100755 play.sh create mode 100755 start_soundboard.sh create mode 100755 stop_all.sh create mode 100755 stop_soundboard.sh diff --git a/play.sh b/play.sh new file mode 100755 index 0000000..fbf387f --- /dev/null +++ b/play.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -e + +FILE="$1" +[[ -f "$FILE" ]] || { echo "Usage: $0 "; exit 1; } + +STATE="$HOME/.soundboard" +mkdir -p "$STATE" + +DEFAULT_SINK=$(pactl get-default-sink) + +# Start paplay processes in foreground +# Store PIDs so we can clean up +paplay --device=soundboard_sink "$FILE" & +PID_MIC=$! + +paplay --device="$DEFAULT_SINK" "$FILE" & +PID_OUT=$! + +# Trap signals to stop both outputs if script is killed +trap "kill $PID_MIC $PID_OUT 2>/dev/null" EXIT INT TERM + +# Register this process in PID file for stop_all.sh +echo $$ >> "$STATE/playing.pids" + +# Wait for both streams to finish +wait $PID_MIC $PID_OUT + +# Remove from PID file when done +sed -i "\|^$$\$|d" "$STATE/playing.pids" \ No newline at end of file diff --git a/start_soundboard.sh b/start_soundboard.sh new file mode 100755 index 0000000..66c2d85 --- /dev/null +++ b/start_soundboard.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -e + +STATE="$HOME/.soundboard" +mkdir -p "$STATE" + +# Defaults +MIC=$(pactl get-default-source) + +# 1. Create a null sink (soundboard mixer) +if ! pactl list short sinks | grep -q soundboard_sink; then + SINK_ID=$(pactl load-module module-null-sink \ + sink_name=soundboard_sink \ + sink_properties=device.description=SoundboardSink) + echo "$SINK_ID" > "$STATE/nullsink.id" +fi + +# 2. Create virtual microphone +if ! pactl list short sources | grep -q soundboard_mic; then + SRC_ID=$(pactl load-module module-remap-source \ + master=soundboard_sink.monitor \ + source_name=soundboard_mic \ + source_properties=device.description=SoundboardMic) + echo "$SRC_ID" > "$STATE/remap.id" +fi + +# 3. Route REAL mic into the mixer +if ! pactl list short modules | grep -q "module-loopback.*$MIC"; then + LOOP_ID=$(pactl load-module module-loopback \ + source="$MIC" \ + sink=soundboard_sink \ + latency_msec=5) + echo "$LOOP_ID" > "$STATE/micloop.id" +fi + +# 4. Set virtual mic as default +pactl set-default-source soundboard_mic + +echo "Soundboard ready." +echo "Select 'SoundboardMic' in apps if needed." diff --git a/stop_all.sh b/stop_all.sh new file mode 100755 index 0000000..9b336c2 --- /dev/null +++ b/stop_all.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +STATE="$HOME/.soundboard" + +[[ -f "$STATE/playing.pids" ]] || exit 0 + +while read -r PGID; do + kill -TERM -- "-$PGID" 2>/dev/null || true +done < "$STATE/playing.pids" + +rm -f "$STATE/playing.pids" + +echo "All soundboard playback stopped." \ No newline at end of file diff --git a/stop_soundboard.sh b/stop_soundboard.sh new file mode 100755 index 0000000..1fdbfa4 --- /dev/null +++ b/stop_soundboard.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +STATE="$HOME/.soundboard" + +for f in "$STATE"/*.id; do + pactl unload-module "$(cat "$f")" 2>/dev/null || true + rm -f "$f" +done + +echo "Soundboard stopped."