fix issue with solo-in-place
[ardour.git] / libs / ardour / ardour / panner_shell.h
index dba5826370dbd65fe3a6a3c9bea6ff4c4e492dae..f344afd54a5569e734b35d592132a0e13d4837c7 100644 (file)
 
 #include "pbd/cartesian.h"
 
+#include "ardour/libardour_visibility.h"
 #include "ardour/types.h"
 #include "ardour/session_object.h"
 
 namespace ARDOUR {
 
 class Session;
+class Route;
 class Panner;
 class BufferSet;
 class AudioBuffer;
@@ -45,10 +47,10 @@ class Pannable;
 /** Class to manage panning by instantiating and controlling
  *  an appropriate Panner object for a given in/out configuration.
  */
-class PannerShell : public SessionObject
+class LIBARDOUR_API PannerShell : public SessionObject
 {
 public:
-       PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>);
+       PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>, bool is_send = false);
        virtual ~PannerShell ();
 
        std::string describe_parameter (Evoral::Parameter param);
@@ -62,19 +64,43 @@ public:
        XMLNode& get_state ();
        int      set_state (const XMLNode&, int version);
 
+       PBD::Signal0<void> PannableChanged; /* Pannable changed -- l*/
        PBD::Signal0<void> Changed; /* panner and/or outputs count and/or bypass state changed */
 
        boost::shared_ptr<Panner> panner() const { return _panner; }
-       boost::shared_ptr<Pannable> pannable() const { return _pannable; }
+       boost::shared_ptr<Pannable> pannable() const { return _panlinked ? _pannable_route : _pannable_internal; }
 
        bool bypassed () const;
        void set_bypassed (bool);
 
+       bool is_send () const { return (_is_send); }
+       bool is_linked_to_route () const { return (_is_send && _panlinked); }
+       /* this function takes the process lock: */
+       void set_linked_to_route (bool);
+
+       std::string current_panner_uri() const { return _current_panner_uri; }
+       std::string user_selected_panner_uri() const { return _user_selected_panner_uri; }
+       std::string panner_gui_uri() const { return _panner_gui_uri; }
+
+       /* this function takes the process lock: */
+       bool select_panner_by_uri (std::string const uri);
+
   private:
        void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff);
+       bool set_user_selected_panner_uri (std::string const uri);
+
        boost::shared_ptr<Panner> _panner;
-       boost::shared_ptr<Pannable> _pannable;
+
+       boost::shared_ptr<Pannable> _pannable_internal;
+       boost::shared_ptr<Pannable> _pannable_route;
+       bool _is_send;
+       bool _panlinked;
        bool _bypassed;
+
+       std::string _current_panner_uri;
+       std::string _user_selected_panner_uri;
+       std::string _panner_gui_uri;
+       bool _force_reselect;
 };
 
 } // namespace ARDOUR