diff --git a/src/forge.c b/src/forge.c index c82b2c8..be6923a 100644 --- a/src/forge.c +++ b/src/forge.c @@ -203,9 +203,8 @@ static void key_callback(Window *window, int key, } static void midi_callback(unsigned char code, float value) { - log_debug("midi: %d %.2f", code, value); - midi_write(midi, code, value); - // TODO treat in state file + state_apply_event(context, state_config, program.frag_count, midi, code, + value); } static void loop(bool hr) { @@ -268,6 +267,10 @@ void forge_run(Parameters params) { if (!midi_background_listen(midi, context, midi_callback)) { return; } + + if (!state_background_midi_write(context, state_config, midi)) { + return; + } } window_startup(error_callback); diff --git a/src/shaders.c b/src/shaders.c index f559797..3fff416 100644 --- a/src/shaders.c +++ b/src/shaders.c @@ -2,7 +2,6 @@ #include #include #include -#include #include "config.h" #include "config_file.h" diff --git a/src/state.c b/src/state.c index 8630ec1..9f835ee 100644 --- a/src/state.c +++ b/src/state.c @@ -1,7 +1,10 @@ -#include "state.h" +#include + #include "config.h" #include "config_file.h" +#include "midi.h" #include "rand.h" +#include "state.h" #include "types.h" StateConfig state_parse_config(ConfigFile config) { @@ -92,6 +95,38 @@ StateConfig state_parse_config(ConfigFile config) { return state_config; } +void state_apply_event(SharedContext *context, StateConfig state_config, + unsigned int state_count, MidiDevice midi, + unsigned char code, float value) { + log_debug("midi: %d %.2f", code, value); + midi_write(midi, code, value); + // TODO +} + +bool state_background_midi_write(SharedContext *context, + StateConfig state_config, MidiDevice midi) { + pid_t pid; + int bytes_read; + unsigned char buffer[3]; + + pid = fork(); + if (pid < 0) { + log_error("Could not create subprocess"); + return false; + } + if (pid == 0) { + return true; + } + log_info("(state) background writing started (pid: %d)", pid); + + while (!context->stop) { + // TODO tap tempo and more + } + + log_info("(state) background writing stopped by main thread (pid: %d)", pid); + return false; +} + void state_randomize(SharedContext *context, StateConfig state_config, unsigned int state_count) { unsigned int i; diff --git a/src/state.h b/src/state.h index f7f4e6d..2c12452 100644 --- a/src/state.h +++ b/src/state.h @@ -5,6 +5,13 @@ StateConfig state_parse_config(ConfigFile config); +void state_apply_event(SharedContext *context, StateConfig state_config, + unsigned int state_count, MidiDevice midi, + unsigned char code, float value); + +bool state_background_midi_write(SharedContext *context, + StateConfig state_config, MidiDevice midi); + void state_randomize(SharedContext *context, StateConfig state_config, unsigned int state_count);