auditioner always runs at normal speed, independent of transport speed
[ardour.git] / gtk2_ardour / processor_box.h
index 663f82b53ca052b27b0048de9f61111b3feed808..cb13f42b436b0a3504b76e703db598e6a2d045f4 100644 (file)
 #include <gtkmm/menu.h>
 #include <gtkmm/scrolledwindow.h>
 
-#include "gtkmm2ext/auto_spin.h"
 #include "gtkmm2ext/bindings.h"
-#include "gtkmm2ext/click_box.h"
 #include "gtkmm2ext/dndtreeview.h"
 #include "gtkmm2ext/dndvbox.h"
-#include "gtkmm2ext/pixfader.h"
 #include "gtkmm2ext/persistent_tooltip.h"
 
 #include "pbd/stateful.h"
 
 #include "pbd/fastlog.h"
 
+#include "widgets/ardour_button.h"
+#include "widgets/ardour_fader.h"
+#include "widgets/slider_controller.h"
+
 #include "plugin_interest.h"
+#include "plugin_display.h"
 #include "io_selector.h"
 #include "send_ui.h"
 #include "enums.h"
-#include "ardour_button.h"
 #include "window_manager.h"
 
 class MotionController;
 class PluginSelector;
 class PluginUIWindow;
-class RouteProcessorSelection;
+class ProcessorSelection;
 class MixerStrip;
 
 namespace ARDOUR {
@@ -80,7 +81,7 @@ class ProcessorBox;
 
 class ProcessorWindowProxy : public WM::ProxyBase
 {
-  public:
+public:
        ProcessorWindowProxy (std::string const &, ProcessorBox *, boost::weak_ptr<ARDOUR::Processor>);
        ~ProcessorWindowProxy();
 
@@ -91,13 +92,13 @@ class ProcessorWindowProxy : public WM::ProxyBase
        }
 
        ARDOUR::SessionHandlePtr* session_handle();
-       void show_the_right_window ();
+       void show_the_right_window (bool show_not_toggle = false);
        void set_custom_ui_mode(bool use_custom) { want_custom = use_custom; }
 
        int set_state (const XMLNode&, int);
        XMLNode& get_state ();
 
-  private:
+private:
        ProcessorBox* _processor_box;
        boost::weak_ptr<ARDOUR::Processor> _processor;
        bool is_custom;
@@ -105,6 +106,7 @@ class ProcessorWindowProxy : public WM::ProxyBase
 
        void processor_going_away ();
        PBD::ScopedConnection going_away_connection;
+       PBD::ScopedConnectionList gui_connections;
 };
 
 
@@ -158,6 +160,7 @@ public:
        /** Hide any widgets that should be hidden */
        virtual void hide_things ();
 
+       void toggle_inline_display_visibility ();
        void show_all_controls ();
        void hide_all_controls ();
        void add_control_state (XMLNode *) const;
@@ -167,7 +170,7 @@ public:
        Gtk::Menu* build_send_options_menu ();
 
 protected:
-       ArdourButton _button;
+       ArdourWidgets::ArdourButton _button;
        Gtk::VBox _vbox;
        Position _position;
        uint32_t _position_num;
@@ -217,51 +220,50 @@ private:
                void button_clicked ();
                void button_clicked_event (GdkEventButton *);
                void control_changed ();
+               void control_automation_state_changed ();
                std::string state_id () const;
                void set_tooltip ();
 
+               void start_touch ();
+               void end_touch ();
+
                boost::weak_ptr<ARDOUR::AutomationControl> _control;
                /* things for a slider */
                Gtk::Adjustment _adjustment;
-               Gtkmm2ext::HSliderController _slider;
+               ArdourWidgets::HSliderController _slider;
                Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
                /* things for a button */
-               ArdourButton _button;
+               ArdourWidgets::ArdourButton _button;
                bool _ignore_ui_adjustment;
-               PBD::ScopedConnection _connection;
+               PBD::ScopedConnectionList _connections;
                bool _visible;
                std::string _name;
-               sigc::connection timer_connection;
        };
 
        std::list<Control*> _controls;
 
-       void toggle_inline_display_visibility ();
        void toggle_control_visibility (Control *);
        void toggle_panner_link ();
+       void toggle_allow_feedback ();
 
