fix issue with solo-in-place
[ardour.git] / libs / ardour / ardour / panner_shell.h
index 883171055567459f722ec074c8badbfb88ada4f0..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;
@@ -43,39 +45,62 @@ class Speakers;
 class Pannable;
 
 /** Class to manage panning by instantiating and controlling
- *  the appropriate specific PannerBase objects for a given
- *  in/out configuration.
+ *  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);
 
-       bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) const { return true; };
+       bool can_support_io_configuration (const ChanCount& /*in*/, ChanCount& /*out*/) { return true; };
        void configure_io (ChanCount in, ChanCount out);
 
        /// The fundamental Panner function
        void run (BufferSet& src, BufferSet& dest, framepos_t start_frame, framepos_t end_frames, pframes_t nframes);
 
-
-       XMLNode& get_state (void);
-       XMLNode& state (bool full);
+       XMLNode& get_state ();
        int      set_state (const XMLNode&, int version);
 
-       PBD::Signal0<void> Changed; /* panner and/or outputs count changed */
+       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 _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);
 
-        boost::shared_ptr<Panner> panner() const { return _panner; }
-        boost::shared_ptr<Pannable> pannable() const { return _pannable; }
+       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);
-        boost::shared_ptr<Panner> _panner;
-        boost::shared_ptr<Pannable> _pannable;
-     
-       static float current_automation_version_number;
+       bool set_user_selected_panner_uri (std::string const uri);
+
+       boost::shared_ptr<Panner> _panner;
+
+       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