X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fgeneric_midi%2Fgeneric_midi_control_protocol.h;h=a4a51b7f99a5c2114894ee0aff282f15904cfafe;hb=1ab61b8564f9934c533d1c1a229888bc7e2fd557;hp=e0867fad7808916a5389988234c17c0d9b905c3d;hpb=a48742043be3ecc3d0522ae48ff4401665d7e83f;p=ardour.git diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.h b/libs/surfaces/generic_midi/generic_midi_control_protocol.h index e0867fad78..a4a51b7f99 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.h +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.h @@ -21,25 +21,29 @@ #define ardour_generic_midi_control_protocol_h #include -#include +#include + #include "ardour/types.h" #include "control_protocol/control_protocol.h" -namespace MIDI { - class Port; -} - namespace PBD { class Controllable; + class ControllableDescriptor; } namespace ARDOUR { class Session; + class MidiPort; +} + +namespace MIDI { + class Port; } class MIDIControllable; class MIDIFunction; +class MIDIAction; class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { public: @@ -49,12 +53,15 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { int set_active (bool yn); static bool probe() { return true; } - MIDI::Port* port () const { return _port; } + MIDI::Port* input_port () const { return _input_port; } + MIDI::Port* output_port () const { return _output_port; } void set_feedback_interval (ARDOUR::microseconds_t); int set_feedback (bool yn); bool get_feedback () const; + boost::shared_ptr lookup_controllable (const PBD::ControllableDescriptor&) const; + XMLNode& get_state (); int set_state (const XMLNode&, int version); @@ -79,8 +86,21 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { void next_bank (); void prev_bank (); + void set_motorised (bool); + + bool motorised () const { + return _motorised; + } + + void set_threshold (int); + + int threshold () const { + return _threshold; + } + private: - MIDI::Port* _port; + MIDI::Port* _input_port; + MIDI::Port* _output_port; ARDOUR::microseconds_t _feedback_interval; ARDOUR::microseconds_t last_feedback_time; @@ -94,11 +114,14 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { typedef std::list MIDIFunctions; MIDIFunctions functions; + typedef std::list MIDIActions; + MIDIActions actions; + typedef std::pair MIDIPendingControllable; typedef std::list MIDIPendingControllables; MIDIPendingControllables pending_controllables; - Glib::Mutex controllables_lock; - Glib::Mutex pending_lock; + Glib::Threads::Mutex controllables_lock; + Glib::Threads::Mutex pending_lock; bool start_learning (PBD::Controllable*); void stop_learning (PBD::Controllable*); @@ -110,6 +133,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { MIDIControllable* create_binding (const XMLNode&); MIDIFunction* create_function (const XMLNode&); + MIDIAction* create_action (const XMLNode&); void reset_controllables (); void drop_all (); @@ -117,6 +141,13 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol { std::string _current_binding; uint32_t _bank_size; uint32_t _current_bank; + /** true if this surface is motorised. If it is, we assume + that the surface's controls are never out of sync with + Ardour's state, so we don't have to take steps to avoid + values jumping around when things are not in sync. + */ + bool _motorised; + int _threshold; mutable void *gui; void build_gui ();