1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-27 15:26:33 -04:00

Merge pull request #1436 from srcejon/airspyhfp_thread

Update threading in airspyhf source
This commit is contained in:
Edouard Griffiths 2022-09-22 01:03:52 +02:00 committed by GitHub
commit 8f0b7287e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 56 deletions

View File

@ -50,6 +50,7 @@ AirspyHFInput::AirspyHFInput(DeviceAPI *deviceAPI) :
m_settings(),
m_dev(nullptr),
m_airspyHFWorker(nullptr),
m_airspyHFWorkerThread(nullptr),
m_deviceDescription("AirspyHF"),
m_running(false)
{
@ -174,10 +175,15 @@ bool AirspyHFInput::start()
stop();
}
m_airspyHFWorker = new AirspyHFWorker(m_dev, &m_sampleFifo);
m_airspyHFWorker->moveToThread(&m_airspyHFWorkerThread);
m_airspyHFWorkerThread = new QThread();
m_airspyHFWorker = new AirspyHFWorker(m_dev, &m_sampleFifo);
m_airspyHFWorker->moveToThread(m_airspyHFWorkerThread);
int sampleRateIndex = m_settings.m_devSampleRateIndex;
QObject::connect(m_airspyHFWorkerThread, &QThread::started, m_airspyHFWorker, &AirspyHFWorker::startWork);
QObject::connect(m_airspyHFWorkerThread, &QThread::finished, m_airspyHFWorker, &QObject::deleteLater);
QObject::connect(m_airspyHFWorkerThread, &QThread::finished, m_airspyHFWorkerThread, &QThread::deleteLater);
if (m_settings.m_devSampleRateIndex >= m_sampleRates.size()) {
sampleRateIndex = m_sampleRates.size() - 1;
}
@ -190,40 +196,15 @@ bool AirspyHFInput::start()
m_airspyHFWorker->setIQOrder(m_settings.m_iqOrder);
mutexLocker.unlock();
if (startWorker())
{
qDebug("AirspyHFInput::startInput: started");
applySettings(m_settings, true);
m_running = true;
}
else
{
m_running = false;
}
m_airspyHFWorkerThread->start();
qDebug("AirspyHFInput::startInput: started");
applySettings(m_settings, true);
m_running = true;
return m_running;
}
bool AirspyHFInput::startWorker()
{
if (m_airspyHFWorker->startWork())
{
m_airspyHFWorkerThread.start();
return true;
}
else
{
return false;
}
}
void AirspyHFInput::stopWorker()
{
m_airspyHFWorker->stopWork();
m_airspyHFWorkerThread.quit();
m_airspyHFWorkerThread.wait();
}
void AirspyHFInput::closeDevice()
{
if (m_dev)
@ -241,12 +222,13 @@ void AirspyHFInput::stop()
qDebug("AirspyHFInput::stop");
QMutexLocker mutexLocker(&m_mutex);
if (m_airspyHFWorker)
{
stopWorker();
delete m_airspyHFWorker;
m_airspyHFWorker = nullptr;
}
if (m_airspyHFWorkerThread)
{
m_airspyHFWorkerThread->quit();
m_airspyHFWorkerThread->wait();
m_airspyHFWorkerThread = nullptr;
m_airspyHFWorker = nullptr;
}
m_running = false;
}

View File

@ -142,15 +142,13 @@ private:
AirspyHFSettings m_settings;
airspyhf_device_t* m_dev;
AirspyHFWorker* m_airspyHFWorker;
QThread m_airspyHFWorkerThread;
QThread *m_airspyHFWorkerThread;
QString m_deviceDescription;
std::vector<uint32_t> m_sampleRates;
bool m_running;
QNetworkAccessManager *m_networkManager;
QNetworkRequest m_networkRequest;
bool startWorker();
void stopWorker();
bool openDevice();
void closeDevice();
bool applySettings(const AirspyHFSettings& settings, bool force);

View File

@ -25,7 +25,6 @@
AirspyHFWorker::AirspyHFWorker(airspyhf_device_t* dev, SampleSinkFifo* sampleFifo, QObject* parent) :
QObject(parent),
m_running(false),
m_dev(dev),
m_convertBuffer(AIRSPYHF_BLOCKSIZE),
m_sampleFifo(sampleFifo),
@ -41,22 +40,14 @@ AirspyHFWorker::~AirspyHFWorker()
stopWork();
}
bool AirspyHFWorker::startWork()
void AirspyHFWorker::startWork()
{
qDebug("AirspyHFWorker::startWork");
airspyhf_error rc = (airspyhf_error) airspyhf_start(m_dev, rx_callback, this);
if (rc == AIRSPYHF_SUCCESS)
{
m_running = (airspyhf_is_streaming(m_dev) != 0);
}
else
{
if (rc != AIRSPYHF_SUCCESS) {
qCritical("AirspyHFWorker::run: failed to start Airspy HF Rx");
m_running = false;
}
return m_running;
}
void AirspyHFWorker::stopWork()
@ -69,8 +60,6 @@ void AirspyHFWorker::stopWork()
} else {
qDebug("AirspyHFWorker::run: failed to stop Airspy HF Rx");
}
m_running = false;
}
void AirspyHFWorker::setSamplerate(uint32_t samplerate)

View File

@ -33,14 +33,13 @@ public:
AirspyHFWorker(airspyhf_device_t* dev, SampleSinkFifo* sampleFifo, QObject* parent = 0);
~AirspyHFWorker();
bool startWork();
void startWork();
void stopWork();
void setSamplerate(uint32_t samplerate);
void setLog2Decimation(unsigned int log2_decim);
void setIQOrder(bool iqOrder) { m_iqOrder = iqOrder; }
private:
bool m_running;
airspyhf_device_t* m_dev;
qint16 m_buf[2*AIRSPYHF_BLOCKSIZE];