eff3c45849
Validate and Test / validate-patches (push) Failing after 13s
alsaucm set _verb HiFi runs without error but doesn't actually apply mixer controls on this board. Use direct amixer cset commands instead. - RX_MACRO RX0/RX1 MUX = AIF1_PB - RX_CODEC_DMA_RX_0 Audio Mixer MultiMedia1 = 1 - RX INT0_1/INT1_1 INTERP = MIX1 - RX INT0_1/INT1_1 MIX1 INP0 = RX0/RX1
106 lines
3.2 KiB
Bash
Executable File
106 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
REPO_DIR="/home/arduino/uno-q-audio-synth"
|
|
PD_DIR="$REPO_DIR/pd"
|
|
PATCH="$PD_DIR/synth.pd"
|
|
MODE="usb"
|
|
VERBOSE=false
|
|
|
|
# Fallback to legacy path if REPO_DIR not cloned
|
|
[ -d "$PD_DIR" ] || PD_DIR="/home/arduino/pd"
|
|
PATCH="$PD_DIR/synth.pd"
|
|
|
|
die() { echo "[ERROR] $*" >&2; exit 1; }
|
|
info() { echo "[INFO] $*"; }
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-a|--auto) MODE="auto"; shift ;;
|
|
-o|--onboard) MODE="onboard"; shift ;;
|
|
-i|--i2s) MODE="i2s"; shift ;;
|
|
-l|--loopback) MODE="loopback"; shift ;;
|
|
-v|--verbose) VERBOSE=true; shift ;;
|
|
-k|--kill) pkill -x pd 2>/dev/null && info "Pd stopped" || info "Pd not running"; exit 0 ;;
|
|
*) die "Unknown option: $1" ;;
|
|
esac
|
|
done
|
|
|
|
if ! command -v pd &>/dev/null; then
|
|
die "Pure Data not found. Install: apt install puredata"
|
|
fi
|
|
|
|
MIN_PD_VERSION="0.54.0"
|
|
PD_VERSION=$(pd -version 2>&1 | grep -oP '\d+\.\d+\.\d+' | head -1 || echo "0.0.0")
|
|
if printf '%s\n' "$MIN_PD_VERSION" "$PD_VERSION" | sort -V | head -1 | grep -q "^$MIN_PD_VERSION$"; then
|
|
info "Pd version $PD_VERSION (>= $MIN_PD_VERSION)"
|
|
else
|
|
die "Pd version $PD_VERSION is too old. Need >= $MIN_PD_VERSION"
|
|
fi
|
|
|
|
if [ ! -f "$PATCH" ]; then
|
|
die "Patch not found: $PATCH"
|
|
fi
|
|
|
|
# --- Auto-detect mode ---
|
|
if [ "$MODE" = "auto" ]; then
|
|
MODE="onboard"
|
|
fi
|
|
|
|
# --- Configure per-mode options ---
|
|
AUDIO_OPTS=()
|
|
|
|
if [ "$MODE" = "usb" ]; then
|
|
info "Mode: USB gadget (UAC1 audio + gmidi MIDI)"
|
|
AUDIO_OPTS=(-audiooutdev 2 -audioindev 2)
|
|
if aplay -l 2>/dev/null | grep -q "UAC1Gadget"; then
|
|
info " USB gadget: OK"
|
|
# MIDI handled by midi-bridge.service → UDP → Pd netreceive
|
|
else
|
|
info " USB gadget: NOT DETECTED (kernel modules needed)"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MODE" = "onboard" ] || [ "$MODE" = "i2s" ]; then
|
|
info "Mode: Onboard audio (PMIC headphone / line out on JMISC)"
|
|
AUDIO_OPTS=(-audiooutdev 0 -inchannels 0 -outchannels 1)
|
|
# Configure ALSA mixer for onboard audio (jack detection broken, set manually)
|
|
if command -v amixer &>/dev/null; then
|
|
amixer -c 0 cset name='RX_MACRO RX0 MUX' AIF1_PB 2>/dev/null
|
|
amixer -c 0 cset name='RX_MACRO RX1 MUX' AIF1_PB 2>/dev/null
|
|
amixer -c 0 cset name='RX_CODEC_DMA_RX_0 Audio Mixer MultiMedia1' 1 2>/dev/null
|
|
amixer -c 0 cset name='RX INT0_1 INTERP' 'RX INT0_1 MIX1' 2>/dev/null
|
|
amixer -c 0 cset name='RX INT1_1 INTERP' 'RX INT1_1 MIX1' 2>/dev/null
|
|
amixer -c 0 cset name='RX INT0_1 MIX1 INP0' RX0 2>/dev/null
|
|
amixer -c 0 cset name='RX INT1_1 MIX1 INP0' RX1 2>/dev/null
|
|
info " ALSA mixer configured for onboard audio"
|
|
else
|
|
info " amixer not found — skipping mixer config"
|
|
fi
|
|
fi
|
|
|
|
if [ "$MODE" = "loopback" ]; then
|
|
info "Mode: ALSA loopback (testing)"
|
|
AUDIO_OPTS=(-audiodev 2)
|
|
fi
|
|
|
|
PD_ARGS=(
|
|
-nogui -alsa
|
|
-send "pd dsp 1"
|
|
"${AUDIO_OPTS[@]}"
|
|
-audiobuf 20 -blocksize 64 -r 48000
|
|
-channels 1 -inchannels 0 -outchannels 1
|
|
-path "$PD_DIR" "$PATCH"
|
|
)
|
|
|
|
if [ "$VERBOSE" = true ]; then
|
|
pd "${PD_ARGS[@]}" &
|
|
else
|
|
pd "${PD_ARGS[@]}" > /dev/null 2>&1 &
|
|
fi
|
|
PID=$!
|
|
info "Pd started (PID: $PID)"
|
|
info " Stop: kill $PID"
|
|
wait $PID
|
|
info "Pd exited (code: $?)"
|