#!/bin/bash # audio-stack-start — initialize the full low-latency audio environment # Run with: sudo audio-stack-start # Then JACK runs as the 'pi' user (or current user if not root) set -e echo "" echo "╔══════════════════════════════════════════╗" echo "║ Audio Stack Initialization ║" echo "╚══════════════════════════════════════════╝" echo "" # ── 1. CPU Governor ────────────────────────────────── echo "1/6 Setting CPU governor → performance..." for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do if [ -f "$cpu" ]; then echo performance > "$cpu" 2>/dev/null || true fi done echo " Done." # ── 2. IRQ Priorities ──────────────────────────────── echo "2/6 Configuring IRQ priorities..." if command -v rtirq > /dev/null 2>&1; then if systemctl is-active --quiet rtirq 2>/dev/null; then systemctl restart rtirq 2>/dev/null || true else systemctl start rtirq 2>/dev/null || true fi echo " rtirq started." else echo " rtirq not installed. Run: sudo apt install rtirq-init" fi # ── 3. PAM Limits Check ────────────────────────────── echo "3/6 Checking PAM limits..." CURRENT_RTPRIO=$(ulimit -r 2>/dev/null || echo "unknown") CURRENT_MEMLOCK=$(ulimit -l 2>/dev/null || echo "unknown") echo " rtprio: $CURRENT_RTPRIO (need 99)" echo " memlock: $CURRENT_MEMLOCK (need unlimited)" # ── 4. USB Audio Driver ────────────────────────────── echo "4/6 Configuring USB audio driver..." if lsmod 2>/dev/null | grep -q snd_usb_audio; then modprobe -r snd-usb-audio 2>/dev/null || true sleep 1 fi modprobe snd-usb-audio nrpacks=1 2>/dev/null || true echo " snd-usb-audio loaded with nrpacks=1" # ── 5. USB Audio Detection ─────────────────────────── echo "5/6 Checking USB audio device..." sleep 1 if aplay -l 2>/dev/null | grep -qi usb; then echo " USB audio interface detected:" aplay -l 2>/dev/null | grep -i usb | head -3 | sed 's/^/ /' else echo " WARNING: No USB audio interface found!" echo " Check: lsusb | grep -i audio" fi # ── 6. Start JACK ──────────────────────────────────── echo "6/6 Starting JACK2..." if pgrep -x jackd > /dev/null; then echo " JACK is already running. PID: $(pgrep -x jackd)" else if [ "$EUID" -eq 0 ] && id pi >/dev/null 2>&1; then # Running as root, drop to pi user sudo -u pi jackd -P70 -t2000 -d alsa -d hw:USB -r48000 -p128 -n3 -S > /tmp/jackd.log 2>&1 & echo " JACK launched as user 'pi' (PID: $!)" else jackd -P70 -t2000 -d alsa -d hw:USB -r48000 -p128 -n3 -S > /tmp/jackd.log 2>&1 & echo " JACK launched (PID: $!)" fi sleep 2 fi # ── Final status ───────────────────────────────────── echo "" echo "╔══════════════════════════════════════════╗" echo "║ Audio Stack Ready ║" echo "╚══════════════════════════════════════════╝" echo "" echo " Check ports: jack_lsp -c system" echo " Test latency: jack_delay -O system:playback_1 -I system:capture_1" echo " Auto-route: jack-route-default" echo " Stop stack: audio-stack-stop" echo " Xrun monitor: jack_cpu_load" echo ""