summaryrefslogtreecommitdiff
path: root/libs/surfaces
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2017-01-23 13:25:56 +0100
committerPaul Davis <paul@linuxaudiosystems.com>2017-01-23 13:25:56 +0100
commit93f837b43eb146f43b278a242acb66d64457c941 (patch)
tree697f71a47e8dc1e61bbcf324a371bd7998d390f7 /libs/surfaces
parent93192705bddab9392544d44278d63e4b83c68af2 (diff)
generic MIDI: put controllables into touch mode (if appropriate) when data is received
Diffstat (limited to 'libs/surfaces')
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.cc12
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.h2
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.cc11
-rw-r--r--libs/surfaces/generic_midi/midicontrollable.h3
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<AutomationControl*> (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<PBD::Controllable> 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__