mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-09-05 14:47:50 -04:00
Test sink: updated threading model. Part of #1346
This commit is contained in:
parent
0c4f45d934
commit
621f6a667e
@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include "SWGDeviceSettings.h"
|
#include "SWGDeviceSettings.h"
|
||||||
#include "SWGDeviceState.h"
|
#include "SWGDeviceState.h"
|
||||||
@ -40,6 +42,8 @@ TestSinkOutput::TestSinkOutput(DeviceAPI *deviceAPI) :
|
|||||||
m_settings(),
|
m_settings(),
|
||||||
m_spectrumVis(SDR_TX_SCALEF),
|
m_spectrumVis(SDR_TX_SCALEF),
|
||||||
m_testSinkWorker(nullptr),
|
m_testSinkWorker(nullptr),
|
||||||
|
m_testSinkWorkerThread(nullptr),
|
||||||
|
m_running(false),
|
||||||
m_deviceDescription("TestSink"),
|
m_deviceDescription("TestSink"),
|
||||||
m_masterTimer(deviceAPI->getMasterTimer())
|
m_masterTimer(deviceAPI->getMasterTimer())
|
||||||
{
|
{
|
||||||
@ -64,16 +68,27 @@ void TestSinkOutput::init()
|
|||||||
bool TestSinkOutput::start()
|
bool TestSinkOutput::start()
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
|
||||||
|
if (m_running) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug() << "TestSinkOutput::start";
|
qDebug() << "TestSinkOutput::start";
|
||||||
|
|
||||||
|
m_testSinkWorkerThread = new QThread();
|
||||||
m_testSinkWorker = new TestSinkWorker(&m_sampleSourceFifo);
|
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->setSpectrumSink(&m_spectrumVis);
|
||||||
m_testSinkWorker->setSamplerate(m_settings.m_sampleRate);
|
m_testSinkWorker->setSamplerate(m_settings.m_sampleRate);
|
||||||
m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
|
m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
|
||||||
m_testSinkWorker->connectTimer(m_masterTimer);
|
m_testSinkWorker->connectTimer(m_masterTimer);
|
||||||
startWorker();
|
m_testSinkWorkerThread->start();
|
||||||
mutexLocker.unlock();
|
m_running = true;
|
||||||
|
|
||||||
qDebug("TestSinkOutput::start: started");
|
qDebug("TestSinkOutput::start: started");
|
||||||
return true;
|
return true;
|
||||||
@ -81,30 +96,25 @@ bool TestSinkOutput::start()
|
|||||||
|
|
||||||
void TestSinkOutput::stop()
|
void TestSinkOutput::stop()
|
||||||
{
|
{
|
||||||
qDebug() << "TestSinkOutput::stop";
|
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
|
||||||
if(m_testSinkWorker != 0)
|
if (!m_running) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << "TestSinkOutput::stop";
|
||||||
|
m_running = false;
|
||||||
|
|
||||||
|
if (m_testSinkWorkerThread)
|
||||||
{
|
{
|
||||||
stopWorker();
|
m_testSinkWorker->stopWork();
|
||||||
delete m_testSinkWorker;
|
m_testSinkWorkerThread->quit();
|
||||||
|
m_testSinkWorkerThread->wait();
|
||||||
m_testSinkWorker = nullptr;
|
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
|
QByteArray TestSinkOutput::serialize() const
|
||||||
{
|
{
|
||||||
return m_settings.serialize();
|
return m_settings.serialize();
|
||||||
@ -210,7 +220,7 @@ void TestSinkOutput::applySettings(const TestSinkSettings& settings, bool force)
|
|||||||
{
|
{
|
||||||
m_settings.m_sampleRate = settings.m_sampleRate;
|
m_settings.m_sampleRate = settings.m_sampleRate;
|
||||||
|
|
||||||
if (m_testSinkWorker) {
|
if (m_running) {
|
||||||
m_testSinkWorker->setSamplerate(m_settings.m_sampleRate);
|
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;
|
m_settings.m_log2Interp = settings.m_log2Interp;
|
||||||
|
|
||||||
if (m_testSinkWorker) {
|
if (m_running) {
|
||||||
m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
|
m_testSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QThread>
|
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
@ -29,6 +28,7 @@
|
|||||||
#include "dsp/spectrumvis.h"
|
#include "dsp/spectrumvis.h"
|
||||||
#include "testsinksettings.h"
|
#include "testsinksettings.h"
|
||||||
|
|
||||||
|
class QThread;
|
||||||
class TestSinkWorker;
|
class TestSinkWorker;
|
||||||
class DeviceAPI;
|
class DeviceAPI;
|
||||||
class BasebandSampleSink;
|
class BasebandSampleSink;
|
||||||
@ -114,13 +114,12 @@ private:
|
|||||||
TestSinkSettings m_settings;
|
TestSinkSettings m_settings;
|
||||||
SpectrumVis m_spectrumVis;
|
SpectrumVis m_spectrumVis;
|
||||||
std::ofstream m_ofstream;
|
std::ofstream m_ofstream;
|
||||||
TestSinkWorker* m_testSinkWorker;
|
TestSinkWorker *m_testSinkWorker;
|
||||||
QThread m_testSinkWorkerThread;
|
QThread *m_testSinkWorkerThread;
|
||||||
|
bool m_running;
|
||||||
QString m_deviceDescription;
|
QString m_deviceDescription;
|
||||||
const QTimer& m_masterTimer;
|
const QTimer& m_masterTimer;
|
||||||
|
|
||||||
void startWorker();
|
|
||||||
void stopWorker();
|
|
||||||
void applySettings(const TestSinkSettings& settings, bool force = false);
|
void applySettings(const TestSinkSettings& settings, bool force = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user