mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-15 21:01:45 -05:00
Only run sink worker thread during acqusition
This commit is contained in:
parent
a5ce12ffab
commit
c2dc5808a6
@ -112,6 +112,7 @@ void ADSBDemod::start()
|
||||
m_worker->reset();
|
||||
m_worker->startWork();
|
||||
m_basebandSink->reset();
|
||||
m_basebandSink->startWork();
|
||||
m_thread->start();
|
||||
|
||||
ADSBDemodWorker::MsgConfigureADSBDemodWorker *msg = ADSBDemodWorker::MsgConfigureADSBDemodWorker::create(m_settings, true);
|
||||
@ -121,6 +122,7 @@ void ADSBDemod::start()
|
||||
void ADSBDemod::stop()
|
||||
{
|
||||
qDebug() << "ADSBDemod::stop";
|
||||
m_basebandSink->stopWork();
|
||||
m_worker->stopWork();
|
||||
m_thread->exit();
|
||||
m_thread->wait();
|
||||
|
@ -56,6 +56,16 @@ void ADSBDemodBaseband::reset()
|
||||
m_sampleFifo.reset();
|
||||
}
|
||||
|
||||
void ADSBDemodBaseband::startWork()
|
||||
{
|
||||
m_sink.startWorker();
|
||||
}
|
||||
|
||||
void ADSBDemodBaseband::stopWork()
|
||||
{
|
||||
m_sink.stopWorker();
|
||||
}
|
||||
|
||||
void ADSBDemodBaseband::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
|
||||
{
|
||||
m_sampleFifo.write(begin, end);
|
||||
|
@ -60,6 +60,8 @@ public:
|
||||
ADSBDemodBaseband();
|
||||
~ADSBDemodBaseband();
|
||||
void reset();
|
||||
void startWork();
|
||||
void stopWork();
|
||||
void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end);
|
||||
MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication
|
||||
int getChannelSampleRate() const;
|
||||
|
@ -55,7 +55,6 @@ ADSBDemodSink::ADSBDemodSink() :
|
||||
|
||||
ADSBDemodSink::~ADSBDemodSink()
|
||||
{
|
||||
stopWorker();
|
||||
for (int i = 0; i < m_buffers; i++)
|
||||
delete m_sampleBuffer[i];
|
||||
}
|
||||
@ -140,7 +139,8 @@ void ADSBDemodSink::processOneSample(Real magsq)
|
||||
boost::chrono::duration<double> sec = boost::chrono::steady_clock::now() - m_startPoint;
|
||||
m_feedTime += sec.count();
|
||||
|
||||
m_bufferWrite[m_writeBuffer].acquire();
|
||||
if (m_worker.isRunning())
|
||||
m_bufferWrite[m_writeBuffer].acquire();
|
||||
|
||||
m_startPoint = boost::chrono::steady_clock::now();
|
||||
|
||||
@ -148,6 +148,13 @@ void ADSBDemodSink::processOneSample(Real magsq)
|
||||
}
|
||||
}
|
||||
|
||||
void ADSBDemodSink::startWorker()
|
||||
{
|
||||
qDebug() << "ADSBDemodSink::startWorker";
|
||||
if (!m_worker.isRunning())
|
||||
m_worker.start();
|
||||
}
|
||||
|
||||
void ADSBDemodSink::stopWorker()
|
||||
{
|
||||
if (m_worker.isRunning())
|
||||
@ -161,14 +168,25 @@ void ADSBDemodSink::stopWorker()
|
||||
m_bufferRead[i].release(1);
|
||||
}
|
||||
m_worker.wait();
|
||||
// If this is called from ADSBDemod, we need to also
|
||||
// make sure baseband sink thread isnt blocked in processOneSample
|
||||
for (int i = 0; i < m_buffers; i++)
|
||||
{
|
||||
if (m_bufferWrite[i].available() == 0)
|
||||
m_bufferWrite[i].release(1);
|
||||
}
|
||||
qDebug() << "ADSBDemodSink::stopWorker: Worker stopped";
|
||||
}
|
||||
}
|
||||
|
||||
void ADSBDemodSink::init(int samplesPerBit)
|
||||
{
|
||||
// Stop worker as we're going to delete the buffers
|
||||
stopWorker();
|
||||
bool restart = m_worker.isRunning();
|
||||
if (restart)
|
||||
{
|
||||
// Stop worker as we're going to delete the buffers
|
||||
stopWorker();
|
||||
}
|
||||
// Reset state of semaphores
|
||||
for (int i = 0; i < m_buffers; i++)
|
||||
{
|
||||
@ -192,7 +210,8 @@ void ADSBDemodSink::init(int samplesPerBit)
|
||||
for (int i = 0; i < m_buffers; i++)
|
||||
m_sampleBuffer[i] = new Real[m_bufferSize];
|
||||
|
||||
m_worker.start();
|
||||
if (restart)
|
||||
startWorker();
|
||||
}
|
||||
|
||||
void ADSBDemodSink::applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force)
|
||||
|
@ -60,6 +60,8 @@ public:
|
||||
void applySettings(const ADSBDemodSettings& settings, bool force = false);
|
||||
void setMessageQueueToGUI(MessageQueue *messageQueue) { m_messageQueueToGUI = messageQueue; }
|
||||
void setMessageQueueToWorker(MessageQueue *messageQueue) { m_messageQueueToWorker = messageQueue; }
|
||||
void startWorker();
|
||||
void stopWorker();
|
||||
|
||||
private:
|
||||
friend ADSBDemodSinkWorker;
|
||||
@ -113,7 +115,6 @@ private:
|
||||
MessageQueue *m_messageQueueToWorker;
|
||||
|
||||
void init(int samplesPerBit);
|
||||
void stopWorker();
|
||||
Real inline complexMagSq(Complex& ci)
|
||||
{
|
||||
double magsqRaw = ci.real()*ci.real() + ci.imag()*ci.imag();
|
||||
|
Loading…
Reference in New Issue
Block a user