major redesign of MIDI port heirarchy and management (part 2)
[ardour.git] / libs / surfaces / generic_midi / generic_midi_control_protocol.h
index a86808948f276f02a210b0474cf9471fc51e0a23..a4a51b7f99a5c2114894ee0aff282f15904cfafe 100644 (file)
 #define ardour_generic_midi_control_protocol_h
 
 #include <list>
-#include <glibmm/thread.h>
+#include <glibmm/threads.h>
+
 #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;
@@ -50,13 +53,15 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
        int set_active (bool yn);
        static bool probe() { return true; }
 
-       MIDI::Port* input_port () const { return _input_port; }
-       MIDI::Port* output_port () const { return _output_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<PBD::Controllable> lookup_controllable (const PBD::ControllableDescriptor&) const;
+
        XMLNode& get_state ();
        int set_state (const XMLNode&, int version);
 
@@ -87,9 +92,15 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
                return _motorised;
        }
 
+       void set_threshold (int);
+
+       int threshold () const {
+               return _threshold;
+       }
+
   private:
-       MIDI::Port* _input_port;
-       MIDI::Port* _output_port;
+        MIDI::Port* _input_port;
+        MIDI::Port* _output_port;
        ARDOUR::microseconds_t _feedback_interval;
        ARDOUR::microseconds_t last_feedback_time;
 
@@ -109,8 +120,8 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
        typedef std::pair<MIDIControllable*,PBD::ScopedConnection> MIDIPendingControllable;
        typedef std::list<MIDIPendingControllable* > 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*);
@@ -136,6 +147,7 @@ class GenericMidiControlProtocol : public ARDOUR::ControlProtocol {
            values jumping around when things are not in sync.
        */
        bool _motorised;
+       int _threshold;
 
        mutable void *gui;
        void build_gui ();