diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index b333994d..e4eecb4e 100755 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -27,53 +27,100 @@ /* Implementation *************************************************************/ CChannelFader::CChannelFader ( QWidget* pNW, - QHBoxLayout* pParentLayout, - QString sName ) + QHBoxLayout* pParentLayout ) { // create new GUI control objects and store pointers to them - pMainGrid = new QGridLayout(); - pFader = new QSlider ( Qt::Vertical, pNW ); - pLabel = new QLabel ( "", pNW ); + pMainGrid = new QVBoxLayout(); + pFader = new QSlider ( Qt::Vertical, pNW ); + pcbMute = new QCheckBox ( "Mute", pNW ); + pcbSolo = new QCheckBox ( "Solo", pNW ); + pLabel = new QLabel ( "", pNW ); + + // setup layout + pMainGrid->setSpacing ( 2 ); // setup slider pFader->setPageStep ( 1 ); pFader->setTickPosition ( QSlider::TicksBothSides ); pFader->setRange ( 0, AUD_MIX_FADER_MAX ); pFader->setTickInterval ( AUD_MIX_FADER_MAX / 9 ); - pFader->setValue ( 0 ); // set init value - // set label text - pLabel->setText ( sName ); - // add slider to grid as position 0 / 0 - pMainGrid->addWidget( pFader, 0, 0, Qt::AlignHCenter ); +// TEST solo functionality is not yet implemented, disable control +pcbSolo->setEnabled ( false ); - // add label to grid as position 1 / 0 - pMainGrid->addWidget( pLabel, 1, 0, Qt::AlignHCenter ); - pParentLayout->insertLayout ( 0, pMainGrid ); + // add user controls to grid + pMainGrid->addWidget( pFader, 0, Qt::AlignHCenter ); + pMainGrid->addWidget( pcbMute, 0, Qt::AlignHCenter ); + pMainGrid->addWidget( pcbSolo, 0, Qt::AlignHCenter ); + pMainGrid->addWidget( pLabel, 0, Qt::AlignHCenter ); + + // add fader layout to audio mixer board layout + pParentLayout->addLayout ( pMainGrid ); + + // reset current fader + Reset(); // add help text to controls - pFader->setWhatsThis ( "Mixer Fader: Adjusts the audio level of this " - "channel. All connected clients at the server will be assigned an audio " - "fader at each client" ); + pFader->setWhatsThis ( "Mixer Fader: Adjusts the audio level of " + "this channel. All connected clients at the server will be assigned " + "an audio fader at each client." ); - pLabel->setWhatsThis ( "Mixer Fader Label: Label (fader tag) identifying " - "the connected client. The tag name can be set in the clients main window." ); + pcbMute->setWhatsThis ( "Mute: Mutes the current channel." ); + + pcbSolo->setWhatsThis ( "Solo: If Solo checkbox is checked, only " + "the current channel is active and all other channels are muted. Only " + "one channel at a time can be set to solo." ); + + pLabel->setWhatsThis ( "Mixer Fader Label: Label (fader tag) " + "identifying the connected client. The tag name can be set in the " + "clients main window." ); // connections ------------------------------------------------------------- QObject::connect ( pFader, SIGNAL ( valueChanged ( int ) ), - this, SLOT ( OnValueChanged ( int ) ) ); + this, SLOT ( OnFaderValueChanged ( int ) ) ); + + QObject::connect ( pcbMute, SIGNAL ( stateChanged ( int ) ), + this, SLOT ( OnMuteStateChanged ( int ) ) ); } -void CChannelFader::OnValueChanged ( int value ) +void CChannelFader::Reset() { - // convert actual slider range in gain values - // and normalize so that maximum gain is 1 - const double dCurGain = static_cast ( value ) / AUD_MIX_FADER_MAX; + // init gain value -> maximum value as definition according to server + pFader->setValue ( AUD_MIX_FADER_MAX ); - emit valueChanged ( dCurGain ); + // reset mute/solo check boxes + pcbMute->setChecked ( false ); + pcbSolo->setChecked ( false ); + + // clear label + pLabel->setText ( "" ); +} + +void CChannelFader::OnFaderValueChanged ( 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 ) ); + } +} + +void CChannelFader::OnMuteStateChanged ( int value ) +{ + if ( static_cast ( value ) == Qt::Checked ) + { + // mute channel -> send gain of 0 + emit faderValueChanged ( 0 ); + } + else + { + // mute was unchecked, get current fader value and apply + emit faderValueChanged ( CalcFaderGain ( pFader->value() ) ); + } } void CChannelFader::SetText ( const QString sText ) @@ -90,7 +137,9 @@ void CChannelFader::SetText ( const QString sText ) } else { - sModText.append ( QString ( "
" ) ); + // insert line break at the beginning of the string -> make sure + // if we only have one line that the text appears at the bottom line + sModText.insert ( 0, QString ( "
" ) ); } // use bold text @@ -100,6 +149,13 @@ void CChannelFader::SetText ( const QString sText ) pLabel->setText ( sModText ); } +double CChannelFader::CalcFaderGain ( const int value ) +{ + // convert actual slider range in gain values + // and normalize so that maximum gain is 1 + return static_cast ( value ) / AUD_MIX_FADER_MAX; +} + CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) : QFrame ( parent, f ) { // set modified style @@ -115,7 +171,7 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) : QFra vecpChanFader.Init ( MAX_NUM_CHANNELS ); for ( int i = 0; i < MAX_NUM_CHANNELS; i++ ) { - vecpChanFader[i] = new CChannelFader ( this, pMainLayout, "" ); + vecpChanFader[i] = new CChannelFader ( this, pMainLayout ); vecpChanFader[i]->Hide(); } @@ -123,16 +179,16 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags f ) : QFra // connections ------------------------------------------------------------- // CODE TAG: MAX_NUM_CHANNELS_TAG // make sure we have MAX_NUM_CHANNELS connections!!! - QObject::connect ( vecpChanFader[0], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh0 ( double ) ) ); - QObject::connect ( vecpChanFader[1], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh1 ( double ) ) ); - QObject::connect ( vecpChanFader[2], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh2 ( double ) ) ); - QObject::connect ( vecpChanFader[3], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh3 ( double ) ) ); - QObject::connect ( vecpChanFader[4], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh4 ( double ) ) ); - QObject::connect ( vecpChanFader[5], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh5 ( double ) ) ); - QObject::connect ( vecpChanFader[6], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh6 ( double ) ) ); - QObject::connect ( vecpChanFader[7], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh7 ( double ) ) ); - QObject::connect ( vecpChanFader[8], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh8 ( double ) ) ); - QObject::connect ( vecpChanFader[9], SIGNAL ( valueChanged ( double ) ), this, SLOT ( OnValueChangedCh9 ( double ) ) ); + 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 ) ) ); } void CAudioMixerBoard::HideAll() @@ -160,7 +216,7 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector& vecCh // check if fader was already in use -> preserve gain value if ( !vecpChanFader[i]->IsVisible() ) { - vecpChanFader[i]->ResetGain(); + vecpChanFader[i]->Reset(); // show fader vecpChanFader[i]->Show(); diff --git a/src/audiomixerboard.h b/src/audiomixerboard.h index a2aa2efd..aefbb9a0 100755 --- a/src/audiomixerboard.h +++ b/src/audiomixerboard.h @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -47,33 +48,39 @@ class CChannelFader : public QObject Q_OBJECT public: - CChannelFader ( QWidget* pNW, QHBoxLayout* pParentLayout, QString sName ); + CChannelFader ( QWidget* pNW, QHBoxLayout* pParentLayout ); ~CChannelFader() { pLabel->close(); + pcbMute->close(); + pcbSolo->close(); pFader->close(); // TODO get rid of pMainGrid } void SetText ( const QString sText ); - void Show() { pLabel->show(); pFader->show(); } - void Hide() { pLabel->hide(); pFader->hide(); } + void Show() { pLabel->show(); pcbMute->show(); pcbSolo->show(); pFader->show(); } + void Hide() { pLabel->hide(); pcbMute->hide(); pcbSolo->hide(); pFader->hide(); } bool IsVisible() { return pLabel->isVisible(); } - // init gain value -> maximum value as definition according to server - void ResetGain() { pFader->setValue ( AUD_MIX_FADER_MAX ); } + void Reset(); protected: - QGridLayout* pMainGrid; + double CalcFaderGain ( const int value ); + + QVBoxLayout* pMainGrid; QSlider* pFader; + QCheckBox* pcbMute; + QCheckBox* pcbSolo; QLabel* pLabel; public slots: - void OnValueChanged ( int value ); + void OnFaderValueChanged ( int value ); + void OnMuteStateChanged ( int value ); signals: - void valueChanged ( double value ); + void faderValueChanged ( double value ); }; @@ -96,20 +103,19 @@ protected: public slots: // CODE TAG: MAX_NUM_CHANNELS_TAG // make sure we have MAX_NUM_CHANNELS connections!!! - void OnValueChangedCh0 ( double dValue ) { emit ChangeChanGain ( 0, dValue ); } - void OnValueChangedCh1 ( double dValue ) { emit ChangeChanGain ( 1, dValue ); } - void OnValueChangedCh2 ( double dValue ) { emit ChangeChanGain ( 2, dValue ); } - void OnValueChangedCh3 ( double dValue ) { emit ChangeChanGain ( 3, dValue ); } - void OnValueChangedCh4 ( double dValue ) { emit ChangeChanGain ( 4, dValue ); } - void OnValueChangedCh5 ( double dValue ) { emit ChangeChanGain ( 5, dValue ); } - void OnValueChangedCh6 ( double dValue ) { emit ChangeChanGain ( 6, dValue ); } - void OnValueChangedCh7 ( double dValue ) { emit ChangeChanGain ( 7, dValue ); } - void OnValueChangedCh8 ( double dValue ) { emit ChangeChanGain ( 8, dValue ); } - void OnValueChangedCh9 ( double dValue ) { emit ChangeChanGain ( 9, dValue ); } + 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 ); } signals: void ChangeChanGain ( int iId, double dGain ); }; - #endif // MIXERBOARD_H__FD6B49E1606C2AC__INCLUDED_ diff --git a/src/llconclientdlg.cpp b/src/llconclientdlg.cpp index 5e72a608..b23a8f6e 100755 --- a/src/llconclientdlg.cpp +++ b/src/llconclientdlg.cpp @@ -37,7 +37,8 @@ CLlconClientDlg::CLlconClientDlg ( CClient* pNCliP, QWidget* parent, // add help text to controls QString strInpLevH = tr ( "Input level meter: Shows the level of the " "input audio signal of the sound card. Overload should be avoided." ); - TextLabelInputLevel->setWhatsThis ( strInpLevH ); + TextLabelInputLevelL->setWhatsThis ( strInpLevH ); + TextLabelInputLevelR->setWhatsThis ( strInpLevH ); MultiColorLEDBarInputLevelL->setWhatsThis ( strInpLevH ); MultiColorLEDBarInputLevelR->setWhatsThis ( strInpLevH ); diff --git a/src/llconclientdlgbase.ui b/src/llconclientdlgbase.ui index 02692349..d4adaf2d 100755 --- a/src/llconclientdlgbase.ui +++ b/src/llconclientdlgbase.ui @@ -5,7 +5,7 @@ 0 0 - 520 + 531 324 @@ -83,7 +83,7 @@ 0 - + 0 @@ -99,7 +99,7 @@ - + 0