#!/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 echo "Soundboard already started" 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 "Soundboard ready." echo "Select 'SoundboardMic' in apps if needed."