mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-23 00:18:37 -05:00
AM demod: improved baseband thread management
This commit is contained in:
parent
d1637e0158
commit
181efe4b1c
@ -50,9 +50,8 @@ AMDemod::AMDemod(DeviceAPI *deviceAPI) :
|
|||||||
{
|
{
|
||||||
setObjectName(m_channelId);
|
setObjectName(m_channelId);
|
||||||
|
|
||||||
m_thread = new QThread(this);
|
|
||||||
m_basebandSink = new AMDemodBaseband();
|
m_basebandSink = new AMDemodBaseband();
|
||||||
m_basebandSink->moveToThread(m_thread);
|
m_basebandSink->moveToThread(&m_thread);
|
||||||
|
|
||||||
applySettings(m_settings, true);
|
applySettings(m_settings, true);
|
||||||
|
|
||||||
@ -69,8 +68,12 @@ AMDemod::~AMDemod()
|
|||||||
delete m_networkManager;
|
delete m_networkManager;
|
||||||
m_deviceAPI->removeChannelSinkAPI(this);
|
m_deviceAPI->removeChannelSinkAPI(this);
|
||||||
m_deviceAPI->removeChannelSink(this);
|
m_deviceAPI->removeChannelSink(this);
|
||||||
|
|
||||||
|
if (m_basebandSink->isRunning()) {
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
|
||||||
delete m_basebandSink;
|
delete m_basebandSink;
|
||||||
delete m_thread;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t AMDemod::getNumberOfDeviceStreams() const
|
uint32_t AMDemod::getNumberOfDeviceStreams() const
|
||||||
@ -88,19 +91,23 @@ void AMDemod::start()
|
|||||||
{
|
{
|
||||||
qDebug("AMDemod::start");
|
qDebug("AMDemod::start");
|
||||||
|
|
||||||
if (m_basebandSampleRate != 0) {
|
|
||||||
m_basebandSink->setBasebandSampleRate(m_basebandSampleRate);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_basebandSink->reset();
|
m_basebandSink->reset();
|
||||||
m_thread->start();
|
m_basebandSink->startWork();
|
||||||
|
m_thread.start();
|
||||||
|
|
||||||
|
DSPSignalNotification *dspMsg = new DSPSignalNotification(m_basebandSampleRate, m_centerFrequency);
|
||||||
|
m_basebandSink->getInputMessageQueue()->push(dspMsg);
|
||||||
|
|
||||||
|
AMDemodBaseband::MsgConfigureAMDemodBaseband *msg = AMDemodBaseband::MsgConfigureAMDemodBaseband::create(m_settings, true);
|
||||||
|
m_basebandSink->getInputMessageQueue()->push(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMDemod::stop()
|
void AMDemod::stop()
|
||||||
{
|
{
|
||||||
qDebug("AMDemod::stop");
|
qDebug("AMDemod::stop");
|
||||||
m_thread->exit();
|
m_basebandSink->stopWork();
|
||||||
m_thread->wait();
|
m_thread.quit();
|
||||||
|
m_thread.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AMDemod::handleMessage(const Message& cmd)
|
bool AMDemod::handleMessage(const Message& cmd)
|
||||||
@ -117,6 +124,7 @@ bool AMDemod::handleMessage(const Message& cmd)
|
|||||||
{
|
{
|
||||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||||
m_basebandSampleRate = notif.getSampleRate();
|
m_basebandSampleRate = notif.getSampleRate();
|
||||||
|
m_centerFrequency = notif.getCenterFrequency();
|
||||||
// Forward to the sink
|
// Forward to the sink
|
||||||
DSPSignalNotification* rep = new DSPSignalNotification(notif); // make a copy
|
DSPSignalNotification* rep = new DSPSignalNotification(notif); // make a copy
|
||||||
qDebug() << "AMDemod::handleMessage: DSPSignalNotification";
|
qDebug() << "AMDemod::handleMessage: DSPSignalNotification";
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
#include "dsp/basebandsamplesink.h"
|
#include "dsp/basebandsamplesink.h"
|
||||||
#include "channel/channelapi.h"
|
#include "channel/channelapi.h"
|
||||||
@ -126,10 +127,11 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
DeviceAPI *m_deviceAPI;
|
DeviceAPI *m_deviceAPI;
|
||||||
QThread *m_thread;
|
QThread m_thread;
|
||||||
AMDemodBaseband* m_basebandSink;
|
AMDemodBaseband* m_basebandSink;
|
||||||
AMDemodSettings m_settings;
|
AMDemodSettings m_settings;
|
||||||
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink
|
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink
|
||||||
|
qint64 m_centerFrequency;
|
||||||
|
|
||||||
static const int m_udpBlockSize;
|
static const int m_udpBlockSize;
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
MESSAGE_CLASS_DEFINITION(AMDemodBaseband::MsgConfigureAMDemodBaseband, Message)
|
MESSAGE_CLASS_DEFINITION(AMDemodBaseband::MsgConfigureAMDemodBaseband, Message)
|
||||||
|
|
||||||
AMDemodBaseband::AMDemodBaseband() :
|
AMDemodBaseband::AMDemodBaseband() :
|
||||||
|
m_running(false),
|
||||||
m_mutex(QMutex::Recursive)
|
m_mutex(QMutex::Recursive)
|
||||||
{
|
{
|
||||||
qDebug("AMDemodBaseband::AMDemodBaseband");
|
qDebug("AMDemodBaseband::AMDemodBaseband");
|
||||||
@ -33,22 +34,13 @@ AMDemodBaseband::AMDemodBaseband() :
|
|||||||
m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(48000));
|
m_sampleFifo.setSize(SampleSinkFifo::getSizePolicy(48000));
|
||||||
m_channelizer = new DownChannelizer(&m_sink);
|
m_channelizer = new DownChannelizer(&m_sink);
|
||||||
|
|
||||||
QObject::connect(
|
|
||||||
&m_sampleFifo,
|
|
||||||
&SampleSinkFifo::dataReady,
|
|
||||||
this,
|
|
||||||
&AMDemodBaseband::handleData,
|
|
||||||
Qt::QueuedConnection
|
|
||||||
);
|
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue());
|
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(m_sink.getAudioFifo(), getInputMessageQueue());
|
||||||
m_sink.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate());
|
m_sink.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate());
|
||||||
|
|
||||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AMDemodBaseband::~AMDemodBaseband()
|
AMDemodBaseband::~AMDemodBaseband()
|
||||||
{
|
{
|
||||||
|
m_inputMessageQueue.clear();
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->removeAudioSink(m_sink.getAudioFifo());
|
DSPEngine::instance()->getAudioDeviceManager()->removeAudioSink(m_sink.getAudioFifo());
|
||||||
delete m_channelizer;
|
delete m_channelizer;
|
||||||
}
|
}
|
||||||
@ -56,9 +48,37 @@ AMDemodBaseband::~AMDemodBaseband()
|
|||||||
void AMDemodBaseband::reset()
|
void AMDemodBaseband::reset()
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
m_inputMessageQueue.clear();
|
||||||
m_sampleFifo.reset();
|
m_sampleFifo.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AMDemodBaseband::startWork()
|
||||||
|
{
|
||||||
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
QObject::connect(
|
||||||
|
&m_sampleFifo,
|
||||||
|
&SampleSinkFifo::dataReady,
|
||||||
|
this,
|
||||||
|
&AMDemodBaseband::handleData,
|
||||||
|
Qt::QueuedConnection
|
||||||
|
);
|
||||||
|
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
|
m_running = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AMDemodBaseband::stopWork()
|
||||||
|
{
|
||||||
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
|
QObject::disconnect(
|
||||||
|
&m_sampleFifo,
|
||||||
|
&SampleSinkFifo::dataReady,
|
||||||
|
this,
|
||||||
|
&AMDemodBaseband::handleData
|
||||||
|
);
|
||||||
|
m_running = false;
|
||||||
|
}
|
||||||
|
|
||||||
void AMDemodBaseband::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
|
void AMDemodBaseband::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
|
||||||
{
|
{
|
||||||
m_sampleFifo.write(begin, end);
|
m_sampleFifo.write(begin, end);
|
||||||
|
@ -59,6 +59,8 @@ public:
|
|||||||
AMDemodBaseband();
|
AMDemodBaseband();
|
||||||
~AMDemodBaseband();
|
~AMDemodBaseband();
|
||||||
void reset();
|
void reset();
|
||||||
|
void startWork();
|
||||||
|
void stopWork();
|
||||||
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
||||||
int getChannelSampleRate() const;
|
int getChannelSampleRate() const;
|
||||||
@ -69,6 +71,7 @@ public:
|
|||||||
double getMagSq() const { return m_sink.getMagSq(); }
|
double getMagSq() const { return m_sink.getMagSq(); }
|
||||||
bool getPllLocked() const { return m_sink.getPllLocked(); }
|
bool getPllLocked() const { return m_sink.getPllLocked(); }
|
||||||
Real getPllFrequency() const { return m_sink.getPllFrequency(); }
|
Real getPllFrequency() const { return m_sink.getPllFrequency(); }
|
||||||
|
bool isRunning() const { return m_running; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SampleSinkFifo m_sampleFifo;
|
SampleSinkFifo m_sampleFifo;
|
||||||
@ -76,6 +79,7 @@ private:
|
|||||||
AMDemodSink m_sink;
|
AMDemodSink m_sink;
|
||||||
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication
|
||||||
AMDemodSettings m_settings;
|
AMDemodSettings m_settings;
|
||||||
|
bool m_running;
|
||||||
QMutex m_mutex;
|
QMutex m_mutex;
|
||||||
|
|
||||||
bool handleMessage(const Message& cmd);
|
bool handleMessage(const Message& cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user