#!/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"