From 93f837b43eb146f43b278a242acb66d64457c941 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 23 Jan 2017 13:25:56 +0100 Subject: generic MIDI: put controllables into touch mode (if appropriate) when data is received --- libs/surfaces/generic_midi/generic_midi_control_protocol.cc | 12 ++++++++++++ libs/surfaces/generic_midi/generic_midi_control_protocol.h | 2 ++ libs/surfaces/generic_midi/midicontrollable.cc | 11 ++++++++--- libs/surfaces/generic_midi/midicontrollable.h | 3 +-- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 78e6dd789d..9e9074c4c2 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -1258,3 +1258,15 @@ GenericMidiControlProtocol::input_port() const { return _input_port; } + +void +GenericMidiControlProtocol::maybe_start_touch (Controllable* controllable) +{ + AutomationControl *actl = dynamic_cast (controllable); + if (actl) { + if (actl->automation_state() == Touch && !actl->touching()) { + actl->start_touch (session->audible_frame ()); + } + } +} + diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index ac5b8bdb8f..291262c820 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -67,6 +67,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { boost::shared_ptr lookup_controllable (const ARDOUR::ControllableDescriptor&) const; + void maybe_start_touch (PBD::Controllable*); + XMLNode& get_state (); int set_state (const XMLNode&, int version); diff --git a/libs/surfaces/generic_midi/midicontrollable.cc b/libs/surfaces/generic_midi/midicontrollable.cc index bed85f49b4..bf163f9615 100644 --- a/libs/surfaces/generic_midi/midicontrollable.cc +++ b/libs/surfaces/generic_midi/midicontrollable.cc @@ -280,6 +280,8 @@ MIDIControllable::midi_sense_note (Parser &, EventTwoBytes *msg, bool /*is_on*/) } } + _surface->maybe_start_touch (controllable); + if (!controllable->is_toggle()) { if (control_additional == msg->note_number) { controllable->set_value (midi_to_control (msg->velocity), Controllable::NoGroup); @@ -307,9 +309,7 @@ MIDIControllable::midi_sense_controller (Parser &, EventTwoBytes *msg) assert (controllable); - if (controllable->touching()) { - return; // to prevent feedback fights when e.g. dragging a UI slider - } + _surface->maybe_start_touch (controllable); if (control_additional == msg->controller_number) { @@ -411,6 +411,9 @@ MIDIControllable::midi_sense_program_change (Parser &, MIDI::byte msg) return; } } + + _surface->maybe_start_touch (controllable); + if (msg == control_additional) { if (!controllable->is_toggle()) { @@ -435,6 +438,8 @@ MIDIControllable::midi_sense_pitchbend (Parser &, pitchbend_t pb) } } + _surface->maybe_start_touch (controllable); + if (!controllable->is_toggle()) { controllable->set_value (midi_to_control (pb), Controllable::NoGroup); DEBUG_TRACE (DEBUG::GenericMidi, string_compose ("MIDI pitchbend %1 value %2 %3\n", (int) control_channel, (float) midi_to_control (pb), current_uri() )); diff --git a/libs/surfaces/generic_midi/midicontrollable.h b/libs/surfaces/generic_midi/midicontrollable.h index d07924b936..c88b0b6441 100644 --- a/libs/surfaces/generic_midi/midicontrollable.h +++ b/libs/surfaces/generic_midi/midicontrollable.h @@ -138,7 +138,7 @@ class MIDIControllable : public PBD::Stateful std::string _what; bool _bank_relative; - void drop_controllable (PBD::Controllable*); + void drop_controllable (PBD::Controllable*); void midi_receiver (MIDI::Parser &p, MIDI::byte *, size_t); void midi_sense_note (MIDI::Parser &, MIDI::EventTwoBytes *, bool is_on); @@ -152,7 +152,6 @@ class MIDIControllable : public PBD::Stateful void rpn_value_change (MIDI::Parser&, uint16_t nrpn, float val); void rpn_change (MIDI::Parser&, uint16_t nrpn, int direction); void nrpn_change (MIDI::Parser&, uint16_t nrpn, int direction); - }; #endif // __gm_midicontrollable_h__ -- cgit v1.2.3