X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fpanner_shell.cc;h=6c3ae0021cf1c80da7b118e445109ecb01c9a315;hb=77bd398153240390362fea83533627e6d767ddb3;hp=b489354e21142479decd3bbccdfc4913d7a908b1;hpb=cf806123ca5faaef483f898daba3f7bd38ec62eb;p=ardour.git diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc index b489354e21..6c3ae0021c 100644 --- a/libs/ardour/panner_shell.cc +++ b/libs/ardour/panner_shell.cc @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -33,7 +32,6 @@ #include #include "pbd/cartesian.h" -#include "pbd/boost_debug.h" #include "pbd/convert.h" #include "pbd/error.h" #include "pbd/failed_constructor.h" @@ -44,16 +42,18 @@ #include "ardour/audio_buffer.h" #include "ardour/audioengine.h" +#include "ardour/boost_debug.h" #include "ardour/buffer_set.h" #include "ardour/debug.h" #include "ardour/pannable.h" #include "ardour/panner.h" #include "ardour/panner_manager.h" #include "ardour/panner_shell.h" +#include "ardour/profile.h" #include "ardour/session.h" #include "ardour/speakers.h" -#include "i18n.h" +#include "pbd/i18n.h" #include "pbd/mathfix.h" @@ -74,7 +74,7 @@ PannerShell::PannerShell (string name, Session& s, boost::shared_ptr p { if (is_send) { _pannable_internal.reset(new Pannable (s)); - if (Config->get_link_send_and_route_panner()) { + if (Config->get_link_send_and_route_panner() && !ARDOUR::Profile->get_mixbus()) { _panlinked = true; } else { _panlinked = false; @@ -101,6 +101,7 @@ PannerShell::configure_io (ChanCount in, ChanCount out) if (!_force_reselect && _panner && (_panner->in().n_audio() == nins) && (_panner->out().n_audio() == nouts)) { return; } + _force_reselect = false; if (nouts < 2 || nins == 0) { /* no need for panning with less than 2 outputs or no inputs */ @@ -108,6 +109,9 @@ PannerShell::configure_io (ChanCount in, ChanCount out) _panner.reset (); _current_panner_uri = ""; _panner_gui_uri = ""; + if (!_is_send || !_panlinked) { + pannable()->set_panner(_panner); + } Changed (); /* EMIT SIGNAL */ } return; @@ -115,8 +119,8 @@ PannerShell::configure_io (ChanCount in, ChanCount out) PannerInfo* pi = PannerManager::instance().select_panner (in, out, _user_selected_panner_uri); if (!pi) { - cerr << "No panner found: check that panners are being discovered correctly during startup.\n"; - assert (pi); + fatal << _("No panner found: check that panners are being discovered correctly during startup.") << endmsg; + abort(); /*NOTREACHED*/ } DEBUG_TRACE (DEBUG::Panning, string_compose (_("select panner: %1\n"), pi->descriptor.name.c_str())); @@ -140,6 +144,9 @@ PannerShell::configure_io (ChanCount in, ChanCount out) _current_panner_uri = pi->descriptor.panner_uri; _panner_gui_uri = pi->descriptor.gui_uri; + if (!_is_send || !_panlinked) { + pannable()->set_panner(_panner); + } Changed (); /* EMIT SIGNAL */ } @@ -164,15 +171,17 @@ PannerShell::set_state (const XMLNode& node, int version) { XMLNodeList nlist = node.children (); XMLNodeConstIterator niter; - const XMLProperty *prop; - LocaleGuard lg (X_("POSIX")); + XMLProperty const * prop; + LocaleGuard lg; if ((prop = node.property (X_("bypassed"))) != 0) { set_bypassed (string_is_affirmative (prop->value ())); } if ((prop = node.property (X_("linked-to-route"))) != 0) { - _panlinked = string_is_affirmative (prop->value ()); + if (!ARDOUR::Profile->get_mixbus()) { + _panlinked = string_is_affirmative (prop->value ()); + } } if ((prop = node.property (X_("user-panner"))) != 0) { @@ -180,7 +189,7 @@ PannerShell::set_state (const XMLNode& node, int version) } _panner.reset (); - + for (niter = nlist.begin(); niter != nlist.end(); ++niter) { if ((*niter)->name() == X_("Panner")) { @@ -192,6 +201,15 @@ PannerShell::set_state (const XMLNode& node, int version) _is_send ? _pannable_internal : _pannable_route, _session.get_speakers ())); _current_panner_uri = p->descriptor.panner_uri; _panner_gui_uri = p->descriptor.gui_uri; + if (_is_send) { + if (!_panlinked) { + _pannable_internal->set_panner(_panner); + } else { + _force_reselect = true; + } + } else { + _pannable_route->set_panner(_panner); + } if (_panner->set_state (**niter, version) == 0) { return -1; } @@ -217,6 +235,16 @@ PannerShell::set_state (const XMLNode& node, int version) _current_panner_uri = (*p)->descriptor.panner_uri; _panner_gui_uri = (*p)->descriptor.gui_uri; + if (_is_send) { + if (!_panlinked) { + _pannable_internal->set_panner(_panner); + } else { + _force_reselect = true; + } + } else { + _pannable_route->set_panner(_panner); + } + if (_panner->set_state (**niter, version) == 0) { return -1; } @@ -258,13 +286,13 @@ PannerShell::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, pf AudioBuffer& dst = outbufs.get_audio(0); - if (gain_coeff == 0.0f) { + if (gain_coeff == GAIN_COEFF_ZERO) { /* gain was zero, so make it silent */ dst.silence (nframes); - } else if (gain_coeff == 1.0f){ + } else if (gain_coeff == GAIN_COEFF_UNITY){ /* mix all input buffers into the output */ @@ -359,14 +387,7 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, if (!(as & Play || ((as & Touch) && !_panner->touching()))) { - // Speed quietning - gain_t gain_coeff = 1.0; - - if (fabsf(_session.transport_speed()) > 1.5f && Config->get_quieten_at_speed ()) { - gain_coeff = speed_quietning; - } - - distribute_no_automation (inbufs, outbufs, nframes, gain_coeff); + distribute_no_automation (inbufs, outbufs, nframes, 1.0); } else { @@ -387,8 +408,9 @@ PannerShell::set_bypassed (bool yn) if (yn == _bypassed) { return; } - + _bypassed = yn; + _session.set_dirty (); Changed (); /* EMIT SIGNAL */ } @@ -426,7 +448,9 @@ PannerShell::select_panner_by_uri (std::string const uri) ChanCount in = _panner->in(); ChanCount out = _panner->out(); configure_io(in, out); - pannable()->set_panner(_panner); + if (!_is_send || !_panlinked) { + pannable()->set_panner(_panner); + } _session.set_dirty (); } return true; @@ -435,9 +459,20 @@ PannerShell::select_panner_by_uri (std::string const uri) void PannerShell::set_linked_to_route (bool onoff) { - if (!_is_send || onoff == _panlinked) { + assert(_is_send); + if (onoff == _panlinked) { return; } + + /* set _pannable-_has_state = true + * this way the panners will pick it up + * when it is re-created + */ + if (pannable()) { + XMLNode state = pannable()->get_state(); + pannable()->set_state(state, 3000); + } + _panlinked = onoff; _force_reselect = true; @@ -446,7 +481,9 @@ PannerShell::set_linked_to_route (bool onoff) ChanCount in = _panner->in(); ChanCount out = _panner->out(); configure_io(in, out); - pannable()->set_panner(_panner); + if (!_panlinked) { + pannable()->set_panner(_panner); + } _session.set_dirty (); } PannableChanged();