diff --git a/plugins/channeltx/modnfm/nfmmod.cpp b/plugins/channeltx/modnfm/nfmmod.cpp index 67efc9c43..dbfa7ebe8 100644 --- a/plugins/channeltx/modnfm/nfmmod.cpp +++ b/plugins/channeltx/modnfm/nfmmod.cpp @@ -73,6 +73,7 @@ NFMMod::NFMMod() : m_cwKeyer.setSampleRate(m_config.m_audioSampleRate); m_cwKeyer.setWPM(13); m_cwKeyer.setMode(CWKeyer::CWNone); + m_cwSmoother.setNbFadeSamples(96); // 2 ms @ 48 kHz } NFMMod::~NFMMod() @@ -188,14 +189,24 @@ void NFMMod::pullAF(Real& sample) sample = ((audioSample[0] + audioSample[1]) / 65536.0f) * m_running.m_volumeFactor; break; case NFMModInputCWTone: + Real fadeFactor; + if (m_cwKeyer.getSample()) { - sample = m_toneNco.next(); + m_cwSmoother.getFadeSample(true, fadeFactor); + sample = m_toneNco.next() * fadeFactor; } else { - sample = 0.0f; - m_toneNco.setPhase(0); + if (m_cwSmoother.getFadeSample(false, fadeFactor)) + { + sample = m_toneNco.next() * fadeFactor; + } + else + { + sample = 0.0f; + m_toneNco.setPhase(0); + } } break; case NFMModInputNone: @@ -366,6 +377,7 @@ void NFMMod::apply() if (m_config.m_audioSampleRate != m_running.m_audioSampleRate) { m_cwKeyer.setSampleRate(m_config.m_audioSampleRate); + m_cwSmoother.setNbFadeSamples(m_config.m_audioSampleRate / 500); // 2 ms } m_running.m_outputSampleRate = m_config.m_outputSampleRate; diff --git a/plugins/channeltx/modnfm/nfmmod.h b/plugins/channeltx/modnfm/nfmmod.h index 3c2fd6505..e57368fcb 100644 --- a/plugins/channeltx/modnfm/nfmmod.h +++ b/plugins/channeltx/modnfm/nfmmod.h @@ -322,6 +322,7 @@ private: Real m_peakLevel; Real m_levelSum; CWKeyer m_cwKeyer; + CWSmoother m_cwSmoother; static const int m_levelNbSamples; void apply();