From 621f6a667ec489a87ee683757a7005b95bf04fbc Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 9 Oct 2022 02:09:50 +0200 Subject: [PATCH] Test sink: updated threading model. Part of #1346 --- .../samplesink/testsink/testsinkoutput.cpp | 54 +++++++++++-------- plugins/samplesink/testsink/testsinkoutput.h | 9 ++-- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/plugins/samplesink/testsink/testsinkoutput.cpp b/plugins/samplesink/testsink/testsinkoutput.cpp index 7f1a46e05..dac3c3c39 100644 --- a/plugins/samplesink/testsink/testsinkoutput.cpp +++ b/plugins/samplesink/testsink/testsinkoutput.cpp @@ -17,7 +17,9 @@ #include #include + #include +#include #include "SWGDeviceSettings.h" #include "SWGDeviceState.h" @@ -40,6 +42,8 @@ TestSinkOutput::TestSinkOutput(DeviceAPI *deviceAPI) : m_settings(), m_spectrumVis(SDR_TX_SCALEF), m_testSinkWorker(nullptr), + m_testSinkWorkerThread(nullptr), + m_running(false), m_deviceDescription("TestSink"), m_masterTimer(deviceAPI->getMasterTimer()) { @@ -64,16 +68,27 @@ void TestSinkOutput::init() bool TestSinkOutput::start() { QMutexLocker mutexLocker(&m_mutex); + + if (m_running) { + return true; + } + qDebug() << "TestSinkOutput::start"; + m_testSinkWorkerThread = new QThread(); m_testSinkWorker = new TestSinkWorker(&m_sampleSourceFifo); - m_testSinkWorker->moveToThread(&m_testSinkWorkerThread); + m_testSinkWorker->moveToThread(m_testSinkWorkerThread); + + QObject::connect(m_testSinkWorkerThread, &QThread::started, m_testSinkWorker, &TestSinkWorker::startWork); + QObject::connect(m_testSinkWorkerThread, &QThread::finished, m_testSinkWorker, &QObject::deleteLater); + QObject::connect(m_testSinkWorkerThread, &QThread::finished, m_testSinkWorkerThread, &QThread::deleteLater); + m_testSinkWorker->setSpectrumSink(&m_spectrumVis); m_testSinkWorker->setSamplerate(m_settings.m_sampleRate); m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp); m_testSinkWorker->connectTimer(m_masterTimer); - startWorker(); - mutexLocker.unlock(); + m_testSinkWorkerThread->start(); + m_running = true; qDebug("TestSinkOutput::start: started"); return true; @@ -81,30 +96,25 @@ bool TestSinkOutput::start() void TestSinkOutput::stop() { - qDebug() << "TestSinkOutput::stop"; QMutexLocker mutexLocker(&m_mutex); - if(m_testSinkWorker != 0) + if (!m_running) { + return; + } + + qDebug() << "TestSinkOutput::stop"; + m_running = false; + + if (m_testSinkWorkerThread) { - stopWorker(); - delete m_testSinkWorker; + m_testSinkWorker->stopWork(); + m_testSinkWorkerThread->quit(); + m_testSinkWorkerThread->wait(); m_testSinkWorker = nullptr; + m_testSinkWorkerThread = nullptr; } } -void TestSinkOutput::startWorker() -{ - m_testSinkWorker->startWork(); - m_testSinkWorkerThread.start(); -} - -void TestSinkOutput::stopWorker() -{ - m_testSinkWorker->stopWork(); - m_testSinkWorkerThread.quit(); - m_testSinkWorkerThread.wait(); -} - QByteArray TestSinkOutput::serialize() const { return m_settings.serialize(); @@ -210,7 +220,7 @@ void TestSinkOutput::applySettings(const TestSinkSettings& settings, bool force) { m_settings.m_sampleRate = settings.m_sampleRate; - if (m_testSinkWorker) { + if (m_running) { m_testSinkWorker->setSamplerate(m_settings.m_sampleRate); } @@ -221,7 +231,7 @@ void TestSinkOutput::applySettings(const TestSinkSettings& settings, bool force) { m_settings.m_log2Interp = settings.m_log2Interp; - if (m_testSinkWorker) { + if (m_running) { m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp); } diff --git a/plugins/samplesink/testsink/testsinkoutput.h b/plugins/samplesink/testsink/testsinkoutput.h index 778430f5d..ae8397dd0 100644 --- a/plugins/samplesink/testsink/testsinkoutput.h +++ b/plugins/samplesink/testsink/testsinkoutput.h @@ -20,7 +20,6 @@ #include #include -#include #include #include #include @@ -29,6 +28,7 @@ #include "dsp/spectrumvis.h" #include "testsinksettings.h" +class QThread; class TestSinkWorker; class DeviceAPI; class BasebandSampleSink; @@ -114,13 +114,12 @@ private: TestSinkSettings m_settings; SpectrumVis m_spectrumVis; std::ofstream m_ofstream; - TestSinkWorker* m_testSinkWorker; - QThread m_testSinkWorkerThread; + TestSinkWorker *m_testSinkWorker; + QThread *m_testSinkWorkerThread; + bool m_running; QString m_deviceDescription; const QTimer& m_masterTimer; - void startWorker(); - void stopWorker(); void applySettings(const TestSinkSettings& settings, bool force = false); };