1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-02-03 09:44:01 -05:00

Test sink: updated threading model. Part of #1346

This commit is contained in:
f4exb 2022-10-09 02:09:50 +02:00
parent 0c4f45d934
commit 621f6a667e
2 changed files with 36 additions and 27 deletions

View File

@ -17,7 +17,9 @@
#include <string.h>
#include <errno.h>
#include <QDebug>
#include <QThread>
#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);
}

View File

@ -20,7 +20,6 @@
#include <QString>
#include <QTimer>
#include <QThread>
#include <ctime>
#include <iostream>
#include <fstream>
@ -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);
};