Files
audioserver/scripts/turntable-capture.sh
T
2026-05-16 22:46:17 +02:00

47 lines
1.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# Capture turntable audio from the HiFiBerry HAT and write to the Snapserver FIFO.
# Runs on the host (not in Docker) because it needs direct ALSA access.
#
# Called by turntable-capture.service — do not run directly.
set -euo pipefail
FIFO="${AUDIO_PIPES_DIR:-/opt/audiocontrol/pipes}/turntable.fifo"
CARD="${HIFIBERRY_CARD:-sndrpihifiberry}" # Set in .env / service env
RATE=48000
CHANNELS=2
FORMAT=S16_LE
log() { echo "[turntable] $*"; }
# Wait for the FIFO to exist (stack might not be up yet)
for i in $(seq 1 30); do
[[ -p "$FIFO" ]] && break
log "Waiting for FIFO: $FIFO ($i/30)..."
sleep 2
done
[[ -p "$FIFO" ]] || { log "ERROR: FIFO not found: $FIFO"; exit 1; }
# Find the ALSA capture device for the HiFiBerry card
DEVICE=$(arecord -l 2>/dev/null \
| awk -v card="$CARD" '$0 ~ card { sub(/^card /, ""); sub(/:.*/, ""); print "plug:\x27dsnoop:CARD=" card ",DEV=0\x27"; exit }')
if [[ -z "$DEVICE" ]]; then
log "ERROR: HiFiBerry card '$CARD' not found."
log "Available cards:"
arecord -l 2>&1 | sed 's/^/ /'
exit 1
fi
log "Capturing from ALSA device: $DEVICE ($RATE Hz, $CHANNELS ch, $FORMAT)"
log "Writing to: $FIFO"
# arecord → FIFO (infinite loop — systemd Restart=always handles reconnection)
exec arecord \
--device="$DEVICE" \
--rate="$RATE" \
--channels="$CHANNELS" \
--format="$FORMAT" \
--file-type=raw \
"$FIFO"