add all the script needed (hopefully this means i dont need to even make anymore commits lol)
This commit is contained in:
30
play.sh
Executable file
30
play.sh
Executable file
@@ -0,0 +1,30 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
FILE="$1"
|
||||||
|
[[ -f "$FILE" ]] || { echo "Usage: $0 <file>"; 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"
|
||||||
40
start_soundboard.sh
Executable file
40
start_soundboard.sh
Executable file
@@ -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."
|
||||||
13
stop_all.sh
Executable file
13
stop_all.sh
Executable file
@@ -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."
|
||||||
10
stop_soundboard.sh
Executable file
10
stop_soundboard.sh
Executable file
@@ -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."
|
||||||
Reference in New Issue
Block a user