bug fix: grouping faders in the client should be proportional (see discussion in #202)
This commit is contained in:
parent
51e8399ece
commit
eaf9a1ad0e
3 changed files with 75 additions and 57 deletions
|
@ -2,16 +2,18 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3.5.8git
|
3.5.8git
|
||||||
|
|
||||||
TODO bug fix: incorrect selection of UI language (#408)
|
- bug fix: grouping faders in the client should be proportional (see discussion in #202)
|
||||||
|
|
||||||
|
|
||||||
|
TODO bug fix: incorrect selection of UI language (#408) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
||||||
TODO improve settings management -> move settings class in client/server classes, move actual settings variables
|
TODO improve settings management -> move settings class in client/server classes, move actual settings variables
|
||||||
|
|
||||||
TODO add new register message which contains version and, e.g., max number of clients
|
TODO add new register message which contains version and, e.g., max number of clients
|
||||||
|
|
||||||
TODO bug fix: grouping faders in the client should be proportional (see discussion in #202)
|
|
||||||
|
|
||||||
TODO https://github.com/corrados/jamulus/issues/341#issuecomment-647172946
|
TODO https://github.com/corrados/jamulus/issues/341#issuecomment-647172946
|
||||||
- generate .qm on compile time with lrelease
|
- generate .qm on compile time with lrelease
|
||||||
|
|
||||||
|
|
|
@ -313,7 +313,7 @@ void CChannelFader::Reset()
|
||||||
|
|
||||||
// init gain and pan value -> maximum value as definition according to server
|
// init gain and pan value -> maximum value as definition according to server
|
||||||
pFader->setValue ( AUD_MIX_FADER_MAX );
|
pFader->setValue ( AUD_MIX_FADER_MAX );
|
||||||
iPreviousFaderLevel = AUD_MIX_FADER_MAX;
|
dPreviousFaderLevel = AUD_MIX_FADER_MAX;
|
||||||
pPan->setValue ( AUD_MIX_PAN_MAX / 2 );
|
pPan->setValue ( AUD_MIX_PAN_MAX / 2 );
|
||||||
|
|
||||||
// reset mute/solo/group check boxes and level meter
|
// reset mute/solo/group check boxes and level meter
|
||||||
|
@ -343,20 +343,20 @@ void CChannelFader::Reset()
|
||||||
bIsMyOwnFader = false;
|
bIsMyOwnFader = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannelFader::SetFaderLevel ( const int iLevel,
|
void CChannelFader::SetFaderLevel ( const double dLevel,
|
||||||
const bool bIsGroupUpdate )
|
const bool bIsGroupUpdate )
|
||||||
{
|
{
|
||||||
// first make a range check
|
// first make a range check
|
||||||
if ( ( iLevel >= 0 ) && ( iLevel <= AUD_MIX_FADER_MAX ) )
|
if ( ( dLevel >= 0 ) && ( dLevel <= AUD_MIX_FADER_MAX ) )
|
||||||
{
|
{
|
||||||
// we set the new fader level in the GUI (slider control) and also tell the
|
// we set the new fader level in the GUI (slider control) and also tell the
|
||||||
// server about the change (block the signal of the fader since we want to
|
// server about the change (block the signal of the fader since we want to
|
||||||
// call SendFaderLevelToServer with a special additional parameter)
|
// call SendFaderLevelToServer with a special additional parameter)
|
||||||
pFader->blockSignals ( true );
|
pFader->blockSignals ( true );
|
||||||
pFader->setValue ( iLevel );
|
pFader->setValue ( MathUtils::round ( dLevel ) );
|
||||||
pFader->blockSignals ( false );
|
pFader->blockSignals ( false );
|
||||||
|
|
||||||
SendFaderLevelToServer ( iLevel, bIsGroupUpdate );
|
SendFaderLevelToServer ( dLevel, bIsGroupUpdate );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,23 +401,26 @@ void CChannelFader::SetRemoteFaderIsMute ( const bool bIsMute )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CChannelFader::SendFaderLevelToServer ( const int iLevel,
|
void CChannelFader::SendFaderLevelToServer ( const double dLevel,
|
||||||
const bool bIsGroupUpdate )
|
const bool bIsGroupUpdate )
|
||||||
{
|
{
|
||||||
// if mute flag is set or other channel is on solo, do not apply the new
|
// if mute flag is set or other channel is on solo, do not apply the new
|
||||||
// fader value (exception: we are on solo, in that case we ignore the
|
// fader value to the server (exception: we are on solo, in that case we
|
||||||
// "other channel is on solo" flag)
|
// ignore the "other channel is on solo" flag)
|
||||||
if ( ( pcbMute->checkState() == Qt::Unchecked ) &&
|
const bool bSuppressServerUpdate = !( ( pcbMute->checkState() == Qt::Unchecked ) &&
|
||||||
( !bOtherChannelIsSolo || IsSolo() ) )
|
( !bOtherChannelIsSolo || IsSolo() ) );
|
||||||
{
|
|
||||||
// emit signal for new fader gain value
|
|
||||||
emit gainValueChanged ( CalcFaderGain ( iLevel ),
|
|
||||||
bIsMyOwnFader,
|
|
||||||
bIsGroupUpdate,
|
|
||||||
iLevel - iPreviousFaderLevel );
|
|
||||||
|
|
||||||
// update previous fader level since the level has changed
|
// emit signal for new fader gain value
|
||||||
iPreviousFaderLevel = iLevel;
|
emit gainValueChanged ( CalcFaderGain ( dLevel ),
|
||||||
|
bIsMyOwnFader,
|
||||||
|
bIsGroupUpdate,
|
||||||
|
bSuppressServerUpdate,
|
||||||
|
dLevel / dPreviousFaderLevel );
|
||||||
|
|
||||||
|
// update previous fader level since the level has changed
|
||||||
|
if ( dLevel > 0 )
|
||||||
|
{
|
||||||
|
dPreviousFaderLevel = dLevel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,7 +440,7 @@ void CChannelFader::SetMute ( const bool bState )
|
||||||
if ( bState )
|
if ( bState )
|
||||||
{
|
{
|
||||||
// mute channel -> send gain of 0
|
// mute channel -> send gain of 0
|
||||||
emit gainValueChanged ( 0, bIsMyOwnFader, false, 0 );
|
emit gainValueChanged ( 0, bIsMyOwnFader, false, false, -1 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -445,13 +448,13 @@ void CChannelFader::SetMute ( const bool bState )
|
||||||
if ( !bOtherChannelIsSolo || IsSolo() )
|
if ( !bOtherChannelIsSolo || IsSolo() )
|
||||||
{
|
{
|
||||||
// mute was unchecked, get current fader value and apply
|
// mute was unchecked, get current fader value and apply
|
||||||
emit gainValueChanged ( CalcFaderGain ( GetFaderLevel() ), bIsMyOwnFader, false, 0 );
|
emit gainValueChanged ( CalcFaderGain ( GetFaderLevel() ), bIsMyOwnFader, false, false, -1 );
|
||||||
|
|
||||||
// TODO When mute or solo is activated, the group synchronization does not work anymore.
|
// TODO When mute or solo is activated, the group synchronization does not work anymore.
|
||||||
// To get a smoother experience, we adjust the previous level as soon as the mute is
|
// To get a smoother experience, we adjust the previous level as soon as the mute is
|
||||||
// again set to off (if we would not do that, on the next move of the fader the other
|
// again set to off (if we would not do that, on the next move of the fader the other
|
||||||
// faders in the group would jump which is very bad).
|
// faders in the group would jump which is very bad).
|
||||||
iPreviousFaderLevel = GetFaderLevel();
|
dPreviousFaderLevel = GetFaderLevel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -624,14 +627,14 @@ void CChannelFader::SetChannelInfos ( const CChannelInfo& cChanInfo )
|
||||||
plblLabel->setToolTip ( strToolTip );
|
plblLabel->setToolTip ( strToolTip );
|
||||||
}
|
}
|
||||||
|
|
||||||
double CChannelFader::CalcFaderGain ( const int value )
|
double CChannelFader::CalcFaderGain ( const double dValue )
|
||||||
{
|
{
|
||||||
// convert actual slider range in gain values
|
// convert actual slider range in gain values
|
||||||
// and normalize so that maximum gain is 1
|
// and normalize so that maximum gain is 1
|
||||||
const double dInValueRange0_1 = static_cast<double> ( value ) / AUD_MIX_FADER_MAX;
|
const double dInValueRange0_1 = dValue / AUD_MIX_FADER_MAX;
|
||||||
|
|
||||||
// map range from 0..1 to range -35..0 dB and calculate linear gain
|
// map range from 0..1 to range -35..0 dB and calculate linear gain
|
||||||
if ( value == 0 )
|
if ( dValue == 0 )
|
||||||
{
|
{
|
||||||
return 0; // -infinity
|
return 0; // -infinity
|
||||||
}
|
}
|
||||||
|
@ -718,7 +721,7 @@ inline void CAudioMixerBoard::connectFaderSignalsToMixerBoardSlots()
|
||||||
{
|
{
|
||||||
int iCurChanID = slotId - 1;
|
int iCurChanID = slotId - 1;
|
||||||
|
|
||||||
void ( CAudioMixerBoard::* pGainValueChanged )( double, bool, bool, int ) =
|
void ( CAudioMixerBoard::* pGainValueChanged )( double, bool, bool, bool, double ) =
|
||||||
&CAudioMixerBoardSlots<slotId>::OnChGainValueChanged;
|
&CAudioMixerBoardSlots<slotId>::OnChGainValueChanged;
|
||||||
|
|
||||||
void ( CAudioMixerBoard::* pPanValueChanged )( double ) =
|
void ( CAudioMixerBoard::* pPanValueChanged )( double ) =
|
||||||
|
@ -940,8 +943,8 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector<CChannelInfo>& vecChanInf
|
||||||
( iNewClientFaderLevel != 100 ) )
|
( iNewClientFaderLevel != 100 ) )
|
||||||
{
|
{
|
||||||
// the value is in percent -> convert range
|
// the value is in percent -> convert range
|
||||||
vecpChanFader[i]->SetFaderLevel ( static_cast<int> (
|
vecpChanFader[i]->SetFaderLevel (
|
||||||
iNewClientFaderLevel / 100.0 * AUD_MIX_FADER_MAX ) );
|
iNewClientFaderLevel / 100.0 * AUD_MIX_FADER_MAX );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1051,10 +1054,14 @@ void CAudioMixerBoard::UpdateGainValue ( const int iChannelIdx,
|
||||||
const double dValue,
|
const double dValue,
|
||||||
const bool bIsMyOwnFader,
|
const bool bIsMyOwnFader,
|
||||||
const bool bIsGroupUpdate,
|
const bool bIsGroupUpdate,
|
||||||
const int iDiffLevel )
|
const bool bSuppressServerUpdate,
|
||||||
|
const double dLevelRatio )
|
||||||
{
|
{
|
||||||
// update current gain
|
// update current gain
|
||||||
emit ChangeChanGain ( iChannelIdx, dValue, bIsMyOwnFader );
|
if ( !bSuppressServerUpdate )
|
||||||
|
{
|
||||||
|
emit ChangeChanGain ( iChannelIdx, dValue, bIsMyOwnFader );
|
||||||
|
}
|
||||||
|
|
||||||
// if this fader is selected, all other in the group must be updated as
|
// if this fader is selected, all other in the group must be updated as
|
||||||
// well (note that we do not have to update if this is already a group update
|
// well (note that we do not have to update if this is already a group update
|
||||||
|
@ -1064,11 +1071,14 @@ void CAudioMixerBoard::UpdateGainValue ( const int iChannelIdx,
|
||||||
for ( int i = 0; i < MAX_NUM_CHANNELS; i++ )
|
for ( int i = 0; i < MAX_NUM_CHANNELS; i++ )
|
||||||
{
|
{
|
||||||
// update rest of faders selected
|
// update rest of faders selected
|
||||||
if ( vecpChanFader[i]->IsVisible() && vecpChanFader[i]->IsSelect() && ( i != iChannelIdx ) )
|
if ( vecpChanFader[i]->IsVisible() &&
|
||||||
|
vecpChanFader[i]->IsSelect() &&
|
||||||
|
( i != iChannelIdx ) &&
|
||||||
|
( dLevelRatio >= 0 ) )
|
||||||
{
|
{
|
||||||
// synchronize faders with moving fader level (it is important
|
// synchronize faders with moving fader level (it is important
|
||||||
// to set the group flag to avoid infinite looping)
|
// to set the group flag to avoid infinite looping)
|
||||||
vecpChanFader[i]->SetFaderLevel ( vecpChanFader[i]->GetFaderLevel() + iDiffLevel, true );
|
vecpChanFader[i]->SetFaderLevel ( vecpChanFader[i]->GetPreviousFaderLevel() * dLevelRatio, true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1165,7 +1175,7 @@ void CAudioMixerBoard::SetChannelLevels ( const CVector<uint16_t>& vecChannelLev
|
||||||
|
|
||||||
for ( int iChId = 0; iChId < MAX_NUM_CHANNELS; iChId++ )
|
for ( int iChId = 0; iChId < MAX_NUM_CHANNELS; iChId++ )
|
||||||
{
|
{
|
||||||
if ( vecpChanFader[iChId]->IsVisible() && i < iNumChannelLevels )
|
if ( vecpChanFader[iChId]->IsVisible() && ( i < iNumChannelLevels ) )
|
||||||
{
|
{
|
||||||
vecpChanFader[iChId]->SetChannelLevel ( vecChannelLevel[i++] );
|
vecpChanFader[iChId]->SetChannelLevel ( vecChannelLevel[i++] );
|
||||||
|
|
||||||
|
|
|
@ -69,23 +69,24 @@ public:
|
||||||
void SetFaderIsMute ( const bool bIsMute );
|
void SetFaderIsMute ( const bool bIsMute );
|
||||||
void SetRemoteFaderIsMute ( const bool bIsMute );
|
void SetRemoteFaderIsMute ( const bool bIsMute );
|
||||||
void SetFaderIsSelect ( const bool bIsMute );
|
void SetFaderIsSelect ( const bool bIsMute );
|
||||||
void SetFaderLevel ( const int iLevel,
|
void SetFaderLevel ( const double dLevel,
|
||||||
const bool bIsGroupUpdate = false );
|
const bool bIsGroupUpdate = false );
|
||||||
|
|
||||||
int GetFaderLevel() { return pFader->value(); }
|
int GetFaderLevel() { return pFader->value(); }
|
||||||
int GetPanValue() { return pPan->value(); }
|
double GetPreviousFaderLevel() { return dPreviousFaderLevel; }
|
||||||
void Reset();
|
int GetPanValue() { return pPan->value(); }
|
||||||
void SetChannelLevel ( const uint16_t iLevel );
|
void Reset();
|
||||||
void SetIsMyOwnFader() { bIsMyOwnFader = true; }
|
void SetChannelLevel ( const uint16_t iLevel );
|
||||||
void UpdateSoloState ( const bool bNewOtherSoloState );
|
void SetIsMyOwnFader() { bIsMyOwnFader = true; }
|
||||||
|
void UpdateSoloState ( const bool bNewOtherSoloState );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
double CalcFaderGain ( const int value );
|
double CalcFaderGain ( const double dValue );
|
||||||
void SetMute ( const bool bState );
|
void SetMute ( const bool bState );
|
||||||
void SetupFaderTag ( const ESkillLevel eSkillLevel );
|
void SetupFaderTag ( const ESkillLevel eSkillLevel );
|
||||||
void SendPanValueToServer ( const int iPan );
|
void SendPanValueToServer ( const int iPan );
|
||||||
void SendFaderLevelToServer ( const int iLevel,
|
void SendFaderLevelToServer ( const double dLevel,
|
||||||
const bool bIsGroupUpdate );
|
const bool bIsGroupUpdate );
|
||||||
|
|
||||||
QFrame* pFrame;
|
QFrame* pFrame;
|
||||||
|
|
||||||
|
@ -112,7 +113,7 @@ protected:
|
||||||
|
|
||||||
bool bOtherChannelIsSolo;
|
bool bOtherChannelIsSolo;
|
||||||
bool bIsMyOwnFader;
|
bool bIsMyOwnFader;
|
||||||
int iPreviousFaderLevel;
|
double dPreviousFaderLevel;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void OnLevelValueChanged ( int value ) { SendFaderLevelToServer ( value, false ); }
|
void OnLevelValueChanged ( int value ) { SendFaderLevelToServer ( value, false ); }
|
||||||
|
@ -123,7 +124,8 @@ signals:
|
||||||
void gainValueChanged ( double value,
|
void gainValueChanged ( double value,
|
||||||
bool bIsMyOwnFader,
|
bool bIsMyOwnFader,
|
||||||
bool bIsGroupUpdate,
|
bool bIsGroupUpdate,
|
||||||
int iDiffLevel );
|
bool bSuppressServerUpdate,
|
||||||
|
double dLevelRatio );
|
||||||
|
|
||||||
void panValueChanged ( double value );
|
void panValueChanged ( double value );
|
||||||
void soloStateChanged ( int value );
|
void soloStateChanged ( int value );
|
||||||
|
@ -136,11 +138,13 @@ public:
|
||||||
void OnChGainValueChanged ( double dValue,
|
void OnChGainValueChanged ( double dValue,
|
||||||
bool bIsMyOwnFader,
|
bool bIsMyOwnFader,
|
||||||
bool bIsGroupUpdate,
|
bool bIsGroupUpdate,
|
||||||
int iDiffLevel ) { UpdateGainValue ( slotId - 1,
|
bool bSuppressServerUpdate,
|
||||||
dValue,
|
double dLevelRatio ) { UpdateGainValue ( slotId - 1,
|
||||||
bIsMyOwnFader,
|
dValue,
|
||||||
bIsGroupUpdate,
|
bIsMyOwnFader,
|
||||||
iDiffLevel ); }
|
bIsGroupUpdate,
|
||||||
|
bSuppressServerUpdate,
|
||||||
|
dLevelRatio ); }
|
||||||
|
|
||||||
void OnChPanValueChanged ( double dValue ) { UpdatePanValue ( slotId - 1, dValue ); }
|
void OnChPanValueChanged ( double dValue ) { UpdatePanValue ( slotId - 1, dValue ); }
|
||||||
|
|
||||||
|
@ -149,7 +153,8 @@ protected:
|
||||||
const double dValue,
|
const double dValue,
|
||||||
const bool bIsMyOwnFader,
|
const bool bIsMyOwnFader,
|
||||||
const bool bIsGroupUpdate,
|
const bool bIsGroupUpdate,
|
||||||
const int iDiffLevel ) = 0;
|
const bool bSuppressServerUpdate,
|
||||||
|
const double dLevelRatio ) = 0;
|
||||||
|
|
||||||
virtual void UpdatePanValue ( const int iChannelIdx,
|
virtual void UpdatePanValue ( const int iChannelIdx,
|
||||||
const double dValue ) = 0;
|
const double dValue ) = 0;
|
||||||
|
@ -244,7 +249,8 @@ protected:
|
||||||
const double dValue,
|
const double dValue,
|
||||||
const bool bIsMyOwnFader,
|
const bool bIsMyOwnFader,
|
||||||
const bool bIsGroupUpdate,
|
const bool bIsGroupUpdate,
|
||||||
const int iDiffLevel );
|
const bool bSuppressServerUpdate,
|
||||||
|
const double dLevelRatio );
|
||||||
|
|
||||||
virtual void UpdatePanValue ( const int iChannelIdx,
|
virtual void UpdatePanValue ( const int iChannelIdx,
|
||||||
const double dValue );
|
const double dValue );
|
||||||
|
|
Loading…
Reference in a new issue