Merged with trunk (painfully)
[ardour.git] / libs / ardour / ardour / route.h
index 8f4028c99fd0b33a1612b1d13170e8a853f6eb0e..5699d9ef14a89bca6ed16d6052c4ca219a0f96c7 100644 (file)
 #include <map>
 #include <string>
 
-#include <pthread.h>
-
-#include <pbd/atomic.h>
 #include <pbd/fastlog.h>
-#include <pbd/lockmonitor.h>
+#include <glibmm/thread.h>
 #include <pbd/xml++.h>
 #include <pbd/undo.h>
 #include <midi++/controllable.h>
@@ -57,9 +54,9 @@ enum mute_type {
 
 class Route : public IO
 {
-  private:
-       typedef list<Redirect *> RedirectList;
+  protected:
 
+        typedef list<Redirect *> RedirectList;
   public:
 
        enum Flag {
@@ -127,9 +124,11 @@ class Route : public IO
        bool phase_invert() const { return _phase_invert; }
        
        void       set_edit_group (RouteGroup *, void *);
+       void       drop_edit_group (void *);
        RouteGroup *edit_group () { return _edit_group; }
 
        void       set_mix_group (RouteGroup *, void *);
+       void       drop_mix_group (void *);
        RouteGroup *mix_group () { return _mix_group; }
 
        virtual void  set_meter_point (MeterPoint, void *src);
@@ -140,14 +139,14 @@ class Route : public IO
        void flush_redirects ();
 
        template<class T> void foreach_redirect (T *obj, void (T::*func)(Redirect *)) {
-               LockMonitor lm (redirect_lock, __LINE__, __FILE__);
+               Glib::RWLock::ReaderLock lm (redirect_lock);
                for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
                        (obj->*func) (*i);
                }
        }
 
        Redirect *nth_redirect (uint32_t n) {
-               LockMonitor lm (redirect_lock, __LINE__, __FILE__);
+               Glib::RWLock::ReaderLock lm (redirect_lock);
                RedirectList::iterator i;
                for (i = _redirects.begin(); i != _redirects.end() && n; ++i, --n);
                if (i == _redirects.end()) {
@@ -198,7 +197,7 @@ class Route : public IO
 
        XMLNode& get_state();
        int set_state(const XMLNode& node);
-       XMLNode& get_template();
+       virtual XMLNode& get_template();
 
        sigc::signal<void,void*> SelectedChanged;
 
@@ -245,6 +244,10 @@ class Route : public IO
 
        void protect_automation ();
        
+       void set_remote_control_id (uint32_t id);
+       uint32_t remote_control_id () const;
+       sigc::signal<void> RemoteControlIDChanged;
+
   protected:
        friend class Session;
 
@@ -288,9 +291,9 @@ class Route : public IO
        jack_nframes_t           _roll_delay;
        jack_nframes_t           _own_latency;
        RedirectList             _redirects;
-       PBD::NonBlockingLock      redirect_lock;
+       Glib::RWLock      redirect_lock;
        IO                      *_control_outs;
-       PBD::NonBlockingLock      control_outs_lock;
+       Glib::Mutex      control_outs_lock;
        RouteGroup              *_edit_group;
        RouteGroup              *_mix_group;
        std::string              _comment;
@@ -317,6 +320,7 @@ class Route : public IO
 
        state_id_t _current_state_id;
        uint32_t redirect_max_outs;
+       uint32_t _remote_control_id;
 
        uint32_t pans_required() const;
        uint32_t n_process_buffers ();