X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fpanner.cc;h=cb2ad8dd4a127aa04ed76869f311380eaa9d52c4;hb=0bee288b5d6c6ca1fb33b8bc3b584c6d2c3d3364;hp=6bef67788ab89ccc4dd9f4036f04e5727651d0f0;hpb=edea754b6bafe4e88aaffe51265a000f1a05d19e;p=ardour.git diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc index 6bef67788a..cb2ad8dd4a 100644 --- a/libs/ardour/panner.cc +++ b/libs/ardour/panner.cc @@ -75,7 +75,7 @@ static double direct_control_to_stereo_pan (double fract) StreamPanner::StreamPanner (Panner& p, Evoral::Parameter param) : parent (p) - , _control (new PanControllable (parent.session(), _("direction"), *this, param)) + , _control (new PanControllable (parent.session(), _("direction"), this, param)) { assert (param.type() != NullAutomation); @@ -112,7 +112,7 @@ StreamPanner::PanControllable::lower () const void StreamPanner::PanControllable::set_value (double val) { - Panner& p (streampanner.get_parent()); + Panner& p (streampanner->get_parent()); switch (parameter().id()) { case 100: /* position */ @@ -131,7 +131,7 @@ StreamPanner::PanControllable::set_value (double val) break; default: - streampanner.set_position (AngularVector (direct_control_to_stereo_pan (val), 0.0)); + streampanner->set_position (AngularVector (direct_control_to_stereo_pan (val), 0.0)); AutomationControl::set_value(val); break; } @@ -204,7 +204,7 @@ StreamPanner::get_state () } void -StreamPanner::distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes) +StreamPanner::distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes) { if (_mono) { /* we're in mono mode, so just pan the input to all outputs equally */ @@ -220,7 +220,7 @@ StreamPanner::distribute (AudioBuffer& src, BufferSet& obufs, gain_t gain_coeff, void StreamPanner::distribute_automated (AudioBuffer& src, BufferSet& obufs, - nframes_t start, nframes_t end, nframes_t nframes, pan_t** buffers) + framepos_t start, framepos_t end, pframes_t nframes, pan_t** buffers) { if (_mono) { /* we're in mono mode, so just pan the input to all outputs equally */ @@ -260,7 +260,7 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) _control->list()->clear (); while (in.getline (line, sizeof (line), '\n')) { - nframes_t when; + framepos_t when; double value; ++linecnt; @@ -269,7 +269,7 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) break; } - if (sscanf (line, "%" PRIu32 " %lf", &when, &value) != 2) { + if (sscanf (line, "%" PRIu64 " %lf", &when, &value) != 2) { warning << string_compose(_("badly formatted pan automation event record at line %1 of %2 (ignored) [%3]"), linecnt, path, line) << endmsg; continue; } @@ -285,7 +285,7 @@ BaseStereoPanner::load (istream& in, string path, uint32_t& linecnt) } void -BaseStereoPanner::do_distribute (AudioBuffer& srcbuf, BufferSet& obufs, gain_t gain_coeff, nframes_t nframes) +BaseStereoPanner::do_distribute (AudioBuffer& srcbuf, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes) { assert(obufs.count().n_audio() == 2); @@ -308,8 +308,8 @@ BaseStereoPanner::do_distribute (AudioBuffer& srcbuf, BufferSet& obufs, gain_t g /* we've moving the pan by an appreciable amount, so we must interpolate over 64 frames or nframes, whichever is smaller */ - nframes_t const limit = min ((nframes_t)64, nframes); - nframes_t n; + pframes_t const limit = min ((pframes_t) 64, nframes); + pframes_t n; delta = -(delta / (float) (limit)); @@ -365,8 +365,8 @@ BaseStereoPanner::do_distribute (AudioBuffer& srcbuf, BufferSet& obufs, gain_t g /* we're moving the pan by an appreciable amount, so we must interpolate over 64 frames or nframes, whichever is smaller */ - nframes_t const limit = min ((nframes_t)64, nframes); - nframes_t n; + pframes_t const limit = min ((pframes_t) 64, nframes); + pframes_t n; delta = -(delta / (float) (limit)); @@ -460,7 +460,7 @@ EqualPowerStereoPanner::update () void EqualPowerStereoPanner::do_distribute_automated (AudioBuffer& srcbuf, BufferSet& obufs, - nframes_t start, nframes_t end, nframes_t nframes, + framepos_t start, framepos_t end, pframes_t nframes, pan_t** buffers) { assert (obufs.count().n_audio() == 2); @@ -496,7 +496,7 @@ EqualPowerStereoPanner::do_distribute_automated (AudioBuffer& srcbuf, BufferSet& const float pan_law_attenuation = -3.0f; const float scale = 2.0f - 4.0f * powf (10.0f,pan_law_attenuation/20.0f); - for (nframes_t n = 0; n < nframes; ++n) { + for (pframes_t n = 0; n < nframes; ++n) { float const panR = buffers[0][n]; float const panL = 1 - panR; @@ -510,7 +510,7 @@ EqualPowerStereoPanner::do_distribute_automated (AudioBuffer& srcbuf, BufferSet& dst = obufs.get_audio(0).data(); pbuf = buffers[0]; - for (nframes_t n = 0; n < nframes; ++n) { + for (pframes_t n = 0; n < nframes; ++n) { dst[n] += src[n] * pbuf[n]; } @@ -521,7 +521,7 @@ EqualPowerStereoPanner::do_distribute_automated (AudioBuffer& srcbuf, BufferSet& dst = obufs.get_audio(1).data(); pbuf = buffers[1]; - for (nframes_t n = 0; n < nframes; ++n) { + for (pframes_t n = 0; n < nframes; ++n) { dst[n] += src[n] * pbuf[n]; } @@ -1120,7 +1120,7 @@ Panner::set_position (const AngularVector& a, StreamPanner& orig) } void -Panner::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, nframes_t nframes, gain_t gain_coeff) +Panner::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, pframes_t nframes, gain_t gain_coeff) { if (outbufs.count().n_audio() == 0) { // Don't want to lose audio... @@ -1191,7 +1191,7 @@ Panner::distribute_no_automation (BufferSet& inbufs, BufferSet& outbufs, nframes } void -Panner::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, framepos_t end_frame, nframes_t nframes) +Panner::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes) { if (outbufs.count().n_audio() == 0) { // Failing to deliver audio we were asked to deliver is a bug @@ -1454,11 +1454,14 @@ Panner::set_stereo_pan (double direction_as_lr_fract, double width) swap (l_index, r_index); } - /* if the new right position is less than or equal to 180 (hard left) and the left panner + l_pos = max (min (l_pos, 180.0), 0.0); + r_pos = max (min (r_pos, 180.0), 0.0); + + /* if the new left position is less than or equal to 180 (hard left) and the left panner is already there, we're not moving the left signal. */ - if (l_pos > 180.0 && _streampanners[l_index]->get_position().azi == 180.0) { + if (l_pos >= 180.0 &&_streampanners[l_index]->get_position().azi == 180.0) { move_left = false; } @@ -1470,14 +1473,9 @@ Panner::set_stereo_pan (double direction_as_lr_fract, double width) move_right = false; } - l_pos = max (min (l_pos, 180.0), 0.0); - r_pos = max (min (r_pos, 180.0), 0.0); - if (move_left && move_right) { _streampanners[l_index]->set_position (AngularVector (l_pos, 0.0)); _streampanners[r_index]->set_position (AngularVector (r_pos, 0.0)); - - // cerr << "left @ " << BaseStereoPanner::azimuth_to_lr_fract (l_pos) << " right @ " << BaseStereoPanner::azimuth_to_lr_fract (r_pos) << endl; } return move_left && move_right; @@ -1498,22 +1496,31 @@ Panner::setup_meta_controls () Evoral::Parameter lr_param (PanAutomation, 0, 100); Evoral::Parameter width_param (PanAutomation, 0, 200); - boost::shared_ptr wc; - boost::shared_ptr dc; + boost::shared_ptr dc = automation_control (lr_param); + boost::shared_ptr wc = automation_control (width_param); - if (!automation_control (lr_param)) { - dc.reset (new StreamPanner::PanControllable (_session, _("lr"), *_streampanners.front(), lr_param)); + if (dc) { + /* reset parent StreamPanner as the current one may have been deleted */ + boost::shared_ptr p = boost::dynamic_pointer_cast (dc); + assert (p); + p->streampanner = _streampanners.front (); + } else { + dc.reset (new StreamPanner::PanControllable (_session, _("lr"), _streampanners.front(), lr_param)); add_control (dc); } - if (!automation_control (width_param)) { - wc.reset (new StreamPanner::PanControllable (_session, _("width"), *_streampanners.front(), width_param)); + if (wc) { + /* reset parent as above */ + boost::shared_ptr p = boost::dynamic_pointer_cast (wc); + assert (p); + p->streampanner = _streampanners.front (); + } else { + wc.reset (new StreamPanner::PanControllable (_session, _("width"), _streampanners.front(), width_param)); add_control (wc); } dc->set_value (0.5); wc->set_value (1.0); // full width - } string