-       class PluginDisplay : public Gtk::DrawingArea {
+       class PluginInlineDisplay : public PluginDisplay {
        public:
-               PluginDisplay(boost::shared_ptr<ARDOUR::Plugin>, uint32_t max_height = 80);
-               ~PluginDisplay();
+               PluginInlineDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::Plugin>, uint32_t max_height = 80);
+               ~PluginInlineDisplay() {}
        protected:
-               bool on_expose_event (GdkEventExpose *);
                void on_size_request (Gtk::Requisition* req);
-
+               bool on_button_press_event (GdkEventButton *ev);
                void update_height_alloc (uint32_t inline_height);
-               virtual uint32_t render_inline (cairo_t *, uint32_t width);
 
-               boost::shared_ptr<ARDOUR::Plugin> _plug;
-               PBD::ScopedConnection _qdraw_connection;
-               cairo_surface_t* _surf;
-               uint32_t _max_height;
-               uint32_t _cur_height;
+               void display_frame (cairo_t* cr, double w, double h);
+
+               ProcessorEntry& _entry;
                bool _scroll;
        };
 
-       class LuaPluginDisplay : public PluginDisplay {
+       class LuaPluginDisplay : public PluginInlineDisplay {
        public:
-               LuaPluginDisplay(boost::shared_ptr<ARDOUR::LuaProc>, uint32_t max_height = 80);
+               LuaPluginDisplay(ProcessorEntry&, boost::shared_ptr<ARDOUR::LuaProc>, uint32_t max_height = 80);
                ~LuaPluginDisplay();
        protected:
                virtual uint32_t render_inline (cairo_t *, uint32_t width);
@@ -283,29 +285,67 @@ private:
 
        class RoutingIcon : public Gtk::DrawingArea {
        public:
-               RoutingIcon();
+               RoutingIcon(bool inputrouting = true);
                void set (
                                const ARDOUR::ChanCount&,
                                const ARDOUR::ChanCount&,
                                const ARDOUR::ChanCount&,
                                const ARDOUR::ChanCount&,
                                const ARDOUR::ChanMapping&,
+                               const ARDOUR::ChanMapping&,
                                const ARDOUR::ChanMapping&);
-               void set_feed (
+               void set_fed_by (
                                const ARDOUR::ChanCount&,
                                const ARDOUR::ChanCount&,
+                               const ARDOUR::ChanMapping&,
                                const ARDOUR::ChanMapping&);
-               void unset_feed () { _feed  = false ; }
-               bool identity () const;
+
+               void set_feeding (
+                               const ARDOUR::ChanCount&,
+                               const ARDOUR::ChanCount&,
+                               const ARDOUR::ChanMapping&,
+                               const ARDOUR::ChanMapping&);
+
+               void set_terminal (bool b);
+
+               void copy_state (const RoutingIcon& other) {
+                       _in         = other._in;
+                       _out        = other._out;
+                       _sources    = other._sources;
+                       _sinks      = other._sinks;
+                       _in_map     = other._in_map;
+                       _out_map    = other._out_map;
+                       _thru_map   = other._thru_map;
+                       _f_out      = other._f_out;
+                       _f_out_map  = other._f_out_map;
+                       _f_thru_map = other._f_thru_map;
+                       _f_sources  = other._f_sources;
+                       _i_in       = other._i_in;
+                       _i_in_map   = other._i_in_map;
+                       _i_thru_map = other._i_thru_map;
+                       _i_sinks    = other._i_sinks;
+                       _fed_by     = other._fed_by;
+                       _feeding    = other._feeding;
+               }
+
+               void unset_fed_by () { _fed_by  = false ; }
+               void unset_feeding () { _feeding  = false ; }
+               bool in_identity () const;
+               bool out_identity () const;
+               bool can_coalesce () const;
 
                static double pin_x_pos (uint32_t, double, uint32_t, uint32_t, bool);
                static void draw_connection (cairo_t*, double, double, double, double, bool, bool dashed = false);
-               static void draw_gnd (cairo_t*, double, double, bool);
-               static void draw_sidechain (cairo_t*, double, double, bool);
+               static void draw_gnd (cairo_t*, double, double, double, bool);
+               static void draw_sidechain (cairo_t*, double, double, double, bool);
+               static void draw_thru_src (cairo_t*, double, double, double, bool);
+               static void draw_thru_sink (cairo_t*, double, double, double, bool);
 
        private:
                bool on_expose_event (GdkEventExpose *);
-               void expose_map (cairo_t*, const double, const double);
+               void expose_input_map (cairo_t*, const double, const double);
+               void expose_coalesced_input_map (cairo_t*, const double, const double);
+               void expose_output_map (cairo_t*, const double, const double);
 
                ARDOUR::ChanCount   _in;
                ARDOUR::ChanCount   _out;
@@ -313,16 +353,26 @@ private:
                ARDOUR::ChanCount   _sinks;
                ARDOUR::ChanMapping _in_map;
                ARDOUR::ChanMapping _out_map;
+               ARDOUR::ChanMapping _thru_map;
                ARDOUR::ChanCount   _f_out;
                ARDOUR::ChanMapping _f_out_map;
+               ARDOUR::ChanMapping _f_thru_map;
                ARDOUR::ChanCount   _f_sources;
-               bool _feed;
+               ARDOUR::ChanCount   _i_in;
+               ARDOUR::ChanMapping _i_in_map;
+               ARDOUR::ChanMapping _i_thru_map;
+               ARDOUR::ChanCount   _i_sinks;
+               bool _fed_by;
+               bool _feeding;
+               bool _input;
+               bool _terminal;
        };
 
 public:
-       RoutingIcon routing_icon;
        PortIcon input_icon;
        PortIcon output_icon;
+       RoutingIcon routing_icon; // sits on top of every processor (input routing)
+       RoutingIcon output_routing_icon; // only used by last processor in the chain
 
 protected:
        PluginDisplay *_plugin_display ;
@@ -344,7 +394,7 @@ private:
 
 class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARDOUR::SessionHandlePtr
 {
-  public:
+public:
        enum ProcessorOperation {
                ProcessorsCut,
                ProcessorsCopy,
@@ -357,7 +407,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        };
 
        ProcessorBox (ARDOUR::Session*, boost::function<PluginSelector*()> get_plugin_selector,
-                     RouteProcessorSelection&, MixerStrip* parent, bool owner_is_mixer = false);
+                     ProcessorSelection&, MixerStrip* parent, bool owner_is_mixer = false);
        ~ProcessorBox ();
 
        void set_route (boost::shared_ptr<ARDOUR::Route>);
@@ -378,16 +428,16 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 
        bool edit_aux_send(boost::shared_ptr<ARDOUR::Processor>);
 
-        /* Everything except a WindowProxy object should use this to get the window */
+       /* Everything except a WindowProxy object should use this to get the window */
        Gtk::Window* get_processor_ui (boost::shared_ptr<ARDOUR::Processor>) const;
 
-        /* a WindowProxy object can use this */
-        Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>, bool);
-        Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>);
+       /* a WindowProxy object can use this */
+       Gtk::Window* get_editor_window (boost::shared_ptr<ARDOUR::Processor>, bool);
+       Gtk::Window* get_generic_editor_window (boost::shared_ptr<ARDOUR::Processor>);
 
-        void manage_pins (boost::shared_ptr<ARDOUR::Processor>);
-        void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
-        void generic_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
+       void manage_pins (boost::shared_ptr<ARDOUR::Processor>);
+       void edit_processor (boost::shared_ptr<ARDOUR::Processor>);
+       void generic_edit_processor (boost::shared_ptr<ARDOUR::Processor>);
 
        void update_gui_object_state (ProcessorEntry *);
 
@@ -398,11 +448,22 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        static Gtkmm2ext::Bindings* bindings;
        static void register_actions();
 
+       typedef std::vector<boost::shared_ptr<ARDOUR::Processor> > ProcSelection;
+
+       static ProcSelection current_processor_selection ()
+       {
+               ProcSelection ps;
+               if (_current_processor_box) {
+                       _current_processor_box->get_selected_processors (ps);
+               }
+               return ps;
+       }
+
 #ifndef NDEBUG
        static bool show_all_processors;
 #endif
 
-  private:
+private:
        /* prevent copy construction */
        ProcessorBox (ProcessorBox const &);
 
@@ -421,16 +482,15 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
         *  put at the end of the plugin list.
         */
        int _placement;
-       uint32_t                  _visible_prefader_processors;
 
-       RouteProcessorSelection& _rr_selection;
+       ProcessorSelection& _p_selection;
        static Gtkmm2ext::ActionMap myactions;
 
        static void load_bindings ();
 
        void route_going_away ();
 
-        bool is_editor_mixer_strip() const;
+       bool is_editor_mixer_strip() const;
 
        Gtkmm2ext::DnDVBox<ProcessorEntry> processor_display;
        Gtk::ScrolledWindow    processor_scroller;
@@ -444,7 +504,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void object_drop (Gtkmm2ext::DnDVBox<ProcessorEntry> *, ProcessorEntry *, Glib::RefPtr<Gdk::DragContext> const &);
 
        Width _width;
-        bool  _redisplay_pending;
+       bool  _redisplay_pending;
 
        Gtk::Menu *processor_menu;
        gint processor_menu_map_handler (GdkEventAny *ev);
@@ -458,7 +518,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void return_io_finished (IOSelector::Result, boost::weak_ptr<ARDOUR::Processor>, IOSelectorWindow*);
        void choose_insert ();
        void choose_plugin ();
-       bool choose_lua ();
        bool use_plugins (const SelectedPlugins&);
 
        bool no_processor_redisplay;
@@ -469,7 +528,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        bool processor_button_release_event (GdkEventButton *, ProcessorEntry *);
        void redisplay_processors ();
        void add_processor_to_display (boost::weak_ptr<ARDOUR::Processor>);
-       void help_count_visible_prefader_processors (boost::weak_ptr<ARDOUR::Processor>, uint32_t*, bool*);
        void reordered ();
        void report_failed_reorder ();
        void route_processors_changed (ARDOUR::RouteProcessorChange);
@@ -480,8 +538,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
 
        void ab_plugins ();
 
-       typedef std::vector<boost::shared_ptr<ARDOUR::Processor> > ProcSelection;
-
        void cut_processors (const ProcSelection&);
        void copy_processors (const ProcSelection&);
        void delete_processors (const ProcSelection&);
@@ -496,6 +552,8 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        void for_selected_processors (void (ProcessorBox::*pmf)(boost::shared_ptr<ARDOUR::Processor>));
        void get_selected_processors (ProcSelection&) const;
 
+       void set_disk_io_position (ARDOUR::DiskIOPoint);
+
        bool can_cut() const;
        bool stub_processor_selected() const;
 
@@ -504,7 +562,9 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        static Glib::RefPtr<Gtk::Action> paste_action;
        static Glib::RefPtr<Gtk::Action> rename_action;
        static Glib::RefPtr<Gtk::Action> delete_action;
+       static Glib::RefPtr<Gtk::Action> backspace_action;
        static Glib::RefPtr<Gtk::Action> manage_pins_action;
+       static Glib::RefPtr<Gtk::Action> disk_io_action;
        static Glib::RefPtr<Gtk::Action> edit_action;
        static Glib::RefPtr<Gtk::Action> edit_generic_action;
        void paste_processor_state (const XMLNodeList&, boost::shared_ptr<ARDOUR::Processor>);
@@ -523,7 +583,6 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        static void rb_choose_aux (boost::weak_ptr<ARDOUR::Route>);
        static void rb_choose_plugin ();
        static void rb_choose_insert ();
-       static void rb_choose_lua ();
        static void rb_choose_send ();
        static void rb_clear ();
        static void rb_clear_pre ();
@@ -539,16 +598,17 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
        static void rb_deactivate_all ();
        static void rb_ab_plugins ();
        static void rb_manage_pins ();
+       static void rb_set_disk_io_position (ARDOUR::DiskIOPoint);
        static void rb_edit ();
        static void rb_edit_generic ();
 
        void route_property_changed (const PBD::PropertyChange&);
        std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
 
-        //typedef std::list<ProcessorWindowProxy*> ProcessorWindowProxies;
-        //ProcessorWindowProxies _processor_window_info;
+       //typedef std::list<ProcessorWindowProxy*> ProcessorWindowProxies;
+       //ProcessorWindowProxies _processor_window_info;
 
-        ProcessorWindowProxy* find_window_proxy (boost::shared_ptr<ARDOUR::Processor>) const;
+       ProcessorWindowProxy* find_window_proxy (boost::shared_ptr<ARDOUR::Processor>) const;
 
        void set_processor_ui (boost::shared_ptr<ARDOUR::Processor>, Gtk::Window *);
        void maybe_add_processor_to_ui_list (boost::weak_ptr<ARDOUR::Processor>);