From d4767364874785c69e3e67100694fa4a4a13bf26 Mon Sep 17 00:00:00 2001 From: f4exb Date: Fri, 29 Dec 2017 11:04:47 +0100 Subject: [PATCH] Demods : use specific method to apply channelizer sample rate and frequency offset changes. Separate this data from settings --- plugins/channelrx/demodam/amdemod.cpp | 95 ++++++----- plugins/channelrx/demodam/amdemod.h | 5 +- plugins/channelrx/demodam/amdemodsettings.cpp | 1 - plugins/channelrx/demodam/amdemodsettings.h | 1 - plugins/channelrx/demodbfm/bfmdemod.cpp | 151 ++++++++++-------- plugins/channelrx/demodbfm/bfmdemod.h | 6 +- .../channelrx/demodbfm/bfmdemodsettings.cpp | 1 - plugins/channelrx/demodbfm/bfmdemodsettings.h | 1 - plugins/channelrx/demoddsd/dsddemod.cpp | 103 ++++++------ plugins/channelrx/demoddsd/dsddemod.h | 6 +- .../channelrx/demoddsd/dsddemodsettings.cpp | 3 - plugins/channelrx/demoddsd/dsddemodsettings.h | 1 - plugins/channelrx/demodnfm/nfmdemod.cpp | 5 +- plugins/channelrx/demodssb/ssbdemod.cpp | 105 ++++++------ plugins/channelrx/demodssb/ssbdemod.h | 5 +- .../channelrx/demodssb/ssbdemodsettings.cpp | 1 - plugins/channelrx/demodssb/ssbdemodsettings.h | 1 - plugins/channelrx/demodwfm/wfmdemod.cpp | 102 ++++++------ plugins/channelrx/demodwfm/wfmdemod.h | 4 +- .../channelrx/demodwfm/wfmdemodsettings.cpp | 1 - plugins/channelrx/demodwfm/wfmdemodsettings.h | 1 - plugins/channelrx/udpsrc/udpsrc.cpp | 113 +++++++------ plugins/channelrx/udpsrc/udpsrc.h | 4 +- plugins/channelrx/udpsrc/udpsrcsettings.cpp | 1 - plugins/channelrx/udpsrc/udpsrcsettings.h | 1 - 25 files changed, 386 insertions(+), 332 deletions(-) diff --git a/plugins/channelrx/demodam/amdemod.cpp b/plugins/channelrx/demodam/amdemod.cpp index 82acaf6cf..b58de272a 100644 --- a/plugins/channelrx/demodam/amdemod.cpp +++ b/plugins/channelrx/demodam/amdemod.cpp @@ -39,7 +39,8 @@ const int AMDemod::m_udpBlockSize = 512; AMDemod::AMDemod(DeviceSourceAPI *deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_inputSampleRate(48000), + m_inputFrequencyOffset(0), m_squelchOpen(false), m_magsqSum(0.0f), m_magsqPeak(0.0f), @@ -129,9 +130,7 @@ void AMDemod::feed(const SampleVector::const_iterator& begin, const SampleVector void AMDemod::start() { - qDebug() << "AMDemod::start: m_inputSampleRate: " << m_settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset; - + qDebug("AMDemod::start"); m_squelchCount = 0; m_audioFifo.clear(); } @@ -146,16 +145,11 @@ bool AMDemod::handleMessage(const Message& cmd) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; - AMDemodSettings settings = m_settings; - - settings.m_inputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - qDebug() << "AMDemod::handleMessage: MsgChannelizerNotification:" - << " m_inputSampleRate: " << settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset; + << " inputSampleRate: " << notif.getSampleRate() + << " inputFrequencyOffset: " << notif.getFrequencyOffset(); + + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); return true; } @@ -163,39 +157,22 @@ bool AMDemod::handleMessage(const Message& cmd) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "AMDemod::handleMessage: MsgConfigureChannelizer:" + << " sampleRate: " << cfg.getSampleRate() + << " inputFrequencyOffset: " << cfg.getCenterFrequency(); + m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "AMDemod::handleMessage: MsgConfigureChannelizer:" - << " sampleRate: " << cfg.getSampleRate() - << " inputFrequencyOffset: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureAMDemod::match(cmd)) { MsgConfigureAMDemod& cfg = (MsgConfigureAMDemod&) cmd; + qDebug() << "AMDemod::handleMessage: MsgConfigureAMDemod"; - AMDemodSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotification - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "AMDemod::handleMessage: MsgConfigureAMDemod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioMute: " << settings.m_audioMute - << " m_bandpassEnable: " << settings.m_bandpassEnable - << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " force: " << cfg.getForce(); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -205,23 +182,53 @@ bool AMDemod::handleMessage(const Message& cmd) } } -void AMDemod::applySettings(const AMDemodSettings& settings, bool force) +void AMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) { - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || - (m_settings.m_inputSampleRate != settings.m_inputSampleRate) || force) + qDebug() << "AMDemod::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if ((m_inputFrequencyOffset != inputFrequencyOffset) || + (m_inputSampleRate != inputSampleRate)) { - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); } - if((m_settings.m_inputSampleRate != settings.m_inputSampleRate) || - (m_settings.m_rfBandwidth != settings.m_rfBandwidth) || + if (m_inputSampleRate != inputSampleRate) + { + m_settingsMutex.lock(); + m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth / 2.2f); + m_interpolatorDistanceRemain = 0; + m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + m_settingsMutex.unlock(); + } + + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void AMDemod::applySettings(const AMDemodSettings& settings, bool force) +{ + qDebug() << "AMDemod::applySettings: MsgConfigureAMDemod:" + << " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_volume: " << settings.m_volume + << " m_squelch: " << settings.m_squelch + << " m_audioMute: " << settings.m_audioMute + << " m_bandpassEnable: " << settings.m_bandpassEnable + << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP + << " m_udpAddress: " << settings.m_udpAddress + << " m_udpPort: " << settings.m_udpPort + << " force: " << force; + + if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || (m_settings.m_audioSampleRate != settings.m_audioSampleRate) || (m_settings.m_bandpassEnable != settings.m_bandpassEnable) || force) { m_settingsMutex.lock(); - m_interpolator.create(16, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2f); + m_interpolator.create(16, m_inputSampleRate, settings.m_rfBandwidth / 2.2f); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; m_bandpass.create(301, settings.m_audioSampleRate, 300.0, settings.m_rfBandwidth / 2.0f); m_settingsMutex.unlock(); } diff --git a/plugins/channelrx/demodam/amdemod.h b/plugins/channelrx/demodam/amdemod.h index 1cc53dc97..3fe84b803 100644 --- a/plugins/channelrx/demodam/amdemod.h +++ b/plugins/channelrx/demodam/amdemod.h @@ -126,7 +126,8 @@ private: ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; - int m_absoluteFrequencyOffset; + int m_inputSampleRate; + int m_inputFrequencyOffset; AMDemodSettings m_settings; NCO m_nco; @@ -155,7 +156,7 @@ private: QMutex m_settingsMutex; -// void apply(bool force = false); + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); void applySettings(const AMDemodSettings& settings, bool force = false); void processOneSample(Complex &ci) diff --git a/plugins/channelrx/demodam/amdemodsettings.cpp b/plugins/channelrx/demodam/amdemodsettings.cpp index d70806b6d..2af7ceaab 100644 --- a/plugins/channelrx/demodam/amdemodsettings.cpp +++ b/plugins/channelrx/demodam/amdemodsettings.cpp @@ -29,7 +29,6 @@ AMDemodSettings::AMDemodSettings() : void AMDemodSettings::resetToDefaults() { - m_inputSampleRate = 96000; m_inputFrequencyOffset = 0; m_rfBandwidth = 5000; m_squelch = -40.0; diff --git a/plugins/channelrx/demodam/amdemodsettings.h b/plugins/channelrx/demodam/amdemodsettings.h index eb50d575f..c469246f6 100644 --- a/plugins/channelrx/demodam/amdemodsettings.h +++ b/plugins/channelrx/demodam/amdemodsettings.h @@ -23,7 +23,6 @@ class Serializable; struct AMDemodSettings { - int m_inputSampleRate; qint32 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_squelch; diff --git a/plugins/channelrx/demodbfm/bfmdemod.cpp b/plugins/channelrx/demodbfm/bfmdemod.cpp index a3a95cdb1..02e5d87a0 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.cpp +++ b/plugins/channelrx/demodbfm/bfmdemod.cpp @@ -42,7 +42,8 @@ const int BFMDemod::m_udpBlockSize = 512; BFMDemod::BFMDemod(DeviceSourceAPI *deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_inputSampleRate(384000), + m_inputFrequencyOffset(0), m_audioFifo(250000), m_settingsMutex(QMutex::Recursive), m_pilotPLL(19000/384000, 50/384000, 0.01), @@ -311,16 +312,11 @@ bool BFMDemod::handleMessage(const Message& cmd) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; - BFMDemodSettings settings = m_settings; + qDebug() << "BFMDemod::handleMessage: MsgChannelizerNotification:" + << " inputSampleRate: " << notif.getSampleRate() + << " inputFrequencyOffset: " << notif.getFrequencyOffset(); - settings.m_inputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - - qDebug() << "BFMDemod::handleMessage: MsgChannelizerNotification:" - << " m_inputSampleRate: " << settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset; + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); if (getMessageQueueToGUI()) { @@ -334,40 +330,21 @@ bool BFMDemod::handleMessage(const Message& cmd) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "BFMDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate() + << " centerFrequency: " << cfg.getCenterFrequency(); + m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "BFMDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate() - << " centerFrequency: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureBFMDemod::match(cmd)) { MsgConfigureBFMDemod& cfg = (MsgConfigureBFMDemod&) cmd; + qDebug() << "BFMDemod::handleMessage: MsgConfigureBFMDemod"; - BFMDemodSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotification - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "BFMDemod::handleMessage: MsgConfigureBFMDemod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_audioStereo: " << settings.m_audioStereo - << " m_lsbStereo: " << settings.m_lsbStereo - << " m_showPilot: " << settings.m_showPilot - << " m_rdsActive: " << settings.m_rdsActive - << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " force: " << cfg.getForce(); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -386,57 +363,97 @@ bool BFMDemod::handleMessage(const Message& cmd) } } +void BFMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) +{ + qDebug() << "BFMDemod::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if((inputFrequencyOffset != m_inputFrequencyOffset) || + (inputSampleRate != m_inputSampleRate)) + { + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); + } + + if (inputSampleRate != m_inputSampleRate) + { + m_pilotPLL.configure(19000.0/inputSampleRate, 50.0/inputSampleRate, 0.01); + + m_settingsMutex.lock(); + + m_interpolator.create(16, inputSampleRate, m_settings.m_afBandwidth); + m_interpolatorDistanceRemain = (Real) inputSampleRate / m_settings.m_audioSampleRate; + m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + + m_interpolatorStereo.create(16, inputSampleRate, m_settings.m_afBandwidth); + m_interpolatorStereoDistanceRemain = (Real) inputSampleRate / m_settings.m_audioSampleRate; + m_interpolatorStereoDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + + m_interpolatorRDS.create(4, inputSampleRate, 600.0); + m_interpolatorRDSDistanceRemain = (Real) inputSampleRate / 250000.0; + m_interpolatorRDSDistance = (Real) inputSampleRate / 250000.0; + + Real lowCut = -(m_settings.m_rfBandwidth / 2.0) / inputSampleRate; + Real hiCut = (m_settings.m_rfBandwidth / 2.0) / inputSampleRate; + m_rfFilter->create_filter(lowCut, hiCut); + m_phaseDiscri.setFMScaling(inputSampleRate / m_fmExcursion); + + m_settingsMutex.unlock(); + } + + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + void BFMDemod::applySettings(const BFMDemodSettings& settings, bool force) { - if ((settings.m_inputSampleRate != m_settings.m_inputSampleRate) - || (settings.m_audioStereo && (settings.m_audioStereo != m_settings.m_audioStereo)) || force) + qDebug() << "BFMDemod::applySettings: MsgConfigureBFMDemod:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_volume: " << settings.m_volume + << " m_squelch: " << settings.m_squelch + << " m_audioStereo: " << settings.m_audioStereo + << " m_lsbStereo: " << settings.m_lsbStereo + << " m_showPilot: " << settings.m_showPilot + << " m_rdsActive: " << settings.m_rdsActive + << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP + << " m_udpAddress: " << settings.m_udpAddress + << " m_udpPort: " << settings.m_udpPort + << " force: " << force; + + if ((settings.m_audioStereo && (settings.m_audioStereo != m_settings.m_audioStereo)) || force) { - m_pilotPLL.configure(19000.0/settings.m_inputSampleRate, 50.0/settings.m_inputSampleRate, 0.01); + m_pilotPLL.configure(19000.0/m_inputSampleRate, 50.0/m_inputSampleRate, 0.01); } - if((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force) - { - qDebug() << "BFMDemod::handleMessage: m_nco.setFreq"; - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); - } - - if((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || - (settings.m_afBandwidth != m_settings.m_afBandwidth) || force) + if((settings.m_afBandwidth != m_settings.m_afBandwidth) || force) { m_settingsMutex.lock(); - qDebug() << "BFMDemod::handleMessage: m_interpolator.create"; - m_interpolator.create(16, settings.m_inputSampleRate, settings.m_afBandwidth); - m_interpolatorDistanceRemain = (Real) settings.m_inputSampleRate / settings.m_audioSampleRate; - m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolator.create(16, m_inputSampleRate, settings.m_afBandwidth); + m_interpolatorDistanceRemain = (Real) m_inputSampleRate / settings.m_audioSampleRate; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; - m_interpolatorStereo.create(16, settings.m_inputSampleRate, settings.m_afBandwidth); - m_interpolatorStereoDistanceRemain = (Real) settings.m_inputSampleRate / settings.m_audioSampleRate; - m_interpolatorStereoDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolatorStereo.create(16, m_inputSampleRate, settings.m_afBandwidth); + m_interpolatorStereoDistanceRemain = (Real) m_inputSampleRate / settings.m_audioSampleRate; + m_interpolatorStereoDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; - m_interpolatorRDS.create(4, settings.m_inputSampleRate, 600.0); - m_interpolatorRDSDistanceRemain = (Real) settings.m_inputSampleRate / 250000.0; - m_interpolatorRDSDistance = (Real) settings.m_inputSampleRate / 250000.0; + m_interpolatorRDS.create(4, m_inputSampleRate, 600.0); + m_interpolatorRDSDistanceRemain = (Real) m_inputSampleRate / 250000.0; + m_interpolatorRDSDistance = (Real) m_inputSampleRate / 250000.0; m_settingsMutex.unlock(); } - if((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || - (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || - (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) + if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || + (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force) { m_settingsMutex.lock(); - Real lowCut = -(settings.m_rfBandwidth / 2.0) / settings.m_inputSampleRate; - Real hiCut = (settings.m_rfBandwidth / 2.0) / settings.m_inputSampleRate; + Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_inputSampleRate; + Real hiCut = (settings.m_rfBandwidth / 2.0) / m_inputSampleRate; m_rfFilter->create_filter(lowCut, hiCut); - m_phaseDiscri.setFMScaling(settings.m_inputSampleRate / m_fmExcursion); + m_phaseDiscri.setFMScaling(m_inputSampleRate / m_fmExcursion); m_settingsMutex.unlock(); - - qDebug() << "BFMDemod::handleMessage: m_rfFilter->create_filter: sampleRate: " - << settings.m_inputSampleRate - << " lowCut: " << lowCut * settings.m_inputSampleRate - << " hiCut: " << hiCut * settings.m_inputSampleRate; } if ((settings.m_afBandwidth != m_settings.m_afBandwidth) || diff --git a/plugins/channelrx/demodbfm/bfmdemod.h b/plugins/channelrx/demodbfm/bfmdemod.h index 307e9b3ed..d8f823f78 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.h +++ b/plugins/channelrx/demodbfm/bfmdemod.h @@ -117,7 +117,7 @@ public: virtual void destroy() { delete this; } void setSampleSink(BasebandSampleSink* sampleSink) { m_sampleSink = sampleSink; } - int getSampleRate() const { return m_settings.m_inputSampleRate; } + int getSampleRate() const { return m_inputSampleRate; } virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool po); virtual void start(); virtual void stop(); @@ -167,8 +167,9 @@ private: ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; + int m_inputSampleRate; + int m_inputFrequencyOffset; BFMDemodSettings m_settings; - int m_absoluteFrequencyOffset; NCO m_nco; Interpolator m_interpolator; //!< Interpolator between fixed demod bandwidth and audio bandwidth (rational) @@ -224,6 +225,7 @@ private: static const int m_udpBlockSize; + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); void applySettings(const BFMDemodSettings& settings, bool force = false); }; diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp index 8c36fb408..1c6d1cd13 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.cpp @@ -36,7 +36,6 @@ BFMDemodSettings::BFMDemodSettings() : void BFMDemodSettings::resetToDefaults() { - m_inputSampleRate = 384000; m_inputFrequencyOffset = 0; m_rfBandwidth = getRFBW(5); m_afBandwidth = 15000; diff --git a/plugins/channelrx/demodbfm/bfmdemodsettings.h b/plugins/channelrx/demodbfm/bfmdemodsettings.h index f9adc1113..363034d6d 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsettings.h +++ b/plugins/channelrx/demodbfm/bfmdemodsettings.h @@ -21,7 +21,6 @@ class Serializable; struct BFMDemodSettings { - int m_inputSampleRate; qint64 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_afBandwidth; diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index 3e9ee2a59..91d7d595c 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -42,7 +42,8 @@ const int DSDDemod::m_udpBlockSize = 512; DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_inputSampleRate(48000), + m_inputFrequencyOffset(0), m_interpolatorDistance(0.0f), m_interpolatorDistanceRemain(0.0f), m_sampleCount(0), @@ -325,21 +326,17 @@ bool DSDDemod::handleMessage(const Message& cmd) if (DownChannelizer::MsgChannelizerNotification::match(cmd)) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; + qDebug() << "DSDDemod::handleMessage: MsgChannelizerNotification: inputSampleRate: " << notif.getSampleRate() + << " inputFrequencyOffset: " << notif.getFrequencyOffset(); - DSDDemodSettings settings = m_settings; - settings.m_inputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - - qDebug() << "DSDDemod::handleMessage: MsgChannelizerNotification: m_inputSampleRate: " << settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset; + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); return true; } else if (MsgConfigureChannelizer::match(cmd)) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug("DSDDemod::handleMessage: MsgConfigureChannelizer"); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), @@ -350,35 +347,9 @@ bool DSDDemod::handleMessage(const Message& cmd) else if (MsgConfigureDSDDemod::match(cmd)) { MsgConfigureDSDDemod& cfg = (MsgConfigureDSDDemod&) cmd; + qDebug("DSDDemod::handleMessage: MsgConfigureDSDDemod: m_rfBandwidth"); - DSDDemodSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotification - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "DSDDemod::handleMessage: MsgConfigureDSDDemod: m_rfBandwidth: " << m_settings.m_rfBandwidth - << " m_fmDeviation: " << m_settings.m_fmDeviation - << " m_demodGain: " << m_settings.m_demodGain - << " m_volume: " << m_settings.m_volume - << " m_baudRate: " << m_settings.m_baudRate - << " m_squelchGate" << m_settings.m_squelchGate - << " m_squelch: " << m_settings.m_squelch - << " m_audioMute: " << m_settings.m_audioMute - << " m_enableCosineFiltering: " << m_settings.m_enableCosineFiltering - << " m_syncOrConstellation: " << m_settings.m_syncOrConstellation - << " m_slot1On: " << m_settings.m_slot1On - << " m_slot2On: " << m_settings.m_slot2On - << " m_tdmaStereo: " << m_settings.m_tdmaStereo - << " m_pllLock: " << m_settings.m_pllLock - << " m_udpCopyAudio: " << m_settings.m_udpCopyAudio - << " m_udpAddress: " << m_settings.m_udpAddress - << " m_udpPort: " << m_settings.m_udpPort - << " m_highPassFilter: "<< m_settings.m_highPassFilter - << " force: " << cfg.getForce(); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -394,21 +365,61 @@ bool DSDDemod::handleMessage(const Message& cmd) } } -void DSDDemod::applySettings(DSDDemodSettings& settings, bool force) +void DSDDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) { - if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force) + qDebug() << "DSDDemod::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if ((inputFrequencyOffset != m_inputFrequencyOffset) || + (inputSampleRate != m_inputSampleRate)) { - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); } - if ((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || - (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + if (inputSampleRate != m_inputSampleRate) { m_settingsMutex.lock(); - m_interpolator.create(16, settings.m_inputSampleRate, (settings.m_rfBandwidth) / 2.2); + m_interpolator.create(16, inputSampleRate, (m_settings.m_rfBandwidth) / 2.2); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + m_settingsMutex.unlock(); + } + + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) +{ + qDebug() << "DSDDemod::applySettings: " + << " m_inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << m_settings.m_rfBandwidth + << " m_fmDeviation: " << m_settings.m_fmDeviation + << " m_demodGain: " << m_settings.m_demodGain + << " m_volume: " << m_settings.m_volume + << " m_baudRate: " << m_settings.m_baudRate + << " m_squelchGate" << m_settings.m_squelchGate + << " m_squelch: " << m_settings.m_squelch + << " m_audioMute: " << m_settings.m_audioMute + << " m_enableCosineFiltering: " << m_settings.m_enableCosineFiltering + << " m_syncOrConstellation: " << m_settings.m_syncOrConstellation + << " m_slot1On: " << m_settings.m_slot1On + << " m_slot2On: " << m_settings.m_slot2On + << " m_tdmaStereo: " << m_settings.m_tdmaStereo + << " m_pllLock: " << m_settings.m_pllLock + << " m_udpCopyAudio: " << m_settings.m_udpCopyAudio + << " m_udpAddress: " << m_settings.m_udpAddress + << " m_udpPort: " << m_settings.m_udpPort + << " m_highPassFilter: "<< m_settings.m_highPassFilter + << " force: " << force; + + if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) + { + m_settingsMutex.lock(); + m_interpolator.create(16, m_inputSampleRate, (settings.m_rfBandwidth) / 2.2); + m_interpolatorDistanceRemain = 0; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation); m_settingsMutex.unlock(); } @@ -458,7 +469,7 @@ void DSDDemod::applySettings(DSDDemodSettings& settings, bool force) if ((settings.m_udpAddress != m_settings.m_udpAddress) || (settings.m_udpPort != m_settings.m_udpPort) || force) { - m_udpBufferAudio->setAddress(settings.m_udpAddress); + m_udpBufferAudio->setAddress(const_cast(settings.m_udpAddress)); m_udpBufferAudio->setPort(settings.m_udpPort); } diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 0f6e55382..23054c5e9 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -160,8 +160,9 @@ private: ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; + int m_inputSampleRate; + int m_inputFrequencyOffset; DSDDemodSettings m_settings; - int m_absoluteFrequencyOffset; NCO m_nco; Interpolator m_interpolator; @@ -201,7 +202,8 @@ private: static const int m_udpBlockSize; - void applySettings(DSDDemodSettings& settings, bool force = false); + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); + void applySettings(const DSDDemodSettings& settings, bool force = false); }; #endif // INCLUDE_DSDDEMOD_H diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.cpp b/plugins/channelrx/demoddsd/dsddemodsettings.cpp index 6c04cba8b..6a6ff4feb 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsettings.cpp @@ -30,7 +30,6 @@ DSDDemodSettings::DSDDemodSettings() : void DSDDemodSettings::resetToDefaults() { - m_inputSampleRate = 96000; m_inputFrequencyOffset = 0; m_rfBandwidth = 12500.0; m_fmDeviation = 5000.0; @@ -63,7 +62,6 @@ QByteArray DSDDemodSettings::serialize() const s.writeS32(3, m_demodGain*100.0); s.writeS32(4, m_fmDeviation/100.0); s.writeS32(5, m_squelch*10.0); - s.writeS32(6, m_inputSampleRate); s.writeU32(7, m_rgbColor); s.writeS32(8, m_squelchGate); s.writeS32(9, m_volume*10.0); @@ -120,7 +118,6 @@ bool DSDDemodSettings::deserialize(const QByteArray& data) m_fmDeviation = tmp * 100.0; d.readS32(5, &tmp, -400); m_squelch = tmp / 10.0; - d.readS32(6, &m_inputSampleRate, 96000); d.readU32(7, &m_rgbColor); d.readS32(8, &m_squelchGate, 5); d.readS32(9, &tmp, 20); diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.h b/plugins/channelrx/demoddsd/dsddemodsettings.h index 48a272890..0c86c3cf1 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.h +++ b/plugins/channelrx/demoddsd/dsddemodsettings.h @@ -23,7 +23,6 @@ class Serializable; struct DSDDemodSettings { - int m_inputSampleRate; qint64 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_fmDeviation; diff --git a/plugins/channelrx/demodnfm/nfmdemod.cpp b/plugins/channelrx/demodnfm/nfmdemod.cpp index 2dd103cdd..4124092c3 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.cpp +++ b/plugins/channelrx/demodnfm/nfmdemod.cpp @@ -312,6 +312,7 @@ void NFMDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto void NFMDemod::start() { qDebug() << "NFMDemod::start"; + m_squelchCount = 0; m_audioFifo.clear(); m_phaseDiscri.reset(); } @@ -334,6 +335,7 @@ bool NFMDemod::handleMessage(const Message& cmd) else if (MsgConfigureChannelizer::match(cmd)) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "NFMDemod::handleMessage: MsgConfigureChannelizer:" << " sampleRate: " << cfg.getSampleRate() << " centerFrequency: " << cfg.getCenterFrequency(); @@ -347,10 +349,9 @@ bool NFMDemod::handleMessage(const Message& cmd) else if (MsgConfigureNFMDemod::match(cmd)) { MsgConfigureNFMDemod& cfg = (MsgConfigureNFMDemod&) cmd; - NFMDemodSettings settings = cfg.getSettings(); qDebug() << "NFMDemod::handleMessage: MsgConfigureNFMDemod"; - applySettings(settings, cfg.getForce()); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } diff --git a/plugins/channelrx/demodssb/ssbdemod.cpp b/plugins/channelrx/demodssb/ssbdemod.cpp index 8b496fa46..287d1eac5 100644 --- a/plugins/channelrx/demodssb/ssbdemod.cpp +++ b/plugins/channelrx/demodssb/ssbdemod.cpp @@ -62,13 +62,13 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) : m_LowCutoff = 300; m_volume = 2.0; m_spanLog2 = 3; - m_sampleRate = 96000; - m_absoluteFrequencyOffset = 0; - m_nco.setFreq(m_absoluteFrequencyOffset, m_sampleRate); + m_inputSampleRate = 48000; + m_inputFrequencyOffset = 0; m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); - m_interpolator.create(16, m_sampleRate, 5000); - m_sampleDistanceRemain = (Real) m_sampleRate / m_audioSampleRate; + m_nco.setFreq(m_inputFrequencyOffset, m_inputSampleRate); + m_interpolator.create(16, m_inputSampleRate, 5000); + m_sampleDistanceRemain = (Real) m_inputSampleRate / m_audioSampleRate; m_audioBuffer.resize(1<<9); m_audioBufferFill = 0; @@ -172,7 +172,7 @@ void SSBDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto n_out = SSBFilter->runSSB(ci, &sideband, m_usb); } - m_sampleDistanceRemain += (Real)m_sampleRate / m_audioSampleRate; + m_sampleDistanceRemain += (Real) m_inputSampleRate / m_audioSampleRate; } else { @@ -297,62 +297,30 @@ bool SSBDemod::handleMessage(const Message& cmd) if (DownChannelizer::MsgChannelizerNotification::match(cmd)) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; + qDebug("SSBDemod::handleMessage: MsgChannelizerNotification: m_sampleRate"); - m_settingsMutex.lock(); - - m_sampleRate = notif.getSampleRate(); - m_nco.setFreq(-notif.getFrequencyOffset(), m_sampleRate); - m_interpolator.create(16, m_sampleRate, m_Bandwidth); - m_sampleDistanceRemain = m_sampleRate / m_audioSampleRate; - - m_settingsMutex.unlock(); - - qDebug() << "SSBDemod::handleMessage: MsgChannelizerNotification: m_sampleRate: " << m_sampleRate - << " frequencyOffset" << notif.getFrequencyOffset(); + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); return true; } else if (MsgConfigureChannelizer::match(cmd)) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "SSBDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate() + << " centerFrequency: " << cfg.getCenterFrequency(); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "SSBDemod::handleMessage: MsgConfigureChannelizer: sampleRate: " << cfg.getSampleRate() - << " centerFrequency: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureSSBDemod::match(cmd)) { MsgConfigureSSBDemod& cfg = (MsgConfigureSSBDemod&) cmd; + qDebug("SSBDemod::handleMessage: MsgConfigureSSBDemod"); - SSBDemodSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotificatione - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; // save as absolut frequency shift in baseband - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "SSBDemod::handleMessage: MsgConfigureSSBDemod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_lowCutoff: " << settings.m_lowCutoff - << " m_volume: " << settings.m_volume - << " m_spanLog2: " << settings.m_spanLog2 - << " m_audioBinaual: " << settings.m_audioBinaural - << " m_audioFlipChannels: " << settings.m_audioFlipChannels - << " m_dsb: " << settings.m_dsb - << " m_audioMute: " << settings.m_audioMute - << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP - << " m_agcActive: " << settings.m_agc - << " m_agcClamping: " << settings.m_agcClamping - << " m_agcTimeLog2: " << settings.m_agcTimeLog2 - << " agcPowerThreshold: " << settings.m_agcPowerThreshold - << " agcThresholdGate: " << settings.m_agcThresholdGate; + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -369,17 +337,49 @@ bool SSBDemod::handleMessage(const Message& cmd) } } -void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) +void SSBDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) { - if ((m_settings.m_inputFrequencyOffset != settings.m_inputFrequencyOffset) || - (m_settings.m_inputSampleRate != settings.m_inputSampleRate) || force) + qDebug() << "SSBDemod::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if ((m_inputFrequencyOffset != inputFrequencyOffset) || + (m_inputSampleRate != inputSampleRate)) { - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); } + if (m_inputSampleRate != inputSampleRate) + { + m_settingsMutex.lock(); + m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth * 2.0f); + m_settingsMutex.unlock(); + } - if((m_settings.m_inputSampleRate != settings.m_inputSampleRate) || - (m_settings.m_rfBandwidth != settings.m_rfBandwidth) || + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) +{ + qDebug() << "SSBDemod::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_lowCutoff: " << settings.m_lowCutoff + << " m_volume: " << settings.m_volume + << " m_spanLog2: " << settings.m_spanLog2 + << " m_audioBinaual: " << settings.m_audioBinaural + << " m_audioFlipChannels: " << settings.m_audioFlipChannels + << " m_dsb: " << settings.m_dsb + << " m_audioMute: " << settings.m_audioMute + << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP + << " m_agcActive: " << settings.m_agc + << " m_agcClamping: " << settings.m_agcClamping + << " m_agcTimeLog2: " << settings.m_agcTimeLog2 + << " agcPowerThreshold: " << settings.m_agcPowerThreshold + << " agcThresholdGate: " << settings.m_agcThresholdGate; + + if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) || (m_settings.m_lowCutoff != settings.m_lowCutoff) || (m_settings.m_audioSampleRate != settings.m_audioSampleRate) || force) { @@ -393,8 +393,9 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) band = -band; lowCutoff = -lowCutoff; m_usb = false; - } else + } else { m_usb = true; + } if (band < 100.0f) { @@ -406,7 +407,7 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force) m_LowCutoff = lowCutoff; m_settingsMutex.lock(); - m_interpolator.create(16, m_sampleRate, band * 2.0f); + m_interpolator.create(16, m_inputSampleRate, band * 2.0f); SSBFilter->create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate); DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) m_audioSampleRate); m_settingsMutex.unlock(); diff --git a/plugins/channelrx/demodssb/ssbdemod.h b/plugins/channelrx/demodssb/ssbdemod.h index 14e526850..69dc06169 100644 --- a/plugins/channelrx/demodssb/ssbdemod.h +++ b/plugins/channelrx/demodssb/ssbdemod.h @@ -241,8 +241,8 @@ private: int m_spanLog2; fftfilt::cmplx m_sum; int m_undersampleCount; - int m_sampleRate; - int m_absoluteFrequencyOffset; + int m_inputSampleRate; + int m_inputFrequencyOffset; bool m_audioBinaual; bool m_audioFlipChannels; bool m_usb; @@ -278,6 +278,7 @@ private: QMutex m_settingsMutex; + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); void applySettings(const SSBDemodSettings& settings, bool force = false); }; diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.cpp b/plugins/channelrx/demodssb/ssbdemodsettings.cpp index f5476a70b..bff130abd 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.cpp +++ b/plugins/channelrx/demodssb/ssbdemodsettings.cpp @@ -44,7 +44,6 @@ void SSBDemodSettings::resetToDefaults() m_lowCutoff = 300; m_volume = 3.0; m_spanLog2 = 3; - m_inputSampleRate = 96000; m_inputFrequencyOffset = 0; m_audioSampleRate = DSPEngine::instance()->getAudioSampleRate(); m_udpAddress = "127.0.0.1"; diff --git a/plugins/channelrx/demodssb/ssbdemodsettings.h b/plugins/channelrx/demodssb/ssbdemodsettings.h index 23ef18b43..fe491125a 100644 --- a/plugins/channelrx/demodssb/ssbdemodsettings.h +++ b/plugins/channelrx/demodssb/ssbdemodsettings.h @@ -23,7 +23,6 @@ class Serializable; struct SSBDemodSettings { - int m_inputSampleRate; qint32 m_inputFrequencyOffset; quint32 m_audioSampleRate; Real m_rfBandwidth; diff --git a/plugins/channelrx/demodwfm/wfmdemod.cpp b/plugins/channelrx/demodwfm/wfmdemod.cpp index b9e32e341..0c66af406 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.cpp +++ b/plugins/channelrx/demodwfm/wfmdemod.cpp @@ -40,7 +40,8 @@ const int WFMDemod::m_udpBlockSize = 512; WFMDemod::WFMDemod(DeviceSourceAPI* deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_inputSampleRate(384000), + m_inputFrequencyOffset(0), m_squelchOpen(false), m_magsq(0.0f), m_magsqSum(0.0f), @@ -210,55 +211,32 @@ bool WFMDemod::handleMessage(const Message& cmd) if (DownChannelizer::MsgChannelizerNotification::match(cmd)) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; + qDebug() << "WFMDemod::handleMessage: MsgChannelizerNotification: m_inputSampleRate: " << notif.getSampleRate() + << " m_inputFrequencyOffset: " << notif.getFrequencyOffset(); - WFMDemodSettings settings = m_settings; - - settings.m_inputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - applySettings(settings); - - qDebug() << "WFMDemod::handleMessage: MsgChannelizerNotification: m_inputSampleRate: " << settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset; + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); return true; } else if (MsgConfigureChannelizer::match(cmd)) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "WFMDemod::handleMessage: MsgConfigureChannelizer:" + << " sampleRate: " << cfg.getSampleRate() + << " inputFrequencyOffset: " << cfg.getCenterFrequency(); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "WFMDemod::handleMessage: MsgConfigureChannelizer:" - << " sampleRate: " << cfg.getSampleRate() - << " inputFrequencyOffset: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureWFMDemod::match(cmd)) { MsgConfigureWFMDemod& cfg = (MsgConfigureWFMDemod&) cmd; + qDebug("WFMDemod::handleMessage: MsgConfigureWFMDemod"); - WFMDemodSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotification - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "WFMDemod::handleMessage: MsgConfigureWFMDemod:" - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_afBandwidth: " << settings.m_afBandwidth - << " m_volume: " << settings.m_volume - << " m_squelch: " << settings.m_squelch - << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP - << " m_udpAddress: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " force: " << cfg.getForce(); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -275,30 +253,64 @@ bool WFMDemod::handleMessage(const Message& cmd) } } -void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) +void WFMDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) { - if((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || - (settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force) + qDebug() << "WFMDemod::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if((inputFrequencyOffset != m_inputFrequencyOffset) || + (inputSampleRate != m_inputSampleRate)) { - qDebug() << "WFMDemod::applySettings: m_nco.setFreq"; - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); } - if((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || - (settings.m_audioSampleRate != m_settings.m_audioSampleRate) || + if (inputSampleRate != m_inputSampleRate) + { + qDebug() << "WFMDemod::applyChannelSettings: m_interpolator.create"; + m_interpolator.create(16, inputSampleRate, m_settings.m_afBandwidth); + m_interpolatorDistanceRemain = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + qDebug() << "WFMDemod::applySettings: m_rfFilter->create_filter"; + Real lowCut = -(m_settings.m_rfBandwidth / 2.0) / inputSampleRate; + Real hiCut = (m_settings.m_rfBandwidth / 2.0) / inputSampleRate; + m_rfFilter->create_filter(lowCut, hiCut); + m_fmExcursion = m_settings.m_rfBandwidth / (Real) inputSampleRate; + m_phaseDiscri.setFMScaling(1.0f/m_fmExcursion); + qDebug("WFMDemod::applySettings: m_fmExcursion: %f", m_fmExcursion); + } + + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + +void WFMDemod::applySettings(const WFMDemodSettings& settings, bool force) +{ + qDebug() << "WFMDemod::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_afBandwidth: " << settings.m_afBandwidth + << " m_volume: " << settings.m_volume + << " m_squelch: " << settings.m_squelch + << " m_copyAudioToUDP: " << settings.m_copyAudioToUDP + << " m_udpAddress: " << settings.m_udpAddress + << " m_udpPort: " << settings.m_udpPort + << " force: " << force; + + if((settings.m_audioSampleRate != m_settings.m_audioSampleRate) || (settings.m_afBandwidth != m_settings.m_afBandwidth) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) { m_settingsMutex.lock(); qDebug() << "WFMDemod::applySettings: m_interpolator.create"; - m_interpolator.create(16, settings.m_inputSampleRate, settings.m_afBandwidth); - m_interpolatorDistanceRemain = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; - m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolator.create(16, m_inputSampleRate, settings.m_afBandwidth); + m_interpolatorDistanceRemain = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; qDebug() << "WFMDemod::applySettings: m_rfFilter->create_filter"; - Real lowCut = -(settings.m_rfBandwidth / 2.0) / settings.m_inputSampleRate; - Real hiCut = (settings.m_rfBandwidth / 2.0) / settings.m_inputSampleRate; + Real lowCut = -(settings.m_rfBandwidth / 2.0) / m_inputSampleRate; + Real hiCut = (settings.m_rfBandwidth / 2.0) / m_inputSampleRate; m_rfFilter->create_filter(lowCut, hiCut); - m_fmExcursion = settings.m_rfBandwidth / (Real) settings.m_inputSampleRate; + m_fmExcursion = settings.m_rfBandwidth / (Real) m_inputSampleRate; m_phaseDiscri.setFMScaling(1.0f/m_fmExcursion); qDebug("WFMDemod::applySettings: m_fmExcursion: %f", m_fmExcursion); m_settingsMutex.unlock(); diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index ba1f628a4..120612ee4 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -132,8 +132,9 @@ private: ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; + int m_inputSampleRate; + int m_inputFrequencyOffset; WFMDemodSettings m_settings; - int m_absoluteFrequencyOffset; NCO m_nco; Interpolator m_interpolator; //!< Interpolator between sample rate sent from DSP engine and requested RF bandwidth (rational) @@ -166,6 +167,7 @@ private: static const int m_udpBlockSize; + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); void applySettings(const WFMDemodSettings& settings, bool force = false); }; diff --git a/plugins/channelrx/demodwfm/wfmdemodsettings.cpp b/plugins/channelrx/demodwfm/wfmdemodsettings.cpp index c841e40e3..104c293ad 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsettings.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodsettings.cpp @@ -36,7 +36,6 @@ WFMDemodSettings::WFMDemodSettings() : void WFMDemodSettings::resetToDefaults() { - m_inputSampleRate = 384000; m_inputFrequencyOffset = 0; m_rfBandwidth = getRFBW(5); m_afBandwidth = 15000; diff --git a/plugins/channelrx/demodwfm/wfmdemodsettings.h b/plugins/channelrx/demodwfm/wfmdemodsettings.h index 79dfc8ca5..7cbaf1f9f 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsettings.h +++ b/plugins/channelrx/demodwfm/wfmdemodsettings.h @@ -22,7 +22,6 @@ class Serializable; struct WFMDemodSettings { - int m_inputSampleRate; qint64 m_inputFrequencyOffset; Real m_rfBandwidth; Real m_afBandwidth; diff --git a/plugins/channelrx/udpsrc/udpsrc.cpp b/plugins/channelrx/udpsrc/udpsrc.cpp index 3e309646f..768a45a35 100644 --- a/plugins/channelrx/udpsrc/udpsrc.cpp +++ b/plugins/channelrx/udpsrc/udpsrc.cpp @@ -39,7 +39,8 @@ const QString UDPSrc::m_channelId = "UDPSrc"; UDPSrc::UDPSrc(DeviceSourceAPI *deviceAPI) : ChannelSinkAPI(m_channelIdURI), m_deviceAPI(deviceAPI), - m_absoluteFrequencyOffset(0), + m_inputSampleRate(48000), + m_inputFrequencyOffset(0), m_outMovingAverage(480, 1e-10), m_inMovingAverage(480, 1e-10), m_amMovingAverage(1200, 1e-10), @@ -64,9 +65,9 @@ UDPSrc::UDPSrc(DeviceSourceAPI *deviceAPI) : m_audioBuffer.resize(1<<9); m_audioBufferFill = 0; - m_nco.setFreq(0, m_settings.m_inputSampleRate); - m_interpolator.create(16, m_settings.m_inputSampleRate, m_settings.m_rfBandwidth / 2.0); - m_sampleDistanceRemain = m_settings.m_inputSampleRate / m_settings.m_outputSampleRate; + m_nco.setFreq(0, m_inputSampleRate); + m_interpolator.create(16, m_inputSampleRate, m_settings.m_rfBandwidth / 2.0); + m_sampleDistanceRemain = m_inputSampleRate / m_settings.m_outputSampleRate; m_spectrumEnabled = false; m_nextSSBId = 0; m_nextS16leId = 0; @@ -162,7 +163,7 @@ void UDPSrc::feed(const SampleVector::const_iterator& begin, const SampleVector: Sample ss(ci.real(), ci.imag()); m_sampleBuffer.push_back(ss); - m_sampleDistanceRemain += m_settings.m_inputSampleRate / m_settings.m_outputSampleRate; + m_sampleDistanceRemain += m_inputSampleRate / m_settings.m_outputSampleRate; calculateSquelch(m_inMagsq); @@ -323,66 +324,33 @@ bool UDPSrc::handleMessage(const Message& cmd) if (DownChannelizer::MsgChannelizerNotification::match(cmd)) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; - - UDPSrcSettings settings; - - settings.m_inputSampleRate = notif.getSampleRate(); - settings.m_inputFrequencyOffset = notif.getFrequencyOffset(); - - //apply(false); - applySettings(settings); - - qDebug() << "UDPSrc::handleMessage: MsgChannelizerNotification: m_inputSampleRate: " << settings.m_inputSampleRate + qDebug() << "UDPSrc::handleMessage: MsgChannelizerNotification: m_inputSampleRate: " << notif.getSampleRate() << " frequencyOffset: " << notif.getFrequencyOffset(); + applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); + + return true; } else if (MsgConfigureChannelizer::match(cmd)) { MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; + qDebug() << "UDPSrc::handleMessage: MsgConfigureChannelizer:" + << " sampleRate: " << cfg.getSampleRate() + << " centerFrequency: " << cfg.getCenterFrequency(); m_channelizer->configure(m_channelizer->getInputMessageQueue(), cfg.getSampleRate(), cfg.getCenterFrequency()); - qDebug() << "UDPSrc::handleMessage: MsgConfigureChannelizer:" - << " sampleRate: " << cfg.getSampleRate() - << " centerFrequency: " << cfg.getCenterFrequency(); - return true; } else if (MsgConfigureUDPSrc::match(cmd)) { MsgConfigureUDPSrc& cfg = (MsgConfigureUDPSrc&) cmd; + qDebug("UDPSrc::handleMessage: MsgConfigureUDPSrc"); - UDPSrcSettings settings = cfg.getSettings(); - - // These settings are set with DownChannelizer::MsgChannelizerNotification - m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset; - settings.m_inputSampleRate = m_settings.m_inputSampleRate; - settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset; - - applySettings(settings, cfg.getForce()); - - qDebug() << "UDPSrc::handleMessage: MsgConfigureUDPSrc: " - << " m_inputSampleRate: " << settings.m_inputSampleRate - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_audioActive: " << settings.m_audioActive - << " m_audioStereo: " << settings.m_audioStereo - << " m_gain: " << settings.m_gain - << " m_volume: " << settings.m_volume - << " m_squelchEnabled: " << settings.m_squelchEnabled - << " m_squelchdB: " << settings.m_squelchdB - << " m_squelchGate" << settings.m_squelchGate - << " m_agc" << settings.m_agc - << " m_sampleFormat: " << settings.m_sampleFormat - << " m_outputSampleRate: " << settings.m_outputSampleRate - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_fmDeviation: " << settings.m_fmDeviation - << " m_udpAddressStr: " << settings.m_udpAddress - << " m_udpPort: " << settings.m_udpPort - << " m_audioPort: " << settings.m_audioPort - << " force: " << cfg.getForce(); + applySettings(cfg.getSettings(), cfg.getForce()); return true; } @@ -477,18 +445,59 @@ void UDPSrc::audioReadyRead() //qDebug("UDPSrc::audioReadyRead: done"); } +void UDPSrc::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset) +{ + qDebug() << "UDPSrc::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + + if((inputFrequencyOffset != m_inputFrequencyOffset) || + (inputSampleRate != m_inputSampleRate)) + { + m_nco.setFreq(-inputFrequencyOffset, inputSampleRate); + } + + if (inputSampleRate != m_inputSampleRate) + { + m_settingsMutex.lock(); + m_interpolator.create(16, inputSampleRate, m_settings.m_rfBandwidth / 2.0); + m_sampleDistanceRemain = inputSampleRate / m_settings.m_outputSampleRate; + m_settingsMutex.unlock(); + } + + m_inputSampleRate = inputSampleRate; + m_inputFrequencyOffset = inputFrequencyOffset; +} + void UDPSrc::applySettings(const UDPSrcSettings& settings, bool force) { + qDebug() << "UDPSrc::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_audioActive: " << settings.m_audioActive + << " m_audioStereo: " << settings.m_audioStereo + << " m_gain: " << settings.m_gain + << " m_volume: " << settings.m_volume + << " m_squelchEnabled: " << settings.m_squelchEnabled + << " m_squelchdB: " << settings.m_squelchdB + << " m_squelchGate" << settings.m_squelchGate + << " m_agc" << settings.m_agc + << " m_sampleFormat: " << settings.m_sampleFormat + << " m_outputSampleRate: " << settings.m_outputSampleRate + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_fmDeviation: " << settings.m_fmDeviation + << " m_udpAddressStr: " << settings.m_udpAddress + << " m_udpPort: " << settings.m_udpPort + << " m_audioPort: " << settings.m_audioPort + << " force: " << force; + m_settingsMutex.lock(); - if ((settings.m_inputSampleRate != m_settings.m_inputSampleRate) || - (settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || + if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || (settings.m_rfBandwidth != m_settings.m_rfBandwidth) || (settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) { - m_nco.setFreq(-settings.m_inputFrequencyOffset, settings.m_inputSampleRate); - m_interpolator.create(16, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.0); - m_sampleDistanceRemain = settings.m_inputSampleRate / settings.m_outputSampleRate; + m_interpolator.create(16, m_inputSampleRate, settings.m_rfBandwidth / 2.0); + m_sampleDistanceRemain = m_inputSampleRate / settings.m_outputSampleRate; if ((settings.m_sampleFormat == UDPSrcSettings::FormatLSB) || (settings.m_sampleFormat == UDPSrcSettings::FormatLSBMono) || diff --git a/plugins/channelrx/udpsrc/udpsrc.h b/plugins/channelrx/udpsrc/udpsrc.h index be3257465..7f6050d67 100644 --- a/plugins/channelrx/udpsrc/udpsrc.h +++ b/plugins/channelrx/udpsrc/udpsrc.h @@ -146,8 +146,9 @@ protected: ThreadedBasebandSampleSink* m_threadedChannelizer; DownChannelizer* m_channelizer; + int m_inputSampleRate; + int m_inputFrequencyOffset; UDPSrcSettings m_settings; - int m_absoluteFrequencyOffset; QUdpSocket *m_audioSocket; @@ -197,6 +198,7 @@ protected: QMutex m_settingsMutex; + void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset); void applySettings(const UDPSrcSettings& settings, bool force = false); inline void calculateSquelch(double value) diff --git a/plugins/channelrx/udpsrc/udpsrcsettings.cpp b/plugins/channelrx/udpsrc/udpsrcsettings.cpp index d8caf03df..371c9e935 100644 --- a/plugins/channelrx/udpsrc/udpsrcsettings.cpp +++ b/plugins/channelrx/udpsrc/udpsrcsettings.cpp @@ -32,7 +32,6 @@ void UDPSrcSettings::resetToDefaults() { m_outputSampleRate = 48000; m_sampleFormat = FormatS16LE; - m_inputSampleRate = 48000; m_inputFrequencyOffset = 0; m_rfBandwidth = 12500; m_fmDeviation = 2500; diff --git a/plugins/channelrx/udpsrc/udpsrcsettings.h b/plugins/channelrx/udpsrc/udpsrcsettings.h index 77ebec8c4..2bd3aa2af 100644 --- a/plugins/channelrx/udpsrc/udpsrcsettings.h +++ b/plugins/channelrx/udpsrc/udpsrcsettings.h @@ -41,7 +41,6 @@ struct UDPSrcSettings float m_outputSampleRate; SampleFormat m_sampleFormat; - float m_inputSampleRate; int64_t m_inputFrequencyOffset; float m_rfBandwidth; int m_fmDeviation;