fix possible crash when setting delivery name w/o panshell
[ardour.git] / libs / ardour / delivery.cc
index 11500b4b10f593320a1634a70274e8f614de29b0..30f7ef63fa2761245543d347d1f7a45ee57eedac 100644 (file)
@@ -58,7 +58,9 @@ Delivery::Delivery (Session& s, boost::shared_ptr<IO> io, boost::shared_ptr<Pann
        , _no_panner_reset (false)
 {
        if (pannable) {
-               _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
+               bool is_send = false;
+               if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
+               _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
        }
 
        _display_to_user = false;
@@ -80,7 +82,9 @@ Delivery::Delivery (Session& s, boost::shared_ptr<Pannable> pannable, boost::sha
        , _no_panner_reset (false)
 {
        if (pannable) {
-               _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable));
+               bool is_send = false;
+               if (r & (Delivery::Send|Delivery::Aux)) is_send = true;
+               _panshell = boost::shared_ptr<PannerShell>(new PannerShell (_name, _session, pannable, is_send));
        }
 
        _display_to_user = false;
@@ -245,6 +249,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
           processing pathway that wants to use this->output_buffers() for some reason.
        */
 
+       // TODO delayline -- latency-compensation
        output_buffers().get_backend_port_addresses (ports, nframes);
 
        // this Delivery processor is not a derived type, and thus we assume
@@ -393,12 +398,8 @@ Delivery::reset_panner ()
        if (panners_legal) {
                if (!_no_panner_reset) {
 
-                       if (_panshell) {
+                       if (_panshell && _role != Insert && _role != Listen) {
                                _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs()));
-                               
-                               if (_role == Main || _role == Aux || _role == Send) {
-                                       _panshell->pannable()->set_panner (_panshell->panner());
-                               }
                        }
                }
 
@@ -411,12 +412,8 @@ Delivery::reset_panner ()
 void
 Delivery::panners_became_legal ()
 {
-       if (_panshell) {
+       if (_panshell && _role != Insert) {
                _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs()));
-               
-               if (_role == Main) {
-                       _panshell->pannable()->set_panner (_panshell->panner());
-               }
        }
 
        panner_legal_c.disconnect ();
@@ -560,7 +557,7 @@ Delivery::set_name (const std::string& name)
 {
        bool ret = IOProcessor::set_name (name);
 
-       if (ret) {
+       if (ret && _panshell) {
                ret = _panshell->set_name (name);
        }