From cb6f0be85dc57ade5146b8c262a8e39fb06b12d9 Mon Sep 17 00:00:00 2001 From: f4exb Date: Wed, 28 Sep 2022 21:34:39 +0200 Subject: [PATCH] Airspy: Update threading model. Part of #1346 --- plugins/samplesource/airspy/airspyinput.cpp | 71 +++++++++------------ plugins/samplesource/airspy/airspyinput.h | 6 +- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/plugins/samplesource/airspy/airspyinput.cpp b/plugins/samplesource/airspy/airspyinput.cpp index a3b3ca3b0..3c234459e 100644 --- a/plugins/samplesource/airspy/airspyinput.cpp +++ b/plugins/samplesource/airspy/airspyinput.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "SWGDeviceSettings.h" #include "SWGDeviceState.h" @@ -48,6 +49,7 @@ AirspyInput::AirspyInput(DeviceAPI *deviceAPI) : m_settings(), m_dev(nullptr), m_airspyWorker(nullptr), + m_airspyWorkerThread(nullptr), m_deviceDescription("Airspy"), m_running(false) { @@ -180,38 +182,39 @@ bool AirspyInput::start() } if (m_running) { - stop(); + return true; } + m_airspyWorkerThread = new QThread(); m_airspyWorker = new AirspyWorker(m_dev, &m_sampleFifo); - m_airspyWorker->moveToThread(&m_airspyWorkerThread); + m_airspyWorker->moveToThread(m_airspyWorkerThread); + + QObject::connect(m_airspyWorkerThread, &QThread::started, m_airspyWorker, &AirspyWorker::startWork); + QObject::connect(m_airspyWorkerThread, &QThread::finished, m_airspyWorker, &QObject::deleteLater); + QObject::connect(m_airspyWorkerThread, &QThread::finished, m_airspyWorkerThread, &QThread::deleteLater); + m_airspyWorker->setSamplerate(m_sampleRates[m_settings.m_devSampleRateIndex]); m_airspyWorker->setLog2Decimation(m_settings.m_log2Decim); m_airspyWorker->setIQOrder(m_settings.m_iqOrder); m_airspyWorker->setFcPos((int) m_settings.m_fcPos); mutexLocker.unlock(); - if (startWorker()) - { - qDebug("AirspyInput::startInput: started"); - applySettings(m_settings, true); - m_running = true; - } - else - { - m_running = false; - } + m_airspyWorkerThread->start(); - return m_running; + qDebug("AirspyInput::startInput: started"); + applySettings(m_settings, true); + m_running = true; + + return true; } void AirspyInput::closeDevice() { - if (m_dev != 0) + if (m_dev) { airspy_stop_rx(m_dev); airspy_close(m_dev); - m_dev = 0; + m_dev = nullptr; } m_deviceDescription.clear(); @@ -220,39 +223,25 @@ void AirspyInput::closeDevice() void AirspyInput::stop() { - qDebug("AirspyInput::stop"); - QMutexLocker mutexLocker(&m_mutex); + QMutexLocker mutexLocker(&m_mutex); - if (m_airspyWorker) + if (!m_running) { + return; + } + + qDebug("AirspyInput::stop"); + + if (m_airspyWorkerThread) { - stopWorker(); - delete m_airspyWorker; - m_airspyWorker = nullptr; + m_airspyWorkerThread->quit(); + m_airspyWorkerThread->wait(); + m_airspyWorkerThread = nullptr; + m_airspyWorker = nullptr; } m_running = false; } -bool AirspyInput::startWorker() -{ - if (m_airspyWorker->startWork()) - { - m_airspyWorkerThread.start(); - return true; - } - else - { - return false; - } -} - -void AirspyInput::stopWorker() -{ - m_airspyWorker->stopWork(); - m_airspyWorkerThread.quit(); - m_airspyWorkerThread.wait(); -} - QByteArray AirspyInput::serialize() const { return m_settings.serialize(); diff --git a/plugins/samplesource/airspy/airspyinput.h b/plugins/samplesource/airspy/airspyinput.h index 1a3d8422c..e415a969c 100644 --- a/plugins/samplesource/airspy/airspyinput.h +++ b/plugins/samplesource/airspy/airspyinput.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -29,6 +28,7 @@ class QNetworkAccessManager; class QNetworkReply; +class QThread; class DeviceAPI; class AirspyWorker; @@ -139,15 +139,13 @@ private: AirspySettings m_settings; struct airspy_device* m_dev; AirspyWorker* m_airspyWorker; - QThread m_airspyWorkerThread; + QThread *m_airspyWorkerThread; QString m_deviceDescription; std::vector m_sampleRates; bool m_running; QNetworkAccessManager *m_networkManager; QNetworkRequest m_networkRequest; - bool startWorker(); - void stopWorker(); bool openDevice(); void closeDevice(); bool applySettings(const AirspySettings& settings, bool force);