From 0cc8bc3c8936e3a98bedfd30d0e8298442e8c2e2 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 8 May 2016 10:48:13 +0200 Subject: [PATCH] DV serial support implemented --- sdrbase/dsp/dvserialworker.cpp | 58 +++++++++++++++++++++++++++++++--- sdrbase/dsp/dvserialworker.h | 6 +++- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/sdrbase/dsp/dvserialworker.cpp b/sdrbase/dsp/dvserialworker.cpp index 2324aca24..db70e53b9 100644 --- a/sdrbase/dsp/dvserialworker.cpp +++ b/sdrbase/dsp/dvserialworker.cpp @@ -26,7 +26,8 @@ MESSAGE_CLASS_DEFINITION(DVSerialWorker::MsgTest, Message) DVSerialWorker::DVSerialWorker() : m_running(false), m_currentGainIn(0), - m_currentGainOut(0) + m_currentGainOut(0), + m_upsamplerLastValue(0) { } @@ -69,19 +70,66 @@ void DVSerialWorker::handleInputMessages() while ((message = m_inputMessageQueue.pop()) != 0) { - qDebug("DVSerialWorker::handleInputMessages: message"); - if (MsgMbeDecode::match(*message)) { MsgMbeDecode *decodeMsg = (MsgMbeDecode *) message; int dBVolume = (decodeMsg->getVolumeIndex() - 50) / 5; - if (m_dvController.decode(m_audioSamples, decodeMsg->getMbeFrame(), decodeMsg->getMbeRate(), dBVolume)) + if (m_dvController.decode(m_dvAudioSamples, decodeMsg->getMbeFrame(), decodeMsg->getMbeRate(), dBVolume)) { - decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE, 10); + upsample6(m_dvAudioSamples, m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE); + decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE * 6, 10); } } delete message; } } + +void DVSerialWorker::upsample6(short *in, short *out, int nbSamplesIn) +{ + for (int i = 0; i < nbSamplesIn; i++) + { + int cur = (int) in[i]; + int prev = (int) m_upsamplerLastValue; + short up; + + up = (cur*1 + prev*5) / 6; + *out = up; + out++; + *out = up; + out++; + + up = (cur*2 + prev*4) / 6; + *out = up; + out++; + *out = up; + out++; + + up = (cur*3 + prev*3) / 6; + *out = up; + out++; + *out = up; + out++; + + up = (cur*4 + prev*2) / 6; + *out = up; + out++; + *out = up; + out++; + + up = (cur*5 + prev*1) / 6; + *out = up; + out++; + *out = up; + out++; + + up = in[i]; + *out = up; + out++; + *out = up; + out++; + + m_upsamplerLastValue = in[i]; + } +} diff --git a/sdrbase/dsp/dvserialworker.h b/sdrbase/dsp/dvserialworker.h index 8cc108291..c6be12a3e 100644 --- a/sdrbase/dsp/dvserialworker.h +++ b/sdrbase/dsp/dvserialworker.h @@ -97,11 +97,15 @@ public slots: void handleInputMessages(); private: + void upsample6(short *in, short *out, int nbSamplesIn); + SerialDV::DVController m_dvController; bool m_running; int m_currentGainIn; int m_currentGainOut; - short m_audioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE]; + short m_dvAudioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE]; + short m_audioSamples[SerialDV::MBE_AUDIO_BLOCK_SIZE * 6 * 2]; // upsample to 48k and duplicate channel + short m_upsamplerLastValue; }; #endif /* SDRBASE_DSP_DVSERIALWORKER_H_ */