the solo state of a mixer fader is not exclusive any more and the solo state is preserved if the number of mixer faders changes

This commit is contained in:
Volker Fischer 2013-09-10 16:24:55 +00:00
parent ae874ae0b4
commit b66e22379a
3 changed files with 54 additions and 101 deletions

View file

@ -4,6 +4,9 @@
- added new instrument pictures for "Recorder", "Streamer" and "Listener" - added new instrument pictures for "Recorder", "Streamer" and "Listener"
- the solo state of a mixer fader is not exclusive any more and the solo
state is preserved if the number of mixer faders changes
3.3.2 3.3.2

View file

@ -214,8 +214,8 @@ void CChannelFader::SetMute ( const bool bState )
} }
else else
{ {
// only unmute if no other channel is on solo // only unmute if we are not solot but an other channel is on solo
if ( !bOtherChannelIsSolo ) 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() ) ); emit gainValueChanged ( CalcFaderGain ( GetFaderLevel() ) );
@ -223,41 +223,16 @@ void CChannelFader::SetMute ( const bool bState )
} }
} }
void CChannelFader::ResetSoloState() void CChannelFader::UpdateSoloState ( const bool bNewOtherSoloState )
{
// reset solo state -> since solo state means that this channel is not
// muted but all others, we simply have to uncheck the check box (make
// sure the setChecked does not fire a signal)
pcbSolo->blockSignals ( true );
{
pcbSolo->setChecked ( false );
}
pcbSolo->blockSignals ( false );
}
void CChannelFader::SetOtherSoloState ( const bool bState )
{ {
// store state (must be done before the SetMute() call!) // store state (must be done before the SetMute() call!)
bOtherChannelIsSolo = bState; bOtherChannelIsSolo = bNewOtherSoloState;
// check if we are in solo on state, in that case we first have to disable // mute overwrites solo -> if mute is active, do not change anything
// our solo state since only one channel can be set to solo
if ( bState && pcbSolo->isChecked() )
{
// we do not want to fire a signal with the following set function
// -> block signals temporarily
pcbSolo->blockSignals ( true );
{
pcbSolo->setChecked ( false );
}
pcbSolo->blockSignals ( false );
}
// if other channel is solo, mute this channel, else enable channel gain
// (only enable channel gain if local mute switch is not set to on)
if ( !pcbMute->isChecked() ) if ( !pcbMute->isChecked() )
{ {
SetMute ( bState ); // mute channel if we are not solo but another channel is solo
SetMute ( ( !IsSolo() && bOtherChannelIsSolo ) );
} }
} }
@ -387,26 +362,26 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags ) :
QObject::connect ( vecpChanFader[18], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh18 ( double ) ) ); QObject::connect ( vecpChanFader[18], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh18 ( double ) ) );
QObject::connect ( vecpChanFader[19], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh19 ( double ) ) ); QObject::connect ( vecpChanFader[19], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh19 ( double ) ) );
QObject::connect ( vecpChanFader[0], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh0 ( int ) ) ); QObject::connect ( vecpChanFader[0], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[1], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh1 ( int ) ) ); QObject::connect ( vecpChanFader[1], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[2], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh2 ( int ) ) ); QObject::connect ( vecpChanFader[2], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[3], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh3 ( int ) ) ); QObject::connect ( vecpChanFader[3], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[4], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh4 ( int ) ) ); QObject::connect ( vecpChanFader[4], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[5], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh5 ( int ) ) ); QObject::connect ( vecpChanFader[5], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[6], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh6 ( int ) ) ); QObject::connect ( vecpChanFader[6], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[7], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh7 ( int ) ) ); QObject::connect ( vecpChanFader[7], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[8], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh8 ( int ) ) ); QObject::connect ( vecpChanFader[8], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[9], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh9 ( int ) ) ); QObject::connect ( vecpChanFader[9], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[10], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh10 ( int ) ) ); QObject::connect ( vecpChanFader[10], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[11], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh11 ( int ) ) ); QObject::connect ( vecpChanFader[11], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[12], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh12 ( int ) ) ); QObject::connect ( vecpChanFader[12], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[13], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh13 ( int ) ) ); QObject::connect ( vecpChanFader[13], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[14], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh14 ( int ) ) ); QObject::connect ( vecpChanFader[14], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[15], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh15 ( int ) ) ); QObject::connect ( vecpChanFader[15], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[16], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh16 ( int ) ) ); QObject::connect ( vecpChanFader[16], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[17], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh17 ( int ) ) ); QObject::connect ( vecpChanFader[17], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[18], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh18 ( int ) ) ); QObject::connect ( vecpChanFader[18], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
QObject::connect ( vecpChanFader[19], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh19 ( int ) ) ); QObject::connect ( vecpChanFader[19], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChanged() ) );
} }
void CAudioMixerBoard::SetServerName ( const QString& strNewServerName ) void CAudioMixerBoard::SetServerName ( const QString& strNewServerName )
@ -465,18 +440,12 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector<CChannelInfo>& vecChanInf
// check if fader was already in use -> preserve gain value // check if fader was already in use -> preserve gain value
if ( !vecpChanFader[i]->IsVisible() ) if ( !vecpChanFader[i]->IsVisible() )
{ {
// the fader was not in use, reset everything for new client
vecpChanFader[i]->Reset(); vecpChanFader[i]->Reset();
// show fader // show fader
vecpChanFader[i]->Show(); vecpChanFader[i]->Show();
} }
else
{
// by definition disable all Solo switches if the number of
// channels at the server has changed
vecpChanFader[i]->SetOtherSoloState ( false );
vecpChanFader[i]->ResetSoloState();
}
// restore gain (if new name is different from the current one) // restore gain (if new name is different from the current one)
if ( vecpChanFader[i]->GetReceivedName().compare ( vecChanInfo[j].strName ) ) if ( vecpChanFader[i]->GetReceivedName().compare ( vecChanInfo[j].strName ) )
@ -523,36 +492,37 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector<CChannelInfo>& vecChanInf
} }
} }
// update the solo states since if any channel was on solo and a new client
// has just connected, the new channel must be muted
UpdateSoloStates();
// emit status of connected clients // emit status of connected clients
emit NumClientsChanged ( iNumConnectedClients ); emit NumClientsChanged ( iNumConnectedClients );
} }
void CAudioMixerBoard::OnChSoloStateChanged ( const int iChannelIdx, void CAudioMixerBoard::UpdateSoloStates()
const int iValue )
{ {
// if channel iChannelIdx has just activated the solo switch, mute all // first check if any channel has a solo state active
// other channels, else enable them again bool bAnyChannelIsSolo = false;
const bool bSetOtherSoloState =
( static_cast<Qt::CheckState> ( iValue ) == Qt::Checked );
// apply "other solo state" for all other channels
for ( int i = 0; i < MAX_NUM_CHANNELS; i++ ) for ( int i = 0; i < MAX_NUM_CHANNELS; i++ )
{ {
if ( i != iChannelIdx ) // check if fader is in use and has solo state active
if ( vecpChanFader[i]->IsVisible() && vecpChanFader[i]->IsSolo() )
{ {
// check if fader is in use bAnyChannelIsSolo = true;
if ( vecpChanFader[i]->IsVisible() ) continue;
{
vecpChanFader[i]->SetOtherSoloState ( bSetOtherSoloState );
}
} }
} }
// set "other solo state" always to false for the current fader at which the // now update the solo state of all active faders
// status was changed because if solo is enabled, it has to be "false" and for ( int i = 0; i < MAX_NUM_CHANNELS; i++ )
// in case solo is just disabled (check was removed by the user), also no {
// other channel can be solo at this time if ( vecpChanFader[i]->IsVisible() )
vecpChanFader[iChannelIdx]->SetOtherSoloState ( false ); {
vecpChanFader[i]->UpdateSoloState ( bAnyChannelIsSolo );
}
}
} }
void CAudioMixerBoard::OnGainValueChanged ( const int iChannelIdx, void CAudioMixerBoard::OnGainValueChanged ( const int iChannelIdx,

View file

@ -52,11 +52,10 @@ public:
void Show() { pFrame->show(); } void Show() { pFrame->show(); }
void Hide() { pFrame->hide(); } void Hide() { pFrame->hide(); }
bool IsVisible() { return pLabel->isVisible(); } bool IsVisible() { return pLabel->isVisible(); }
bool IsSolo() { return pcbSolo->isChecked(); }
void SetGUIDesign ( const EGUIDesign eNewDesign ); void SetGUIDesign ( const EGUIDesign eNewDesign );
void ResetSoloState(); void UpdateSoloState ( const bool bNewOtherSoloState );
void SetOtherSoloState ( const bool bState );
void SetFaderLevel ( const int iLevel ); void SetFaderLevel ( const int iLevel );
int GetFaderLevel() { return pFader->value(); } int GetFaderLevel() { return pFader->value(); }
void Reset(); void Reset();
@ -107,8 +106,8 @@ public:
protected: protected:
int GetStoredFaderLevel ( const CChannelInfo& ChanInfo ); int GetStoredFaderLevel ( const CChannelInfo& ChanInfo );
void StoreFaderLevel ( CChannelFader* pChanFader ); void StoreFaderLevel ( CChannelFader* pChanFader );
void UpdateSoloStates();
void OnChSoloStateChanged ( const int iChannelIdx, const int iValue );
void OnGainValueChanged ( const int iChannelIdx, const double dValue ); void OnGainValueChanged ( const int iChannelIdx, const double dValue );
CVector<CChannelFader*> vecpChanFader; CVector<CChannelFader*> vecpChanFader;
@ -138,26 +137,7 @@ public slots:
void OnGainValueChangedCh18 ( double dValue ) { OnGainValueChanged ( 18, dValue ); } void OnGainValueChangedCh18 ( double dValue ) { OnGainValueChanged ( 18, dValue ); }
void OnGainValueChangedCh19 ( double dValue ) { OnGainValueChanged ( 19, dValue ); } void OnGainValueChangedCh19 ( double dValue ) { OnGainValueChanged ( 19, dValue ); }
void OnChSoloStateChangedCh0 ( int value ) { OnChSoloStateChanged ( 0, value ); } void OnChSoloStateChanged() { UpdateSoloStates(); }
void OnChSoloStateChangedCh1 ( int value ) { OnChSoloStateChanged ( 1, value ); }
void OnChSoloStateChangedCh2 ( int value ) { OnChSoloStateChanged ( 2, value ); }
void OnChSoloStateChangedCh3 ( int value ) { OnChSoloStateChanged ( 3, value ); }
void OnChSoloStateChangedCh4 ( int value ) { OnChSoloStateChanged ( 4, value ); }
void OnChSoloStateChangedCh5 ( int value ) { OnChSoloStateChanged ( 5, value ); }
void OnChSoloStateChangedCh6 ( int value ) { OnChSoloStateChanged ( 6, value ); }
void OnChSoloStateChangedCh7 ( int value ) { OnChSoloStateChanged ( 7, value ); }
void OnChSoloStateChangedCh8 ( int value ) { OnChSoloStateChanged ( 8, value ); }
void OnChSoloStateChangedCh9 ( int value ) { OnChSoloStateChanged ( 9, value ); }
void OnChSoloStateChangedCh10 ( int value ) { OnChSoloStateChanged ( 10, value ); }
void OnChSoloStateChangedCh11 ( int value ) { OnChSoloStateChanged ( 11, value ); }
void OnChSoloStateChangedCh12 ( int value ) { OnChSoloStateChanged ( 12, value ); }
void OnChSoloStateChangedCh13 ( int value ) { OnChSoloStateChanged ( 13, value ); }
void OnChSoloStateChangedCh14 ( int value ) { OnChSoloStateChanged ( 14, value ); }
void OnChSoloStateChangedCh15 ( int value ) { OnChSoloStateChanged ( 15, value ); }
void OnChSoloStateChangedCh16 ( int value ) { OnChSoloStateChanged ( 16, value ); }
void OnChSoloStateChangedCh17 ( int value ) { OnChSoloStateChanged ( 17, value ); }
void OnChSoloStateChangedCh18 ( int value ) { OnChSoloStateChanged ( 18, value ); }
void OnChSoloStateChangedCh19 ( int value ) { OnChSoloStateChanged ( 19, value ); }
signals: signals:
void ChangeChanGain ( int iId, double dGain ); void ChangeChanGain ( int iId, double dGain );