fix: keep persistent MIDI client across notes in integration tests

Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-12 18:37:15 +00:00
parent 04b59999c8
commit 4339fda529

View File

@@ -56,27 +56,32 @@ static int midi_inject_process(jack_nframes_t nframes, void *arg) {
return 0;
}
/* Helper: close and reopen the persistent MIDI client so it connects
to the current looper instance */
static void midi_inject_reconnect(const char *target_port) {
/* Helper: initialise the persistent MIDI client (open and connect) */
static int midi_inject_init(const char *target_port) {
if (midi_inject_client) return 0; /* already initialised */
jack_status_t st;
midi_inject_client = jack_client_open("midi_inject_persistent", JackNoStartServer, &st);
if (!midi_inject_client) return -1;
midi_inject_port = jack_port_register(midi_inject_client, "out",
JACK_DEFAULT_MIDI_TYPE,
JackPortIsOutput, 0);
if (!midi_inject_port) return -1;
jack_set_process_callback(midi_inject_client, midi_inject_process, NULL);
if (jack_activate(midi_inject_client) != 0) return -1;
char src[64];
snprintf(src, sizeof(src), "midi_inject_persistent:out");
if (jack_connect(midi_inject_client, src, target_port) != 0) return -1;
return 0;
}
/* Helper: close the persistent MIDI client */
static void midi_inject_close(void) {
if (midi_inject_client) {
jack_deactivate(midi_inject_client);
jack_client_close(midi_inject_client);
midi_inject_client = NULL;
midi_inject_port = NULL;
}
jack_status_t st;
midi_inject_client = jack_client_open("midi_inject_persistent", JackNoStartServer, &st);
if (!midi_inject_client) return;
midi_inject_port = jack_port_register(midi_inject_client, "out",
JACK_DEFAULT_MIDI_TYPE,
JackPortIsOutput, 0);
if (!midi_inject_port) return;
jack_set_process_callback(midi_inject_client, midi_inject_process, NULL);
jack_activate(midi_inject_client);
char src[64];
snprintf(src, sizeof(src), "midi_inject_persistent:out");
jack_connect(midi_inject_client, src, target_port);
}
/* The test code uses this callback in two ways:
@@ -252,8 +257,8 @@ static jack_client_t *midi_persistent_client = NULL;
static jack_port_t *midi_persistent_port = NULL;
static int send_jack_note_on(const char *target_port, unsigned char note, unsigned char velocity) {
midi_inject_reconnect(target_port);
if (!midi_inject_client || !midi_inject_port) return -1;
/* initialise client on first call (pertest) */
if (midi_inject_init(target_port) != 0) return -1;
midi_inject_note = note;
midi_inject_velocity = velocity;
@@ -939,6 +944,8 @@ static int test_wav_load(void) {
unlink("loop.wav");
return 1;
}
/* force a fresh MIDI connection for this test */
midi_inject_close();
/* send control key + note 70 to trigger load */
if (send_jack_note_on("looper:control", 64, 127) != 0) {
jack_deactivate(client);
@@ -1038,6 +1045,8 @@ static int test_wav_save(void) {
return 1;
}
safe_usleep(500000);
/* force a fresh MIDI connection for this test */
midi_inject_close();
/* send control key + note 71 to save */
if (send_jack_note_on("looper:control", 64, 127) != 0) {
jack_deactivate(client);