Less weak plugin preset system (maybe AU preset stuff can use the 'normal' thing...
[ardour.git] / libs / ardour / ardour / io.h
index 521efbafb470bbf39d1b4cc960759dccd8db9c62..c5f90bcd90807859284833b1b8afc63451b2aac2 100644 (file)
@@ -42,7 +42,8 @@
 #include <ardour/chan_count.h>
 #include <ardour/latent.h>
 #include <ardour/automation_control.h>
-#include <ardour/user_bundle.h>
+#include <ardour/session_object.h>
+#include <ardour/bundle.h>
 
 using std::string;
 using std::vector;
@@ -53,8 +54,8 @@ namespace ARDOUR {
 
 class Session;
 class AudioEngine;
+class UserBundle;
 class Bundle;
-class AutoBundle;
 class Panner;
 class PeakMeter;
 class Port;
@@ -62,7 +63,6 @@ class AudioPort;
 class MidiPort;
 class BufferSet;
 
-
 /** A collection of input and output ports with connections.
  *
  * An IO can contain ports of varying types, making routes/inserts/etc with
@@ -77,8 +77,7 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        IO (Session&, const string& name, 
            int input_min = -1, int input_max = -1, 
            int output_min = -1, int output_max = -1,
-           DataType default_type = DataType::AUDIO,
-           bool public_ports = true);
+           DataType default_type = DataType::AUDIO);
        
        IO (Session&, const XMLNode&, DataType default_type = DataType::AUDIO);
        
@@ -110,6 +109,8 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        void just_meter_input (nframes_t start_frame, nframes_t end_frame, 
                               nframes_t nframes, nframes_t offset);
 
+       BufferSet& output_buffers() { return *_output_buffers; }
+
        gain_t         gain () const { return _desired_gain; }
        virtual gain_t effective_gain () const;
        
@@ -122,17 +123,20 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        Panner& panner()        { return *_panner; }
        PeakMeter& peak_meter() { return *_meter; }
        const Panner& panner() const { return *_panner; }
+       void reset_panner ();
        
        int ensure_io (ChanCount in, ChanCount out, bool clear, void *src);
 
-       int connect_input_ports_to_bundle (boost::shared_ptr<Bundle>, void *src);
-       int connect_output_ports_to_bundle (boost::shared_ptr<Bundle>, void *src);
+       int connect_input_ports_to_bundle (boost::shared_ptr<Bundle>, void *);
+       int disconnect_input_ports_from_bundle (boost::shared_ptr<Bundle>, void *);
+       int connect_output_ports_to_bundle (boost::shared_ptr<Bundle>, void *);
+       int disconnect_output_ports_from_bundle (boost::shared_ptr<Bundle>, void *);
 
-       std::vector<boost::shared_ptr<Bundle> > bundles_connected_to_inputs ();
-       std::vector<boost::shared_ptr<Bundle> > bundles_connected_to_outputs ();
+       BundleList bundles_connected_to_inputs ();
+       BundleList bundles_connected_to_outputs ();
 
-        boost::shared_ptr<AutoBundle> bundle_for_inputs () { return _bundle_for_inputs; }
-        boost::shared_ptr<AutoBundle> bundle_for_outputs () { return _bundle_for_outputs; }
+        boost::shared_ptr<Bundle> bundle_for_inputs () { return _bundle_for_inputs; }
+        boost::shared_ptr<Bundle> bundle_for_outputs () { return _bundle_for_outputs; }
        
        int add_input_port (string source, void *src, DataType type = DataType::NIL);
        int add_output_port (string destination, void *src, DataType type = DataType::NIL);
@@ -197,15 +201,10 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        int set_state (const XMLNode&);
 
        static int  disable_connecting (void);
-
        static int  enable_connecting (void);
-
        static int  disable_ports (void);
-
        static int  enable_ports (void);
-
        static int  disable_panners (void);
-
        static int  reset_panners (void);
        
        static sigc::signal<int>            PortsLegal;
@@ -215,28 +214,29 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        static sigc::signal<void,ChanCount> PortCountChanged;
        static sigc::signal<int>            PortsCreated;
 
-    static void update_meters();
+       static void update_meters();
 
   private: 
-
-    static sigc::signal<void>   Meter;
-    static Glib::StaticMutex    m_meter_signal_lock;
-    sigc::connection            m_meter_connection;
+       
+       static sigc::signal<void>   Meter;
+       static Glib::StaticMutex    m_meter_signal_lock;
+       sigc::connection            m_meter_connection;
 
   public:
-
+    
        /* automation */
 
        struct GainControl : public AutomationControl {
-           GainControl (std::string name, IO& i, boost::shared_ptr<AutomationList> al)
-                       : AutomationControl (i._session, al->parameter(), al, name)
+           GainControl (std::string name, IO* i, const Evoral::Parameter &param,
+                   boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>() )
+                       : AutomationControl (i->_session, param, al, name )
                        , _io (i)
                {}
         
            void set_value (float val);
            float get_value (void) const;
    
-           IO& _io;
+           IO* _io;
        };
 
        boost::shared_ptr<GainControl> gain_control() {
@@ -248,7 +248,7 @@ class IO : public SessionObject, public AutomatableControls, public Latent
 
        void clear_automation ();
        
-       void set_parameter_automation_state (Parameter, AutoState);
+       void set_parameter_automation_state (Evoral::Parameter, AutoState);
 
        virtual void transport_stopped (nframes_t now);
        virtual void automation_snapshot (nframes_t now, bool force);
@@ -285,14 +285,12 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        bool                _denormal_protection;
        XMLNode*             deferred_state;
        DataType            _default_type;
-       bool                _public_ports;
 
        virtual void prepare_inputs (nframes_t nframes, nframes_t offset);
+       virtual void flush_outputs (nframes_t nframes, nframes_t offset);
 
        virtual void set_deferred_state() {}
 
-       void reset_panner ();
-
        virtual uint32_t pans_required() const
                { return _inputs.count().n_audio(); }
 
@@ -313,14 +311,11 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        static bool connecting_legal;
        static bool ports_legal;
 
-       BufferSet& output_buffers() { return *_output_buffers; }
-
   private:
+       static bool panners_legal;
 
-       friend class Send;
+       void copy_to_outputs (BufferSet& bufs, DataType type, nframes_t nframes, nframes_t offset);
 
-       static bool panners_legal;
-       
        int connecting_became_legal ();
        int panners_became_legal ();
        sigc::connection connection_legal_c;
@@ -332,17 +327,14 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        ChanCount _output_minimum; ///< minimum number of output channels (0 for no minimum)
        ChanCount _output_maximum; ///< maximum number of output channels (ChanCount::INFINITE for no maximum)
 
-       boost::shared_ptr<AutoBundle> _bundle_for_inputs; ///< a bundle representing our inputs
-       boost::shared_ptr<AutoBundle> _bundle_for_outputs; ///< a bundle representing our outputs
+       boost::shared_ptr<Bundle> _bundle_for_inputs; ///< a bundle representing our inputs
+       boost::shared_ptr<Bundle> _bundle_for_outputs; ///< a bundle representing our outputs
 
        struct UserBundleInfo {
                UserBundleInfo (IO*, boost::shared_ptr<UserBundle> b);
                
                boost::shared_ptr<UserBundle> bundle;
-               sigc::connection configuration_will_change;
-               sigc::connection configuration_has_changed;
-               sigc::connection ports_will_change;
-               sigc::connection ports_have_changed;
+               sigc::connection changed;
        };
        
        std::vector<UserBundleInfo> _bundles_connected_to_outputs; ///< user bundles connected to our outputs
@@ -362,10 +354,7 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        void check_bundles_connected_to_outputs ();
        void check_bundles (std::vector<UserBundleInfo>&, const PortSet&);
 
-       void bundle_configuration_will_change ();
-       void bundle_configuration_has_changed ();
-       void bundle_ports_will_change (int);
-       void bundle_ports_have_changed (int);
+       void bundle_changed (Bundle::Change);
 
        int create_ports (const XMLNode&);
        int make_connections (const XMLNode&);
@@ -381,11 +370,10 @@ class IO : public SessionObject, public AutomatableControls, public Latent
        int32_t find_input_port_hole (const char* base);
        int32_t find_output_port_hole (const char* base);
 
-       void create_bundles_for_inputs_and_outputs ();
        void setup_bundles_for_inputs_and_outputs ();
-
-       void maybe_add_input_bundle_to_list (boost::shared_ptr<Bundle>, std::vector<boost::shared_ptr<Bundle> >*);
-       void maybe_add_output_bundle_to_list (boost::shared_ptr<Bundle>, std::vector<boost::shared_ptr<Bundle> >*);
+       void setup_bundle_for_inputs ();
+       void setup_bundle_for_outputs ();
+       std::string bundle_channel_name (uint32_t, uint32_t) const;
 };
 
 } // namespace ARDOUR