us144mkii/raw_jack_us144mkii/start_tascam_raw.sh

170 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
DRIVER_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
echo "========================================="
echo " TASCAM RAW DRIVER LAUNCHER"
echo "========================================="
echo "Select Sample Rate:"
echo " 1) 44100 Hz"
echo " 2) 48000 Hz (Recommended)"
echo " 3) 88200 Hz"
echo " 4) 96000 Hz"
read -p "Enter choice [1-4]: " rate_choice
case $rate_choice in
1) RATE=44100 ;;
2) RATE=48000 ;;
3) RATE=88200 ;;
4) RATE=96000 ;;
*) echo "Invalid choice. Defaulting to 48000."; RATE=48000 ;;
esac
echo ""
read -p "Enter Buffer Size (frames) [e.g., 64]: " BUFFER
if ! [[ "$BUFFER" =~ ^[0-9]+$ ]]; then
echo "Invalid buffer size. Defaulting to 64."
BUFFER=64
fi
LATENCY=$(awk "BEGIN { printf \"%.2f\", (($BUFFER * 2 * 1000 / $RATE) + 1.0) }")
echo ""
echo "-----------------------------------------"
echo " Estimated Playback Latency: ${LATENCY} ms"
echo "-----------------------------------------"
echo ""
cleanup() {
echo ""
echo "========================================="
echo " SHUTTING DOWN"
echo "========================================="
if [ ! -z "$CLIENT_PID" ]; then
echo "[*] Stopping Client..."
kill $CLIENT_PID 2>/dev/null
wait $CLIENT_PID 2>/dev/null
fi
if [ ! -z "$A2J_PID" ]; then
echo "[*] Stopping a2jmidid..."
kill $A2J_PID 2>/dev/null
wait $A2J_PID 2>/dev/null
fi
if [ ! -z "$JACK_PID" ]; then
echo "[*] Stopping JACK..."
kill $JACK_PID 2>/dev/null
wait $JACK_PID 2>/dev/null
fi
echo "[*] Unloading Raw Driver..."
for i in {1..10}; do
if sudo rmmod tascam_raw 2>/dev/null; then
break
fi
sleep 0.5
done
echo "[*] Restoring Standard ALSA Driver..."
sudo modprobe snd_usb_us144mkii 2>/dev/null
echo "[*] Restarting PipeWire/PulseAudio..."
systemctl --user start pipewire.socket pipewire-pulse.socket wireplumber.service 2>/dev/null
echo "Done. Desktop audio restored."
exit
}
trap cleanup SIGINT
echo ""
echo "--- INITIALIZING ---"
cd "$DRIVER_DIR"
if [ ! -f "jack_tascam" ] || [ "jack_tascam.c" -nt "jack_tascam" ] || [ ! -f "tascam_raw.ko" ]; then
echo "[1/6] Compiling..."
make clean > /dev/null
make > /dev/null
if [ $? -ne 0 ]; then echo "Error: Compilation failed."; exit 1; fi
fi
echo "[2/6] Stopping Desktop Audio Services..."
systemctl --user stop pipewire.socket pipewire-pulse.socket wireplumber.service 2>/dev/null
killall -9 jackd 2>/dev/null
killall -9 a2jmidid 2>/dev/null
echo "[3/6] Loading Kernel Driver..."
sudo rmmod snd_usb_us144mkii 2>/dev/null
sudo rmmod snd_usb_audio 2>/dev/null
sudo rmmod tascam_raw 2>/dev/null
TASCAM_BUS_ID=$(grep -l "0644" /sys/bus/usb/devices/*/idVendor | xargs grep -l -E "8020|800f" | sed 's|/idProduct||' | xargs -I{} basename {})
if [ ! -z "$TASCAM_BUS_ID" ]; then
if [ -e "/sys/bus/usb/devices/$TASCAM_BUS_ID:1.0/driver/unbind" ]; then
echo "$TASCAM_BUS_ID:1.0" | sudo tee /sys/bus/usb/devices/$TASCAM_BUS_ID:1.0/driver/unbind > /dev/null
fi
if [ -e "/sys/bus/usb/devices/$TASCAM_BUS_ID:1.1/driver/unbind" ]; then
echo "$TASCAM_BUS_ID:1.1" | sudo tee /sys/bus/usb/devices/$TASCAM_BUS_ID:1.1/driver/unbind > /dev/null
fi
fi
if ! sudo insmod tascam_raw.ko; then
echo "Error: Failed to insert kernel module."
cleanup
fi
echo " Waiting for device node..."
for ((i=0; i<50; i++)); do
if [ -e /dev/tascam_raw ]; then break; fi
sleep 0.1
done
if [ ! -e /dev/tascam_raw ]; then
echo "Error: /dev/tascam_raw was not created."
sudo dmesg | tail -n 5
cleanup
fi
sudo chmod 666 /dev/tascam_raw /dev/tascam_midi 2>/dev/null
echo "[4/6] Starting JACK ($RATE Hz / $BUFFER frames)..."
jackd -R -d dummy -r $RATE -p $BUFFER >/dev/null 2>&1 &
JACK_PID=$!
sleep 2
if ! ps -p $JACK_PID > /dev/null; then
echo "Error: JACK failed to start."
cleanup
fi
if command -v a2jmidid &> /dev/null; then
echo "[5/6] Starting a2jmidid..."
a2jmidid -e >/dev/null 2>&1 &
A2J_PID=$!
else
echo "[5/6] a2jmidid not found (skipping MIDI bridge)."
fi
echo "[6/6] Starting TASCAM Bridge Client..."
./jack_tascam &
CLIENT_PID=$!
sleep 1
if ! ps -p $CLIENT_PID > /dev/null; then
echo "Error: Client failed to start."
cleanup
fi
echo ""
echo "========================================="
echo " SYSTEM LIVE!"
echo " Rate: $RATE Hz | Buffer: $BUFFER"
echo " Estimated Playback Latency: ${LATENCY} ms"
echo " Connect your apps in JACK now."
echo " Press Ctrl+C to stop and restore."
echo "========================================="
wait $CLIENT_PID