From a6e779f87472dd07f30fd2cc488c0883693b5d39 Mon Sep 17 00:00:00 2001 From: Volker Fischer Date: Sun, 14 Jun 2020 08:54:31 +0200 Subject: [PATCH 1/9] updated delay pan code by Detlef Henning (received via email on 6/12/2020) --- src/global.h | 6 ++ src/server.cpp | 135 +++++++++++++++++++++++++++++++++++++++---- src/server.h | 12 +++- src/serverdlg.cpp | 15 +++++ src/serverdlg.h | 1 + src/serverdlgbase.ui | 7 +++ 6 files changed, 165 insertions(+), 11 deletions(-) diff --git a/src/global.h b/src/global.h index 28ff6444b6..322ff2ac0f 100755 --- a/src/global.h +++ b/src/global.h @@ -93,6 +93,12 @@ LED bar: lbr #define SYSTEM_FRAME_SIZE_SAMPLES 64 #define DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES ( 2 * SYSTEM_FRAME_SIZE_SAMPLES ) +//****************************************************************************************** +// additional buffer for delay panning 200601 +#define MAX_DELAY_PANNING_SAMPLES 64 // 32 --> 64 +#define PANNING_TYPE_DEFAULT 2 // 2 = delay panning +//****************************************************************************************** + // default server address and port numbers #define DEFAULT_SERVER_ADDRESS "anygenre1.jamulus.io" #define DEFAULT_PORT_NUMBER 22124 diff --git a/src/server.cpp b/src/server.cpp index bd9635882f..0eda823f83 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -330,6 +330,7 @@ CServer::CServer ( const int iNewMaxNumChan, iServerFrameSizeSamples = SYSTEM_FRAME_SIZE_SAMPLES; } + bDelayPan = PANNING_TYPE_DEFAULT == 2; // To avoid audio clitches, in the entire realtime timer audio processing // routine including the ProcessData no memory must be allocated. Since we @@ -341,6 +342,7 @@ CServer::CServer ( const int iNewMaxNumChan, vecvecfGains.Init ( iMaxNumChannels ); vecvecfPannings.Init ( iMaxNumChannels ); vecvecsData.Init ( iMaxNumChannels ); + vecvecsData2.Init ( iMaxNumChannels ); vecvecsSendData.Init ( iMaxNumChannels ); vecvecfIntermediateProcBuf.Init ( iMaxNumChannels ); vecvecbyCodedData.Init ( iMaxNumChannels ); @@ -357,6 +359,7 @@ CServer::CServer ( const int iNewMaxNumChan, // we always use stereo audio buffers (which is the worst case) vecvecsData[i].Init ( 2 /* stereo */ * DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES /* worst case buffer size */ ); + vecvecsData2[i].Init ( 2 /* stereo */ * DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES /* worst case buffer size */ ); // (note that we only allocate iMaxNumChannels buffers for the send // and coded data because of the OMP implementation) @@ -934,6 +937,16 @@ static CTimingMeas JitterMeas ( 1000, "test2.dat" ); JitterMeas.Measure(); // TE FutureSynchronizer.waitForFinished(); FutureSynchronizer.clearFutures(); } + if ( bDelayPan ) + { + for ( int i = 0; i < iNumClients; i++ ) + { + for ( int j = 0; j < 2 * (iServerFrameSizeSamples); j++ ) + { + vecvecsData2[i][j] = vecvecsData[i][j]; + } + } + } } else { @@ -1196,12 +1209,22 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, else { // Stereo target channel ----------------------------------------------- + + const int maxPanDelay = MAX_DELAY_PANNING_SAMPLES; // 32 --> 64 + + int iLpan, iRpan, iPan; + for ( j = 0; j < iNumClients; j++ ) { // get a reference to the audio data and gain/pan of the current client const CVector& vecsData = vecvecsData[j]; + const CVector& vecsData2 = vecvecsData2[j]; + const float fGain = vecvecfGains[iChanCnt][j]; - const float fPan = vecvecfPannings[iChanCnt][j]; + const float fPan = bDelayPan ? 0.5f : vecvecfPannings[iChanCnt][j]; + const int iPanDel = lround( (float)(2 * maxPanDelay - 2) * (vecvecfPannings[iChanCnt][j] - 0.5f) ); + const int iPanDelL = ( iPanDel > 0 ) ? iPanDel : 0; + const int iPanDelR = ( iPanDel < 0 ) ? -iPanDel : 0; // calculate combined gain/pan for each stereo channel where we define // the panning that center equals full gain for both channels @@ -1216,9 +1239,35 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, // mono: copy same mono data in both out stereo audio channels for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { - // left/right channel - vecfIntermProcBuf[k] += vecsData[i]; - vecfIntermProcBuf[k + 1] += vecsData[i]; + if ( bDelayPan ) + { + // pan address shift + // left channel + iLpan = i - iPanDelL; + if ( iLpan < 0 ) + { // get from second + iLpan = iLpan + iServerFrameSizeSamples; // + vecfIntermProcBuf[k] += vecsData2[iLpan]; + } + else + vecfIntermProcBuf[k] += vecsData[iLpan]; + // right channel + iRpan = i - iPanDelR; + if ( iRpan < 0 ) + { // get from second + iRpan = iRpan + iServerFrameSizeSamples; // + vecfIntermProcBuf[k + 1] += vecsData2[iRpan]; + } + else + vecfIntermProcBuf[k + 1] += vecsData[iRpan]; + ; + } + else + { + // left/right channel + vecfIntermProcBuf[k] += vecsData[i]; + vecfIntermProcBuf[k + 1] += vecsData[i]; + } } } else @@ -1226,7 +1275,26 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, // stereo for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) { - vecfIntermProcBuf[i] += vecsData[i]; + if ( bDelayPan ) + { + // pan address shift + iLpan = i - iPanDelL; + iRpan = i - iPanDelR; + if ( (i & 1) == 0 ) + iPan = i - 2 * iPanDelL; // if even : left channel + else + iPan = i - 2 * iPanDelR; // if odd : right channel + // interleaved channels + if ( iPan < 0 ) + { // get from second + iPan = iPan + 2 * iServerFrameSizeSamples; // 2*iServerFrameSizeSamples; + vecfIntermProcBuf[i] += vecsData2[iPan]; // + } + else + vecfIntermProcBuf[i] += vecsData[iPan]; //*** korr200605 + } + else + vecfIntermProcBuf[i] += vecsData[i]; } } } @@ -1238,18 +1306,65 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { // left/right channel - vecfIntermProcBuf[k] += vecsData[i] * fGainL; - vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; + if ( bDelayPan ) + { + // pan address shift + // left channel + iLpan = i - iPanDelL; + if ( iLpan < 0 ) + { // get from second + iLpan = iLpan + iServerFrameSizeSamples; // + vecfIntermProcBuf[k] += vecsData2[iLpan] * fGainL; + } + else + vecfIntermProcBuf[k] += vecsData[iLpan] * fGainL; + // right channel + iRpan = i - iPanDelR; + if ( iRpan < 0 ) + { // get from second + iRpan = iRpan + iServerFrameSizeSamples; // + vecfIntermProcBuf[k + 2] += vecsData2[iRpan] * fGainR; + } + else + vecfIntermProcBuf[k + 2] += vecsData[iRpan] * fGainR; + } + else + { + vecfIntermProcBuf[k] += vecsData[i] * fGainL; + vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; + } } } else { // stereo - for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i += 2 ) + for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) { // left/right channel - vecfIntermProcBuf[i] += vecsData[i] * fGainL; - vecfIntermProcBuf[i + 1] += vecsData[i + 1] * fGainR; + + if ( bDelayPan ) + { + // pan address shift + if ( (i & 1) == 0 ) + iPan = i - 2 * iPanDelL; // if even : left channel + else + iPan = i - 2 * iPanDelR; // if odd : right channel + // interleaved channels + if ( iPan < 0 ) + { // get from second + iPan = iPan + 2 * iServerFrameSizeSamples; // + vecfIntermProcBuf[i] += vecsData2[iPan] * fGain; + } + else + vecfIntermProcBuf[i] += vecsData[iPan] * fGain; + } + else + { + if ( (i & 1) == 0 ) // if even : left channel + vecfIntermProcBuf[i] += vecsData[i] * fGainL; + else // if odd : right channel + vecfIntermProcBuf[i] += vecsData[i] * fGainR; + } } } } diff --git a/src/server.h b/src/server.h index b4e78b4462..7f52031dfb 100755 --- a/src/server.h +++ b/src/server.h @@ -1,5 +1,5 @@ /******************************************************************************\ - * Copyright (c) 2004-2020 + * Copyright (c) 2004-2021 * * Author(s): * Volker Fischer @@ -21,6 +21,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * \******************************************************************************/ +//****************************************************************************************** +// Pan-Delay code added by Detlef Hennings, www.eclim.de, 2020-06 +//****************************************************************************************** #pragma once @@ -221,6 +224,9 @@ class CServer : void CreateAndSendRecorderStateForAllConChannels(); + //**************************** delay panning + void SetEnableDelayPanning ( bool bDelayPanningOn ) { bDelayPan = bDelayPanningOn; } + bool IsDelayPanningEnabled() { return bDelayPan; } // Server list management -------------------------------------------------- void UpdateServerList() { ServerListManager.Update(); } @@ -320,6 +326,9 @@ class CServer : bool bUseDoubleSystemFrameSize; int iServerFrameSizeSamples; + // for delay panning + bool bDelayPan; + // variables needed for multithreading support bool bUseMultithreading; QFutureSynchronizer FutureSynchronizer; @@ -358,6 +367,7 @@ class CServer : CVector > vecvecfGains; CVector > vecvecfPannings; CVector > vecvecsData; + CVector > vecvecsData2; CVector vecNumAudioChannels; CVector vecNumFrameSizeConvBlocks; CVector vecUseDoubleSysFraSizeConvBuf; diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index 1ddc15263d..ac94cb26f5 100755 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -315,6 +315,17 @@ lvwClients->setMinimumHeight ( 140 ); ModifyAutoStartEntry ( bCurAutoStartMinState ); #endif + //******************************************************************* + // update delay panning check box + if ( pServer->IsDelayPanningEnabled() ) + { + chbEnableDelayPanning->setCheckState(Qt::Checked); + } + else + { + chbEnableDelayPanning->setCheckState(Qt::Unchecked); + } + // Recorder controls chbEnableRecorder->setChecked ( pServer->GetRecordingEnabled() ); edtCurrentSessionDir->setText ( "" ); @@ -382,6 +393,10 @@ lvwClients->setMinimumHeight ( 140 ); QObject::connect ( chbEnableRecorder, &QCheckBox::stateChanged, this, &CServerDlg::OnEnableRecorderStateChanged ); + //**************************** delay panning + QObject::connect ( chbEnableDelayPanning, &QCheckBox::stateChanged, + this, &CServerDlg::OnEnableDelayPanningStateChanged ); + // line edits QObject::connect ( edtCentralServerAddress, &QLineEdit::editingFinished, this, &CServerDlg::OnCentralServerAddressEditingFinished ); diff --git a/src/serverdlg.h b/src/serverdlg.h index 9906bbb1a3..d11c98e9cf 100755 --- a/src/serverdlg.h +++ b/src/serverdlg.h @@ -115,6 +115,7 @@ public slots: void OnSysTrayActivated ( QSystemTrayIcon::ActivationReason ActReason ); void OnWelcomeMessageChanged() { pServer->SetWelcomeMessage ( tedWelcomeMessage->toPlainText() ); } void OnLanguageChanged ( QString strLanguage ) { pSettings->strLanguage = strLanguage; } + void OnEnableDelayPanningStateChanged ( int value ) { pServer->SetEnableDelayPanning ( Qt::CheckState::Checked == value ); } void OnNewRecordingClicked() { pServer->RequestNewRecording(); } void OnRecordingDirClicked(); void OnClearRecordingDirClicked(); diff --git a/src/serverdlgbase.ui b/src/serverdlgbase.ui index 3600f07d5d..d175c72677 100755 --- a/src/serverdlgbase.ui +++ b/src/serverdlgbase.ui @@ -265,6 +265,13 @@ + + + + Enable delay panning + + + From e0eb0aee350684c654a0427e12b8ce0f0226b29e Mon Sep 17 00:00:00 2001 From: Hk1020 <> Date: Sun, 28 Feb 2021 22:21:02 +0100 Subject: [PATCH 2/9] Set delayed panning off by default. --- src/global.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/global.h b/src/global.h index 322ff2ac0f..39d32c5a24 100755 --- a/src/global.h +++ b/src/global.h @@ -93,12 +93,12 @@ LED bar: lbr #define SYSTEM_FRAME_SIZE_SAMPLES 64 #define DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES ( 2 * SYSTEM_FRAME_SIZE_SAMPLES ) -//****************************************************************************************** -// additional buffer for delay panning 200601 -#define MAX_DELAY_PANNING_SAMPLES 64 // 32 --> 64 -#define PANNING_TYPE_DEFAULT 2 // 2 = delay panning -//****************************************************************************************** - +//****************************************************************************************** +// additional buffer for delay panning 200601 +#define MAX_DELAY_PANNING_SAMPLES 64 // 32 --> 64 +#define PANNING_TYPE_DEFAULT 1 // 2 = delay panning +//****************************************************************************************** + // default server address and port numbers #define DEFAULT_SERVER_ADDRESS "anygenre1.jamulus.io" #define DEFAULT_PORT_NUMBER 22124 From 43f70587a9b791e927b013ad8b512a90258c4941 Mon Sep 17 00:00:00 2001 From: Hk1020 <> Date: Mon, 1 Mar 2021 00:15:38 +0100 Subject: [PATCH 3/9] Added command line options for delayed panning. Options -P/--delayedpan and --nodelayedpan --- src/global.h | 1 - src/main.cpp | 27 +++++++++++++++++++++++++++ src/server.cpp | 4 ++-- src/server.h | 7 ++++--- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/global.h b/src/global.h index 39d32c5a24..8b9f34317a 100755 --- a/src/global.h +++ b/src/global.h @@ -96,7 +96,6 @@ LED bar: lbr //****************************************************************************************** // additional buffer for delay panning 200601 #define MAX_DELAY_PANNING_SAMPLES 64 // 32 --> 64 -#define PANNING_TYPE_DEFAULT 1 // 2 = delay panning //****************************************************************************************** // default server address and port numbers diff --git a/src/main.cpp b/src/main.cpp index 4847b701c6..04e689d9fc 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -69,6 +69,7 @@ int main ( int argc, char** argv ) bool bMuteStream = false; bool bMuteMeInPersonalMix = false; bool bDisableRecording = false; + bool bDelayPan = false; bool bNoAutoJackConnect = false; bool bUseTranslation = true; bool bCustomPortNumberGiven = false; @@ -381,6 +382,29 @@ int main ( int argc, char** argv ) continue; } + // Disable delayed panning on startup ---------------------------------------- + if ( GetFlagArgument ( argv, + i, + "--nodelayedpan", // no short form + "--nodelayedpan" ) ) + { + bDelayPan = false; + qInfo() << "- starting without delayed panning"; + CommandLineOptions << "--nodelayedpan"; + continue; + } + + // Enable delayed panning on startup ---------------------------------------- + if ( GetFlagArgument ( argv, + i, + "-P", + "--delayedpanning" ) ) + { + bDelayPan = true; + qInfo() << "- starting with delayed panning"; + CommandLineOptions << "--delayedpanning"; + continue; + } // Central server ------------------------------------------------------ if ( GetStringArgument ( argc, @@ -742,6 +766,7 @@ int main ( int argc, char** argv ) bUseDoubleSystemFrameSize, bUseMultithreading, bDisableRecording, + bDelayPan, eLicenceType ); #ifndef HEADLESS @@ -845,6 +870,8 @@ QString UsageArguments ( char **argv ) " -m, --htmlstatus enable HTML status file, set file name\n" " -o, --serverinfo infos of this server in the format:\n" " [name];[city];[country as QLocale ID]\n" + " -P, --delayedpan start with delayed panning enabled\n" + " --nodelayedpan start with delayed panning disabled\n" " -R, --recording sets directory to contain recorded jams\n" " --norecord disables recording (when enabled by default by -R)\n" " -s, --server start server\n" diff --git a/src/server.cpp b/src/server.cpp index 0eda823f83..3dea54b95e 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -233,6 +233,7 @@ CServer::CServer ( const int iNewMaxNumChan, const bool bNUseDoubleSystemFrameSize, const bool bNUseMultithreading, const bool bDisableRecording, + const bool bNDelayPan, const ELicenceType eNLicenceType ) : bUseDoubleSystemFrameSize ( bNUseDoubleSystemFrameSize ), bUseMultithreading ( bNUseMultithreading ), @@ -252,6 +253,7 @@ CServer::CServer ( const int iNewMaxNumChan, &ConnLessProtocol ), bDisableRecording ( bDisableRecording ), bAutoRunMinimized ( false ), + bDelayPan ( bNDelayPan ), eLicenceType ( eNLicenceType ), bDisconnectAllClientsOnQuit ( bNDisconnectAllClientsOnQuit ), pSignalHandler ( CSignalHandler::getSingletonP() ) @@ -330,8 +332,6 @@ CServer::CServer ( const int iNewMaxNumChan, iServerFrameSizeSamples = SYSTEM_FRAME_SIZE_SAMPLES; } - bDelayPan = PANNING_TYPE_DEFAULT == 2; - // To avoid audio clitches, in the entire realtime timer audio processing // routine including the ProcessData no memory must be allocated. Since we // do not know the required sizes for the vectors, we allocate memory for diff --git a/src/server.h b/src/server.h index 7f52031dfb..51fea26e55 100755 --- a/src/server.h +++ b/src/server.h @@ -186,6 +186,7 @@ class CServer : const bool bNUseDoubleSystemFrameSize, const bool bNUseMultithreading, const bool bDisableRecording, + const bool bNDelayPan, const ELicenceType eNLicenceType ); virtual ~CServer(); @@ -326,9 +327,6 @@ class CServer : bool bUseDoubleSystemFrameSize; int iServerFrameSizeSamples; - // for delay panning - bool bDelayPan; - // variables needed for multithreading support bool bUseMultithreading; QFutureSynchronizer FutureSynchronizer; @@ -404,6 +402,9 @@ class CServer : // GUI settings bool bAutoRunMinimized; + // for delay panning + bool bDelayPan; + // messaging QString strWelcomeMessage; ELicenceType eLicenceType; From cb3e2e401f6c1df6ca7b065278effac77aa34fc7 Mon Sep 17 00:00:00 2001 From: Hk1020 <> Date: Tue, 2 Mar 2021 23:56:53 +0100 Subject: [PATCH 4/9] Cherry picking copy/paste error fixed. --- src/server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 3dea54b95e..b49cfb1676 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -1323,10 +1323,10 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, if ( iRpan < 0 ) { // get from second iRpan = iRpan + iServerFrameSizeSamples; // - vecfIntermProcBuf[k + 2] += vecsData2[iRpan] * fGainR; + vecfIntermProcBuf[k + 1] += vecsData2[iRpan] * fGainR; } else - vecfIntermProcBuf[k + 2] += vecsData[iRpan] * fGainR; + vecfIntermProcBuf[k + 1] += vecsData[iRpan] * fGainR; } else { From c17048b0c70e8c6eb9f7095a5060a478fa807bbc Mon Sep 17 00:00:00 2001 From: Hk1020 <> Date: Mon, 1 Mar 2021 23:45:41 +0100 Subject: [PATCH 5/9] Removed --nodelayedpan option. --- src/main.cpp | 13 ------------- src/server.cpp | 1 - 2 files changed, 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 04e689d9fc..18d2efc87e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -382,18 +382,6 @@ int main ( int argc, char** argv ) continue; } - // Disable delayed panning on startup ---------------------------------------- - if ( GetFlagArgument ( argv, - i, - "--nodelayedpan", // no short form - "--nodelayedpan" ) ) - { - bDelayPan = false; - qInfo() << "- starting without delayed panning"; - CommandLineOptions << "--nodelayedpan"; - continue; - } - // Enable delayed panning on startup ---------------------------------------- if ( GetFlagArgument ( argv, i, @@ -871,7 +859,6 @@ QString UsageArguments ( char **argv ) " -o, --serverinfo infos of this server in the format:\n" " [name];[city];[country as QLocale ID]\n" " -P, --delayedpan start with delayed panning enabled\n" - " --nodelayedpan start with delayed panning disabled\n" " -R, --recording sets directory to contain recorded jams\n" " --norecord disables recording (when enabled by default by -R)\n" " -s, --server start server\n" diff --git a/src/server.cpp b/src/server.cpp index b49cfb1676..7b5e2bc161 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -1260,7 +1260,6 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, } else vecfIntermProcBuf[k + 1] += vecsData[iRpan]; - ; } else { From 040f1b7b82b3d4da28fb97f151b11382511ed784 Mon Sep 17 00:00:00 2001 From: Hk1020 <1018004+Hk1020@users.noreply.github.com> Date: Tue, 9 Mar 2021 23:04:58 +0100 Subject: [PATCH 6/9] Style changes, fGain == 1 case removed. Co-authored-by: Detlef Hennings --- ChangeLog | 2 + src/global.h | 6 +- src/server.cpp | 161 ++++++++++++++++------------------------------ src/server.h | 5 +- src/serverdlg.cpp | 3 +- 5 files changed, 62 insertions(+), 115 deletions(-) diff --git a/ChangeLog b/ChangeLog index 557d4e4ef0..27a52fcc7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ ### 3.7.0dev <- NOTE: the release version number will be 3.7.1 ### +- Added Pan-Delay code by Detlef Hennings, www.eclim.de + - Automatic channel fader adjustment simplifies mixer setup by using the channel level meters (#1071). (contributed by @JohannesBrx) diff --git a/src/global.h b/src/global.h index 8b9f34317a..044fb1c9a6 100755 --- a/src/global.h +++ b/src/global.h @@ -93,10 +93,8 @@ LED bar: lbr #define SYSTEM_FRAME_SIZE_SAMPLES 64 #define DOUBLE_SYSTEM_FRAME_SIZE_SAMPLES ( 2 * SYSTEM_FRAME_SIZE_SAMPLES ) -//****************************************************************************************** -// additional buffer for delay panning 200601 -#define MAX_DELAY_PANNING_SAMPLES 64 // 32 --> 64 -//****************************************************************************************** +// additional buffer for delay panning +#define MAX_DELAY_PANNING_SAMPLES 64 // default server address and port numbers #define DEFAULT_SERVER_ADDRESS "anygenre1.jamulus.io" diff --git a/src/server.cpp b/src/server.cpp index 7b5e2bc161..04bf53dbc9 100755 --- a/src/server.cpp +++ b/src/server.cpp @@ -1210,7 +1210,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, { // Stereo target channel ----------------------------------------------- - const int maxPanDelay = MAX_DELAY_PANNING_SAMPLES; // 32 --> 64 + const int maxPanDelay = MAX_DELAY_PANNING_SAMPLES; int iLpan, iRpan, iPan; @@ -1222,7 +1222,7 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const float fGain = vecvecfGains[iChanCnt][j]; const float fPan = bDelayPan ? 0.5f : vecvecfPannings[iChanCnt][j]; - const int iPanDel = lround( (float)(2 * maxPanDelay - 2) * (vecvecfPannings[iChanCnt][j] - 0.5f) ); + const int iPanDel = lround( (float)( 2 * maxPanDelay - 2 ) * ( vecvecfPannings[iChanCnt][j] - 0.5f ) ); const int iPanDelL = ( iPanDel > 0 ) ? iPanDel : 0; const int iPanDelR = ( iPanDel < 0 ) ? -iPanDel : 0; @@ -1231,138 +1231,89 @@ void CServer::MixEncodeTransmitData ( const int iChanCnt, const float fGainL = MathUtils::GetLeftPan ( fPan, false ) * fGain; const float fGainR = MathUtils::GetRightPan ( fPan, false ) * fGain; - // if channel gain is 1, avoid multiplication for speed optimization - if ( ( fGainL == 1.0f ) && ( fGainR == 1.0f ) ) + if ( vecNumAudioChannels[j] == 1 ) { - if ( vecNumAudioChannels[j] == 1 ) + // mono: copy same mono data in both out stereo audio channels + for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) { - // mono: copy same mono data in both out stereo audio channels - for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) + // left/right channel + if ( bDelayPan ) { - if ( bDelayPan ) + // pan address shift + + // left channel + iLpan = i - iPanDelL; + if ( iLpan < 0 ) { - // pan address shift - // left channel - iLpan = i - iPanDelL; - if ( iLpan < 0 ) - { // get from second - iLpan = iLpan + iServerFrameSizeSamples; // - vecfIntermProcBuf[k] += vecsData2[iLpan]; - } - else - vecfIntermProcBuf[k] += vecsData[iLpan]; - // right channel - iRpan = i - iPanDelR; - if ( iRpan < 0 ) - { // get from second - iRpan = iRpan + iServerFrameSizeSamples; // - vecfIntermProcBuf[k + 1] += vecsData2[iRpan]; - } - else - vecfIntermProcBuf[k + 1] += vecsData[iRpan]; + // get from second + iLpan = iLpan + iServerFrameSizeSamples; + vecfIntermProcBuf[k] += vecsData2[iLpan] * fGainL; } else { - // left/right channel - vecfIntermProcBuf[k] += vecsData[i]; - vecfIntermProcBuf[k + 1] += vecsData[i]; + vecfIntermProcBuf[k] += vecsData[iLpan] * fGainL; } - } - } - else - { - // stereo - for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) - { - if ( bDelayPan ) + + // right channel + iRpan = i - iPanDelR; + if ( iRpan < 0 ) { - // pan address shift - iLpan = i - iPanDelL; - iRpan = i - iPanDelR; - if ( (i & 1) == 0 ) - iPan = i - 2 * iPanDelL; // if even : left channel - else - iPan = i - 2 * iPanDelR; // if odd : right channel - // interleaved channels - if ( iPan < 0 ) - { // get from second - iPan = iPan + 2 * iServerFrameSizeSamples; // 2*iServerFrameSizeSamples; - vecfIntermProcBuf[i] += vecsData2[iPan]; // - } - else - vecfIntermProcBuf[i] += vecsData[iPan]; //*** korr200605 + // get from second + iRpan = iRpan + iServerFrameSizeSamples; + vecfIntermProcBuf[k + 1] += vecsData2[iRpan] * fGainR; } else - vecfIntermProcBuf[i] += vecsData[i]; + { + vecfIntermProcBuf[k + 1] += vecsData[iRpan] * fGainR; + } + } + else + { + vecfIntermProcBuf[k] += vecsData[i] * fGainL; + vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; } } } else { - if ( vecNumAudioChannels[j] == 1 ) + // stereo + for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) { - // mono: copy same mono data in both out stereo audio channels - for ( i = 0, k = 0; i < iServerFrameSizeSamples; i++, k += 2 ) + // left/right channel + if ( bDelayPan ) { - // left/right channel - if ( bDelayPan ) + // pan address shift + if ( (i & 1) == 0 ) + { + iPan = i - 2 * iPanDelL; // if even : left channel + } + else { - // pan address shift - // left channel - iLpan = i - iPanDelL; - if ( iLpan < 0 ) - { // get from second - iLpan = iLpan + iServerFrameSizeSamples; // - vecfIntermProcBuf[k] += vecsData2[iLpan] * fGainL; - } - else - vecfIntermProcBuf[k] += vecsData[iLpan] * fGainL; - // right channel - iRpan = i - iPanDelR; - if ( iRpan < 0 ) - { // get from second - iRpan = iRpan + iServerFrameSizeSamples; // - vecfIntermProcBuf[k + 1] += vecsData2[iRpan] * fGainR; - } - else - vecfIntermProcBuf[k + 1] += vecsData[iRpan] * fGainR; + iPan = i - 2 * iPanDelR; // if odd : right channel + } + // interleaved channels + if ( iPan < 0 ) + { + // get from second + iPan = iPan + 2 * iServerFrameSizeSamples; + vecfIntermProcBuf[i] += vecsData2[iPan] * fGain; } else { - vecfIntermProcBuf[k] += vecsData[i] * fGainL; - vecfIntermProcBuf[k + 1] += vecsData[i] * fGainR; + vecfIntermProcBuf[i] += vecsData[iPan] * fGain; } } - } - else - { - // stereo - for ( i = 0; i < ( 2 * iServerFrameSizeSamples ); i++ ) + else { - // left/right channel - - if ( bDelayPan ) + if ( (i & 1) == 0 ) { - // pan address shift - if ( (i & 1) == 0 ) - iPan = i - 2 * iPanDelL; // if even : left channel - else - iPan = i - 2 * iPanDelR; // if odd : right channel - // interleaved channels - if ( iPan < 0 ) - { // get from second - iPan = iPan + 2 * iServerFrameSizeSamples; // - vecfIntermProcBuf[i] += vecsData2[iPan] * fGain; - } - else - vecfIntermProcBuf[i] += vecsData[iPan] * fGain; + // if even : left channel + vecfIntermProcBuf[i] += vecsData[i] * fGainL; } else { - if ( (i & 1) == 0 ) // if even : left channel - vecfIntermProcBuf[i] += vecsData[i] * fGainL; - else // if odd : right channel - vecfIntermProcBuf[i] += vecsData[i] * fGainR; + // if odd : right channel + vecfIntermProcBuf[i] += vecsData[i] * fGainR; } } } diff --git a/src/server.h b/src/server.h index 51fea26e55..e39bea66a0 100755 --- a/src/server.h +++ b/src/server.h @@ -21,9 +21,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * \******************************************************************************/ -//****************************************************************************************** -// Pan-Delay code added by Detlef Hennings, www.eclim.de, 2020-06 -//****************************************************************************************** #pragma once @@ -225,7 +222,7 @@ class CServer : void CreateAndSendRecorderStateForAllConChannels(); - //**************************** delay panning + // delay panning void SetEnableDelayPanning ( bool bDelayPanningOn ) { bDelayPan = bDelayPanningOn; } bool IsDelayPanningEnabled() { return bDelayPan; } diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp index ac94cb26f5..9c9e2100cd 100755 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -315,7 +315,6 @@ lvwClients->setMinimumHeight ( 140 ); ModifyAutoStartEntry ( bCurAutoStartMinState ); #endif - //******************************************************************* // update delay panning check box if ( pServer->IsDelayPanningEnabled() ) { @@ -393,7 +392,7 @@ lvwClients->setMinimumHeight ( 140 ); QObject::connect ( chbEnableRecorder, &QCheckBox::stateChanged, this, &CServerDlg::OnEnableRecorderStateChanged ); - //**************************** delay panning + // delay panning QObject::connect ( chbEnableDelayPanning, &QCheckBox::stateChanged, this, &CServerDlg::OnEnableDelayPanningStateChanged ); From 66548eea920c197d20b3a024007411af2a17a7ce Mon Sep 17 00:00:00 2001 From: Hk1020 <1018004+Hk1020@users.noreply.github.com> Date: Wed, 10 Mar 2021 01:55:09 +0100 Subject: [PATCH 7/9] Column "channels" added in server GUI. Co-authored-by: Detlef Hennings --- src/server.cpp | 0 src/server.h | 3 +++ src/serverdlg.cpp | 11 ++++++++--- src/serverdlgbase.ui | 10 ++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) mode change 100755 => 100644 src/server.cpp mode change 100755 => 100644 src/server.h mode change 100755 => 100644 src/serverdlg.cpp mode change 100755 => 100644 src/serverdlgbase.ui diff --git a/src/server.cpp b/src/server.cpp old mode 100755 new mode 100644 diff --git a/src/server.h b/src/server.h old mode 100755 new mode 100644 index e39bea66a0..d9c7a331b3 --- a/src/server.h +++ b/src/server.h @@ -274,6 +274,9 @@ class CServer : void SetAutoRunMinimized ( const bool NAuRuMin ) { bAutoRunMinimized = NAuRuMin; } bool GetAutoRunMinimized() { return bAutoRunMinimized; } + int GetClientNumAudioChannels ( const int iChanNum ) + { return vecChannels[iChanNum].GetNumAudioChannels(); } + protected: // access functions for actual channels bool IsConnected ( const int iChanNum ) { return vecChannels[iChanNum].IsConnected(); } diff --git a/src/serverdlg.cpp b/src/serverdlg.cpp old mode 100755 new mode 100644 index 9c9e2100cd..fdf6c9a824 --- a/src/serverdlg.cpp +++ b/src/serverdlg.cpp @@ -219,11 +219,12 @@ CServerDlg::CServerDlg ( CServer* pNServP, } // set up list view for connected clients - lvwClients->setColumnWidth ( 0, 170 ); - lvwClients->setColumnWidth ( 1, 200 ); + lvwClients->setColumnWidth ( 0, 170 ); // 170 // IP:port + lvwClients->setColumnWidth ( 1, 200 ); // 200 // Name + lvwClients->setColumnWidth ( 2, 120 ); // 60 // Buf-Frames + lvwClients->setColumnWidth ( 3, 50 ); // Channels lvwClients->clear(); - // TEST workaround for resize problem of window after iconize in task bar lvwClients->setMinimumWidth ( 170 + 130 + 60 + 205 ); lvwClients->setMinimumHeight ( 140 ); @@ -688,6 +689,10 @@ void CServerDlg::OnTimer() vecpListViewItems[i]->setText ( 2, QString().setNum ( veciJitBufNumFrames[i] ) ); + // show num of audio channels + int iNumAudioChs = pServer->GetClientNumAudioChannels ( i ); + vecpListViewItems[i]->setText ( 3, QString().setNum ( iNumAudioChs ) ); + vecpListViewItems[i]->setHidden ( false ); } else diff --git a/src/serverdlgbase.ui b/src/serverdlgbase.ui old mode 100755 new mode 100644 index d175c72677..0af251a549 --- a/src/serverdlgbase.ui +++ b/src/serverdlgbase.ui @@ -44,6 +44,16 @@ Jitter Buffer Size + + + Channels + + + + + + + From 43239ff6e03d42ea46569616b3065fe0a8ee64a8 Mon Sep 17 00:00:00 2001 From: Hk1020 <1018004+Hk1020@users.noreply.github.com> Date: Thu, 11 Mar 2021 19:56:43 +0100 Subject: [PATCH 8/9] Correct unused column. --- src/serverdlgbase.ui | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/serverdlgbase.ui b/src/serverdlgbase.ui index 0af251a549..76a05af7f1 100644 --- a/src/serverdlgbase.ui +++ b/src/serverdlgbase.ui @@ -27,7 +27,7 @@ false - 3 + 4 @@ -49,11 +49,6 @@ Channels - - - - - From e8f5bca31f40a9dd70e6e7f8660c135069097457 Mon Sep 17 00:00:00 2001 From: Hk1020 <1018004+Hk1020@users.noreply.github.com> Date: Mon, 22 Mar 2021 20:59:54 +0100 Subject: [PATCH 9/9] Fixed delaypan option. --- src/main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 18d2efc87e..5484a63b85 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -382,15 +382,15 @@ int main ( int argc, char** argv ) continue; } - // Enable delayed panning on startup ---------------------------------------- + // Enable delay panning on startup ---------------------------------------- if ( GetFlagArgument ( argv, i, "-P", - "--delayedpanning" ) ) + "--delaypan" ) ) { bDelayPan = true; - qInfo() << "- starting with delayed panning"; - CommandLineOptions << "--delayedpanning"; + qInfo() << "- starting with delay panning"; + CommandLineOptions << "--delaypan"; continue; } @@ -858,7 +858,7 @@ QString UsageArguments ( char **argv ) " -m, --htmlstatus enable HTML status file, set file name\n" " -o, --serverinfo infos of this server in the format:\n" " [name];[city];[country as QLocale ID]\n" - " -P, --delayedpan start with delayed panning enabled\n" + " -P, --delaypan start with delay panning enabled\n" " -R, --recording sets directory to contain recorded jams\n" " --norecord disables recording (when enabled by default by -R)\n" " -s, --server start server\n"