diff --git a/plugins/samplesource/airspyhf/airspyhfinput.cpp b/plugins/samplesource/airspyhf/airspyhfinput.cpp index 70f509899..367c0733b 100644 --- a/plugins/samplesource/airspyhf/airspyhfinput.cpp +++ b/plugins/samplesource/airspyhf/airspyhfinput.cpp @@ -50,6 +50,7 @@ AirspyHFInput::AirspyHFInput(DeviceAPI *deviceAPI) : m_settings(), m_dev(nullptr), m_airspyHFWorker(nullptr), + m_airspyHFWorkerThread(nullptr), m_deviceDescription("AirspyHF"), m_running(false) { @@ -174,10 +175,15 @@ bool AirspyHFInput::start() stop(); } - m_airspyHFWorker = new AirspyHFWorker(m_dev, &m_sampleFifo); - m_airspyHFWorker->moveToThread(&m_airspyHFWorkerThread); + m_airspyHFWorkerThread = new QThread(); + m_airspyHFWorker = new AirspyHFWorker(m_dev, &m_sampleFifo); + m_airspyHFWorker->moveToThread(m_airspyHFWorkerThread); int sampleRateIndex = m_settings.m_devSampleRateIndex; + QObject::connect(m_airspyHFWorkerThread, &QThread::started, m_airspyHFWorker, &AirspyHFWorker::startWork); + QObject::connect(m_airspyHFWorkerThread, &QThread::finished, m_airspyHFWorker, &QObject::deleteLater); + QObject::connect(m_airspyHFWorkerThread, &QThread::finished, m_airspyHFWorkerThread, &QThread::deleteLater); + if (m_settings.m_devSampleRateIndex >= m_sampleRates.size()) { sampleRateIndex = m_sampleRates.size() - 1; } @@ -190,40 +196,15 @@ bool AirspyHFInput::start() m_airspyHFWorker->setIQOrder(m_settings.m_iqOrder); mutexLocker.unlock(); - if (startWorker()) - { - qDebug("AirspyHFInput::startInput: started"); - applySettings(m_settings, true); - m_running = true; - } - else - { - m_running = false; - } + m_airspyHFWorkerThread->start(); + + qDebug("AirspyHFInput::startInput: started"); + applySettings(m_settings, true); + m_running = true; return m_running; } -bool AirspyHFInput::startWorker() -{ - if (m_airspyHFWorker->startWork()) - { - m_airspyHFWorkerThread.start(); - return true; - } - else - { - return false; - } -} - -void AirspyHFInput::stopWorker() -{ - m_airspyHFWorker->stopWork(); - m_airspyHFWorkerThread.quit(); - m_airspyHFWorkerThread.wait(); -} - void AirspyHFInput::closeDevice() { if (m_dev) @@ -241,12 +222,13 @@ void AirspyHFInput::stop() qDebug("AirspyHFInput::stop"); QMutexLocker mutexLocker(&m_mutex); - if (m_airspyHFWorker) - { - stopWorker(); - delete m_airspyHFWorker; - m_airspyHFWorker = nullptr; - } + if (m_airspyHFWorkerThread) + { + m_airspyHFWorkerThread->quit(); + m_airspyHFWorkerThread->wait(); + m_airspyHFWorkerThread = nullptr; + m_airspyHFWorker = nullptr; + } m_running = false; } diff --git a/plugins/samplesource/airspyhf/airspyhfinput.h b/plugins/samplesource/airspyhf/airspyhfinput.h index c43864938..b4019fdd2 100644 --- a/plugins/samplesource/airspyhf/airspyhfinput.h +++ b/plugins/samplesource/airspyhf/airspyhfinput.h @@ -142,15 +142,13 @@ private: AirspyHFSettings m_settings; airspyhf_device_t* m_dev; AirspyHFWorker* m_airspyHFWorker; - QThread m_airspyHFWorkerThread; + QThread *m_airspyHFWorkerThread; 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 AirspyHFSettings& settings, bool force); diff --git a/plugins/samplesource/airspyhf/airspyhfworker.cpp b/plugins/samplesource/airspyhf/airspyhfworker.cpp index 22fdc1b1b..ca26e2fcc 100644 --- a/plugins/samplesource/airspyhf/airspyhfworker.cpp +++ b/plugins/samplesource/airspyhf/airspyhfworker.cpp @@ -25,7 +25,6 @@ AirspyHFWorker::AirspyHFWorker(airspyhf_device_t* dev, SampleSinkFifo* sampleFifo, QObject* parent) : QObject(parent), - m_running(false), m_dev(dev), m_convertBuffer(AIRSPYHF_BLOCKSIZE), m_sampleFifo(sampleFifo), @@ -41,22 +40,14 @@ AirspyHFWorker::~AirspyHFWorker() stopWork(); } -bool AirspyHFWorker::startWork() +void AirspyHFWorker::startWork() { qDebug("AirspyHFWorker::startWork"); airspyhf_error rc = (airspyhf_error) airspyhf_start(m_dev, rx_callback, this); - if (rc == AIRSPYHF_SUCCESS) - { - m_running = (airspyhf_is_streaming(m_dev) != 0); - } - else - { + if (rc != AIRSPYHF_SUCCESS) { qCritical("AirspyHFWorker::run: failed to start Airspy HF Rx"); - m_running = false; } - - return m_running; } void AirspyHFWorker::stopWork() @@ -69,8 +60,6 @@ void AirspyHFWorker::stopWork() } else { qDebug("AirspyHFWorker::run: failed to stop Airspy HF Rx"); } - - m_running = false; } void AirspyHFWorker::setSamplerate(uint32_t samplerate) diff --git a/plugins/samplesource/airspyhf/airspyhfworker.h b/plugins/samplesource/airspyhf/airspyhfworker.h index 8f072c7db..5a4349feb 100644 --- a/plugins/samplesource/airspyhf/airspyhfworker.h +++ b/plugins/samplesource/airspyhf/airspyhfworker.h @@ -33,14 +33,13 @@ public: AirspyHFWorker(airspyhf_device_t* dev, SampleSinkFifo* sampleFifo, QObject* parent = 0); ~AirspyHFWorker(); - bool startWork(); + void startWork(); void stopWork(); void setSamplerate(uint32_t samplerate); void setLog2Decimation(unsigned int log2_decim); void setIQOrder(bool iqOrder) { m_iqOrder = iqOrder; } private: - bool m_running; airspyhf_device_t* m_dev; qint16 m_buf[2*AIRSPYHF_BLOCKSIZE];