X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fpanner_shell.cc;h=fae60c3458b36916d4b71ce6250c43ef3a5f0868;hb=0938a42440cc82ce8d0cb064840c258c863714ab;hp=d67925ed5c1b0f7fc658ad5eae2a8ed6d8dfbdf9;hpb=da144ab5edb5bb629a8300c2cbf93c7f87947a83;p=ardour.git diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc index d67925ed5c..fae60c3458 100644 --- a/libs/ardour/panner_shell.cc +++ b/libs/ardour/panner_shell.cc @@ -65,77 +65,74 @@ using namespace PBD; PannerShell::PannerShell (string name, Session& s, boost::shared_ptr p) : SessionObject (s, name) - , _pannable (p) + , _pannable (p) + , _bypassed (false) { set_name (name); } PannerShell::~PannerShell () { - DEBUG_TRACE(DEBUG::Destruction, string_compose ("panner shell for %1 destructor, pannable is %2\n", _name, _pannable)); + DEBUG_TRACE(DEBUG::Destruction, string_compose ("panner shell for %1 destructor, pannable is %2\n", _name, _pannable)); } void PannerShell::configure_io (ChanCount in, ChanCount out) { - uint32_t nouts = out.n_audio(); - uint32_t nins = in.n_audio(); + uint32_t nouts = out.n_audio(); + uint32_t nins = in.n_audio(); /* if new and old config don't need panning, or if the config hasn't changed, we're done. */ - if (_panner && _panner->in().n_audio() == nins && _panner->out().n_audio() == nouts) { - return; + if (_panner && (_panner->in().n_audio() == nins) && (_panner->out().n_audio() == nouts)) { + return; } if (nouts < 2 || nins == 0) { /* no need for panning with less than 2 outputs or no inputs */ if (_panner) { - _panner.reset (); + _panner.reset (); Changed (); /* EMIT SIGNAL */ } return; } - PannerInfo* pi = PannerManager::instance().select_panner (in, out); - - if (pi == 0) { - abort (); - } + PannerInfo* pi = PannerManager::instance().select_panner (in, out); + if (!pi) { + cerr << "No panner found: check that panners are being discovered correctly during startup.\n"; + assert (pi); + } - boost::shared_ptr speakers = _session.get_speakers (); + boost::shared_ptr speakers = _session.get_speakers (); - if (nouts != speakers->size()) { - /* hmm, output count doesn't match session speaker count so - create a new speaker set. - */ - Speakers* s = new Speakers (); - s->setup_default_speakers (nouts); - speakers.reset (s); - } + if (nouts != speakers->size()) { + /* hmm, output count doesn't match session speaker count so + create a new speaker set. + */ + Speakers* s = new Speakers (); + s->setup_default_speakers (nouts); + speakers.reset (s); + } - Panner* p = pi->descriptor.factory (_pannable, speakers); - boost_debug_shared_ptr_mark_interesting (p, "Panner"); - _panner.reset (p); - _panner->configure_io (in, out); + Panner* p = pi->descriptor.factory (_pannable, speakers); + boost_debug_shared_ptr_mark_interesting (p, "Panner"); + _panner.reset (p); + _panner->configure_io (in, out); - Changed (); /* EMIT SIGNAL */ + Changed (); /* EMIT SIGNAL */ } XMLNode& -PannerShell::get_state (void) -{ - return state (true); -} - -XMLNode& -PannerShell::state (bool full) +PannerShell::get_state () { XMLNode* node = new XMLNode ("PannerShell"); - if (_panner) { - node->add_child_nocopy (_panner->state (full)); + node->add_property (X_("bypassed"), _bypassed ? X_("yes") : X_("no")); + + if (_panner) { + node->add_child_nocopy (_panner->get_state ()); } return *node; @@ -149,16 +146,20 @@ PannerShell::set_state (const XMLNode& node, int version) const XMLProperty *prop; LocaleGuard lg (X_("POSIX")); - _panner.reset (); + if ((prop = node.property (X_("bypassed"))) != 0) { + set_bypassed (string_is_affirmative (prop->value ())); + } + _panner.reset (); + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == X_("Panner")) { if ((prop = (*niter)->property (X_("type")))) { - list::iterator p; - PannerManager& pm (PannerManager::instance()); + list::iterator p; + PannerManager& pm (PannerManager::instance()); for (p = pm.panner_info.begin(); p != pm.panner_info.end(); ++p) { if (prop->value() == (*p)->descriptor.name) { @@ -167,12 +168,12 @@ PannerShell::set_state (const XMLNode& node, int version) are of the same type. pretty good assumption, but it's still an assumption. */ - - _panner.reset ((*p)->descriptor.factory (_pannable, _session.get_speakers ())); - + + _panner.reset ((*p)->descriptor.factory (_pannable, _session.get_speakers ())); + if (_panner->set_state (**niter, version) == 0) { - return -1; - } + return -1; + } break; } @@ -180,7 +181,7 @@ PannerShell::set_state (const XMLNode& node, int version) if (p == pm.panner_info.end()) { error << string_compose (_("Unknown panner plugin \"%1\" found in pan state - ignored"), - prop->value()) + prop->value()) << endmsg; } @@ -207,7 +208,7 @@ PannerShell::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, pf if (outbufs.count().n_audio() == 1) { - /* just one output: no real panning going on */ + /* just one output: no real panning going on */ AudioBuffer& dst = outbufs.get_audio(0); @@ -252,19 +253,19 @@ PannerShell::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, pf return; } - /* multiple outputs ... we must have a panner */ + /* multiple outputs ... we must have a panner */ - assert (_panner); + assert (_panner); /* setup silent buffers so that we can mix into the outbuffers (slightly suboptimal - - better to copy the first set of data then mix after that, but hey, its 2011) - */ + better to copy the first set of data then mix after that, but hey, its 2011) + */ for (BufferSet::audio_iterator b = outbufs.audio_begin(); b != outbufs.audio_end(); ++b) { (*b).silence (nframes); } - _panner->distribute (inbufs, outbufs, gain_coeff, nframes); + _panner->distribute (inbufs, outbufs, gain_coeff, nframes); } void @@ -278,7 +279,7 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, if (outbufs.count().n_audio() == 1) { - /* one output only: no panner */ + /* one output only: no panner */ AudioBuffer& dst = outbufs.get_audio(0); @@ -298,7 +299,7 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, // More than 1 output - AutoState as = _panner->automation_state (); + AutoState as = _panner->automation_state (); // If we shouldn't play automation defer to distribute_no_automation @@ -306,7 +307,7 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, // Speed quietning gain_t gain_coeff = 1.0; - + if (fabsf(_session.transport_speed()) > 1.5f && Config->get_quieten_at_speed ()) { gain_coeff = speed_quietning; } @@ -315,14 +316,30 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, } else { - /* setup the terrible silence so that we can mix into the outbuffers (slightly suboptimal - - better to copy the first set of data then mix after that, but hey, its 2011) - */ - for (BufferSet::audio_iterator i = outbufs.audio_begin(); i != outbufs.audio_end(); ++i) { - i->silence(nframes); - } - - _panner->distribute_automated (inbufs, outbufs, start_frame, end_frame, nframes, _session.pan_automation_buffer()); - } + /* setup the terrible silence so that we can mix into the outbuffers (slightly suboptimal - + better to copy the first set of data then mix after that, but hey, its 2011) + */ + for (BufferSet::audio_iterator i = outbufs.audio_begin(); i != outbufs.audio_end(); ++i) { + i->silence(nframes); + } + + _panner->distribute_automated (inbufs, outbufs, start_frame, end_frame, nframes, _session.pan_automation_buffer()); + } +} + +void +PannerShell::set_bypassed (bool yn) +{ + if (yn == _bypassed) { + return; + } + + _bypassed = yn; + Changed (); /* EMIT SIGNAL */ } +bool +PannerShell::bypassed () const +{ + return _bypassed; +}