X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=shared%2Fmidi_mapper_util.h;h=c9c96bb9516dbd31cf81699b144d19449a0b84eb;hb=d6e55865d7feccfc000c6187e285212fbfb8e9f7;hp=9120fc8719998f97575193e4e739c25aa7f65f58;hpb=f1a8ab7eb34a89a104093c3931b1d51fcb2684e6;p=nageru diff --git a/shared/midi_mapper_util.h b/shared/midi_mapper_util.h index 9120fc8..c9c96bb 100644 --- a/shared/midi_mapper_util.h +++ b/shared/midi_mapper_util.h @@ -7,31 +7,43 @@ #include template -inline bool match_controller_helper(const Proto &msg, int field_number, int controller) +inline int get_controller_mapping_helper(const Proto &msg, int field_number, int default_value) { using namespace google::protobuf; const FieldDescriptor *descriptor = msg.GetDescriptor()->FindFieldByNumber(field_number); const Reflection *reflection = msg.GetReflection(); if (!reflection->HasField(msg, descriptor)) { - return false; + return default_value; } const MIDIControllerProto &controller_proto = static_cast(reflection->GetMessage(msg, descriptor)); - return (controller_proto.controller_number() == controller); + return controller_proto.controller_number(); } template -inline bool match_button_helper(const Proto &msg, int field_number, int note) +inline bool match_controller_helper(const Proto &msg, int field_number, int controller) +{ + return (get_controller_mapping_helper(msg, field_number, -1) == controller); +} + +template +inline int get_button_mapping_helper(const Proto &msg, int field_number, int default_value) { using namespace google::protobuf; const FieldDescriptor *descriptor = msg.GetDescriptor()->FindFieldByNumber(field_number); const Reflection *reflection = msg.GetReflection(); if (!reflection->HasField(msg, descriptor)) { - return false; + return default_value; } const MIDIButtonProto &button_proto = static_cast(reflection->GetMessage(msg, descriptor)); - return (button_proto.note_number() == note); + return button_proto.note_number(); +} + +template +inline bool match_button_helper(const Proto &msg, int field_number, int note) +{ + return (get_button_mapping_helper(msg, field_number, -1) == note); } template @@ -47,18 +59,26 @@ inline bool match_bank_helper(const Proto &msg, int bank_field_number, int bank) return reflection->GetInt32(msg, bank_descriptor) == bank; } -// Find what MIDI note the given light (as given by field_number) is mapped to, and enable it. template -void activate_mapped_light(const Proto &msg, int field_number, std::map *active_lights) +inline MIDILightProto get_light_mapping_helper(const Proto &msg, int field_number) { using namespace google::protobuf; const FieldDescriptor *descriptor = msg.GetDescriptor()->FindFieldByNumber(field_number); const Reflection *reflection = msg.GetReflection(); if (!reflection->HasField(msg, descriptor)) { + return MIDILightProto(); + } + return static_cast(reflection->GetMessage(msg, descriptor)); +} + +// Find what MIDI note the given light (as given by field_number) is mapped to, and enable it. +template +void activate_mapped_light(const Proto &msg, int field_number, std::map *active_lights) +{ + MIDILightProto light_proto = get_light_mapping_helper(msg, field_number); + if (!light_proto.has_note_number()) { return; } - const MIDILightProto &light_proto = - static_cast(reflection->GetMessage(msg, descriptor)); active_lights->emplace(MIDIDevice::LightKey{MIDIDevice::LightKey::NOTE, unsigned(light_proto.note_number())}, light_proto.velocity()); }