diff --git a/plugins/samplesink/filesink/CMakeLists.txt b/plugins/samplesink/filesink/CMakeLists.txt
index d920fc631..e5e0d9aa3 100644
--- a/plugins/samplesink/filesink/CMakeLists.txt
+++ b/plugins/samplesink/filesink/CMakeLists.txt
@@ -4,14 +4,14 @@ set(filesink_SOURCES
filesinkoutput.cpp
filesinkplugin.cpp
filesinksettings.cpp
- filesinkthread.cpp
+ filesinkworker.cpp
)
set(filesink_HEADERS
filesinkoutput.h
filesinkplugin.h
filesinksettings.h
- filesinkthread.h
+ filesinkworker.h
)
include_directories(
diff --git a/plugins/samplesink/filesink/filesinkoutput.cpp b/plugins/samplesink/filesink/filesinkoutput.cpp
index d0d4bda51..64250f1f6 100644
--- a/plugins/samplesink/filesink/filesinkoutput.cpp
+++ b/plugins/samplesink/filesink/filesinkoutput.cpp
@@ -15,7 +15,6 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
-#include
#include
#include
@@ -30,7 +29,7 @@
#include "device/deviceapi.h"
#include "filesinkoutput.h"
-#include "filesinkthread.h"
+#include "filesinkworker.h"
MESSAGE_CLASS_DEFINITION(FileSinkOutput::MsgConfigureFileSink, Message)
MESSAGE_CLASS_DEFINITION(FileSinkOutput::MsgStartStop, Message)
@@ -43,7 +42,7 @@ MESSAGE_CLASS_DEFINITION(FileSinkOutput::MsgReportFileSinkStreamTiming, Message)
FileSinkOutput::FileSinkOutput(DeviceAPI *deviceAPI) :
m_deviceAPI(deviceAPI),
m_settings(),
- m_fileSinkThread(0),
+ m_fileSinkWorker(nullptr),
m_deviceDescription("FileSink"),
m_fileName("./test.sdriq"),
m_startingTimeStamp(0),
@@ -95,11 +94,12 @@ bool FileSinkOutput::start()
openFileStream();
- m_fileSinkThread = new FileSinkThread(&m_ofstream, &m_sampleSourceFifo);
- m_fileSinkThread->setSamplerate(m_settings.m_sampleRate);
- m_fileSinkThread->setLog2Interpolation(m_settings.m_log2Interp);
- m_fileSinkThread->connectTimer(m_masterTimer);
- m_fileSinkThread->startWork();
+ m_fileSinkWorker = new FileSinkWorker(&m_ofstream, &m_sampleSourceFifo);
+ m_fileSinkWorker->moveToThread(&m_fileSinkWorkerThread);
+ m_fileSinkWorker->setSamplerate(m_settings.m_sampleRate);
+ m_fileSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
+ m_fileSinkWorker->connectTimer(m_masterTimer);
+ startWorker();
mutexLocker.unlock();
//applySettings(m_generalSettings, m_settings, true);
@@ -119,11 +119,11 @@ void FileSinkOutput::stop()
qDebug() << "FileSourceInput::stop";
QMutexLocker mutexLocker(&m_mutex);
- if(m_fileSinkThread != 0)
+ if (m_fileSinkWorker)
{
- m_fileSinkThread->stopWork();
- delete m_fileSinkThread;
- m_fileSinkThread = 0;
+ stopWorker();
+ delete m_fileSinkWorker;
+ m_fileSinkWorker = nullptr;
}
if (m_ofstream.is_open()) {
@@ -239,15 +239,12 @@ bool FileSinkOutput::handleMessage(const Message& message)
MsgConfigureFileSinkWork& conf = (MsgConfigureFileSinkWork&) message;
bool working = conf.isWorking();
- if (m_fileSinkThread != 0)
+ if (m_fileSinkWorker != 0)
{
- if (working)
- {
- m_fileSinkThread->startWork();
- }
- else
- {
- m_fileSinkThread->stopWork();
+ if (working) {
+ startWorker();
+ } else {
+ stopWorker();
}
}
@@ -257,9 +254,9 @@ bool FileSinkOutput::handleMessage(const Message& message)
{
MsgReportFileSinkStreamTiming *report;
- if (m_fileSinkThread != 0 && getMessageQueueToGUI())
+ if (m_fileSinkWorker != 0 && getMessageQueueToGUI())
{
- report = MsgReportFileSinkStreamTiming::create(m_fileSinkThread->getSamplesCount());
+ report = MsgReportFileSinkStreamTiming::create(m_fileSinkWorker->getSamplesCount());
getMessageQueueToGUI()->push(report);
}
@@ -286,9 +283,9 @@ void FileSinkOutput::applySettings(const FileSinkSettings& settings, bool force)
{
m_settings.m_sampleRate = settings.m_sampleRate;
- if (m_fileSinkThread != 0)
+ if (m_fileSinkWorker != 0)
{
- m_fileSinkThread->setSamplerate(m_settings.m_sampleRate);
+ m_fileSinkWorker->setSamplerate(m_settings.m_sampleRate);
}
forwardChange = true;
@@ -298,9 +295,9 @@ void FileSinkOutput::applySettings(const FileSinkSettings& settings, bool force)
{
m_settings.m_log2Interp = settings.m_log2Interp;
- if (m_fileSinkThread != 0)
+ if (m_fileSinkWorker != 0)
{
- m_fileSinkThread->setLog2Interpolation(m_settings.m_log2Interp);
+ m_fileSinkWorker->setLog2Interpolation(m_settings.m_log2Interp);
}
forwardChange = true;
diff --git a/plugins/samplesink/filesink/filesinkoutput.h b/plugins/samplesink/filesink/filesinkoutput.h
index 38ffb639c..0094a42b7 100644
--- a/plugins/samplesink/filesink/filesinkoutput.h
+++ b/plugins/samplesink/filesink/filesinkoutput.h
@@ -20,6 +20,8 @@
#include
#include
+#include
+
#include
#include
#include
@@ -27,7 +29,7 @@
#include "dsp/devicesamplesink.h"
#include "filesinksettings.h"
-class FileSinkThread;
+class FileSinkWorker;
class DeviceAPI;
class FileSinkOutput : public DeviceSampleSink {
@@ -206,12 +208,15 @@ private:
QMutex m_mutex;
FileSinkSettings m_settings;
std::ofstream m_ofstream;
- FileSinkThread* m_fileSinkThread;
+ FileSinkWorker* m_fileSinkWorker;
+ QThread m_fileSinkWorkerThread;
QString m_deviceDescription;
QString m_fileName;
std::time_t m_startingTimeStamp;
const QTimer& m_masterTimer;
+ void startWorker();
+ void stopWorker();
void openFileStream();
void applySettings(const FileSinkSettings& settings, bool force = false);
};
diff --git a/plugins/samplesink/filesink/filesinkthread.cpp b/plugins/samplesink/filesink/filesinkworker.cpp
similarity index 81%
rename from plugins/samplesink/filesink/filesinkthread.cpp
rename to plugins/samplesink/filesink/filesinkworker.cpp
index d7ff51989..bf4470bb3 100644
--- a/plugins/samplesink/filesink/filesinkthread.cpp
+++ b/plugins/samplesink/filesink/filesinkworker.cpp
@@ -22,10 +22,10 @@
#include
#include "dsp/samplesourcefifo.h"
-#include "filesinkthread.h"
+#include "filesinkworker.h"
-FileSinkThread::FileSinkThread(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent) :
- QThread(parent),
+FileSinkWorker::FileSinkWorker(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent) :
+ QObject(parent),
m_running(false),
m_ofstream(samplesStream),
m_bufsize(0),
@@ -37,12 +37,12 @@ FileSinkThread::FileSinkThread(std::ofstream *samplesStream, SampleSourceFifo* s
m_throttlems(FILESINK_THROTTLE_MS),
m_maxThrottlems(50),
m_throttleToggle(false),
- m_buf(0)
+ m_buf(nullptr)
{
- assert(m_ofstream != 0);
+ assert(m_ofstream != nullptr);
}
-FileSinkThread::~FileSinkThread()
+FileSinkWorker::~FileSinkWorker()
{
if (m_running) {
stopWork();
@@ -51,39 +51,34 @@ FileSinkThread::~FileSinkThread()
if (m_buf) delete[] m_buf;
}
-void FileSinkThread::startWork()
+void FileSinkWorker::startWork()
{
- qDebug() << "FileSinkThread::startWork: ";
+ qDebug() << "FileSinkWorker::startWork: ";
if (m_ofstream->is_open())
{
- qDebug() << "FileSinkThread::startWork: file stream open, starting...";
+ qDebug() << "FileSinkWorker::startWork: file stream open, starting...";
m_maxThrottlems = 0;
- m_startWaitMutex.lock();
m_elapsedTimer.start();
- start();
- while(!m_running)
- m_startWaiter.wait(&m_startWaitMutex, 100);
- m_startWaitMutex.unlock();
+ m_running = true;
}
else
{
- qDebug() << "FileSinkThread::startWork: file stream closed, not starting.";
+ qDebug() << "FileSinkWorker::startWork: file stream closed, not starting.";
+ m_running = false;
}
}
-void FileSinkThread::stopWork()
+void FileSinkWorker::stopWork()
{
- qDebug() << "FileSinkThread::stopWork";
m_running = false;
- wait();
}
-void FileSinkThread::setSamplerate(int samplerate)
+void FileSinkWorker::setSamplerate(int samplerate)
{
if (samplerate != m_samplerate)
{
- qDebug() << "FileSinkThread::setSamplerate:"
+ qDebug() << "FileSinkWorker::setSamplerate:"
<< " new:" << samplerate
<< " old:" << m_samplerate;
@@ -113,7 +108,7 @@ void FileSinkThread::setSamplerate(int samplerate)
}
}
-void FileSinkThread::setLog2Interpolation(int log2Interpolation)
+void FileSinkWorker::setLog2Interpolation(int log2Interpolation)
{
if ((log2Interpolation < 0) || (log2Interpolation > 6))
{
@@ -122,7 +117,7 @@ void FileSinkThread::setLog2Interpolation(int log2Interpolation)
if (log2Interpolation != m_log2Interpolation)
{
- qDebug() << "FileSinkThread::setLog2Interpolation:"
+ qDebug() << "FileSinkWorker::setLog2Interpolation:"
<< " new:" << log2Interpolation
<< " old:" << m_log2Interpolation;
@@ -146,26 +141,13 @@ void FileSinkThread::setLog2Interpolation(int log2Interpolation)
}
}
-void FileSinkThread::run()
+void FileSinkWorker::connectTimer(const QTimer& timer)
{
- m_running = true;
- m_startWaiter.wakeAll();
-
- while(m_running) // actual work is in the tick() function
- {
- sleep(1);
- }
-
- m_running = false;
-}
-
-void FileSinkThread::connectTimer(const QTimer& timer)
-{
- qDebug() << "FileSinkThread::connectTimer";
+ qDebug() << "FileSinkWorker::connectTimer";
connect(&timer, SIGNAL(timeout()), this, SLOT(tick()));
}
-void FileSinkThread::tick()
+void FileSinkWorker::tick()
{
if (m_running)
{
@@ -193,7 +175,7 @@ void FileSinkThread::tick()
}
}
-void FileSinkThread::callbackPart(SampleVector& data, unsigned int iBegin, unsigned int iEnd)
+void FileSinkWorker::callbackPart(SampleVector& data, unsigned int iBegin, unsigned int iEnd)
{
SampleVector::iterator beginRead = data.begin() + iBegin;
unsigned int chunkSize = iEnd - iBegin;
diff --git a/plugins/samplesink/filesink/filesinkthread.h b/plugins/samplesink/filesink/filesinkworker.h
similarity index 87%
rename from plugins/samplesink/filesink/filesinkthread.h
rename to plugins/samplesink/filesink/filesinkworker.h
index 1ae8413ac..c4e1f9f62 100644
--- a/plugins/samplesink/filesink/filesinkthread.h
+++ b/plugins/samplesink/filesink/filesinkworker.h
@@ -15,12 +15,10 @@
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////
-#ifndef INCLUDE_FILESINKTHREAD_H
-#define INCLUDE_FILESINKTHREAD_H
+#ifndef INCLUDE_FILESINKWORKER_H
+#define INCLUDE_FILESINKWORKER_H
-#include
-#include
-#include
+#include
#include
#include
#include
@@ -35,12 +33,12 @@
class SampleSourceFifo;
-class FileSinkThread : public QThread {
+class FileSinkWorker : public QObject {
Q_OBJECT
public:
- FileSinkThread(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent = 0);
- ~FileSinkThread();
+ FileSinkWorker(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent = 0);
+ ~FileSinkWorker();
void startWork();
void stopWork();
@@ -54,8 +52,6 @@ public:
void connectTimer(const QTimer& timer);
private:
- QMutex m_startWaitMutex;
- QWaitCondition m_startWaiter;
volatile bool m_running;
std::ofstream* m_ofstream;
@@ -74,11 +70,10 @@ private:
Interpolators m_interpolators;
int16_t *m_buf;
- void run();
void callbackPart(SampleVector& data, unsigned int iBegin, unsigned int iEnd);
private slots:
void tick();
};
-#endif // INCLUDE_FILESINKTHREAD_H
+#endif // INCLUDE_FILESINKWORKER_H