X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdelivery.cc;h=126b599299691855457e23283b4b818404d6c766;hb=6ed562f182edf02434685e9af62921724a38370f;hp=967e01187e762a3e5c8a87ea2f92bcee243fac57;hpb=862972eaaa2232c399bb819eb1092379689d747e;p=ardour.git diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 967e01187e..126b599299 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -22,33 +22,27 @@ #include "pbd/enumwriter.h" #include "pbd/convert.h" -#include "ardour/midi_buffer.h" - -#include "ardour/debug.h" -#include "ardour/delivery.h" -#include "ardour/audio_buffer.h" -#include "ardour/audio_port.h" #include "ardour/amp.h" +#include "ardour/audioengine.h" #include "ardour/buffer_set.h" -#include "ardour/configuration.h" +#include "ardour/debug.h" +#include "ardour/delivery.h" #include "ardour/io.h" -#include "ardour/meter.h" #include "ardour/mute_master.h" -#include "ardour/panner.h" -#include "ardour/panner_shell.h" #include "ardour/pannable.h" +#include "ardour/panner_shell.h" #include "ardour/port.h" #include "ardour/session.h" -#include "ardour/audioengine.h" #include "i18n.h" +namespace ARDOUR { class Panner; } + using namespace std; using namespace PBD; using namespace ARDOUR; -PBD::Signal1 Delivery::CycleStart; -PBD::Signal0 Delivery::PannersLegal; +PBD::Signal0 Delivery::PannersLegal; bool Delivery::panners_legal = false; /* deliver to an existing IO object */ @@ -61,8 +55,7 @@ Delivery::Delivery (Session& s, boost::shared_ptr io, boost::shared_ptr(new PannerShell (_name, _session, pannable)); @@ -73,21 +66,18 @@ Delivery::Delivery (Session& s, boost::shared_ptr io, boost::shared_ptrchanged.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - - CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } /* deliver to a new IO object */ Delivery::Delivery (Session& s, boost::shared_ptr pannable, boost::shared_ptr mm, const string& name, Role r) - : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name) + : IOProcessor(s, false, (role_requires_output_ports (r) ? true : false), name, "", DataType::AUDIO, (r == Send)) , _role (r) , _output_buffers (new BufferSet()) , _current_gain (1.0) , _no_outs_cuz_we_no_monitor (false) , _mute_master (mm) - , no_panner_reset (false) - , scnt (0) + , _no_panner_reset (false) { if (pannable) { _panshell = boost::shared_ptr(new PannerShell (_name, _session, pannable)); @@ -98,14 +88,21 @@ Delivery::Delivery (Session& s, boost::shared_ptr pannable, boost::sha if (_output) { _output->changed.connect_same_thread (*this, boost::bind (&Delivery::output_changed, this, _1, _2)); } - - CycleStart.connect_same_thread (*this, boost::bind (&Delivery::cycle_start, this, _1)); } Delivery::~Delivery() { - DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name)); + DEBUG_TRACE (DEBUG::Destruction, string_compose ("delivery %1 destructor\n", _name)); + + /* this object should vanish from any signal callback lists + that it is on before we get any further. The full qualification + of the method name is not necessary, but is here to make it + clear that this call is about signals, not data flow connections. + */ + + ScopedConnectionList::drop_connections (); + delete _output_buffers; } @@ -126,12 +123,6 @@ Delivery::display_name () const } } -void -Delivery::cycle_start (pframes_t /*nframes*/) -{ - _no_outs_cuz_we_no_monitor = false; -} - bool Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) const { @@ -375,22 +366,24 @@ Delivery::unpan () _panshell.reset (); } +uint32_t +Delivery::pan_outs () const +{ + if (_output) { + return _output->n_ports().n_audio(); + } + + return _configured_output.n_audio(); +} + void Delivery::reset_panner () { if (panners_legal) { - if (!no_panner_reset) { - - uint32_t ntargets; - - if (_output) { - ntargets = _output->n_ports().n_audio(); - } else { - ntargets = _configured_output.n_audio(); - } + if (!_no_panner_reset) { if (_panshell) { - _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, ntargets)); + _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs())); if (_role == Main) { _panshell->pannable()->set_panner (_panshell->panner()); @@ -404,19 +397,11 @@ Delivery::reset_panner () } } -int +void Delivery::panners_became_legal () { - uint32_t ntargets; - - if (_output) { - ntargets = _output->n_ports().n_audio(); - } else { - ntargets = _configured_output.n_audio(); - } - if (_panshell) { - _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, ntargets)); + _panshell->configure_io (ChanCount (DataType::AUDIO, pans_required()), ChanCount (DataType::AUDIO, pan_outs())); if (_role == Main) { _panshell->pannable()->set_panner (_panshell->panner()); @@ -424,46 +409,49 @@ Delivery::panners_became_legal () } panner_legal_c.disconnect (); - return 0; } void Delivery::defer_pan_reset () { - no_panner_reset = true; + _no_panner_reset = true; } void Delivery::allow_pan_reset () { - no_panner_reset = false; + _no_panner_reset = false; reset_panner (); } int -Delivery::disable_panners (void) +Delivery::disable_panners () { panners_legal = false; return 0; } -int +void Delivery::reset_panners () { panners_legal = true; - return *PannersLegal (); + PannersLegal (); } void -Delivery::flush_buffers (framecnt_t nframes, framepos_t time) +Delivery::flush_buffers (framecnt_t nframes) { /* io_lock, not taken: function must be called from Session::process() calltree */ + if (!_output) { + return; + } + PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { - (*i).flush_buffers (nframes, time); + i->flush_buffers (nframes); } } @@ -480,7 +468,7 @@ Delivery::transport_stopped (framepos_t now) PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { - (*i).transport_stopped (); + i->transport_stopped (); } } } @@ -492,7 +480,7 @@ Delivery::realtime_locate () PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { - (*i).realtime_locate (); + i->realtime_locate (); } } }