diff --git a/src/channel.c b/src/channel.c index 0313260..0d94656 100644 --- a/src/channel.c +++ b/src/channel.c @@ -23,7 +23,7 @@ void channel_add(jack_client_t *client, int idx) return; } - channels[idx].active = 1; + atomic_store(&channels[idx].active, 1); atomic_store(&channels[idx].state, STATE_IDLE); channels[idx].prev_state = -1; channels[idx].loop_count = 0; @@ -38,6 +38,6 @@ void channel_remove(jack_client_t *client, int idx) { jack_port_unregister(client, channels[idx].audio_in); jack_port_unregister(client, channels[idx].audio_out); - channels[idx].active = 0; + atomic_store(&channels[idx].active, 0); channel_count--; } diff --git a/src/channel.h b/src/channel.h index d6f0d06..cb51698 100644 --- a/src/channel.h +++ b/src/channel.h @@ -21,7 +21,7 @@ struct channel_t { int loop_count; int record_pos; int playback_pos; - int active; + atomic_int active; jack_port_t *audio_in; jack_port_t *audio_out; }; diff --git a/src/looper.c b/src/looper.c index 6c0bd53..f72bf35 100644 --- a/src/looper.c +++ b/src/looper.c @@ -26,14 +26,16 @@ int process_callback(jack_nframes_t nframes, void *arg) { (void)arg; - void *midi_ctrl_buf = jack_port_get_buffer(midi_control_port, nframes); - if (midi_ctrl_buf) { - midi_handle_events(midi_ctrl_buf, nframes); + if (midi_control_port) { + void *midi_ctrl_buf = jack_port_get_buffer(midi_control_port, nframes); + if (midi_ctrl_buf) { + midi_handle_events(midi_ctrl_buf, nframes); + } } /* process each active channel */ for (int c = 0; c < MAX_CHANNELS; c++) { - if (!channels[c].active) continue; + if (!atomic_load(&channels[c].active)) continue; /* Guard against NULL ports (e.g. if port registration failed) */ if (!channels[c].audio_in || !channels[c].audio_out) { @@ -108,30 +110,32 @@ int process_callback(jack_nframes_t nframes, void *arg) } /* MIDI clock events – affect channel 0 only */ - void *midi_clock_buf = jack_port_get_buffer(midi_clock_port, nframes); - if (midi_clock_buf) { - jack_nframes_t n_clock_events = jack_midi_get_event_count(midi_clock_buf); - jack_midi_event_t cev; - for (jack_nframes_t j = 0; j < n_clock_events; j++) { - if (jack_midi_event_get(&cev, midi_clock_buf, j) != 0) continue; - if (cev.size >= 1) { - unsigned char msg = cev.buffer[0]; - switch (msg) { - case 0xFA: { - int s = atomic_load(&channels[0].state); - if (s == STATE_IDLE) atomic_store(&channels[0].state, STATE_RECORD); - break; - } - case 0xFC: - atomic_store(&channels[0].state, STATE_IDLE); - break; - case 0xFB: { - int s = atomic_load(&channels[0].state); - if (s == STATE_PAUSED) atomic_store(&channels[0].state, STATE_LOOPING); - break; - } - default: - break; + if (midi_clock_port) { + void *midi_clock_buf = jack_port_get_buffer(midi_clock_port, nframes); + if (midi_clock_buf) { + jack_nframes_t n_clock_events = jack_midi_get_event_count(midi_clock_buf); + jack_midi_event_t cev; + for (jack_nframes_t j = 0; j < n_clock_events; j++) { + if (jack_midi_event_get(&cev, midi_clock_buf, j) != 0) continue; + if (cev.size >= 1) { + unsigned char msg = cev.buffer[0]; + switch (msg) { + case 0xFA: { + int s = atomic_load(&channels[0].state); + if (s == STATE_IDLE) atomic_store(&channels[0].state, STATE_RECORD); + break; + } + case 0xFC: + atomic_store(&channels[0].state, STATE_IDLE); + break; + case 0xFB: { + int s = atomic_load(&channels[0].state); + if (s == STATE_PAUSED) atomic_store(&channels[0].state, STATE_LOOPING); + break; + } + default: + break; + } } } } diff --git a/tests/integration.c b/tests/integration.c index 6ae382b..6f88fe6 100644 --- a/tests/integration.c +++ b/tests/integration.c @@ -34,6 +34,7 @@ static unsigned char midi_inject_velocity = 0; static int midi_inject_process(jack_nframes_t nframes, void *arg) { (void)arg; + if (!midi_inject_port) return 0; void *port_buf = jack_port_get_buffer(midi_inject_port, nframes); if (!port_buf) return 0; jack_midi_clear_buffer(port_buf);