From c41cf68d60e7b611e9f9d2372f9925290b618957 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sat, 1 Aug 2020 10:09:39 +0200 Subject: [PATCH] Demod plugins with configurable audio: fixed audio sample rate handling --- plugins/channelrx/demodam/amdemodbaseband.cpp | 5 +-- plugins/channelrx/demodam/amdemodbaseband.h | 2 +- plugins/channelrx/demodam/amdemodgui.cpp | 25 ++++++++------ plugins/channelrx/demodam/amdemodgui.h | 1 + plugins/channelrx/demodam/amdemodsink.cpp | 6 ++++ plugins/channelrx/demodam/amdemodsink.h | 4 +-- plugins/channelrx/demodbfm/bfmdemod.h | 1 + .../channelrx/demodbfm/bfmdemodbaseband.cpp | 3 +- plugins/channelrx/demodbfm/bfmdemodbaseband.h | 2 +- plugins/channelrx/demodbfm/bfmdemodgui.cpp | 33 +++++++++++-------- plugins/channelrx/demodbfm/bfmdemodsink.cpp | 8 ++++- plugins/channelrx/demodbfm/bfmdemodsink.h | 6 ++-- plugins/channelrx/demoddsd/dsddemod.h | 1 + .../channelrx/demoddsd/dsddemodbaseband.cpp | 6 ++-- plugins/channelrx/demoddsd/dsddemodbaseband.h | 2 +- plugins/channelrx/demoddsd/dsddemodgui.cpp | 9 +++-- plugins/channelrx/demoddsd/dsddemodgui.h | 1 + plugins/channelrx/demoddsd/dsddemodsink.cpp | 6 ++++ plugins/channelrx/demoddsd/dsddemodsink.h | 4 +-- plugins/channelrx/demodfreedv/freedvdemod.h | 2 +- .../demodfreedv/freedvdemodbaseband.cpp | 3 +- .../demodfreedv/freedvdemodbaseband.h | 2 +- .../channelrx/demodfreedv/freedvdemodgui.cpp | 11 +++++-- .../channelrx/demodfreedv/freedvdemodgui.h | 1 + .../channelrx/demodfreedv/freedvdemodsink.cpp | 6 ++++ .../channelrx/demodfreedv/freedvdemodsink.h | 4 +-- plugins/channelrx/demodnfm/nfmdemod.h | 1 + .../channelrx/demodnfm/nfmdemodbaseband.cpp | 5 +-- plugins/channelrx/demodnfm/nfmdemodbaseband.h | 2 +- plugins/channelrx/demodnfm/nfmdemodgui.cpp | 9 +++-- plugins/channelrx/demodnfm/nfmdemodgui.h | 1 + plugins/channelrx/demodnfm/nfmdemodsink.cpp | 6 ++++ plugins/channelrx/demodnfm/nfmdemodsink.h | 4 +-- plugins/channelrx/demodwfm/wfmdemod.h | 1 + .../channelrx/demodwfm/wfmdemodbaseband.cpp | 3 +- plugins/channelrx/demodwfm/wfmdemodbaseband.h | 2 +- plugins/channelrx/demodwfm/wfmdemodgui.cpp | 12 +++++-- plugins/channelrx/demodwfm/wfmdemodgui.h | 1 + plugins/channelrx/demodwfm/wfmdemodsink.cpp | 8 ++++- plugins/channelrx/demodwfm/wfmdemodsink.h | 6 ++-- 40 files changed, 149 insertions(+), 66 deletions(-) diff --git a/plugins/channelrx/demodam/amdemodbaseband.cpp b/plugins/channelrx/demodam/amdemodbaseband.cpp index 6bae1dff3..2a614e56c 100644 --- a/plugins/channelrx/demodam/amdemodbaseband.cpp +++ b/plugins/channelrx/demodam/amdemodbaseband.cpp @@ -165,14 +165,15 @@ void AMDemodBaseband::applySettings(const AMDemodSettings& settings, bool force) AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { - m_sink.applyAudioSampleRate(audioSampleRate); m_channelizer->setChannelization(audioSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + m_sink.applyAudioSampleRate(audioSampleRate); } } diff --git a/plugins/channelrx/demodam/amdemodbaseband.h b/plugins/channelrx/demodam/amdemodbaseband.h index 91f8ab6b4..d3d6b4241 100644 --- a/plugins/channelrx/demodam/amdemodbaseband.h +++ b/plugins/channelrx/demodam/amdemodbaseband.h @@ -66,7 +66,7 @@ public: int getChannelSampleRate() const; void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_sink.getMagSqLevels(avg, peak, nbSamples); } bool getSquelchOpen() const { return m_sink.getSquelchOpen(); } - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } void setBasebandSampleRate(int sampleRate); double getMagSq() const { return m_sink.getMagSq(); } bool getPllLocked() const { return m_sink.getPllLocked(); } diff --git a/plugins/channelrx/demodam/amdemodgui.cpp b/plugins/channelrx/demodam/amdemodgui.cpp index 6264bc905..c8ab8c3da 100644 --- a/plugins/channelrx/demodam/amdemodgui.cpp +++ b/plugins/channelrx/demodam/amdemodgui.cpp @@ -255,6 +255,7 @@ AMDemodGUI::AMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandS m_channelMarker(this), m_doApplySettings(true), m_squelchOpen(false), + m_audioSampleRate(-1), m_samUSB(true), m_tickCount(0) { @@ -461,18 +462,22 @@ void AMDemodGUI::tick() ui->channelPower->setText(QString::number(powDbAvg, 'f', 1)); } + int audioSampleRate = m_amDemod->getAudioSampleRate(); bool squelchOpen = m_amDemod->getSquelchOpen(); - if (squelchOpen != m_squelchOpen) - { - m_squelchOpen = squelchOpen; + if ((audioSampleRate != m_audioSampleRate) || (squelchOpen != m_squelchOpen)) + { + if (audioSampleRate < 0) { + ui->audioMute->setStyleSheet("QToolButton { background-color : red; }"); + } else if (squelchOpen) { + ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); + } else { + ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); + } - if (m_squelchOpen) { - ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); - } else { - ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); - } - } + m_audioSampleRate = audioSampleRate; + m_squelchOpen = squelchOpen; + } if (m_settings.m_pll) { @@ -482,7 +487,7 @@ void AMDemodGUI::tick() ui->pll->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } - int freq = (m_amDemod->getPllFrequency() * m_amDemod->getAudioSampleRate()) / (2.0*M_PI); + int freq = (m_amDemod->getPllFrequency() * audioSampleRate) / (2.0*M_PI); ui->pll->setToolTip(tr("PLL for synchronous AM. Freq = %1 Hz").arg(freq)); } diff --git a/plugins/channelrx/demodam/amdemodgui.h b/plugins/channelrx/demodam/amdemodgui.h index eb91cb141..cea9d848a 100644 --- a/plugins/channelrx/demodam/amdemodgui.h +++ b/plugins/channelrx/demodam/amdemodgui.h @@ -52,6 +52,7 @@ private: AMDemod* m_amDemod; bool m_squelchOpen; + int m_audioSampleRate; //!< for display purposes bool m_samUSB; uint32_t m_tickCount; MessageQueue m_inputMessageQueue; diff --git a/plugins/channelrx/demodam/amdemodsink.cpp b/plugins/channelrx/demodam/amdemodsink.cpp index d47486535..64353f7ca 100644 --- a/plugins/channelrx/demodam/amdemodsink.cpp +++ b/plugins/channelrx/demodam/amdemodsink.cpp @@ -297,6 +297,12 @@ void AMDemodSink::applySettings(const AMDemodSettings& settings, bool force) void AMDemodSink::applyAudioSampleRate(int sampleRate) { + if (sampleRate < 0) + { + qWarning("AMDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + qDebug("AMDemodSink::applyAudioSampleRate: sampleRate: %d m_channelSampleRate: %d", sampleRate, m_channelSampleRate); m_interpolator.create(16, m_channelSampleRate, m_settings.m_rfBandwidth / 2.2f); diff --git a/plugins/channelrx/demodam/amdemodsink.h b/plugins/channelrx/demodam/amdemodsink.h index 753552dd6..33b449a2d 100644 --- a/plugins/channelrx/demodam/amdemodsink.h +++ b/plugins/channelrx/demodam/amdemodsink.h @@ -44,7 +44,7 @@ public: void applySettings(const AMDemodSettings& settings, bool force = false); void applyAudioSampleRate(int sampleRate); - uint32_t getAudioSampleRate() const { return m_audioSampleRate; } + int getAudioSampleRate() const { return m_audioSampleRate; } double getMagSq() const { return m_magsq; } bool getSquelchOpen() const { return m_squelchOpen; } bool getPllLocked() const { return m_settings.m_pll && m_pll.locked(); } @@ -88,7 +88,7 @@ private: int m_channelSampleRate; int m_channelFrequencyOffset; AMDemodSettings m_settings; - uint32_t m_audioSampleRate; + int m_audioSampleRate; NCO m_nco; Interpolator m_interpolator; diff --git a/plugins/channelrx/demodbfm/bfmdemod.h b/plugins/channelrx/demodbfm/bfmdemod.h index a3d50433e..b808b529c 100644 --- a/plugins/channelrx/demodbfm/bfmdemod.h +++ b/plugins/channelrx/demodbfm/bfmdemod.h @@ -105,6 +105,7 @@ public: Real getDemodAcc() const { return m_basebandSink->getDemodAcc(); } Real getDemodQua() const { return m_basebandSink->getDemodQua(); } Real getDemodFclk() const { return m_basebandSink->getDemodFclk(); } + int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_basebandSink->getMagSqLevels(avg, peak, nbSamples); } diff --git a/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp b/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp index 8f6d6b5c2..669ff7a81 100644 --- a/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodbaseband.cpp @@ -159,8 +159,9 @@ void BFMDemodBaseband::applySettings(const BFMDemodSettings& settings, bool forc AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { m_sink.applyAudioSampleRate(audioSampleRate); diff --git a/plugins/channelrx/demodbfm/bfmdemodbaseband.h b/plugins/channelrx/demodbfm/bfmdemodbaseband.h index aafde9828..b69f03129 100644 --- a/plugins/channelrx/demodbfm/bfmdemodbaseband.h +++ b/plugins/channelrx/demodbfm/bfmdemodbaseband.h @@ -66,7 +66,7 @@ public: void setSpectrumSink(BasebandSampleSink* spectrumSink) { m_sink.setSpectrumSink(spectrumSink); } void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; } - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } int getSquelchState() const { return m_sink.getSquelchState(); } double getMagSq() const { return m_sink.getMagSq(); } bool getPilotLock() const { return m_sink.getPilotLock(); } diff --git a/plugins/channelrx/demodbfm/bfmdemodgui.cpp b/plugins/channelrx/demodbfm/bfmdemodgui.cpp index 85d8e9b79..f90e124ca 100644 --- a/plugins/channelrx/demodbfm/bfmdemodgui.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodgui.cpp @@ -551,20 +551,25 @@ void BFMDemodGUI::tick() pilotPowDbStr.sprintf("%+02.1f", pilotPowDb); ui->pilotPower->setText(pilotPowDbStr); - if (m_bfmDemod->getPilotLock()) - { - if (ui->audioStereo->isChecked()) - { - ui->audioStereo->setStyleSheet("QToolButton { background-color : green; }"); - } - } - else - { - if (ui->audioStereo->isChecked()) - { - ui->audioStereo->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); - } - } + if (m_bfmDemod->getAudioSampleRate() < 0) + { + ui->audioStereo->setStyleSheet("QToolButton { background-color : red; }"); + } + else + { + if (m_bfmDemod->getPilotLock()) + { + if (ui->audioStereo->isChecked()) { + ui->audioStereo->setStyleSheet("QToolButton { background-color : green; }"); + } + } + else + { + if (ui->audioStereo->isChecked()) { + ui->audioStereo->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); + } + } + } if (ui->rds->isChecked() && (m_rdsTimerCount == 0)) { diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.cpp b/plugins/channelrx/demodbfm/bfmdemodsink.cpp index 73e380b9f..9d778232f 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.cpp +++ b/plugins/channelrx/demodbfm/bfmdemodsink.cpp @@ -247,8 +247,14 @@ void BFMDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV m_sampleBuffer.clear(); } -void BFMDemodSink::applyAudioSampleRate(unsigned int sampleRate) +void BFMDemodSink::applyAudioSampleRate(int sampleRate) { + if (sampleRate < 0) + { + qWarning("BFMDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + qDebug("BFMDemodSink::applyAudioSampleRate: %u", sampleRate); m_interpolator.create(16, m_channelSampleRate, m_settings.m_afBandwidth); diff --git a/plugins/channelrx/demodbfm/bfmdemodsink.h b/plugins/channelrx/demodbfm/bfmdemodsink.h index c46a19d17..ea59fa571 100644 --- a/plugins/channelrx/demodbfm/bfmdemodsink.h +++ b/plugins/channelrx/demodbfm/bfmdemodsink.h @@ -83,8 +83,8 @@ public: void applySettings(const BFMDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo() { return &m_audioFifo; } - void applyAudioSampleRate(unsigned int sampleRate); - unsigned int getAudioSampleRate() const { return m_audioSampleRate; } + void applyAudioSampleRate(int sampleRate); + int getAudioSampleRate() const { return m_audioSampleRate; } private: struct MagSqLevelsStore @@ -106,7 +106,7 @@ private: int m_channelFrequencyOffset; BFMDemodSettings m_settings; - quint32 m_audioSampleRate; + int m_audioSampleRate; AudioVector m_audioBuffer; uint m_audioBufferFill; AudioFifo m_audioFifo; diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index 10ec96317..e30013f02 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -119,6 +119,7 @@ public: const DSDDecoder& getDecoder() const { return m_basebandSink->getDecoder(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_basebandSink->getMagSqLevels(avg, peak, nbSamples); } const char *updateAndGetStatusText() { return m_basebandSink->updateAndGetStatusText(); } + int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } static const QString m_channelIdURI; static const QString m_channelId; diff --git a/plugins/channelrx/demoddsd/dsddemodbaseband.cpp b/plugins/channelrx/demoddsd/dsddemodbaseband.cpp index 78c767fa2..1accde4d0 100644 --- a/plugins/channelrx/demoddsd/dsddemodbaseband.cpp +++ b/plugins/channelrx/demoddsd/dsddemodbaseband.cpp @@ -147,15 +147,17 @@ void DSDDemodBaseband::applySettings(const DSDDemodSettings& settings, bool forc AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo1()); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo2()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo1(), getInputMessageQueue(), audioDeviceIndex); audioDeviceManager->addAudioSink(m_sink.getAudioFifo2(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { - m_sink.applyAudioSampleRate(audioSampleRate); m_channelizer->setChannelization(audioSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + m_sink.applyAudioSampleRate(audioSampleRate); } } diff --git a/plugins/channelrx/demoddsd/dsddemodbaseband.h b/plugins/channelrx/demoddsd/dsddemodbaseband.h index a6118a658..64dc296c8 100644 --- a/plugins/channelrx/demoddsd/dsddemodbaseband.h +++ b/plugins/channelrx/demoddsd/dsddemodbaseband.h @@ -62,7 +62,7 @@ public: void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication int getChannelSampleRate() const; - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } double getMagSq() { return m_sink.getMagSq(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_sink.getMagSqLevels(avg, peak, nbSamples); } bool getSquelchOpen() const { return m_sink.getSquelchOpen(); } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index 4058f9604..bb1bd6f1b 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -334,6 +334,7 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban m_slot2On(false), m_tdmaStereo(false), m_squelchOpen(false), + m_audioSampleRate(-1), m_tickCount(0), m_dsdStatusTextDialog(0) { @@ -560,16 +561,20 @@ void DSDDemodGUI::tick() ui->channelPower->setText(tr("%1 dB").arg(powDbAvg, 0, 'f', 1)); } + int audioSampleRate = m_dsdDemod->getAudioSampleRate(); bool squelchOpen = m_dsdDemod->getSquelchOpen(); - if (squelchOpen != m_squelchOpen) + if ((audioSampleRate != m_audioSampleRate) || (squelchOpen != m_squelchOpen)) { - if (squelchOpen) { + if (audioSampleRate < 0) { + ui->audioMute->setStyleSheet("QToolButton { background-color : red; }"); + } else if (squelchOpen) { ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); } else { ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } + m_audioSampleRate = audioSampleRate; m_squelchOpen = squelchOpen; } diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index fa7251d1d..4198a1eec 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -91,6 +91,7 @@ private: bool m_tdmaStereo; bool m_audioMute; bool m_squelchOpen; + int m_audioSampleRate; uint32_t m_tickCount; float m_myLatitude; diff --git a/plugins/channelrx/demoddsd/dsddemodsink.cpp b/plugins/channelrx/demoddsd/dsddemodsink.cpp index 61c14b80d..b7d0ca241 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsink.cpp @@ -281,6 +281,12 @@ void DSDDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV void DSDDemodSink::applyAudioSampleRate(int sampleRate) { + if (sampleRate < 0) + { + qWarning("DSDDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + int upsampling = sampleRate / 8000; qDebug("DSDDemodSink::applyAudioSampleRate: audio rate: %d upsample by %d", sampleRate, upsampling); diff --git a/plugins/channelrx/demoddsd/dsddemodsink.h b/plugins/channelrx/demoddsd/dsddemodsink.h index f242833e3..3b732150d 100644 --- a/plugins/channelrx/demoddsd/dsddemodsink.h +++ b/plugins/channelrx/demoddsd/dsddemodsink.h @@ -47,7 +47,7 @@ public: void applySettings(const DSDDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo1() { return &m_audioFifo1; } AudioFifo *getAudioFifo2() { return &m_audioFifo2; } - unsigned int getAudioSampleRate() const { return m_audioSampleRate; } + int getAudioSampleRate() const { return m_audioSampleRate; } void setScopeXYSink(BasebandSampleSink* scopeSink) { m_scopeXY = scopeSink; } void configureMyPosition(float myLatitude, float myLongitude); @@ -106,7 +106,7 @@ private: int m_channelSampleRate; int m_channelFrequencyOffset; DSDDemodSettings m_settings; - quint32 m_audioSampleRate; + int m_audioSampleRate; NCO m_nco; Interpolator m_interpolator; diff --git a/plugins/channelrx/demodfreedv/freedvdemod.h b/plugins/channelrx/demodfreedv/freedvdemod.h index 75604076b..eb0390db3 100644 --- a/plugins/channelrx/demodfreedv/freedvdemod.h +++ b/plugins/channelrx/demodfreedv/freedvdemod.h @@ -101,7 +101,7 @@ public: return m_settings.m_inputFrequencyOffset; } - uint32_t getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } + int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } uint32_t getModemSampleRate() const { return m_basebandSink->getModemSampleRate(); } double getMagSq() const { return m_basebandSink->getMagSq(); } bool getAudioActive() const { return m_basebandSink->getAudioActive(); } diff --git a/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp b/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp index 1e86d165b..553bb5232 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodbaseband.cpp @@ -159,8 +159,9 @@ void FreeDVDemodBaseband::applySettings(const FreeDVDemodSettings& settings, boo AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { m_sink.applyAudioSampleRate(audioSampleRate); diff --git a/plugins/channelrx/demodfreedv/freedvdemodbaseband.h b/plugins/channelrx/demodfreedv/freedvdemodbaseband.h index b8ba4b2a3..47d9919c6 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodbaseband.h +++ b/plugins/channelrx/demodfreedv/freedvdemodbaseband.h @@ -75,7 +75,7 @@ public: void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end); MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication int getChannelSampleRate() const; - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } double getMagSq() { return m_sink.getMagSq(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_sink.getMagSqLevels(avg, peak, nbSamples); } void setBasebandSampleRate(int sampleRate); diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp index 0f6ac7caa..cbd55c812 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.cpp @@ -268,7 +268,8 @@ FreeDVDemodGUI::FreeDVDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, B m_audioBinaural(false), m_audioFlipChannels(false), m_audioMute(false), - m_squelchOpen(false) + m_squelchOpen(false), + m_audioSampleRate(-1) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); @@ -486,16 +487,20 @@ void FreeDVDemodGUI::tick() ui->snrText->setText(tr("%1 dB").arg(snrAvg < -90 ? -90 : snrAvg > 90 ? 90 : snrAvg, 0, 'f', 1)); } + int audioSampleRate = m_freeDVDemod->getAudioSampleRate(); bool squelchOpen = m_freeDVDemod->getAudioActive(); - if (squelchOpen != m_squelchOpen) + if ((audioSampleRate != m_audioSampleRate) || (squelchOpen != m_squelchOpen)) { - if (squelchOpen) { + if (audioSampleRate < 0) { + ui->audioMute->setStyleSheet("QToolButton { background-color : red; }"); + } else if (squelchOpen) { ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); } else { ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } + m_audioSampleRate = audioSampleRate; m_squelchOpen = squelchOpen; } diff --git a/plugins/channelrx/demodfreedv/freedvdemodgui.h b/plugins/channelrx/demodfreedv/freedvdemodgui.h index a16ae3e9a..1f06490b8 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodgui.h +++ b/plugins/channelrx/demodfreedv/freedvdemodgui.h @@ -73,6 +73,7 @@ private: bool m_audioFlipChannels; bool m_audioMute; bool m_squelchOpen; + int m_audioSampleRate; uint32_t m_tickCount; FreeDVDemod* m_freeDVDemod; diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp index c2bd851d4..9fb50a6b4 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.cpp +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.cpp @@ -379,6 +379,12 @@ void FreeDVDemodSink::applyChannelSettings(int channelSampleRate, int channnelFr void FreeDVDemodSink::applyAudioSampleRate(int sampleRate) { + if (sampleRate < 0) + { + qWarning("FreeDVDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + qDebug("FreeDVDemodSink::applyAudioSampleRate: %d", sampleRate); m_audioFifo.setSize(sampleRate); diff --git a/plugins/channelrx/demodfreedv/freedvdemodsink.h b/plugins/channelrx/demodfreedv/freedvdemodsink.h index f31405134..b047a7690 100644 --- a/plugins/channelrx/demodfreedv/freedvdemodsink.h +++ b/plugins/channelrx/demodfreedv/freedvdemodsink.h @@ -51,7 +51,7 @@ public: void resyncFreeDV(); void setSpectrumSink(BasebandSampleSink* spectrumSink) { m_spectrumSink = spectrumSink; } - uint32_t getAudioSampleRate() const { return m_audioSampleRate; } + int getAudioSampleRate() const { return m_audioSampleRate; } uint32_t getModemSampleRate() const { return m_modemSampleRate; } double getMagSq() const { return m_magsq; } bool getAudioActive() const { return m_audioActive; } @@ -155,7 +155,7 @@ private: int m_channelSampleRate; uint32_t m_modemSampleRate; uint32_t m_speechSampleRate; - uint32_t m_audioSampleRate; + int m_audioSampleRate; int m_channelFrequencyOffset; bool m_audioMute; double m_magsq; diff --git a/plugins/channelrx/demodnfm/nfmdemod.h b/plugins/channelrx/demodnfm/nfmdemod.h index 6e2faa34e..d07befc4b 100644 --- a/plugins/channelrx/demodnfm/nfmdemod.h +++ b/plugins/channelrx/demodnfm/nfmdemod.h @@ -115,6 +115,7 @@ public: bool getSquelchOpen() const { return m_basebandSink->getSquelchOpen(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_basebandSink->getMagSqLevels(avg, peak, nbSamples); } void propagateMessageQueueToGUI() { m_basebandSink->setMessageQueueToGUI(getMessageQueueToGUI()); } + int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } uint32_t getNumberOfDeviceStreams() const; diff --git a/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp b/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp index 0d73557c6..8b171c81c 100644 --- a/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodbaseband.cpp @@ -144,14 +144,15 @@ void NFMDemodBaseband::applySettings(const NFMDemodSettings& settings, bool forc AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { - m_sink.applyAudioSampleRate(audioSampleRate); m_channelizer->setChannelization(audioSampleRate, settings.m_inputFrequencyOffset); m_sink.applyChannelSettings(m_channelizer->getChannelSampleRate(), m_channelizer->getChannelFrequencyOffset()); + m_sink.applyAudioSampleRate(audioSampleRate); } } diff --git a/plugins/channelrx/demodnfm/nfmdemodbaseband.h b/plugins/channelrx/demodnfm/nfmdemodbaseband.h index 727becc33..40363341f 100644 --- a/plugins/channelrx/demodnfm/nfmdemodbaseband.h +++ b/plugins/channelrx/demodnfm/nfmdemodbaseband.h @@ -67,7 +67,7 @@ public: bool getSquelchOpen() const { return m_sink.getSquelchOpen(); } const Real *getCtcssToneSet(int& nbTones) const { return m_sink.getCtcssToneSet(nbTones); } void setMessageQueueToGUI(MessageQueue *messageQueue) { m_sink.setMessageQueueToGUI(messageQueue); } - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } void setBasebandSampleRate(int sampleRate); private: diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.cpp b/plugins/channelrx/demodnfm/nfmdemodgui.cpp index baba5bb51..f4436e9e7 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodgui.cpp @@ -283,6 +283,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban m_basicSettingsShown(false), m_doApplySettings(true), m_squelchOpen(false), + m_audioSampleRate(-1), m_tickCount(0) { ui->setupUi(this); @@ -490,16 +491,20 @@ void NFMDemodGUI::tick() ui->channelPower->setText(tr("%1 dB").arg(powDbAvg, 0, 'f', 1)); } + int audioSampleRate = m_nfmDemod->getAudioSampleRate(); bool squelchOpen = m_nfmDemod->getSquelchOpen(); - if (squelchOpen != m_squelchOpen) + if ((audioSampleRate != m_audioSampleRate) || (squelchOpen != m_squelchOpen)) { - if (squelchOpen) { + if (audioSampleRate < 0) { + ui->audioMute->setStyleSheet("QToolButton { background-color : red; }"); + } else if (squelchOpen) { ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); } else { ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } + m_audioSampleRate = audioSampleRate; m_squelchOpen = squelchOpen; } diff --git a/plugins/channelrx/demodnfm/nfmdemodgui.h b/plugins/channelrx/demodnfm/nfmdemodgui.h index ab3aff498..f7ef1fd5e 100644 --- a/plugins/channelrx/demodnfm/nfmdemodgui.h +++ b/plugins/channelrx/demodnfm/nfmdemodgui.h @@ -53,6 +53,7 @@ private: NFMDemod* m_nfmDemod; bool m_squelchOpen; + int m_audioSampleRate; uint32_t m_tickCount; MessageQueue m_inputMessageQueue; diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.cpp b/plugins/channelrx/demodnfm/nfmdemodsink.cpp index 1a9f09b12..1cd60dc90 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.cpp +++ b/plugins/channelrx/demodnfm/nfmdemodsink.cpp @@ -358,6 +358,12 @@ void NFMDemodSink::applySettings(const NFMDemodSettings& settings, bool force) void NFMDemodSink::applyAudioSampleRate(unsigned int sampleRate) { + if (sampleRate < 0) + { + qWarning("NFMDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + qDebug("NFMDemodSink::applyAudioSampleRate: %u m_channelSampleRate: %d", sampleRate, m_channelSampleRate); m_ctcssLowpass.create(301, sampleRate, 250.0); diff --git a/plugins/channelrx/demodnfm/nfmdemodsink.h b/plugins/channelrx/demodnfm/nfmdemodsink.h index 4ab646694..70684a0b1 100644 --- a/plugins/channelrx/demodnfm/nfmdemodsink.h +++ b/plugins/channelrx/demodnfm/nfmdemodsink.h @@ -77,7 +77,7 @@ public: AudioFifo *getAudioFifo() { return &m_audioFifo; } void applyAudioSampleRate(unsigned int sampleRate); - unsigned int getAudioSampleRate() const { return m_audioSampleRate; } + int getAudioSampleRate() const { return m_audioSampleRate; } private: struct MagSqLevelsStore @@ -99,7 +99,7 @@ private: int m_channelFrequencyOffset; NFMDemodSettings m_settings; - quint32 m_audioSampleRate; + int m_audioSampleRate; AudioVector m_audioBuffer; uint m_audioBufferFill; AudioFifo m_audioFifo; diff --git a/plugins/channelrx/demodwfm/wfmdemod.h b/plugins/channelrx/demodwfm/wfmdemod.h index 72bb0dce6..1c1c2f20c 100644 --- a/plugins/channelrx/demodwfm/wfmdemod.h +++ b/plugins/channelrx/demodwfm/wfmdemod.h @@ -88,6 +88,7 @@ public: double getMagSq() const { return m_basebandSink->getMagSq(); } bool getSquelchOpen() const { return m_basebandSink->getSquelchOpen(); } + int getAudioSampleRate() const { return m_basebandSink->getAudioSampleRate(); } void getMagSqLevels(double& avg, double& peak, int& nbSamples) { m_basebandSink->getMagSqLevels(avg, peak, nbSamples); } diff --git a/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp b/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp index 775d8728a..37d3d4e2e 100644 --- a/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodbaseband.cpp @@ -145,8 +145,9 @@ void WFMDemodBaseband::applySettings(const WFMDemodSettings& settings, bool forc AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->removeAudioSink(m_sink.getAudioFifo()); audioDeviceManager->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue(), audioDeviceIndex); - uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + int audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); if (m_sink.getAudioSampleRate() != audioSampleRate) { m_sink.applyAudioSampleRate(audioSampleRate); diff --git a/plugins/channelrx/demodwfm/wfmdemodbaseband.h b/plugins/channelrx/demodwfm/wfmdemodbaseband.h index d4a7943d2..b79e289a2 100644 --- a/plugins/channelrx/demodwfm/wfmdemodbaseband.h +++ b/plugins/channelrx/demodwfm/wfmdemodbaseband.h @@ -64,7 +64,7 @@ public: int getChannelSampleRate() const; void setBasebandSampleRate(int sampleRate); - unsigned int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } + int getAudioSampleRate() const { return m_sink.getAudioSampleRate(); } double getMagSq() const { return m_sink.getMagSq(); } bool getSquelchOpen() const { return m_sink.getSquelchOpen(); } int getSquelchState() const { return m_sink.getSquelchState(); } diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.cpp b/plugins/channelrx/demodwfm/wfmdemodgui.cpp index 5c096d031..5871c03a2 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodgui.cpp @@ -218,7 +218,9 @@ WFMDemodGUI::WFMDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban m_pluginAPI(pluginAPI), m_deviceUISet(deviceUISet), m_channelMarker(this), - m_basicSettingsShown(false) + m_basicSettingsShown(false), + m_squelchOpen(false), + m_audioSampleRate(-1) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, true); @@ -361,16 +363,20 @@ void WFMDemodGUI::tick() (100.0f + powDbPeak) / 100.0f, nbMagsqSamples); + int audioSampleRate = m_wfmDemod->getAudioSampleRate(); bool squelchOpen = m_wfmDemod->getSquelchOpen(); - if (squelchOpen != m_squelchOpen) + if ((audioSampleRate != m_audioSampleRate) || (squelchOpen != m_squelchOpen)) { - if (squelchOpen) { + if (audioSampleRate < 0) { + ui->audioMute->setStyleSheet("QToolButton { background-color : red; }"); + } else if (squelchOpen) { ui->audioMute->setStyleSheet("QToolButton { background-color : green; }"); } else { ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); } + m_audioSampleRate = audioSampleRate; m_squelchOpen = squelchOpen; } } diff --git a/plugins/channelrx/demodwfm/wfmdemodgui.h b/plugins/channelrx/demodwfm/wfmdemodgui.h index a1a64ae25..ded46149e 100644 --- a/plugins/channelrx/demodwfm/wfmdemodgui.h +++ b/plugins/channelrx/demodwfm/wfmdemodgui.h @@ -49,6 +49,7 @@ private: bool m_doApplySettings; bool m_audioMute; bool m_squelchOpen; + int m_audioSampleRate; WFMDemod* m_wfmDemod; MessageQueue m_inputMessageQueue; diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.cpp b/plugins/channelrx/demodwfm/wfmdemodsink.cpp index 37fbb0ab7..bd13402bf 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.cpp +++ b/plugins/channelrx/demodwfm/wfmdemodsink.cpp @@ -148,8 +148,14 @@ void WFMDemodSink::feed(const SampleVector::const_iterator& begin, const SampleV m_sampleBuffer.clear(); } -void WFMDemodSink::applyAudioSampleRate(unsigned int sampleRate) +void WFMDemodSink::applyAudioSampleRate(int sampleRate) { + if (sampleRate < 0) + { + qWarning("WFMDemodSink::applyAudioSampleRate: invalid sample rate: %d", sampleRate); + return; + } + qDebug("WFMDemodSink::applyAudioSampleRate: %u", sampleRate); m_interpolator.create(16, m_channelSampleRate, m_settings.m_afBandwidth); diff --git a/plugins/channelrx/demodwfm/wfmdemodsink.h b/plugins/channelrx/demodwfm/wfmdemodsink.h index 00c56ef76..b3d051c3a 100644 --- a/plugins/channelrx/demodwfm/wfmdemodsink.h +++ b/plugins/channelrx/demodwfm/wfmdemodsink.h @@ -65,8 +65,8 @@ public: void applySettings(const WFMDemodSettings& settings, bool force = false); AudioFifo *getAudioFifo() { return &m_audioFifo; } - void applyAudioSampleRate(unsigned int sampleRate); - unsigned int getAudioSampleRate() const { return m_audioSampleRate; } + void applyAudioSampleRate(int sampleRate); + int getAudioSampleRate() const { return m_audioSampleRate; } private: struct MagSqLevelsStore @@ -88,7 +88,7 @@ private: int m_channelFrequencyOffset; WFMDemodSettings m_settings; - quint32 m_audioSampleRate; + int m_audioSampleRate; NCO m_nco; Interpolator m_interpolator; //!< Interpolator between sample rate sent from DSP engine and requested RF bandwidth (rational)