From 30c8f462c35d8985f5d77bc1ccd103b07592b58c Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Tue, 4 Aug 2020 16:43:32 +0200 Subject: [PATCH] add multithreading CONFIG parameter and use thread synchronization --- Jamulus.pro | 8 +++++++- src/server.cpp | 45 ++++++++++++++++++++------------------------- src/server.h | 23 ++++------------------- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/Jamulus.pro b/Jamulus.pro index 2ae267dc..7317fd9b 100755 --- a/Jamulus.pro +++ b/Jamulus.pro @@ -6,12 +6,18 @@ contains(CONFIG, "noupcasename") { TARGET = jamulus } +# support multi-threading with OMP if requested +contains(CONFIG, "multithreading") { + message(Multithreading in the server is enabled.) + DEFINES += USE_MULTITHREADING + QT += concurrent +} + CONFIG += qt \ thread \ release QT += network \ - concurrent \ xml contains(CONFIG, "headless") { diff --git a/src/server.cpp b/src/server.cpp index 0ca900ba..92ea936e 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -979,6 +979,10 @@ static CTimingMeas JitterMeas ( 1000, "test2.dat" ); JitterMeas.Measure(); // TE // Process data ------------------------------------------------------------ +#ifdef USE_MULTITHREADING + QFutureSynchronizer FutureSynchronizer; +#endif + // Check if at least one client is connected. If not, stop server until // one client is connected. if ( iNumClients > 0 ) @@ -1055,35 +1059,26 @@ static CTimingMeas JitterMeas ( 1000, "test2.dat" ); JitterMeas.Measure(); // TE } } -// TEST -QFuture future = QtConcurrent::run ( this, &CServer::MixEncodeTransmitData, - i, - iCurChanID, - pCurOpusEncoder, - iClientFrameSizeSamples, - iNumClients ); - - // generate a separate mix for each channel, OPUS encode the - // audio data and transmit the network packet -/* - MixEncodeTransmitData ( vecvecsData, - vecvecdGains[i], - vecvecdPannings[i], - vecNumAudioChannels, - vecvecsIntermediateProcBuf[i], - vecvecsSendData[i], - vecvecbyCodedData[i], - vecChannels[iCurChanID], - DoubleFrameSizeConvBufOut[iCurChanID], - vecUseDoubleSysFraSizeConvBuf[i], - vecNumFrameSizeConvBlocks[i], + // audio data and transmit the network packet (note that if + // multithreading is enabled, the work is distributed over + // all available processor cores) +#ifdef USE_MULTITHREADING + // by using the future synchronizer we make sure that all + // threads are done when we leave the timer callback function + FutureSynchronizer.addFuture ( QtConcurrent::run ( this, &CServer::MixEncodeTransmitData, + i, + iCurChanID, + pCurOpusEncoder, + iClientFrameSizeSamples, + iNumClients ) ); +#else + MixEncodeTransmitData ( i, + iCurChanID, pCurOpusEncoder, - iCeltNumCodedBytes, iClientFrameSizeSamples, - iCurNumAudChan, iNumClients ); -*/ +#endif } } else diff --git a/src/server.h b/src/server.h index c04e8f8e..56bd4443 100755 --- a/src/server.h +++ b/src/server.h @@ -29,8 +29,11 @@ #include #include #include -#include #include +#ifdef USE_MULTITHREADING +# include +# include +#endif #ifdef USE_OPUS_SHARED_LIB # include "opus/opus_custom.h" #else @@ -302,24 +305,6 @@ protected: void WriteHTMLChannelList(); -/* - void MixEncodeTransmitData ( const CVector >& vecvecsData, - const CVector& vecdGains, - const CVector& vecdPannings, - const CVector& vecNumAudioChannels, - CVector& vecdIntermProcBuf, - CVector& vecsSendData, - CVector& vecbyCodedData, - CChannel& Channel, - CConvBuf& DoubleFrameSizeConvBufOut, - const int iUseDoubleSysFraSizeConvBuf, - const int iNumFrameSizeConvBlocks, - OpusCustomEncoder* pCurOpusEncoder, - const int iCeltNumCodedBytes, - const int iClientFrameSizeSamples, - const int iCurNumAudChan, - const int iNumClients ); -*/ // TEST void MixEncodeTransmitData ( const int iIdx,