diff --git a/plugins/samplesource/audioinput/audioinput.cpp b/plugins/samplesource/audioinput/audioinput.cpp index 331756388..b7855cbec 100644 --- a/plugins/samplesource/audioinput/audioinput.cpp +++ b/plugins/samplesource/audioinput/audioinput.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "SWGDeviceSettings.h" #include "SWGDeviceState.h" @@ -40,6 +41,7 @@ AudioInput::AudioInput(DeviceAPI *deviceAPI) : m_deviceAPI(deviceAPI), m_settings(), m_worker(nullptr), + m_workerThread(nullptr), m_deviceDescription("AudioInput"), m_running(false), m_centerFrequency(0) @@ -116,10 +118,10 @@ void AudioInput::init() bool AudioInput::start() { - qDebug() << "AudioInput::start"; + QMutexLocker mutexLocker(&m_mutex); if (m_running) { - stop(); + return true; } if(!m_sampleFifo.setSize(96000*4)) @@ -128,14 +130,21 @@ bool AudioInput::start() return false; } + qDebug() << "AudioInput::start"; applySettings(m_settings, true, true); + m_workerThread = new QThread(); m_worker = new AudioInputWorker(&m_sampleFifo, &m_fifo); - m_worker->moveToThread(&m_workerThread); + m_worker->moveToThread(m_workerThread); + + QObject::connect(m_workerThread, &QThread::started, m_worker, &AudioInputWorker::startWork); + QObject::connect(m_workerThread, &QThread::finished, m_worker, &QObject::deleteLater); + QObject::connect(m_workerThread, &QThread::finished, m_workerThread, &QThread::deleteLater); + m_worker->setLog2Decimation(m_settings.m_log2Decim); m_worker->setIQMapping(m_settings.m_iqMapping); m_worker->startWork(); - m_workerThread.start(); + m_workerThread->start(); qDebug("AudioInput::started"); m_running = true; @@ -151,12 +160,19 @@ void AudioInput::closeDevice() void AudioInput::stop() { - if (m_worker) + QMutexLocker mutexLocker(&m_mutex); + + if (!m_running) { + return; + } + + qDebug("AudioInput::stop"); + + if (m_workerThread) { - m_worker->stopWork(); - m_workerThread.quit(); - m_workerThread.wait(); - delete m_worker; + m_workerThread->quit(); + m_workerThread->wait(); + m_workerThread = nullptr; m_worker = nullptr; } @@ -286,7 +302,7 @@ void AudioInput::applySettings(const AudioInputSettings& settings, bool force, b reverseAPIKeys.append("log2Decim"); forwardChange = true; - if (m_worker) + if (m_running) { m_worker->setLog2Decimation(settings.m_log2Decim); qDebug() << "AudioInput::applySettings: set decimation to " << (1<setIQMapping(settings.m_iqMapping); } } diff --git a/plugins/samplesource/audioinput/audioinput.h b/plugins/samplesource/audioinput/audioinput.h index b57b16c36..bd4ced3b0 100644 --- a/plugins/samplesource/audioinput/audioinput.h +++ b/plugins/samplesource/audioinput/audioinput.h @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "dsp/devicesamplesource.h" #include "audio/audioinputdevice.h" @@ -34,6 +34,7 @@ class QNetworkAccessManager; class QNetworkReply; +class QThread; class DeviceAPI; class AudioInputWorker; @@ -137,7 +138,7 @@ private: QMutex m_mutex; AudioInputSettings m_settings; AudioInputWorker* m_worker; - QThread m_workerThread; + QThread *m_workerThread; QString m_deviceDescription; bool m_running; int m_sampleRate;