From bd2cca5a2cd9a34ded534bdc3e4829e924e4407f Mon Sep 17 00:00:00 2001 From: Alberstein8 Date: Sat, 20 Jun 2020 16:20:27 +0200 Subject: [PATCH 1/2] New Select option to move faders at once New Select switch. All selected channels can be modified in their faders levels at the same time. Useful if channels are organized by instruments, set same level to similar instruments or to raise level of one particular set --- src/audiomixerboard.cpp | 72 +++++++++++++++++++++++++++++++++++++++-- src/audiomixerboard.h | 11 ++++++- 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index 97ff7135..23c004f8 100755 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -45,6 +45,7 @@ CChannelFader::CChannelFader ( QWidget* pNW ) pMuteSoloBox = new QWidget ( pFrame ); pcbMute = new QCheckBox ( tr ( "Mute" ), pMuteSoloBox ); pcbSolo = new QCheckBox ( tr ( "Solo" ), pMuteSoloBox ); + pcbSelect = new QCheckBox ( tr ( "Select"), pMuteSoloBox ); pLabelInstBox = new QGroupBox ( pFrame ); plblLabel = new QLabel ( "", pFrame ); @@ -108,6 +109,7 @@ CChannelFader::CChannelFader ( QWidget* pNW ) pMuteSoloGrid->addWidget ( pcbMute, 0, Qt::AlignLeft ); pMuteSoloGrid->addWidget ( pcbSolo, 0, Qt::AlignLeft ); + pMuteSoloGrid->addWidget ( pcbSelect, 0, Qt::AlignLeft ); pMainGrid->addLayout ( pPanGrid ); pMainGrid->addWidget ( pLevelsBox, 0, Qt::AlignHCenter ); @@ -152,6 +154,13 @@ CChannelFader::CChannelFader ( QWidget* pNW ) "one channel to solo." ) ); pcbSolo->setAccessibleName ( tr ( "Solo button" ) ); + pcbSelect->setWhatsThis ( "" + tr ( "Select" ) + ": " + tr ( "With the Select checkbox, the " + "audio channel can be selected among others which means that all changes " + " made in any of the selected channels' fader are adjusted to the rest like all were the same " + ) ); + pcbSelect->setAccessibleName ( tr ( "Select button" ) ); + + QString strFaderText = "" + tr ( "Fader Tag" ) + ": " + tr ( "The fader tag " "identifies the connected client. The tag name, a picture of your " "instrument and the flag of your country can be set in the main window." ); @@ -176,6 +185,9 @@ CChannelFader::CChannelFader ( QWidget* pNW ) QObject::connect ( pcbSolo, &QCheckBox::stateChanged, this, &CChannelFader::soloStateChanged ); + + QObject::connect ( pcbSelect, &QCheckBox::stateChanged, + this, &CChannelFader::OnSelectStateChanged ); } void CChannelFader::SetGUIDesign ( const EGUIDesign eNewDesign ) @@ -202,6 +214,7 @@ void CChannelFader::SetGUIDesign ( const EGUIDesign eNewDesign ) pPanLabel->setText ( tr ( "PAN" ) ); pcbMute->setText ( tr ( "MUTE" ) ); pcbSolo->setText ( tr ( "SOLO" ) ); + pcbSelect->setText ( tr ( "SELECT" ) ); plbrChannelLevel->SetLevelMeterType ( CMultiColorLEDBar::MT_LED ); break; @@ -214,6 +227,7 @@ void CChannelFader::SetGUIDesign ( const EGUIDesign eNewDesign ) pPanLabel->setText ( tr ( "Pan" ) ); pcbMute->setText ( tr ( "M" ) ); pcbSolo->setText ( tr ( "S" ) ); + pcbSelect->setText ( tr ( "SL" ) ); plbrChannelLevel->SetLevelMeterType ( CMultiColorLEDBar::MT_SLIM_BAR ); break; @@ -227,6 +241,7 @@ void CChannelFader::SetGUIDesign ( const EGUIDesign eNewDesign ) pPanLabel->setText ( tr ( "Pan" ) ); pcbMute->setText ( tr ( "Mute" ) ); pcbSolo->setText ( tr ( "Solo" ) ); + pcbSelect->setText ( tr ( "Select" ) ); plbrChannelLevel->SetLevelMeterType ( CMultiColorLEDBar::MT_BAR ); break; } @@ -305,6 +320,7 @@ void CChannelFader::Reset() // reset mute/solo check boxes and level meter pcbMute->setChecked ( false ); pcbSolo->setChecked ( false ); + pcbSelect->setChecked ( false ); plbrChannelLevel->setValue ( 0 ); // clear instrument picture, country flag, tool tips and label text @@ -325,6 +341,7 @@ void CChannelFader::Reset() bOtherChannelIsSolo = false; bIsMyOwnFader = false; + bIsSelected = false; } void CChannelFader::SetFaderLevel ( const int iLevel ) @@ -376,6 +393,11 @@ void CChannelFader::SetRemoteFaderIsMute ( const bool bIsMute ) } } +void CChannelFader::SetFaderIsSelect ( const bool bIsSelected ) +{ + pcbSelect->setChecked ( bIsSelected ); +} + void CChannelFader::SendFaderLevelToServer ( const int iLevel ) { // if mute flag is set or other channel is on solo, do not apply the new @@ -603,6 +625,17 @@ double CChannelFader::CalcFaderGain ( const int value ) } } +void CChannelFader::OnSelectStateChanged ( int value ) +{ + // call selecting function + SetSelected ( static_cast ( value ) == Qt::Checked ); +} + +void CChannelFader::SetSelected ( const bool bState ) +{ + // Just in case we need future actions here... + bIsSelected = bState; +} /******************************************************************************\ * CAudioMixerBoard * @@ -614,6 +647,7 @@ CAudioMixerBoard::CAudioMixerBoard ( QWidget* parent, Qt::WindowFlags ) : vecStoredPanValues ( MAX_NUM_STORED_FADER_SETTINGS, AUD_MIX_PAN_MAX / 2 ), vecStoredFaderIsSolo ( MAX_NUM_STORED_FADER_SETTINGS, false ), vecStoredFaderIsMute ( MAX_NUM_STORED_FADER_SETTINGS, false ), + vecStoredFaderIsSelect( MAX_NUM_STORED_FADER_SETTINGS, false ), iNewClientFaderLevel ( 100 ), bDisplayPans ( false ), bIsPanSupported ( false ), @@ -908,17 +942,20 @@ void CAudioMixerBoard::ApplyNewConClientList ( CVector& vecChanInf int iStoredPanValue; bool bStoredFaderIsSolo; bool bStoredFaderIsMute; + bool bStoredFaderIsSelect; if ( GetStoredFaderSettings ( vecChanInfo[j], iStoredFaderLevel, iStoredPanValue, bStoredFaderIsSolo, - bStoredFaderIsMute ) ) + bStoredFaderIsMute, + bStoredFaderIsSelect) ) { vecpChanFader[i]->SetFaderLevel ( iStoredFaderLevel ); vecpChanFader[i]->SetPanValue ( iStoredPanValue ); vecpChanFader[i]->SetFaderIsSolo ( bStoredFaderIsSolo ); vecpChanFader[i]->SetFaderIsMute ( bStoredFaderIsMute ); + vecpChanFader[i]->SetFaderIsSelect ( bStoredFaderIsSelect ); } } @@ -1005,7 +1042,32 @@ void CAudioMixerBoard::UpdateGainValue ( const int iChannelIdx, const double dValue, const bool bIsMyOwnFader ) { - emit ChangeChanGain ( iChannelIdx, dValue, bIsMyOwnFader ); + if ( !vecpChanFader[iChannelIdx]->IsSelect() ) + { + emit ChangeChanGain ( iChannelIdx, dValue, bIsMyOwnFader ); + } + else // This is selected, so all selected must be updated as well + { + // update current, don't touch fader + emit ChangeChanGain ( iChannelIdx, dValue, bIsMyOwnFader ); + for ( int i = MAX_NUM_CHANNELS - 1; i >= 0; i-- ) + { + // update rest of faders selected + if ( vecpChanFader[i]->IsSelect() ) + { + if ( i != iChannelIdx ) + { + // temporaly unselect so it does not repeat this again and again... + vecpChanFader[i]->SetFaderIsSelect( FALSE ); + // "move" faders with moving fader level + vecpChanFader[i]->SetFaderLevel( vecpChanFader[iChannelIdx]->GetFaderLevel() ); + // back to selected status + vecpChanFader[i]->SetFaderIsSelect( TRUE ); + } + } + } + } + } void CAudioMixerBoard::UpdatePanValue ( const int iChannelIdx, @@ -1024,6 +1086,7 @@ void CAudioMixerBoard::StoreFaderSettings ( CChannelFader* pChanFader ) CVector viOldStoredPanValues ( vecStoredPanValues ); CVector vbOldStoredFaderIsSolo ( vecStoredFaderIsSolo ); CVector vbOldStoredFaderIsMute ( vecStoredFaderIsMute ); + CVector vbOldStoredFaderIsSelected ( vecStoredFaderIsSelect ); // init temporary list count (may be overwritten later on) int iTempListCnt = 0; @@ -1038,6 +1101,7 @@ void CAudioMixerBoard::StoreFaderSettings ( CChannelFader* pChanFader ) vecStoredPanValues[0] = pChanFader->GetPanValue(); vecStoredFaderIsSolo[0] = pChanFader->IsSolo(); vecStoredFaderIsMute[0] = pChanFader->IsMute(); + vecStoredFaderIsSelect[0] = pChanFader->IsSelect(); iTempListCnt = 1; for ( int iIdx = 0; iIdx < MAX_NUM_STORED_FADER_SETTINGS; iIdx++ ) @@ -1066,7 +1130,8 @@ bool CAudioMixerBoard::GetStoredFaderSettings ( const CChannelInfo& ChanInfo, int& iStoredFaderLevel, int& iStoredPanValue, bool& bStoredFaderIsSolo, - bool& bStoredFaderIsMute) + bool& bStoredFaderIsMute, + bool& bStoredFaderIsSelect) { // only do the check if the name string is not empty if ( !ChanInfo.strName.isEmpty() ) @@ -1081,6 +1146,7 @@ bool CAudioMixerBoard::GetStoredFaderSettings ( const CChannelInfo& ChanInfo, iStoredPanValue = vecStoredPanValues[iIdx]; bStoredFaderIsSolo = vecStoredFaderIsSolo[iIdx] != 0; bStoredFaderIsMute = vecStoredFaderIsMute[iIdx] != 0; + bStoredFaderIsSelect = vecStoredFaderIsSelect[iIdx] != 0; // values found and copied, return OK return true; diff --git a/src/audiomixerboard.h b/src/audiomixerboard.h index 3d8457be..e46cba12 100755 --- a/src/audiomixerboard.h +++ b/src/audiomixerboard.h @@ -57,6 +57,7 @@ public: bool IsVisible() { return !pFrame->isHidden(); } bool IsSolo() { return pcbSolo->isChecked(); } bool IsMute() { return pcbMute->isChecked(); } + bool IsSelect() { return pcbSelect->isChecked(); } void SetGUIDesign ( const EGUIDesign eNewDesign ); void SetDisplayChannelLevel ( const bool eNDCL ); bool GetDisplayChannelLevel(); @@ -69,6 +70,7 @@ public: void SetFaderIsSolo ( const bool bIsSolo ); void SetFaderIsMute ( const bool bIsMute ); void SetRemoteFaderIsMute ( const bool bIsMute ); + void SetFaderIsSelect ( const bool bIsMute ); int GetFaderLevel() { return pFader->value(); } int GetPanValue() { return pPan->value(); } void Reset(); @@ -81,6 +83,7 @@ protected: void SendFaderLevelToServer ( const int iLevel ); void SendPanValueToServer ( const int iPan ); void SetupFaderTag ( const ESkillLevel eSkillLevel ); + void SetSelected ( const bool bState ); QFrame* pFrame; @@ -96,6 +99,7 @@ protected: QCheckBox* pcbMute; QCheckBox* pcbSolo; + QCheckBox* pcbSelect; QGroupBox* pLabelInstBox; QLabel* plblLabel; @@ -106,11 +110,13 @@ protected: bool bOtherChannelIsSolo; bool bIsMyOwnFader; + bool bIsSelected; public slots: void OnLevelValueChanged ( int value ) { SendFaderLevelToServer ( value ); } void OnPanValueChanged ( int value ) { SendPanValueToServer ( value ); } void OnMuteStateChanged ( int value ); + void OnSelectStateChanged ( int value ); signals: void gainValueChanged ( double value, bool bIsMyOwnFader ); @@ -166,12 +172,14 @@ public: void SetRecorderState ( const ERecorderState newRecorderState ); + // settings CVector vecStoredFaderTags; CVector vecStoredFaderLevels; CVector vecStoredPanValues; CVector vecStoredFaderIsSolo; CVector vecStoredFaderIsMute; + CVector vecStoredFaderIsSelect; int iNewClientFaderLevel; protected: @@ -194,7 +202,8 @@ protected: int& iStoredFaderLevel, int& iStoredPanValue, bool& bStoredFaderIsSolo, - bool& bStoredFaderIsMute ); + bool& bStoredFaderIsMute, + bool& bStoredFaderIsSelect); void StoreFaderSettings ( CChannelFader* pChanFader ); void UpdateSoloStates(); From 25f10fcb6dcd917a2323a61e3afdd98ca04408b9 Mon Sep 17 00:00:00 2001 From: Alberstein8 Date: Sat, 20 Jun 2020 16:26:18 +0200 Subject: [PATCH 2/2] Update audiomixerboard.cpp --- src/audiomixerboard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audiomixerboard.cpp b/src/audiomixerboard.cpp index 23c004f8..d86e01af 100755 --- a/src/audiomixerboard.cpp +++ b/src/audiomixerboard.cpp @@ -317,7 +317,7 @@ void CChannelFader::Reset() pFader->setValue ( AUD_MIX_FADER_MAX ); pPan->setValue ( AUD_MIX_PAN_MAX / 2 ); - // reset mute/solo check boxes and level meter + // reset mute/solo/select check boxes and level meter pcbMute->setChecked ( false ); pcbSolo->setChecked ( false ); pcbSelect->setChecked ( false );