DV serial support implemented

This commit is contained in:
f4exb 2016-05-08 10:48:13 +02:00
parent 4daa54b8b7
commit 0cc8bc3c89
2 changed files with 58 additions and 6 deletions

View File

@ -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];
}
}

View File

@ -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_ */