Files
jack-looper/test-jack-looper.sh
Loic Coenen ea23febdde test: add JACK looper plugin test script
Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
2026-05-04 17:31:54 +00:00

133 lines
3.8 KiB
Bash

#!/bin/bash
# jack-looper-test.sh - Test audio routing for the jack-looper Carla plugin
set -e
# Configuration
PLUGIN_BINARY="./jack-looper" # Adjust path to your compiled binary
TEST_DURATION=5 # seconds
TEST_FREQ=440 # Hz
TEST_AMP=0.5 # amplitude
SAMPLE_RATE=48000 # must match JACK server
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}=== JACK Looper Plugin Test ===${NC}"
# 1. Check if JACK is running, start if not
if ! jack_wait -c 2>/dev/null; then
echo -e "${YELLOW}Starting JACK server...${NC}"
jackd -d alsa -r $SAMPLE_RATE -p 1024 -n 2 &
JACK_PID=$!
sleep 2
if ! jack_wait -c; then
echo -e "${RED}Failed to start JACK server${NC}"
exit 1
fi
echo -e "${GREEN}JACK server started (PID: $JACK_PID)${NC}"
else
echo -e "${GREEN}JACK server already running${NC}"
fi
# 2. Start the plugin
echo -e "${YELLOW}Starting plugin...${NC}"
$PLUGIN_BINARY &
PLUGIN_PID=$!
sleep 1
# Check if plugin is running
if ! kill -0 $PLUGIN_PID 2>/dev/null; then
echo -e "${RED}Plugin failed to start${NC}"
exit 1
fi
echo -e "${GREEN}Plugin started (PID: $PLUGIN_PID)${NC}"
# 3. List available JACK ports
echo -e "${YELLOW}Available JACK ports:${NC}"
jack_lsp
# 4. Connect system capture to plugin input
echo -e "${YELLOW}Connecting system capture to plugin input...${NC}"
jack_connect system:capture_1 "$PLUGIN_BINARY:in_1" 2>/dev/null || true
jack_connect system:capture_2 "$PLUGIN_BINARY:in_2" 2>/dev/null || true
# 5. Connect plugin output to system playback
echo -e "${YELLOW}Connecting plugin output to system playback...${NC}"
jack_connect "$PLUGIN_BINARY:out_1" system:playback_1 2>/dev/null || true
jack_connect "$PLUGIN_BINARY:out_2" system:playback_2 2>/dev/null || true
# 6. Generate a test tone and play it through system capture
echo -e "${YELLOW}Playing test tone (${TEST_FREQ}Hz) for ${TEST_DURATION} seconds...${NC}"
# Generate sine wave and play through JACK
python3 -c "
import numpy as np
import jack
import time
client = jack.Client('test_tone')
client.activate()
# Create output port
out_port = client.outports.register('out_1')
# Generate sine wave
sample_rate = $SAMPLE_RATE
duration = $TEST_DURATION
frequency = $TEST_FREQ
amplitude = $TEST_AMP
t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
sine_wave = (amplitude * np.sin(2 * np.pi * frequency * t)).astype(np.float32)
# Play the tone
chunk_size = 1024
for i in range(0, len(sine_wave), chunk_size):
chunk = sine_wave[i:i+chunk_size]
if len(chunk) < chunk_size:
chunk = np.pad(chunk, (0, chunk_size - len(chunk)), 'constant')
out_port.get_array()[:] = chunk
time.sleep(chunk_size / sample_rate)
client.deactivate()
" &
TONE_PID=$!
sleep $TEST_DURATION
# 7. Record the output to verify routing
echo -e "${YELLOW}Recording output for verification...${NC}"
# Record using jack_capture or jack_rec
if command -v jack_capture &> /dev/null; then
jack_capture --duration $TEST_DURATION --filename test_output.wav --port "$PLUGIN_BINARY:out_1" "$PLUGIN_BINARY:out_2"
elif command -v jack_rec &> /dev/null; then
jack_rec -f test_output.wav -d $TEST_DURATION -p "$PLUGIN_BINARY:out_1" -p "$PLUGIN_BINARY:out_2"
else
echo -e "${YELLOW}No recording tool found (jack_capture or jack_rec). Skipping recording.${NC}"
fi
# 8. Cleanup
echo -e "${YELLOW}Cleaning up...${NC}"
kill $TONE_PID 2>/dev/null || true
kill $PLUGIN_PID 2>/dev/null || true
sleep 1
# Stop JACK if we started it
if [ -n "$JACK_PID" ]; then
kill $JACK_PID 2>/dev/null || true
fi
echo -e "${GREEN}=== Test Complete ===${NC}"
# Check if recording was made
if [ -f test_output.wav ]; then
echo -e "${GREEN}Recording saved to test_output.wav${NC}"
echo -e "${YELLOW}You can play it back with: aplay test_output.wav${NC}"
fi