From 595cfc36afbe4192bf24b0a2f5c2f95e87e12295 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 24 Apr 2023 16:27:50 +0200 Subject: Fix potential recursive loop on interrupt --- src/main.c | 8 ++++++-- src/sequencer.c | 49 +++++++++++++------------------------------------ 2 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/main.c b/src/main.c index 0ab251d..3a1c1d7 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,7 @@ WITH REGARD TO THIS SOFTWARE. // + Allow pasting parameters if they have been copied. // - Draw the global params in grey if they haven't been adjusted or aren't // currently selected. -// - Draw missing cursor. +// + Draw missing cursor. // + Per-octave note adjustment with Select + L/R on a trig. // + Transpose channel with SEL + L/R on channel select. // - Pattern chaining for more than 1 queue and/or song mode. @@ -47,7 +47,7 @@ WITH REGARD TO THIS SOFTWARE. #include "renderer_m0.c" #include "sequencer.c" -#define PROF_ENABLE 1 +#define PROF_ENABLE 0 #include "profiling.c" void @@ -107,6 +107,10 @@ update(void) { last_channel_loc = channel_selection_loc; last_pattern_loc = pattern_selection_loc; last_right_col_loc = right_col_selection_loc; + if (update_bpm) { + set_time(patterns[current_pattern].bpm); + update_bpm = false; + } } int diff --git a/src/sequencer.c b/src/sequencer.c index 179e72f..44ee8be 100644 --- a/src/sequencer.c +++ b/src/sequencer.c @@ -17,15 +17,14 @@ bool redraw_bank_buttons = true; bool redraw_params = true; bool redraw_bpm = true; bool redraw_piano_note = true; +bool update_bpm = false; void play_step(void) { if (current_pattern != next_pattern && step_counter == 15) { current_pattern = next_pattern; redraw_pattern_buttons = true; - set_time(patterns[current_pattern].bpm); - play_step(); - return; + update_bpm = true; } Pattern *pat = &patterns[current_pattern]; if (pat->ch1.active) { @@ -90,21 +89,11 @@ play_step(void) { SOUND_WAVE_MODE |= SOUND_WAVE_ENABLE; switch (params->wave_volume) { - case 0: { - SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; - } break; - case 1: { - SOUND_WAVE_CTRL = SOUND_WAVE_VOL_25; - } break; - case 2: { - SOUND_WAVE_CTRL = SOUND_WAVE_VOL_50; - } break; - case 3: { - SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; - } break; - case 4: { - SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; - } break; + case 0: { SOUND_WAVE_CTRL = SOUND_WAVE_MUTE; } break; + case 1: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_25; } break; + case 2: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_50; } break; + case 3: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_75; } break; + case 4: { SOUND_WAVE_CTRL = SOUND_WAVE_VOL_100; } break; } SOUND_WAVE_FREQ = SOUND_FREQ_RESET | sound_rates[trig->note]; @@ -755,30 +744,18 @@ set_param_selection_wave(size_t i, InputHandler return_handler) { u32 *wave_a = &pat->ch3.params[i].wave_a; u32 *wave_b = &pat->ch3.params[i].wave_b; switch (param_selection_loc) { - case 64: { - memcpy32(wave_a, sine_wave, 16); - } break; - case 65: { - memcpy32(wave_a, saw_wave, 16); - } break; - case 66: { - memcpy32(wave_a, square_wave, 16); - } break; + case 64: { memcpy32(wave_a, sine_wave, 16); } break; + case 65: { memcpy32(wave_a, saw_wave, 16); } break; + case 66: { memcpy32(wave_a, square_wave, 16); } break; case 67: { u32 rand_wave[4] = { rng32(), rng32(), rng32(), rng32(), }; memcpy32(wave_a, rand_wave, 16); } break; - case 68: { - memcpy32(wave_b, sine_wave, 16); - } break; - case 69: { - memcpy32(wave_b, saw_wave, 16); - } break; - case 70: { - memcpy32(wave_b, square_wave, 16); - } break; + case 68: { memcpy32(wave_b, sine_wave, 16); } break; + case 69: { memcpy32(wave_b, saw_wave, 16); } break; + case 70: { memcpy32(wave_b, square_wave, 16); } break; case 71: { u32 rand_wave[4] = { rng32(), rng32(), rng32(), rng32(), -- cgit v1.2.1