mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 07:14:56 +01:00
adjust logic for slaved faders, not necessarily correctly.
More info in the code comments.
This commit is contained in:
parent
0275582b89
commit
c5c6be4170
1 changed files with 58 additions and 18 deletions
|
|
@ -523,19 +523,57 @@ GainMeterBase::show_gain ()
|
||||||
void
|
void
|
||||||
GainMeterBase::fader_moved ()
|
GainMeterBase::fader_moved ()
|
||||||
{
|
{
|
||||||
|
if (!ignore_toggle) {
|
||||||
|
|
||||||
gain_t value;
|
gain_t value;
|
||||||
const gain_t master_gain = _control->get_master_gain ();
|
const gain_t master_gain = _control->get_master_gain ();
|
||||||
|
|
||||||
/* convert from adjustment range (0..1) to gain coefficient */
|
/* convert from adjustment range (0..1) to gain coefficient */
|
||||||
|
|
||||||
if (_data_type == DataType::AUDIO) {
|
if (_data_type == DataType::AUDIO) {
|
||||||
value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain()) / master_gain;
|
|
||||||
|
if (_control->slaved ()) {
|
||||||
|
|
||||||
|
/* fader has been moved. The initial position of the fader
|
||||||
|
reflects any master gain (see ::gain_changed() below). So
|
||||||
|
when we reset the actual gain value, we have to remove the
|
||||||
|
influence of the master gain (if any).
|
||||||
|
|
||||||
|
but ... the fader is non-linear. a given number of dB will have a
|
||||||
|
relatively small effect on fader position far from the 0dB
|
||||||
|
position, and a larger effect near to it.
|
||||||
|
|
||||||
|
so... we take the current gain value, and compute where the
|
||||||
|
fader was BEFORE it was moved. Then we compute how the
|
||||||
|
position delta that the master gain caused.
|
||||||
|
|
||||||
|
once we have that value, we subtract it from the current
|
||||||
|
fader position, which gives us the current fader position as
|
||||||
|
if there was no master.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const gain_t current_value = _control->get_value (); /* current value */
|
||||||
|
const float position_delta_caused_by_master = gain_to_slider_position_with_max (current_value * master_gain, Config->get_max_gain()) -
|
||||||
|
gain_to_slider_position_with_max (current_value, Config->get_max_gain());
|
||||||
|
|
||||||
|
/* this is "where would the fader be now if the master
|
||||||
|
wan't changing things?"
|
||||||
|
*/
|
||||||
|
|
||||||
|
const float adjusted_position = min (gain_adjustment.get_upper(), max (gain_adjustment.get_lower(), gain_adjustment.get_value() - position_delta_caused_by_master));
|
||||||
|
|
||||||
|
value = slider_position_to_gain_with_max (adjusted_position, Config->get_max_gain());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
value = gain_adjustment.get_value();
|
value = gain_adjustment.get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ignore_toggle) {
|
if (_route && _control == _route->gain_control()) {
|
||||||
if (_route && _route->amp() == _amp) {
|
|
||||||
_route->set_gain (value, Controllable::UseGroup);
|
_route->set_gain (value, Controllable::UseGroup);
|
||||||
} else {
|
} else {
|
||||||
_control->set_value (value, Controllable::NoGroup);
|
_control->set_value (value, Controllable::NoGroup);
|
||||||
|
|
@ -548,21 +586,23 @@ GainMeterBase::fader_moved ()
|
||||||
void
|
void
|
||||||
GainMeterBase::effective_gain_display ()
|
GainMeterBase::effective_gain_display ()
|
||||||
{
|
{
|
||||||
gain_t value = GAIN_COEFF_ZERO;
|
gain_t fader_position = 0;
|
||||||
const gain_t master_gain = _control->get_master_gain ();
|
|
||||||
|
|
||||||
switch (_data_type) {
|
switch (_data_type) {
|
||||||
case DataType::AUDIO:
|
case DataType::AUDIO:
|
||||||
value = gain_to_slider_position_with_max (_control->get_value() * master_gain, Config->get_max_gain());
|
/* the position of the fader should reflect any master gain,
|
||||||
|
* not just the control's own inherent value
|
||||||
|
*/
|
||||||
|
fader_position = gain_to_slider_position_with_max (_control->get_value() * _control->get_master_gain(), Config->get_max_gain());
|
||||||
break;
|
break;
|
||||||
case DataType::MIDI:
|
case DataType::MIDI:
|
||||||
value = _control->get_value ();
|
fader_position = _control->get_value ();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gain_adjustment.get_value() != value) {
|
if (gain_adjustment.get_value() != fader_position) {
|
||||||
ignore_toggle = true;
|
ignore_toggle = true;
|
||||||
gain_adjustment.set_value (value);
|
gain_adjustment.set_value (fader_position);
|
||||||
ignore_toggle = false;
|
ignore_toggle = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue