diff --git a/plugins/channelrx/demodadsb/adsbdemod.cpp b/plugins/channelrx/demodadsb/adsbdemod.cpp index 5e50179ee..88c371082 100644 --- a/plugins/channelrx/demodadsb/adsbdemod.cpp +++ b/plugins/channelrx/demodadsb/adsbdemod.cpp @@ -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(); diff --git a/plugins/channelrx/demodadsb/adsbdemodbaseband.cpp b/plugins/channelrx/demodadsb/adsbdemodbaseband.cpp index d2ed1a268..6277b737a 100644 --- a/plugins/channelrx/demodadsb/adsbdemodbaseband.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodbaseband.cpp @@ -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); diff --git a/plugins/channelrx/demodadsb/adsbdemodbaseband.h b/plugins/channelrx/demodadsb/adsbdemodbaseband.h index be7367491..39e223fc4 100644 --- a/plugins/channelrx/demodadsb/adsbdemodbaseband.h +++ b/plugins/channelrx/demodadsb/adsbdemodbaseband.h @@ -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; diff --git a/plugins/channelrx/demodadsb/adsbdemodsink.cpp b/plugins/channelrx/demodadsb/adsbdemodsink.cpp index fc9a790ac..80ee2a517 100644 --- a/plugins/channelrx/demodadsb/adsbdemodsink.cpp +++ b/plugins/channelrx/demodadsb/adsbdemodsink.cpp @@ -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 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) diff --git a/plugins/channelrx/demodadsb/adsbdemodsink.h b/plugins/channelrx/demodadsb/adsbdemodsink.h index 6676d4f5e..90a6fd630 100644 --- a/plugins/channelrx/demodadsb/adsbdemodsink.h +++ b/plugins/channelrx/demodadsb/adsbdemodsink.h @@ -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();