X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Famp.cc;h=b038cde695c847f7adba5374ebd42c6041616b18;hb=bc3e1a212250a67e53e86c972287a275834a967a;hp=5f305182f8c8472a1fbd7160e943b4b93ec7d739;hpb=aeff4ebb79cf80db69a02e0175aa1af4097705e1;p=ardour.git diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 5f305182f8..b038cde695 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -42,8 +42,11 @@ Amp::Amp (Session& s) , _apply_gain_automation(false) , _current_gain(1.0) { - boost::shared_ptr gl(new AutomationList(Evoral::Parameter(GainAutomation))); - _gain_control = boost::shared_ptr( new GainControl(X_("gaincontrol"), s, this, Evoral::Parameter(GainAutomation), gl )); + Evoral::Parameter p (GainAutomation); + /* gain range of -inf to +6dB, default 0dB */ + p.set_range (0, 1.99526231f, 1, false); + boost::shared_ptr gl (new AutomationList (p)); + _gain_control = boost::shared_ptr (new GainControl (X_("gaincontrol"), s, this, p, gl)); add_control(_gain_control); } @@ -89,7 +92,7 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, sp[nx] *= gab[nx]; } } - + _current_gain = gab[nframes-1]; } else { /* manual (scalar) gain */ @@ -243,7 +246,7 @@ Amp::declick (BufferSet& bufs, framecnt_t nframes, int dir) if (declick != nframes) { if (target == 0.0) { - memset (&buffer[declick], 0, sizeof (Sample) * (nframes - declick)); + memset (&buffer[declick], 0, sizeof (Sample) * (nframes - declick)); } else if (target != 1.0) { apply_gain_to_buffer (&buffer[declick], nframes - declick, target); } @@ -282,18 +285,18 @@ Amp::apply_gain (AudioBuffer& buf, framecnt_t nframes, gain_t initial, gain_t ta Sample* const buffer = buf.data(); - + fractional_pos = 1.0; - + for (pframes_t nx = 0; nx < declick; ++nx) { buffer[nx] *= (initial + (delta * (0.5 + 0.5 * cos (M_PI * fractional_pos)))); fractional_pos += fractional_shift; } - + /* now ensure the rest of the buffer has the target value applied, if necessary. */ - + if (declick != nframes) { - + if (target == 0.0) { memset (&buffer[declick], 0, sizeof (Sample) * (nframes - declick)); } else if (target != 1.0) { @@ -371,8 +374,6 @@ Amp::set_gain (gain_t val, void *src) val = 1.99526231f; } - //cerr << "set desired gain to " << val << " when curgain = " << _gain_control->get_value () << endl; - if (src != _gain_control.get()) { _gain_control->set_value (val); // bit twisty, this will come back and call us again @@ -404,7 +405,7 @@ Amp::set_state (const XMLNode& node, int version) if ((gain_node = node.child (Controllable::xml_node_name.c_str())) != 0) { _gain_control->set_state (*gain_node, version); } - + return 0; } @@ -412,8 +413,8 @@ void Amp::GainControl::set_value (double val) { // max gain at about +6dB (10.0 ^ ( 6 dB * 0.05)) - if (val > 1.99526231f) { - val = 1.99526231f; + if (val > 1.99526231) { + val = 1.99526231; } _amp->set_gain (val, this); @@ -422,9 +423,21 @@ Amp::GainControl::set_value (double val) } double -Amp::GainControl::get_value (void) const +Amp::GainControl::internal_to_interface (double v) const +{ + return gain_to_slider_position (v); +} + +double +Amp::GainControl::interface_to_internal (double v) const +{ + return slider_position_to_gain (v); +} + +double +Amp::GainControl::internal_to_user (double v) const { - return AutomationControl::get_value(); + return accurate_coefficient_to_dB (v); } void