From be2dbabafee76a199fdfe3b870f703d5c1795282 Mon Sep 17 00:00:00 2001 From: Franco Venturi Date: Mon, 5 Jul 2021 18:02:56 -0400 Subject: [PATCH] sdrplayv3 plugin: wait for rf updates to be fully completed when changing center frequency, bandwidth, or IF --- .../samplesource/sdrplayv3/sdrplayv3input.cpp | 12 ++++++++++++ .../samplesource/sdrplayv3/sdrplayv3thread.cpp | 17 +++++++++++++++++ .../samplesource/sdrplayv3/sdrplayv3thread.h | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3input.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3input.cpp index 21494e06b..8abd01190 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3input.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3input.cpp @@ -464,8 +464,11 @@ bool SDRPlayV3Input::applySettings(const SDRPlayV3Settings& settings, bool forwa m_devParams->rxChannelA->tunerParams.bwType = SDRPlayV3Bandwidths::getBandwidthEnum(settings.m_bandwidthIndex); else m_devParams->rxChannelB->tunerParams.bwType = SDRPlayV3Bandwidths::getBandwidthEnum(settings.m_bandwidthIndex); + m_sdrPlayThread->resetRfChanged(); if ((err = sdrplay_api_Update(m_dev->dev, m_dev->tuner, sdrplay_api_Update_Tuner_BwType, sdrplay_api_Update_Ext1_None)) != sdrplay_api_Success) qCritical() << "SDRPlayV3Input::applySettings: could not set bandwidth: " << sdrplay_api_GetErrorString(err); + if (!m_sdrPlayThread->waitForRfChanged()) + qCritical() << "SDRPlayV3Input::applySettings: could not set bandwidth: Rf update timed out"; } } @@ -479,8 +482,11 @@ bool SDRPlayV3Input::applySettings(const SDRPlayV3Settings& settings, bool forwa m_devParams->rxChannelA->tunerParams.ifType = SDRPlayV3IF::getIFEnum(settings.m_ifFrequencyIndex); else m_devParams->rxChannelB->tunerParams.ifType = SDRPlayV3IF::getIFEnum(settings.m_ifFrequencyIndex); + m_sdrPlayThread->resetRfChanged(); if ((err = sdrplay_api_Update(m_dev->dev, m_dev->tuner, sdrplay_api_Update_Tuner_IfType, sdrplay_api_Update_Ext1_None)) != sdrplay_api_Success) qCritical() << "SDRPlayV3Input::applySettings: could not set IF frequency: " << sdrplay_api_GetErrorString(err); + if (!m_sdrPlayThread->waitForRfChanged()) + qCritical() << "SDRPlayV3Input::applySettings: could not set IF frequency: Rf update timed out"; } } @@ -714,11 +720,17 @@ bool SDRPlayV3Input::setDeviceCenterFrequency(quint64 freq_hz) m_devParams->rxChannelA->tunerParams.rfFreq.rfHz = (double)freq_hz; else m_devParams->rxChannelB->tunerParams.rfFreq.rfHz = (double)freq_hz; + m_sdrPlayThread->resetRfChanged(); if ((err = sdrplay_api_Update(m_dev->dev, m_dev->tuner, sdrplay_api_Update_Tuner_Frf, sdrplay_api_Update_Ext1_None)) != sdrplay_api_Success) { qWarning("SDRPlayV3Input::setDeviceCenterFrequency: could not frequency to %llu Hz", freq_hz); return false; } + else if (!m_sdrPlayThread->waitForRfChanged()) + { + qWarning() << "SDRPlayV3Input::setDeviceCenterFrequency: could not set frequency: Rf update timed out"; + return false; + } else { qDebug("SDRPlayV3Input::setDeviceCenterFrequency: frequency set to %llu Hz", freq_hz); diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3thread.cpp b/plugins/samplesource/sdrplayv3/sdrplayv3thread.cpp index 7189008a5..e5d830ffb 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3thread.cpp +++ b/plugins/samplesource/sdrplayv3/sdrplayv3thread.cpp @@ -18,6 +18,8 @@ #include #include +#include +#include #include "sdrplayv3thread.h" #include "dsp/samplesinkfifo.h" @@ -77,6 +79,18 @@ void SDRPlayV3Thread::setFcPos(int fcPos) m_fcPos = fcPos; } +void SDRPlayV3Thread::resetRfChanged() +{ + m_rfChanged = 0; +} + +bool SDRPlayV3Thread::waitForRfChanged() +{ + for (unsigned int i = 0; i < m_rfChangedTimeout && m_rfChanged == 0; i++) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + return m_rfChanged != 0; +} + // Don't really need a thread here - just using same structure as other plugins void SDRPlayV3Thread::run() { @@ -111,6 +125,9 @@ void SDRPlayV3Thread::callbackHelper(short *xi, short *xq, sdrplay_api_StreamCbP SDRPlayV3Thread* thread = (SDRPlayV3Thread*) ctx; qint16 iq[8192]; + if (params->rfChanged) + thread->m_rfChanged = params->rfChanged; + if (thread->m_running) { if (numSamples > 8192) diff --git a/plugins/samplesource/sdrplayv3/sdrplayv3thread.h b/plugins/samplesource/sdrplayv3/sdrplayv3thread.h index a62becc25..308a6ac66 100644 --- a/plugins/samplesource/sdrplayv3/sdrplayv3thread.h +++ b/plugins/samplesource/sdrplayv3/sdrplayv3thread.h @@ -41,6 +41,9 @@ public: void setLog2Decimation(unsigned int log2_decim); void setFcPos(int fcPos); + void resetRfChanged(); + bool waitForRfChanged(); + private: QMutex m_startWaitMutex; QWaitCondition m_startWaiter; @@ -54,6 +57,9 @@ private: unsigned int m_log2Decim; int m_fcPos; + int m_rfChanged; + static const unsigned int m_rfChangedTimeout = 500; + Decimators m_decimatorsIQ; void run();