diff --git a/src/analyzerconsole.cpp b/src/analyzerconsole.cpp index d1648646..5e84d1bf 100644 --- a/src/analyzerconsole.cpp +++ b/src/analyzerconsole.cpp @@ -71,8 +71,8 @@ CAnalyzerConsole::CAnalyzerConsole ( CClient* pNCliP, // Connections ------------------------------------------------------------- // timers - QObject::connect ( &TimerErrRateUpdate, SIGNAL ( timeout() ), - this, SLOT ( OnTimerErrRateUpdate() ) ); + QObject::connect ( &TimerErrRateUpdate, &QTimer::timeout, + this, &CAnalyzerConsole::OnTimerErrRateUpdate ); } void CAnalyzerConsole::showEvent ( QShowEvent* ) diff --git a/src/clientsettingsdlg.cpp b/src/clientsettingsdlg.cpp index 50e24e33..b553cb7f 100755 --- a/src/clientsettingsdlg.cpp +++ b/src/clientsettingsdlg.cpp @@ -400,26 +400,26 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, this, &CClientSettingsDlg::OnNewClientLevelEditingFinished ); // combo boxes - QObject::connect ( cbxSoundcard, SIGNAL ( activated ( int ) ), - this, SLOT ( OnSoundcardActivated ( int ) ) ); + QObject::connect ( cbxSoundcard, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnSoundcardActivated ); - QObject::connect ( cbxLInChan, SIGNAL ( activated ( int ) ), - this, SLOT ( OnLInChanActivated ( int ) ) ); + QObject::connect ( cbxLInChan, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnLInChanActivated ); - QObject::connect ( cbxRInChan, SIGNAL ( activated ( int ) ), - this, SLOT ( OnRInChanActivated ( int ) ) ); + QObject::connect ( cbxRInChan, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnRInChanActivated ); - QObject::connect ( cbxLOutChan, SIGNAL ( activated ( int ) ), - this, SLOT ( OnLOutChanActivated ( int ) ) ); + QObject::connect ( cbxLOutChan, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnLOutChanActivated ); - QObject::connect ( cbxROutChan, SIGNAL ( activated ( int ) ), - this, SLOT ( OnROutChanActivated ( int ) ) ); + QObject::connect ( cbxROutChan, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnROutChanActivated ); - QObject::connect ( cbxAudioChannels, SIGNAL ( activated ( int ) ), - this, SLOT ( OnAudioChannelsActivated ( int ) ) ); + QObject::connect ( cbxAudioChannels, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnAudioChannelsActivated ); - QObject::connect ( cbxAudioQuality, SIGNAL ( activated ( int ) ), - this, SLOT ( OnAudioQualityActivated ( int ) ) ); + QObject::connect ( cbxAudioQuality, static_cast ( &QComboBox::activated ), + this, &CClientSettingsDlg::OnAudioQualityActivated ); // buttons QObject::connect ( butDriverSetup, &QPushButton::clicked, @@ -427,8 +427,8 @@ CClientSettingsDlg::CClientSettingsDlg ( CClient* pNCliP, QWidget* parent, // misc QObject::connect ( &SndCrdBufferDelayButtonGroup, - SIGNAL ( buttonClicked ( QAbstractButton* ) ), this, - SLOT ( OnSndCrdBufferDelayButtonGroupClicked ( QAbstractButton* ) ) ); + static_cast ( &QButtonGroup::buttonClicked ), + this, &CClientSettingsDlg::OnSndCrdBufferDelayButtonGroupClicked ); // Timers ------------------------------------------------------------------ diff --git a/src/connectdlg.cpp b/src/connectdlg.cpp index 6e716a4b..6623cca5 100755 --- a/src/connectdlg.cpp +++ b/src/connectdlg.cpp @@ -169,8 +169,8 @@ CConnectDlg::CConnectDlg ( CClient* pNCliP, QObject::connect ( cbxServerAddr, &QComboBox::editTextChanged, this, &CConnectDlg::OnServerAddrEditTextChanged ); - QObject::connect ( cbxCentServAddrType, SIGNAL ( activated ( int ) ), - this, SLOT ( OnCentServAddrTypeChanged ( int ) ) ); + QObject::connect ( cbxCentServAddrType, static_cast ( &QComboBox::activated ), + this, &CConnectDlg::OnCentServAddrTypeChanged ); // check boxes QObject::connect ( chbExpandAll, &QCheckBox::stateChanged, diff --git a/src/server.cpp b/src/server.cpp index 0945fe43..acab3b19 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -59,8 +59,8 @@ CHighPrecisionTimer::CHighPrecisionTimer ( const bool bNewUseDoubleSystemFrameSi veciTimeOutIntervals[2] = 0; // connect timer timeout signal - QObject::connect ( &Timer, SIGNAL ( timeout() ), - this, SLOT ( OnTimer() ) ); + QObject::connect ( &Timer, &QTimer::timeout, + this, &CHighPrecisionTimer::OnTimer ); } void CHighPrecisionTimer::Start() @@ -238,6 +238,7 @@ CServer::CServer ( const int iNewMaxNumChan, iMaxNumChannels ( iNewMaxNumChan ), Socket ( this, iPortNumber ), Logging ( iMaxDaysHistory ), + iFrameCount ( 0 ), JamRecorder ( strRecordingDirName ), bWriteStatusHTMLFile ( false ), HighPrecisionTimer ( bNUseDoubleSystemFrameSize ), @@ -752,22 +753,14 @@ void CServer::Stop() void CServer::OnTimer() { - int i, j, iUnused; - int iClientFrameSizeSamples = 0; // initialize to avoid a compiler warning - OpusCustomDecoder* CurOpusDecoder; - OpusCustomEncoder* CurOpusEncoder; - unsigned char* pCurCodedData; - /* -// TEST do a timer jitter measurement -static CTimingMeas JitterMeas ( 1000, "test2.dat" ); -JitterMeas.Measure(); +static CTimingMeas JitterMeas ( 1000, "test2.dat" ); JitterMeas.Measure(); // TEST do a timer jitter measurement */ - // Get data from all connected clients ------------------------------------- // some inits int iNumClients = 0; // init connected client counter bool bChannelIsNowDisconnected = false; + bool bUpdateChannelLevels = false; bool bSendChannelLevels = false; // Make put and get calls thread safe. Do not forget to unlock mutex @@ -775,7 +768,7 @@ JitterMeas.Measure(); Mutex.lock(); { // first, get number and IDs of connected channels - for ( i = 0; i < iMaxNumChannels; i++ ) + for ( int i = 0; i < iMaxNumChannels; i++ ) { if ( vecChannels[i].IsConnected() ) { @@ -789,8 +782,12 @@ JitterMeas.Measure(); } // process connected channels - for ( i = 0; i < iNumClients; i++ ) + for ( int i = 0; i < iNumClients; i++ ) { + int iClientFrameSizeSamples = 0; // initialize to avoid a compiler warning + OpusCustomDecoder* CurOpusDecoder; + unsigned char* pCurCodedData; + // get actual ID of current channel const int iCurChanID = vecChanIDsCurConChan[i]; @@ -850,7 +847,7 @@ JitterMeas.Measure(); } // get gains of all connected channels - for ( j = 0; j < iNumClients; j++ ) + for ( int j = 0; j < iNumClients; j++ ) { // The second index of "vecvecdGains" does not represent // the channel ID! Therefore we have to use @@ -865,6 +862,12 @@ JitterMeas.Measure(); vecvecdPannings[i][j] = vecChannels[iCurChanID].GetPan ( vecChanIDsCurConChan[j] ); } + // flag for updating channel levels (if at least one clients wants it) + if ( vecChannels[iCurChanID].ChannelLevelsRequired() ) + { + bUpdateChannelLevels = true; + } + // If the server frame size is smaller than the received OPUS frame size, we need a conversion // buffer which stores the large buffer. // Note that we have a shortcut here. If the conversion buffer is not needed, the boolean flag @@ -908,11 +911,11 @@ JitterMeas.Measure(); // OPUS decode received data stream if ( CurOpusDecoder != nullptr ) { - iUnused = opus_custom_decode ( CurOpusDecoder, - pCurCodedData, - iCeltNumCodedBytes, - &vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], - iClientFrameSizeSamples ); + Q_UNUSED ( opus_custom_decode ( CurOpusDecoder, + pCurCodedData, + iCeltNumCodedBytes, + &vecvecsData[i][iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], + iClientFrameSizeSamples ) ); } } @@ -941,35 +944,20 @@ JitterMeas.Measure(); // one client is connected. if ( iNumClients > 0 ) { - // low frequency updates - if ( iFrameCount > CHANNEL_LEVEL_UPDATE_INTERVAL ) + // calculate levels for all connected clients + if ( bUpdateChannelLevels ) { - iFrameCount = 0; - - // Calculate channel levels if any client has requested them - for ( int i = 0; i < iNumClients; i++ ) - { - if ( vecChannels[vecChanIDsCurConChan[i]].ChannelLevelsRequired() ) - { - bSendChannelLevels = true; - - CreateLevelsForAllConChannels ( iNumClients, - vecNumAudioChannels, - vecvecsData, - vecChannelLevels ); - break; - } - } - } - iFrameCount++; - if ( bUseDoubleSystemFrameSize ) - { - // additional increment needed for double frame size to get to the same time interval - iFrameCount++; + bSendChannelLevels = CreateLevelsForAllConChannels ( iNumClients, + vecNumAudioChannels, + vecvecsData, + vecChannelLevels ); } for ( int i = 0; i < iNumClients; i++ ) { + int iClientFrameSizeSamples = 0; // initialize to avoid a compiler warning + OpusCustomEncoder* CurOpusEncoder; + // get actual ID of current channel const int iCurChanID = vecChanIDsCurConChan[i]; @@ -1056,11 +1044,11 @@ JitterMeas.Measure(); opus_custom_encoder_ctl ( CurOpusEncoder, OPUS_SET_BITRATE ( CalcBitRateBitsPerSecFromCodedBytes ( iCeltNumCodedBytes, iClientFrameSizeSamples ) ) ); - iUnused = opus_custom_encode ( CurOpusEncoder, - &vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], - iClientFrameSizeSamples, - &vecbyCodedData[0], - iCeltNumCodedBytes ); + Q_UNUSED ( opus_custom_encode ( CurOpusEncoder, + &vecsSendData[iB * SYSTEM_FRAME_SIZE_SAMPLES * vecNumAudioChannels[i]], + iClientFrameSizeSamples, + &vecbyCodedData[0], + iCeltNumCodedBytes ) ); } // send separate mix to current clients @@ -1075,7 +1063,9 @@ opus_custom_encoder_ctl ( CurOpusEncoder, // send channel levels if ( bSendChannelLevels && vecChannels[iCurChanID].ChannelLevelsRequired() ) { - ConnLessProtocol.CreateCLChannelLevelListMes ( vecChannels[iCurChanID].GetAddress(), vecChannelLevels, iNumClients ); + ConnLessProtocol.CreateCLChannelLevelListMes ( vecChannels[iCurChanID].GetAddress(), + vecChannelLevels, + iNumClients ); } } } @@ -1086,8 +1076,6 @@ opus_custom_encoder_ctl ( CurOpusEncoder, // does not consume any significant CPU when no client is connected. Stop(); } - - Q_UNUSED ( iUnused ) } /// @brief Mix all audio data from all clients together. @@ -1403,7 +1391,7 @@ bool CServer::PutAudioData ( const CVector& vecbyRecBuf, int& iCurChanID ) { bool bNewConnection = false; // init return value - bool bChanOK = true; // init with ok, might be overwritten + bool bChanOK = true; // init with ok, might be overwritten Mutex.lock(); { @@ -1558,58 +1546,77 @@ void CServer::customEvent ( QEvent* pEvent ) } /// @brief Compute frame peak level for each client -void CServer::CreateLevelsForAllConChannels ( const int iNumClients, +bool CServer::CreateLevelsForAllConChannels ( const int iNumClients, const CVector& vecNumAudioChannels, const CVector > vecvecsData, CVector& vecLevelsOut ) { - int i, j, k; + int i, j, k; + bool bLevelsWereUpdated = false; - // init return vector with zeros since we mix all channels on that vector - vecLevelsOut.Reset ( 0 ); - - for ( j = 0; j < iNumClients; j++ ) + // low frequency updates + if ( iFrameCount > CHANNEL_LEVEL_UPDATE_INTERVAL ) { - // get a reference to the audio data - const CVector& vecsData = vecvecsData[j]; + iFrameCount = 0; + bLevelsWereUpdated = true; - double dCurLevel = 0.0; + // init return vector with zeros since we mix all channels on that vector + vecLevelsOut.Reset ( 0 ); - if ( vecNumAudioChannels[j] == 1 ) + for ( j = 0; j < iNumClients; j++ ) { - // mono - for ( i = 0; i < iServerFrameSizeSamples; i += 3 ) + // get a reference to the audio data + const CVector& vecsData = vecvecsData[j]; + + double dCurLevel = 0.0; + + if ( vecNumAudioChannels[j] == 1 ) { - dCurLevel = std::max ( dCurLevel, fabs ( static_cast ( vecsData[i] ) ) ); + // mono + for ( i = 0; i < iServerFrameSizeSamples; i += 3 ) + { + dCurLevel = std::max ( dCurLevel, fabs ( static_cast ( vecsData[i] ) ) ); + } } - } - else - { - // stereo: apply stereo-to-mono attenuation - for ( i = 0, k = 0; i < iServerFrameSizeSamples; i += 3, k += 6 ) + else { - double sMix = ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2; - dCurLevel = std::max ( dCurLevel, fabs ( sMix ) ); + // stereo: apply stereo-to-mono attenuation + for ( i = 0, k = 0; i < iServerFrameSizeSamples; i += 3, k += 6 ) + { + double sMix = ( static_cast ( vecsData[k] ) + vecsData[k + 1] ) / 2; + dCurLevel = std::max ( dCurLevel, fabs ( sMix ) ); + } } + + // smoothing + const int iChId = vecChanIDsCurConChan[j]; + dCurLevel = std::max ( dCurLevel, vecChannels[iChId].GetPrevLevel() * 0.5 ); + vecChannels[iChId].SetPrevLevel ( dCurLevel ); + + // logarithmic measure + double dCurSigLevel = CStereoSignalLevelMeter::CalcLogResult ( dCurLevel ); + + // map to signal level meter + dCurSigLevel -= LOW_BOUND_SIG_METER; + dCurSigLevel *= NUM_STEPS_LED_BAR / ( UPPER_BOUND_SIG_METER - LOW_BOUND_SIG_METER ); + + if ( dCurSigLevel < 0 ) + { + dCurSigLevel = 0; + } + + vecLevelsOut[j] = static_cast ( ceil ( dCurSigLevel ) ); } - - // smoothing - const int iChId = vecChanIDsCurConChan[j]; - dCurLevel = std::max ( dCurLevel, vecChannels[iChId].GetPrevLevel() * 0.5 ); - vecChannels[iChId].SetPrevLevel ( dCurLevel ); - - // logarithmic measure - double dCurSigLevel = CStereoSignalLevelMeter::CalcLogResult ( dCurLevel ); - - // map to signal level meter - dCurSigLevel -= LOW_BOUND_SIG_METER; - dCurSigLevel *= NUM_STEPS_LED_BAR / ( UPPER_BOUND_SIG_METER - LOW_BOUND_SIG_METER ); - - if ( dCurSigLevel < 0 ) - { - dCurSigLevel = 0; - } - - vecLevelsOut[j] = static_cast ( ceil ( dCurSigLevel ) ); } + + // increment the frame counter needed for low frequency update trigger + iFrameCount++; + + if ( bUseDoubleSystemFrameSize ) + { + // additional increment needed for double frame size to get to the same time interval + iFrameCount++; + } + + return bLevelsWereUpdated; } diff --git a/src/server.h b/src/server.h index f41fd04d..d025cc75 100755 --- a/src/server.h +++ b/src/server.h @@ -298,7 +298,7 @@ protected: bool bUseDoubleSystemFrameSize; int iServerFrameSizeSamples; - void CreateLevelsForAllConChannels ( const int iNumClients, + bool CreateLevelsForAllConChannels ( const int iNumClients, const CVector& vecNumAudioChannels, const CVector > vecvecsData, CVector& vecLevelsOut ); @@ -347,7 +347,7 @@ protected: CServerLogging Logging; // channel level update frame interval counter - uint16_t iFrameCount; + int iFrameCount; // recording thread recorder::CJamRecorder JamRecorder; diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index 3b6c9c0b..a23d36fb 100755 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -357,11 +357,11 @@ lvwClients->setMinimumHeight ( 140 ); this, &CServerDlg::OnLocationCityTextChanged ); // combo boxes - QObject::connect ( cbxLocationCountry, SIGNAL ( activated ( int ) ), - this, SLOT ( OnLocationCountryActivated ( int ) ) ); + QObject::connect ( cbxLocationCountry, static_cast ( &QComboBox::activated ), + this, &CServerDlg::OnLocationCountryActivated ); - QObject::connect ( cbxCentServAddrType, SIGNAL ( activated ( int ) ), - this, SLOT ( OnCentServAddrTypeActivated ( int ) ) ); + QObject::connect ( cbxCentServAddrType, static_cast ( &QComboBox::activated ), + this, &CServerDlg::OnCentServAddrTypeActivated ); // push buttons QObject::connect ( pbtNewRecording, &QPushButton::released, diff --git a/src/socket.cpp b/src/socket.cpp index b87f9d5f..36b63dd8 100755 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -117,8 +117,8 @@ void CSocket::Init ( const quint16 iPortNumber ) QObject::connect ( this, &CSocket::ProtcolCLMessageReceived, pChannel, &CChannel::OnProtcolCLMessageReceived ); - QObject::connect ( this, SIGNAL ( NewConnection() ), - pChannel, SLOT ( OnNewConnection() ) ); + QObject::connect ( this, static_cast ( &CSocket::NewConnection ), + pChannel, &CChannel::OnNewConnection ); } else { @@ -130,8 +130,8 @@ void CSocket::Init ( const quint16 iPortNumber ) QObject::connect ( this, &CSocket::ProtcolCLMessageReceived, pServer, &CServer::OnProtcolCLMessageReceived ); - QObject::connect ( this, SIGNAL ( NewConnection ( int, CHostAddress ) ), - pServer, SLOT ( OnNewConnection ( int, CHostAddress ) ) ); + QObject::connect ( this, static_cast ( &CSocket::NewConnection ), + pServer, &CServer::OnNewConnection ); QObject::connect ( this, &CSocket::ServerFull, pServer, &CServer::OnServerFull ); diff --git a/src/util.cpp b/src/util.cpp index 9ede9148..f475f812 100755 --- a/src/util.cpp +++ b/src/util.cpp @@ -731,17 +731,17 @@ CMusProfDlg::CMusProfDlg ( CClient* pNCliP, QObject::connect ( pedtAlias, &QLineEdit::textChanged, this, &CMusProfDlg::OnAliasTextChanged ); - QObject::connect ( pcbxInstrument, SIGNAL ( activated ( int ) ), - this, SLOT ( OnInstrumentActivated ( int ) ) ); + QObject::connect ( pcbxInstrument, static_cast ( &QComboBox::activated ), + this, &CMusProfDlg::OnInstrumentActivated ); - QObject::connect ( pcbxCountry, SIGNAL ( activated ( int ) ), - this, SLOT ( OnCountryActivated ( int ) ) ); + QObject::connect ( pcbxCountry, static_cast ( &QComboBox::activated ), + this, &CMusProfDlg::OnCountryActivated ); QObject::connect ( pedtCity, &QLineEdit::textChanged, this, &CMusProfDlg::OnCityTextChanged ); - QObject::connect ( pcbxSkill, SIGNAL ( activated ( int ) ), - this, SLOT ( OnSkillActivated ( int ) ) ); + QObject::connect ( pcbxSkill, static_cast ( &QComboBox::activated ), + this, &CMusProfDlg::OnSkillActivated ); QObject::connect ( butClose, &QPushButton::clicked, this, &CMusProfDlg::accept );