kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			Audio input: Update threading model. Part of #1346
							rodzic
							
								
									2bdc456b7a
								
							
						
					
					
						commit
						997a7da292
					
				| 
						 | 
					@ -22,6 +22,7 @@
 | 
				
			||||||
#include <QDebug>
 | 
					#include <QDebug>
 | 
				
			||||||
#include <QNetworkReply>
 | 
					#include <QNetworkReply>
 | 
				
			||||||
#include <QBuffer>
 | 
					#include <QBuffer>
 | 
				
			||||||
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "SWGDeviceSettings.h"
 | 
					#include "SWGDeviceSettings.h"
 | 
				
			||||||
#include "SWGDeviceState.h"
 | 
					#include "SWGDeviceState.h"
 | 
				
			||||||
| 
						 | 
					@ -40,6 +41,7 @@ AudioInput::AudioInput(DeviceAPI *deviceAPI) :
 | 
				
			||||||
    m_deviceAPI(deviceAPI),
 | 
					    m_deviceAPI(deviceAPI),
 | 
				
			||||||
    m_settings(),
 | 
					    m_settings(),
 | 
				
			||||||
    m_worker(nullptr),
 | 
					    m_worker(nullptr),
 | 
				
			||||||
 | 
					    m_workerThread(nullptr),
 | 
				
			||||||
    m_deviceDescription("AudioInput"),
 | 
					    m_deviceDescription("AudioInput"),
 | 
				
			||||||
    m_running(false),
 | 
					    m_running(false),
 | 
				
			||||||
    m_centerFrequency(0)
 | 
					    m_centerFrequency(0)
 | 
				
			||||||
| 
						 | 
					@ -116,10 +118,10 @@ void AudioInput::init()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool AudioInput::start()
 | 
					bool AudioInput::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    qDebug() << "AudioInput::start";
 | 
					    QMutexLocker mutexLocker(&m_mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (m_running) {
 | 
					    if (m_running) {
 | 
				
			||||||
        stop();
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(!m_sampleFifo.setSize(96000*4))
 | 
					    if(!m_sampleFifo.setSize(96000*4))
 | 
				
			||||||
| 
						 | 
					@ -128,14 +130,21 @@ bool AudioInput::start()
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    qDebug() << "AudioInput::start";
 | 
				
			||||||
    applySettings(m_settings, true, true);
 | 
					    applySettings(m_settings, true, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    m_workerThread = new QThread();
 | 
				
			||||||
    m_worker = new AudioInputWorker(&m_sampleFifo, &m_fifo);
 | 
					    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->setLog2Decimation(m_settings.m_log2Decim);
 | 
				
			||||||
    m_worker->setIQMapping(m_settings.m_iqMapping);
 | 
					    m_worker->setIQMapping(m_settings.m_iqMapping);
 | 
				
			||||||
    m_worker->startWork();
 | 
					    m_worker->startWork();
 | 
				
			||||||
    m_workerThread.start();
 | 
					    m_workerThread->start();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qDebug("AudioInput::started");
 | 
					    qDebug("AudioInput::started");
 | 
				
			||||||
    m_running = true;
 | 
					    m_running = true;
 | 
				
			||||||
| 
						 | 
					@ -151,12 +160,19 @@ void AudioInput::closeDevice()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void AudioInput::stop()
 | 
					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.quit();
 | 
					        m_workerThread->wait();
 | 
				
			||||||
        m_workerThread.wait();
 | 
					        m_workerThread = nullptr;
 | 
				
			||||||
        delete m_worker;
 | 
					 | 
				
			||||||
        m_worker = nullptr;
 | 
					        m_worker = nullptr;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -286,7 +302,7 @@ void AudioInput::applySettings(const AudioInputSettings& settings, bool force, b
 | 
				
			||||||
        reverseAPIKeys.append("log2Decim");
 | 
					        reverseAPIKeys.append("log2Decim");
 | 
				
			||||||
        forwardChange = true;
 | 
					        forwardChange = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_worker)
 | 
					        if (m_running)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            m_worker->setLog2Decimation(settings.m_log2Decim);
 | 
					            m_worker->setLog2Decimation(settings.m_log2Decim);
 | 
				
			||||||
            qDebug() << "AudioInput::applySettings: set decimation to " << (1<<settings.m_log2Decim);
 | 
					            qDebug() << "AudioInput::applySettings: set decimation to " << (1<<settings.m_log2Decim);
 | 
				
			||||||
| 
						 | 
					@ -298,7 +314,7 @@ void AudioInput::applySettings(const AudioInputSettings& settings, bool force, b
 | 
				
			||||||
        reverseAPIKeys.append("iqMapping");
 | 
					        reverseAPIKeys.append("iqMapping");
 | 
				
			||||||
        forwardChange = true;
 | 
					        forwardChange = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (m_worker) {
 | 
					        if (m_running) {
 | 
				
			||||||
            m_worker->setIQMapping(settings.m_iqMapping);
 | 
					            m_worker->setIQMapping(settings.m_iqMapping);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,7 @@
 | 
				
			||||||
#include <QString>
 | 
					#include <QString>
 | 
				
			||||||
#include <QByteArray>
 | 
					#include <QByteArray>
 | 
				
			||||||
#include <QNetworkRequest>
 | 
					#include <QNetworkRequest>
 | 
				
			||||||
#include <QThread>
 | 
					#include <QMutex>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "dsp/devicesamplesource.h"
 | 
					#include "dsp/devicesamplesource.h"
 | 
				
			||||||
#include "audio/audioinputdevice.h"
 | 
					#include "audio/audioinputdevice.h"
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class QNetworkAccessManager;
 | 
					class QNetworkAccessManager;
 | 
				
			||||||
class QNetworkReply;
 | 
					class QNetworkReply;
 | 
				
			||||||
 | 
					class QThread;
 | 
				
			||||||
class DeviceAPI;
 | 
					class DeviceAPI;
 | 
				
			||||||
class AudioInputWorker;
 | 
					class AudioInputWorker;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -137,7 +138,7 @@ private:
 | 
				
			||||||
    QMutex m_mutex;
 | 
					    QMutex m_mutex;
 | 
				
			||||||
    AudioInputSettings m_settings;
 | 
					    AudioInputSettings m_settings;
 | 
				
			||||||
    AudioInputWorker* m_worker;
 | 
					    AudioInputWorker* m_worker;
 | 
				
			||||||
    QThread m_workerThread;
 | 
					    QThread *m_workerThread;
 | 
				
			||||||
    QString m_deviceDescription;
 | 
					    QString m_deviceDescription;
 | 
				
			||||||
    bool m_running;
 | 
					    bool m_running;
 | 
				
			||||||
    int m_sampleRate;
 | 
					    int m_sampleRate;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Ładowanie…
	
		Reference in New Issue