From 19b9918a26787c41a68091025a21b0dedb34da8f Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Fri, 8 May 2009 21:14:33 +0000 Subject: [PATCH] implementation of solo switch --- src/audiomixerboard.cpp | 140 +++++++++++++++++++++++++++++++++------- src/audiomixerboard.h | 43 ++++++++---- 2 files changed, 146 insertions(+), 37 deletions(-) diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index 54bd522a..80e2c3c8 100755 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -25,7 +25,9 @@ #include "audiomixerboard.h" -/* Implementation *************************************************************/ +/******************************************************************************\ +* CChanneFader * +\******************************************************************************/ CChannelFader::CChannelFader ( QWidget* pNW, QHBoxLayout* pParentLayout ) { @@ -45,18 +47,18 @@ CChannelFader::CChannelFader ( QWidget* pNW, pFader->setRange ( 0, AUD_MIX_FADER_MAX ); pFader->setTickInterval ( AUD_MIX_FADER_MAX / 9 ); - -// TEST solo functionality is not yet implemented, disable control -pcbSolo->setEnabled ( false ); - - // setup fader tag label (use white background of label) QPalette newPalette = pLabel->palette(); newPalette.setColor ( QPalette::Active, QPalette::Window, newPalette.color ( QPalette::Active, QPalette::Base ) ); + newPalette.setColor ( QPalette::Disabled, QPalette::Window, + newPalette.color ( QPalette::Disabled, QPalette::Base ) ); + newPalette.setColor ( QPalette::Inactive, QPalette::Window, + newPalette.color ( QPalette::Inactive, QPalette::Base ) ); pLabel->setPalette ( newPalette ); pLabel->setAutoFillBackground ( true ); + pLabel->setFrameShape ( QFrame::Box ); // add user controls to grid pMainGrid->addWidget( pFader, 0, Qt::AlignHCenter ); @@ -88,10 +90,13 @@ pcbSolo->setEnabled ( false ); // connections ------------------------------------------------------------- QObject::connect ( pFader, SIGNAL ( valueChanged ( int ) ), - this, SLOT ( OnFaderValueChanged ( int ) ) ); + this, SLOT ( OnGainValueChanged ( int ) ) ); QObject::connect ( pcbMute, SIGNAL ( stateChanged ( int ) ), this, SLOT ( OnMuteStateChanged ( int ) ) ); + + QObject::connect ( pcbSolo, SIGNAL ( stateChanged ( int ) ), + this, SIGNAL ( soloStateChanged ( int ) ) ); } void CChannelFader::Reset() @@ -105,29 +110,68 @@ void CChannelFader::Reset() // clear label pLabel->setText ( "" ); + + bOtherChannelIsSolo = false; } -void CChannelFader::OnFaderValueChanged ( int value ) +void CChannelFader::OnGainValueChanged ( int value ) { // if mute flag is set, do not apply the new fader value if ( pcbMute->checkState() == Qt::Unchecked ) { // emit signal for new fader gain value - emit faderValueChanged ( CalcFaderGain ( value ) ); + emit gainValueChanged ( CalcFaderGain ( value ) ); } } void CChannelFader::OnMuteStateChanged ( int value ) { - if ( static_cast ( value ) == Qt::Checked ) + // call muting function + SetMute ( static_cast ( value ) == Qt::Checked ); +} + +void CChannelFader::SetMute ( const bool bState ) +{ + if ( bState ) { // mute channel -> send gain of 0 - emit faderValueChanged ( 0 ); + emit gainValueChanged ( 0 ); } else { - // mute was unchecked, get current fader value and apply - emit faderValueChanged ( CalcFaderGain ( pFader->value() ) ); + // only unmute if no other channel is on solo + if ( !bOtherChannelIsSolo ) + { + // mute was unchecked, get current fader value and apply + emit gainValueChanged ( CalcFaderGain ( pFader->value() ) ); + } + } +} + +void CChannelFader::ResetSoloState() +{ + // reset solo state -> since solo state means that this channel is not + // muted but all others, we simply have to uncheck the check box + pcbSolo->setChecked ( false ); +} + +void CChannelFader::SetOtherSoloState ( const bool bState ) +{ + // store state (must be done before the SetMute() call!) + bOtherChannelIsSolo = bState; + + // check if we are in solo on state, in that case we first have to disable + // our solo state since only one channel can be set to solo + if ( bState && pcbSolo->isChecked() ) + { + pcbSolo->setChecked ( 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() ) + { + SetMute ( bState ); } } @@ -167,11 +211,15 @@ double CChannelFader::CalcFaderGain ( const int value ) return static_cast ( value ) / AUD_MIX_FADER_MAX; } + +/******************************************************************************\ +* CAudioMixerBoard * +\******************************************************************************/ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) : QGroupBox ( parent ) { // set title text and title properties - setTitle ( "Server" ); + setTitle ( "Server Mixer" ); setAlignment ( Qt::AlignHCenter ); // add hboxlayout @@ -185,20 +233,34 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) : vecpChanFader[i]->Hide(); } + // insert horizontal spacer + pMainLayout->addItem ( new QSpacerItem ( 0, 0, QSizePolicy::Expanding ) ); + // connections ------------------------------------------------------------- // CODE TAG: MAX_NUM_CHANNELS_TAG // make sure we have MAX_NUM_CHANNELS connections!!! - QObject::connect ( vecpChanFader[0], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh0 ( double ) ) ); - QObject::connect ( vecpChanFader[1], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh1 ( double ) ) ); - QObject::connect ( vecpChanFader[2], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh2 ( double ) ) ); - QObject::connect ( vecpChanFader[3], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh3 ( double ) ) ); - QObject::connect ( vecpChanFader[4], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh4 ( double ) ) ); - QObject::connect ( vecpChanFader[5], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh5 ( double ) ) ); - QObject::connect ( vecpChanFader[6], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh6 ( double ) ) ); - QObject::connect ( vecpChanFader[7], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh7 ( double ) ) ); - QObject::connect ( vecpChanFader[8], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh8 ( double ) ) ); - QObject::connect ( vecpChanFader[9], SIGNAL ( faderValueChanged ( double ) ), this, SLOT ( OnFaderValueChangedCh9 ( double ) ) ); + QObject::connect ( vecpChanFader[0], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh0 ( double ) ) ); + QObject::connect ( vecpChanFader[1], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh1 ( double ) ) ); + QObject::connect ( vecpChanFader[2], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh2 ( double ) ) ); + QObject::connect ( vecpChanFader[3], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh3 ( double ) ) ); + QObject::connect ( vecpChanFader[4], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh4 ( double ) ) ); + QObject::connect ( vecpChanFader[5], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh5 ( double ) ) ); + QObject::connect ( vecpChanFader[6], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh6 ( double ) ) ); + QObject::connect ( vecpChanFader[7], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh7 ( double ) ) ); + QObject::connect ( vecpChanFader[8], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh8 ( double ) ) ); + QObject::connect ( vecpChanFader[9], SIGNAL ( gainValueChanged ( double ) ), this, SLOT ( OnGainValueChangedCh9 ( double ) ) ); + + QObject::connect ( vecpChanFader[0], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh0 ( int ) ) ); + QObject::connect ( vecpChanFader[1], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh1 ( int ) ) ); + QObject::connect ( vecpChanFader[2], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh2 ( int ) ) ); + QObject::connect ( vecpChanFader[3], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh3 ( int ) ) ); + QObject::connect ( vecpChanFader[4], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh4 ( int ) ) ); + QObject::connect ( vecpChanFader[5], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh5 ( int ) ) ); + QObject::connect ( vecpChanFader[6], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh6 ( int ) ) ); + QObject::connect ( vecpChanFader[7], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh7 ( int ) ) ); + QObject::connect ( vecpChanFader[8], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh8 ( int ) ) ); + QObject::connect ( vecpChanFader[9], SIGNAL ( soloStateChanged ( int ) ), this, SLOT ( OnChSoloStateChangedCh9 ( int ) ) ); } void CAudioMixerBoard::HideAll() @@ -220,7 +282,7 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector& vecCh for ( int j = 0; j < vecChanInfo.Size(); j++ ) { - // search if current fader is used + // check if current fader is used if ( vecChanInfo[j].iChanID == i ) { // check if fader was already in use -> preserve gain value @@ -231,6 +293,13 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector& vecCh // show fader 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(); + } // update text vecpChanFader[i]->SetText ( GenFaderText ( vecChanInfo[j] ) ); @@ -247,6 +316,27 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector& vecCh } } +void CAudioMixerBoard::OnChSoloStateChanged ( const int iChannelIdx, const int iValue ) +{ + // if channel iChannelIdx has just activated the solo switch, mute all + // other channels, else enable them again + const bool bSetOtherSoloState = + ( static_cast ( iValue ) == Qt::Checked ); + + // apply "other solo state" for all other channels + for ( int i = 0; i < USED_NUM_CHANNELS; i++ ) + { + if ( i != iChannelIdx ) + { + // check if fader is in use + if ( vecpChanFader[i]->IsVisible() ) + { + vecpChanFader[i]->SetOtherSoloState ( bSetOtherSoloState ); + } + } + } +} + QString CAudioMixerBoard::GenFaderText ( CChannelShortInfo& ChanInfo ) { // if text is empty, show IP address instead diff --git a/src/audiomixerboard.h b/src/audiomixerboard.h index d55f8443..47e2da37 100755 --- a/src/audiomixerboard.h +++ b/src/audiomixerboard.h @@ -64,10 +64,14 @@ public: void Hide() { pLabel->hide(); pcbMute->hide(); pcbSolo->hide(); pFader->hide(); } bool IsVisible() { return pLabel->isVisible(); } + void ResetSoloState(); + void SetOtherSoloState ( const bool bState ); + void Reset(); protected: double CalcFaderGain ( const int value ); + void SetMute ( const bool bState ); QVBoxLayout* pMainGrid; QSlider* pFader; @@ -75,12 +79,15 @@ protected: QCheckBox* pcbSolo; QLabel* pLabel; + bool bOtherChannelIsSolo; + public slots: - void OnFaderValueChanged ( int value ); + void OnGainValueChanged ( int value ); void OnMuteStateChanged ( int value ); signals: - void faderValueChanged ( double value ); + void gainValueChanged ( double value ); + void soloStateChanged ( int value ); }; @@ -96,6 +103,7 @@ public: protected: QString GenFaderText ( CChannelShortInfo& ChanInfo ); + void OnChSoloStateChanged ( const int iChannelIdx, const int iValue ); CVector vecpChanFader; QHBoxLayout* pMainLayout; @@ -103,16 +111,27 @@ protected: public slots: // CODE TAG: MAX_NUM_CHANNELS_TAG // make sure we have MAX_NUM_CHANNELS connections!!! - void OnFaderValueChangedCh0 ( double dValue ) { emit ChangeChanGain ( 0, dValue ); } - void OnFaderValueChangedCh1 ( double dValue ) { emit ChangeChanGain ( 1, dValue ); } - void OnFaderValueChangedCh2 ( double dValue ) { emit ChangeChanGain ( 2, dValue ); } - void OnFaderValueChangedCh3 ( double dValue ) { emit ChangeChanGain ( 3, dValue ); } - void OnFaderValueChangedCh4 ( double dValue ) { emit ChangeChanGain ( 4, dValue ); } - void OnFaderValueChangedCh5 ( double dValue ) { emit ChangeChanGain ( 5, dValue ); } - void OnFaderValueChangedCh6 ( double dValue ) { emit ChangeChanGain ( 6, dValue ); } - void OnFaderValueChangedCh7 ( double dValue ) { emit ChangeChanGain ( 7, dValue ); } - void OnFaderValueChangedCh8 ( double dValue ) { emit ChangeChanGain ( 8, dValue ); } - void OnFaderValueChangedCh9 ( double dValue ) { emit ChangeChanGain ( 9, dValue ); } + void OnGainValueChangedCh0 ( double dValue ) { emit ChangeChanGain ( 0, dValue ); } + void OnGainValueChangedCh1 ( double dValue ) { emit ChangeChanGain ( 1, dValue ); } + void OnGainValueChangedCh2 ( double dValue ) { emit ChangeChanGain ( 2, dValue ); } + void OnGainValueChangedCh3 ( double dValue ) { emit ChangeChanGain ( 3, dValue ); } + void OnGainValueChangedCh4 ( double dValue ) { emit ChangeChanGain ( 4, dValue ); } + void OnGainValueChangedCh5 ( double dValue ) { emit ChangeChanGain ( 5, dValue ); } + void OnGainValueChangedCh6 ( double dValue ) { emit ChangeChanGain ( 6, dValue ); } + void OnGainValueChangedCh7 ( double dValue ) { emit ChangeChanGain ( 7, dValue ); } + void OnGainValueChangedCh8 ( double dValue ) { emit ChangeChanGain ( 8, dValue ); } + void OnGainValueChangedCh9 ( double dValue ) { emit ChangeChanGain ( 9, dValue ); } + + void OnChSoloStateChangedCh0 ( int value ) { OnChSoloStateChanged ( 0, value ); } + 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 ); } signals: void ChangeChanGain ( int iId, double dGain );