1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-09-28 15:56:33 -04:00

DSD demod plugin: DMR refactoring: allow stereo split of TDMA channels. Works with DVSerial too now.

This commit is contained in:
f4exb 2016-09-07 00:47:51 +02:00
parent 6dfa20db20
commit f64d078375
6 changed files with 32 additions and 16 deletions

View File

@ -201,8 +201,14 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
{ {
if ((m_running.m_slot1On) && m_dsdDecoder.mbeDVReady1()) if ((m_running.m_slot1On) && m_dsdDecoder.mbeDVReady1())
{ {
if (!m_running.m_audioMute) { if (!m_running.m_audioMute)
DSPEngine::instance()->pushMbeFrame(m_dsdDecoder.getMbeDVFrame1(), m_dsdDecoder.getMbeRateIndex(), m_running.m_volume, &m_audioFifo1); {
DSPEngine::instance()->pushMbeFrame(
m_dsdDecoder.getMbeDVFrame1(),
m_dsdDecoder.getMbeRateIndex(),
m_running.m_volume,
m_running.m_tdmaStereo ? 1 : 3, // left or both channels
&m_audioFifo1);
} }
m_dsdDecoder.resetMbeDV1(); m_dsdDecoder.resetMbeDV1();
@ -210,8 +216,14 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
if ((m_running.m_slot2On) && m_dsdDecoder.mbeDVReady2()) if ((m_running.m_slot2On) && m_dsdDecoder.mbeDVReady2())
{ {
if (!m_running.m_audioMute) { if (!m_running.m_audioMute)
DSPEngine::instance()->pushMbeFrame(m_dsdDecoder.getMbeDVFrame2(), m_dsdDecoder.getMbeRateIndex(), m_running.m_volume, &m_audioFifo2); {
DSPEngine::instance()->pushMbeFrame(
m_dsdDecoder.getMbeDVFrame2(),
m_dsdDecoder.getMbeRateIndex(),
m_running.m_volume,
m_running.m_tdmaStereo ? 2 : 3, // right or both channels
&m_audioFifo2);
} }
m_dsdDecoder.resetMbeDV2(); m_dsdDecoder.resetMbeDV2();

View File

@ -76,10 +76,10 @@ public:
#endif #endif
} }
void pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, AudioFifo *audioFifo) void pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, unsigned char channels, AudioFifo *audioFifo)
{ {
#ifdef DSD_USE_SERIALDV #ifdef DSD_USE_SERIALDV
m_dvSerialEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, audioFifo); m_dvSerialEngine.pushMbeFrame(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, audioFifo);
#endif #endif
} }

View File

@ -244,7 +244,7 @@ void DVSerialEngine::getDevicesNames(std::vector<std::string>& deviceNames)
} }
} }
void DVSerialEngine::pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, AudioFifo *audioFifo) void DVSerialEngine::pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, unsigned char channels, AudioFifo *audioFifo)
{ {
std::vector<DVSerialController>::iterator it = m_controllers.begin(); std::vector<DVSerialController>::iterator it = m_controllers.begin();
@ -252,7 +252,7 @@ void DVSerialEngine::pushMbeFrame(const unsigned char *mbeFrame, int mbeRateInde
{ {
if (it->worker->m_inputMessageQueue.size() < 2) if (it->worker->m_inputMessageQueue.size() < 2)
{ {
it->worker->m_inputMessageQueue.push(DVSerialWorker::MsgMbeDecode::create(mbeFrame, mbeRateIndex, mbeVolumeIndex, audioFifo)); it->worker->m_inputMessageQueue.push(DVSerialWorker::MsgMbeDecode::create(mbeFrame, mbeRateIndex, mbeVolumeIndex, channels, audioFifo));
break; break;
} }

View File

@ -40,7 +40,7 @@ public:
int getNbDevices() const { return m_controllers.size(); } int getNbDevices() const { return m_controllers.size(); }
void getDevicesNames(std::vector<std::string>& devicesNames); void getDevicesNames(std::vector<std::string>& devicesNames);
void pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, AudioFifo *audioFifo); void pushMbeFrame(const unsigned char *mbeFrame, int mbeRateIndex, int mbeVolumeIndex, unsigned char channels, AudioFifo *audioFifo);
private: private:
struct DVSerialController struct DVSerialController

View File

@ -80,7 +80,7 @@ void DVSerialWorker::handleInputMessages()
if (m_dvController.decode(m_dvAudioSamples, decodeMsg->getMbeFrame(), decodeMsg->getMbeRate(), dBVolume)) if (m_dvController.decode(m_dvAudioSamples, decodeMsg->getMbeFrame(), decodeMsg->getMbeRate(), dBVolume))
{ {
upsample6(m_dvAudioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE, decodeMsg->getAudioFifo()); upsample6(m_dvAudioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE, decodeMsg->getChannels(), decodeMsg->getAudioFifo());
// upsample6(m_dvAudioSamples, m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE); // upsample6(m_dvAudioSamples, m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE);
// decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE * 6, 10); // decodeMsg->getAudioFifo()->write((const quint8 *) m_audioSamples, SerialDV::MBE_AUDIO_BLOCK_SIZE * 6, 10);
} }
@ -94,7 +94,7 @@ void DVSerialWorker::handleInputMessages()
} }
} }
void DVSerialWorker::upsample6(short *in, int nbSamplesIn, AudioFifo *audioFifo) void DVSerialWorker::upsample6(short *in, int nbSamplesIn, unsigned char channels, AudioFifo *audioFifo)
{ {
for (int i = 0; i < nbSamplesIn; i++) for (int i = 0; i < nbSamplesIn; i++)
{ {
@ -105,8 +105,8 @@ void DVSerialWorker::upsample6(short *in, int nbSamplesIn, AudioFifo *audioFifo)
for (int j = 1; j < 7; j++) for (int j = 1; j < 7; j++)
{ {
upsample = (qint16) ((cur*j + prev*(6-j)) / 6); upsample = (qint16) ((cur*j + prev*(6-j)) / 6);
m_audioBuffer[m_audioBufferFill].l = upsample; m_audioBuffer[m_audioBufferFill].l = channels & 1 ? upsample : 0;
m_audioBuffer[m_audioBufferFill].r = upsample; m_audioBuffer[m_audioBufferFill].r = (channels>>1) & 1 ? upsample : 0;
++m_audioBufferFill; ++m_audioBufferFill;
if (m_audioBufferFill >= m_audioBuffer.size()) if (m_audioBufferFill >= m_audioBuffer.size())

View File

@ -49,26 +49,30 @@ public:
const unsigned char *getMbeFrame() const { return m_mbeFrame; } const unsigned char *getMbeFrame() const { return m_mbeFrame; }
SerialDV::DVRate getMbeRate() const { return m_mbeRate; } SerialDV::DVRate getMbeRate() const { return m_mbeRate; }
int getVolumeIndex() const { return m_volumeIndex; } int getVolumeIndex() const { return m_volumeIndex; }
unsigned char getChannels() const { return m_channels % 4; }
AudioFifo *getAudioFifo() { return m_audioFifo; } AudioFifo *getAudioFifo() { return m_audioFifo; }
static MsgMbeDecode* create(const unsigned char *mbeFrame, int mbeRateIndex, int volumeIndex, AudioFifo *audioFifo) static MsgMbeDecode* create(const unsigned char *mbeFrame, int mbeRateIndex, int volumeIndex, unsigned char channels, AudioFifo *audioFifo)
{ {
return new MsgMbeDecode(mbeFrame, (SerialDV::DVRate) mbeRateIndex, volumeIndex, audioFifo); return new MsgMbeDecode(mbeFrame, (SerialDV::DVRate) mbeRateIndex, volumeIndex, channels, audioFifo);
} }
private: private:
unsigned char m_mbeFrame[SerialDV::MBE_FRAME_LENGTH_BYTES]; unsigned char m_mbeFrame[SerialDV::MBE_FRAME_LENGTH_BYTES];
SerialDV::DVRate m_mbeRate; SerialDV::DVRate m_mbeRate;
int m_volumeIndex; int m_volumeIndex;
unsigned char m_channels;
AudioFifo *m_audioFifo; AudioFifo *m_audioFifo;
MsgMbeDecode(const unsigned char *mbeFrame, MsgMbeDecode(const unsigned char *mbeFrame,
SerialDV::DVRate mbeRate, SerialDV::DVRate mbeRate,
int volumeIndex, int volumeIndex,
unsigned char channels,
AudioFifo *audioFifo) : AudioFifo *audioFifo) :
Message(), Message(),
m_mbeRate(mbeRate), m_mbeRate(mbeRate),
m_volumeIndex(volumeIndex), m_volumeIndex(volumeIndex),
m_channels(channels),
m_audioFifo(audioFifo) m_audioFifo(audioFifo)
{ {
memcpy((void *) m_mbeFrame, (const void *) mbeFrame, SerialDV::MBE_FRAME_LENGTH_BYTES); memcpy((void *) m_mbeFrame, (const void *) mbeFrame, SerialDV::MBE_FRAME_LENGTH_BYTES);
@ -107,7 +111,7 @@ private:
typedef std::vector<AudioSample> AudioVector; typedef std::vector<AudioSample> AudioVector;
void upsample6(short *in, short *out, int nbSamplesIn); void upsample6(short *in, short *out, int nbSamplesIn);
void upsample6(short *in, int nbSamplesIn, AudioFifo *audioFifo); void upsample6(short *in, int nbSamplesIn, unsigned char channels, AudioFifo *audioFifo);
SerialDV::DVController m_dvController; SerialDV::DVController m_dvController;
bool m_running; bool m_running;