From 18a8e7c903cbd62eca8ba2710f5d94870c16f653 Mon Sep 17 00:00:00 2001 From: f4exb Date: Tue, 11 Oct 2016 22:52:45 +0200 Subject: [PATCH] DV Serial: implement FIFO slots --- sdrbase/dsp/dvserialengine.cpp | 2 ++ sdrbase/dsp/dvserialworker.cpp | 12 ++++++------ sdrbase/dsp/dvserialworker.h | 10 ++++++++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/sdrbase/dsp/dvserialengine.cpp b/sdrbase/dsp/dvserialengine.cpp index 2f50a1c3c..624ebf298 100644 --- a/sdrbase/dsp/dvserialengine.cpp +++ b/sdrbase/dsp/dvserialengine.cpp @@ -258,10 +258,12 @@ void DVSerialEngine::pushMbeFrame(const unsigned char *mbeFrame, int mbeRateInde { it->worker->pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, audioFifo); done = true; + break; } else if (it->worker->isAvailable()) { itAvail = it; + break; } ++it; diff --git a/sdrbase/dsp/dvserialworker.cpp b/sdrbase/dsp/dvserialworker.cpp index 16cf47842..a15008ff1 100644 --- a/sdrbase/dsp/dvserialworker.cpp +++ b/sdrbase/dsp/dvserialworker.cpp @@ -32,7 +32,7 @@ DVSerialWorker::DVSerialWorker() : { m_audioBuffer.resize(48000); m_audioBufferFill = 0; - m_audioFifo = 0; +// m_audioFifo = 0; } DVSerialWorker::~DVSerialWorker() @@ -105,7 +105,7 @@ void DVSerialWorker::handleInputMessages() } } - m_timestamp = QDateTime::currentDateTime(); + m_fifoSlots[0].m_timestamp = QDateTime::currentDateTime(); } void DVSerialWorker::pushMbeFrame(const unsigned char *mbeFrame, @@ -113,22 +113,22 @@ void DVSerialWorker::pushMbeFrame(const unsigned char *mbeFrame, int mbeVolumeIndex, unsigned char channels, AudioFifo *audioFifo) { - m_audioFifo = audioFifo; + m_fifoSlots[0].m_audioFifo = audioFifo; m_inputMessageQueue.push(MsgMbeDecode::create(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, audioFifo)); } bool DVSerialWorker::isAvailable() { - if (m_audioFifo == 0) { + if (m_fifoSlots[0].m_audioFifo == 0) { return true; } - return m_timestamp.time().msecsTo(QDateTime::currentDateTime().time()) > 1000; // 1 second inactivity timeout + return m_fifoSlots[0].m_timestamp.time().msecsTo(QDateTime::currentDateTime().time()) > 1000; // 1 second inactivity timeout } bool DVSerialWorker::hasFifo(AudioFifo *audioFifo) { - return m_audioFifo == audioFifo; + return m_fifoSlots[0].m_audioFifo == audioFifo; } void DVSerialWorker::upsample6(short *in, int nbSamplesIn, unsigned char channels, AudioFifo *audioFifo) diff --git a/sdrbase/dsp/dvserialworker.h b/sdrbase/dsp/dvserialworker.h index 36ef2c4fa..9192b8b7c 100644 --- a/sdrbase/dsp/dvserialworker.h +++ b/sdrbase/dsp/dvserialworker.h @@ -105,8 +105,6 @@ public: } MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication - AudioFifo *m_audioFifo; - QDateTime m_timestamp; signals: void finished(); @@ -122,6 +120,13 @@ private: typedef std::vector AudioVector; + struct FifoSlot + { + FifoSlot() : m_audioFifo(0), m_timestamp(QDate(2000, 1, 1)) {} + AudioFifo *m_audioFifo; + QDateTime m_timestamp; + }; + void upsample6(short *in, short *out, int nbSamplesIn); void upsample6(short *in, int nbSamplesIn, unsigned char channels, AudioFifo *audioFifo); @@ -133,6 +138,7 @@ private: //short m_audioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE * 6 * 2]; // upsample to 48k and duplicate channel AudioVector m_audioBuffer; uint m_audioBufferFill; + FifoSlot m_fifoSlots[2]; short m_upsamplerLastValue; float m_phase; MBEAudioInterpolatorFilter m_upsampleFilter;