Some improvements to performance with crossfades: don't recompute a whole track's...
[ardour.git] / libs / ardour / panner.cc
index 23c87f0a2e84f33e88214ee80eb1a7901a7e20c8..f43741300a6d7df8f846a22b07697ae295d55d60 100644 (file)
@@ -465,7 +465,7 @@ EqualPowerStereoPanner::get_state (void)
 }
 
 XMLNode&
-EqualPowerStereoPanner::state (bool full_state)
+EqualPowerStereoPanner::state (bool /*full_state*/)
 {
        XMLNode* root = new XMLNode ("StreamPanner");
        char buf[64];
@@ -623,9 +623,9 @@ Multi2dPanner::distribute (AudioBuffer& srcbuf, BufferSet& obufs, gain_t gain_co
 }
 
 void
-Multi2dPanner::distribute_automated (AudioBuffer& src, BufferSet& obufs
-                                    nframes_t start, nframes_t end, nframes_t nframes,
-                                    pan_t** buffers)
+Multi2dPanner::distribute_automated (AudioBuffer& /*src*/, BufferSet& /*obufs*/
+                                    nframes_t /*start*/, nframes_t /*end*/, nframes_t /*nframes*/,
+                                    pan_t** /*buffers*/)
 {
        if (_muted) {
                return;
@@ -643,7 +643,7 @@ Multi2dPanner::factory (Panner& p, Evoral::Parameter param)
 }
 
 int
-Multi2dPanner::load (istream& in, string path, uint32_t& linecnt)
+Multi2dPanner::load (istream& /*in*/, string /*path*/, uint32_t& /*linecnt*/)
 {
        return 0;
 }
@@ -655,7 +655,7 @@ Multi2dPanner::get_state (void)
 }
 
 XMLNode&
-Multi2dPanner::state (bool full_state)
+Multi2dPanner::state (bool /*full_state*/)
 {
        XMLNode* root = new XMLNode ("StreamPanner");
        char buf[64];
@@ -703,7 +703,8 @@ Multi2dPanner::set_state (const XMLNode& node)
 /*---------------------------------------------------------------------- */
 
 Panner::Panner (string name, Session& s)
-       : Processor(s, name, PostFader)
+       : SessionObject (s, name)
+       , AutomatableControls (s)
 {
        //set_name_old_auto (name);
        set_name (name);
@@ -1012,23 +1013,30 @@ Panner::set_automation_state (AutoState state)
 AutoState
 Panner::automation_state () const
 {
+       boost::shared_ptr<AutomationList> l;
        if (!empty()) {
-               return ((AutomationList*)_streampanners.front()->pan_control()->list().get())->automation_state ();
-       } else {
-               return Off;
+               boost::shared_ptr<AutomationControl> control = _streampanners.front()->pan_control();
+               if (control) {
+                       l = boost::dynamic_pointer_cast<AutomationList>(control->list());
+               }
        }
+
+       return l ? l->automation_state() : Off;
 }
 
 AutoStyle
 Panner::automation_style () const
 {
+       boost::shared_ptr<AutomationList> l;
        if (!empty()) {
-               return ((AutomationList*)_streampanners.front()->pan_control()->list().get())->automation_style ();
-       } else {
-               return Absolute;
+               boost::shared_ptr<AutomationControl> control = _streampanners.front()->pan_control();
+               if (control) {
+                       l = boost::dynamic_pointer_cast<AutomationList>(control->list());
+               }
        }
-}
 
+       return l ? l->automation_style() : Absolute;
+}
 
 struct PanPlugins {
     string name;
@@ -1051,15 +1059,13 @@ Panner::get_state (void)
 XMLNode&
 Panner::state (bool full)
 {
-       XMLNode& node = Processor::state(full);
-
-       node.add_property ("type", "panner");
+       XMLNode* node = new XMLNode ("Panner");
 
        char buf[32];
 
-       node.add_property (X_("linked"), (_linked ? "yes" : "no"));
-       node.add_property (X_("link_direction"), enum_2_string (_link_direction));
-       node.add_property (X_("bypassed"), (bypassed() ? "yes" : "no"));
+       node->add_property (X_("linked"), (_linked ? "yes" : "no"));
+       node->add_property (X_("link_direction"), enum_2_string (_link_direction));
+       node->add_property (X_("bypassed"), (bypassed() ? "yes" : "no"));
 
        for (vector<Panner::Output>::iterator o = outputs.begin(); o != outputs.end(); ++o) {
                XMLNode* onode = new XMLNode (X_("Output"));
@@ -1067,15 +1073,15 @@ Panner::state (bool full)
                onode->add_property (X_("x"), buf);
                snprintf (buf, sizeof (buf), "%.12g", (*o).y);
                onode->add_property (X_("y"), buf);
-               node.add_child_nocopy (*onode);
+               node->add_child_nocopy (*onode);
        }
-
+       
        for (vector<StreamPanner*>::const_iterator i = _streampanners.begin(); i != _streampanners.end(); ++i) {
-               node.add_child_nocopy ((*i)->state (full));
+               node->add_child_nocopy ((*i)->state (full));
        }
 
 
-       return node;
+       return *node;
 }
 
 int
@@ -1091,8 +1097,6 @@ Panner::set_state (const XMLNode& node)
 
        clear_panners ();
 
-       Processor::set_state(node);
-
        ChanCount ins = ChanCount::ZERO;
        ChanCount outs = ChanCount::ZERO;
 
@@ -1375,7 +1379,7 @@ Panner::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, nframes
                        if (inbufs.count().n_audio() > 0) {
                                BufferSet::audio_iterator i = inbufs.audio_begin();
                                for (++i; i != inbufs.audio_end(); ++i) {
-                                       dst.accumulate_from(*i, nframes);
+                                       dst.merge_from(*i, nframes);
                                }
                        }
 
@@ -1412,7 +1416,7 @@ Panner::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, nframes
 }
 
 void
-Panner::run_out_of_place (BufferSet& inbufs, BufferSet& outbufs, nframes_t start_frame, nframes_t end_frame, nframes_t nframes)
+Panner::run (BufferSet& inbufs, BufferSet& outbufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes)
 {      
        if (outbufs.count().n_audio() == 0) {
                // Failing to deliver audio we were asked to deliver is a bug
@@ -1425,16 +1429,16 @@ Panner::run_out_of_place (BufferSet& inbufs, BufferSet& outbufs, nframes_t start
        assert(!empty());
 
        // If we shouldn't play automation defer to distribute_no_automation
-       if ( !( automation_state() & Play ||
-                        ((automation_state() & Touch) && !touching()) ) ) {
+       if (!(automation_state() & Play || ((automation_state() & Touch) && !touching()))) {
 
                // Speed quietning
                gain_t gain_coeff = 1.0;
+
                if (fabsf(_session.transport_speed()) > 1.5f) {
                        gain_coeff = speed_quietning;
                }
 
-               distribute_no_automation(inbufs, outbufs, nframes, gain_coeff);
+               distribute_no_automation (inbufs, outbufs, nframes, gain_coeff);
                return;
        }
 
@@ -1452,7 +1456,7 @@ Panner::run_out_of_place (BufferSet& inbufs, BufferSet& outbufs, nframes_t start
                // accumulate starting with the second
                BufferSet::audio_iterator i = inbufs.audio_begin();
                for (++i; i != inbufs.audio_end(); ++i) {
-                       dst.accumulate_from(*i, nframes);
+                       dst.merge_from(*i, nframes);
                }
 
                return;