47 lines
1.4 KiB
Bash
Executable File
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"
|