Move panner bypass state up to the PannerShell so that it is preserved even when...
[ardour.git] / libs / ardour / delivery.cc
index 44782650c16c23904bfe8104ef29dc69d0b1cde4..e7d435bacfd5470705bee37666707bfa4521d45e 100644 (file)
@@ -233,8 +233,6 @@ Delivery::configure_io (ChanCount in, ChanCount out)
 void
 Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
 {
-        boost::shared_ptr<Panner> panner;
-
        assert (_output);
 
        PortSet& ports (_output->ports());
@@ -276,6 +274,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
 
                _output->silence (nframes);
                if (result_required) {
+                       bufs.set_count (output_buffers().count ());
                        Amp::apply_simple_gain (bufs, nframes, 0.0);
                }
                goto out;
@@ -286,10 +285,6 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
                Amp::apply_simple_gain (bufs, nframes, tgain);
        }
 
-       if (_panshell) {
-               panner = _panshell->panner();
-       }
-
 #if 0
         if (_session.transport_rolling()) {
                 cerr << name() << " first value written : " << scnt << endl;
@@ -305,7 +300,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
         }
 #endif
 
-       if (panner && !panner->bypassed()) {
+       if (_panshell && !_panshell->bypassed()) {
 
                // Use the panner to distribute audio to output port buffers
 
@@ -349,7 +344,7 @@ Delivery::state (bool full_state)
        node.add_property("role", enum_2_string(_role));
 
        if (_panshell) {
-               node.add_child_nocopy (_panshell->state (full_state));
+               node.add_child_nocopy (_panshell->get_state ());
        }
 
        return node;
@@ -371,7 +366,7 @@ Delivery::set_state (const XMLNode& node, int version)
                // std::cerr << this << ' ' << _name << " NO ROLE INFO\n";
        }
 
-       XMLNode* pan_node = node.child (X_("Panner"));
+       XMLNode* pan_node = node.child (X_("PannerShell"));
 
        if (pan_node && _panshell) {
                _panshell->set_state (*pan_node, version);
@@ -383,13 +378,16 @@ Delivery::set_state (const XMLNode& node, int version)
 }
 
 void
-Delivery::reset_panner ()
+Delivery::unpan ()
 {
-        if (_role == Listen) {
-                /* monitor out gets no panner */
-                return;
-        }
+       /* caller must hold process lock */
 
+       _panshell.reset ();
+}
+
+void
+Delivery::reset_panner ()
+{
        if (panners_legal) {
                if (!no_panner_reset) {
 
@@ -598,3 +596,4 @@ Delivery::panner () const
                return boost::shared_ptr<Panner>();
        }
 }
+