47 lines
1.3 KiB
Bash
Executable File
47 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
STATE="$HOME/.soundboard"
|
|
mkdir -p "$STATE"
|
|
|
|
# Defaults
|
|
MIC=$(pactl get-default-source)
|
|
|
|
# Check if soundboard is already started
|
|
if [[ -f "$STATE/nullsink.id" || -f "$STATE/remap.id" || -f "$STATE/micloop.id" ]]; then
|
|
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
|
|
$SCRIPT_DIR/stop_soundboard.sh
|
|
exit 0
|
|
fi
|
|
|
|
# 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 "on"
|