X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=midi_mapper.h;h=84baf1f98d707760051e0142bf35f067b7a2cce0;hb=afe996bc7dfc8689ca356d00824fbfcd632f93a2;hp=5b8b98ec37cfc38bef11e874cbb2c0125e6ffe25;hpb=937b6ab9e4c5d13fe7f7bdcb5a17bf48929f44ce;p=nageru diff --git a/midi_mapper.h b/midi_mapper.h index 5b8b98e..84baf1f 100644 --- a/midi_mapper.h +++ b/midi_mapper.h @@ -11,10 +11,14 @@ #include #include #include +#include #include #include class MIDIMappingProto; +typedef struct snd_seq_addr snd_seq_addr_t; +typedef struct snd_seq_event snd_seq_event_t; +typedef struct _snd_seq snd_seq_t; // Interface for receiving interpreted controller messages. class ControllerReceiver { @@ -43,10 +47,12 @@ public: virtual ~MIDIMapper(); void set_midi_mapping(const MIDIMappingProto &new_mapping); void start_thread(); - const MIDIMappingProto &get_current_mapping() const { return *mapping_proto; } + const MIDIMappingProto &get_current_mapping() const; private: void thread_func(); + void handle_event(snd_seq_t *seq, snd_seq_event_t *event); + void subscribe_to_port(snd_seq_t *seq, const snd_seq_addr_t &addr); void match_controller(int controller, int field_number, int bank_field_number, float value, std::function func); void match_button(int note, int field_number, int bank_field_number, std::function func); bool bank_mismatch(int bank_field_number); @@ -55,9 +61,10 @@ private: std::atomic should_quit{false}; int should_quit_fd; - std::unique_ptr mapping_proto; - int num_controller_banks; - int current_controller_bank = 0; + mutable std::mutex mapping_mu; + std::unique_ptr mapping_proto; // Under . + int num_controller_banks; // Under . + std::atomic current_controller_bank{0}; std::thread midi_thread; };