From 27a585e3e082066f894410bc76944c263128b033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 7 May 2020 00:25:56 +0200 Subject: [PATCH] Fix manual ducking now the ducking gain is only applied when talkover is enabled --- src/engine/enginemaster.cpp | 18 ++++++++++++++---- src/engine/enginesidechaincompressor.cpp | 5 +++-- src/engine/enginesidechaincompressor.h | 6 ++---- src/engine/enginetalkoverducking.cpp | 12 ++++++------ 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/engine/enginemaster.cpp b/src/engine/enginemaster.cpp index 5454723c90c..edd693042d5 100644 --- a/src/engine/enginemaster.cpp +++ b/src/engine/enginemaster.cpp @@ -464,11 +464,21 @@ void EngineMaster::process(const int iBufferSize) { m_pTalkover, m_iBufferSize, m_iSampleRate, busFeatures); - - // Clear talkover compressor for the next round of gain calculation. - m_pTalkoverDucking->clearKeys(); - if (m_pTalkoverDucking->getMode() != EngineTalkoverDucking::OFF) { + switch (m_pTalkoverDucking->getMode()) { + case EngineTalkoverDucking::OFF: + m_pTalkoverDucking->setAboveThreshold(false); + break; + case EngineTalkoverDucking::AUTO: m_pTalkoverDucking->processKey(m_pTalkover, m_iBufferSize); + break; + case EngineTalkoverDucking::MANUAL: + qDebug() << "m_activeTalkoverChannels.size()" << m_activeTalkoverChannels.size(); + m_pTalkoverDucking->setAboveThreshold(m_activeTalkoverChannels.size()); + break; + default: + DEBUG_ASSERT("!Unknown Ducking mode"); + m_pTalkoverDucking->setAboveThreshold(false); + break; } // Calculate the crossfader gains for left and right side of the crossfader diff --git a/src/engine/enginesidechaincompressor.cpp b/src/engine/enginesidechaincompressor.cpp index 4f9b6fc634e..bd21e53914e 100644 --- a/src/engine/enginesidechaincompressor.cpp +++ b/src/engine/enginesidechaincompressor.cpp @@ -38,11 +38,12 @@ void EngineSideChainCompressor::calculateRates() { << "decay per frame: " << m_decayPerFrame; } -void EngineSideChainCompressor::clearKeys() { - m_bAboveThreshold = false; +void EngineSideChainCompressor::setAboveThreshold(bool value) { + m_bAboveThreshold = value; } void EngineSideChainCompressor::processKey(const CSAMPLE* pIn, const int iBufferSize) { + m_bAboveThreshold = false; for (int i = 0; i + 1 < iBufferSize; i += 2) { CSAMPLE val = (pIn[i] + pIn[i + 1]) / 2; if (val > m_threshold) { diff --git a/src/engine/enginesidechaincompressor.h b/src/engine/enginesidechaincompressor.h index c2ac57db955..e7b043f2675 100644 --- a/src/engine/enginesidechaincompressor.h +++ b/src/engine/enginesidechaincompressor.h @@ -40,10 +40,8 @@ class EngineSideChainCompressor { calculateRates(); } - - // Before calling processKey on multiple channels, first call clearKeys to - // clear state from the last round of compressor gain calculation. - void clearKeys(); + /// Forces the above threshold flag to the given value without calculations + void setAboveThreshold(bool value); // Every loop, before calling process, first call processKey to feed // the compressor the input key signal. It is safe to call this function diff --git a/src/engine/enginetalkoverducking.cpp b/src/engine/enginetalkoverducking.cpp index 290db999fd0..486a0be6dc5 100644 --- a/src/engine/enginetalkoverducking.cpp +++ b/src/engine/enginetalkoverducking.cpp @@ -67,13 +67,13 @@ void EngineTalkoverDucking::slotDuckModeChanged(double mode) { CSAMPLE EngineTalkoverDucking::getGain(int numFrames) { // Apply microphone ducking. switch (getMode()) { - case EngineTalkoverDucking::OFF: + case EngineTalkoverDucking::OFF: return 1.0; - case EngineTalkoverDucking::AUTO: + case EngineTalkoverDucking::AUTO: + case EngineTalkoverDucking::MANUAL: return calculateCompressedGain(numFrames); - case EngineTalkoverDucking::MANUAL: - return m_pDuckStrength->get(); + default: + DEBUG_ASSERT("!Unknown Ducking mode"); + return 1.0; } - qWarning() << "Invalid ducking mode, returning 1.0"; - return 1.0; }