diff --git a/dsd/dsd_state.h b/dsd/dsd_state.h index e64f71274..f8950626b 100644 --- a/dsd/dsd_state.h +++ b/dsd/dsd_state.h @@ -104,9 +104,10 @@ typedef struct int exitflag; // the former global that cannot be a global within SDRangel and is not of much use with it anyway // New from original DSD for in-memory processing support with SDRangel: - const short *input_samples; //!< demodulator samples + short *input_samples; //!< demodulator samples int input_length; //!< 0: data not ready, >0: data ready for this amount of demodulator samples int input_offset; //!< consumer pointer + int input_buffer_size; //!< Size of buffer in number of samples short *output_buffer; //!< Output of decoder single S16LE int output_offset; //!< producer pointer diff --git a/plugins/channel/demoddsd/dsddecoder.cpp b/plugins/channel/demoddsd/dsddecoder.cpp index fd7ff2429..63b81f85c 100644 --- a/plugins/channel/demoddsd/dsddecoder.cpp +++ b/plugins/channel/demoddsd/dsddecoder.cpp @@ -52,8 +52,10 @@ DSDDecoder::DSDDecoder() m_dsdParams.opts.mod_gfsk = 1; m_dsdParams.state.rf_mod = 0; + m_dsdParams.state.input_samples = (short *) malloc(1<<18); m_dsdParams.state.input_length = 0; m_dsdParams.state.input_offset = 0; + m_dsdParams.state.input_buffer_size = 1<<17; m_dsdParams.state.output_buffer = (short *) malloc(1<<18); // Raw output buffer with single S16LE samples @ 8k (max: 128 kS) m_dsdParams.state.output_offset = 0; @@ -82,14 +84,10 @@ DSDDecoder::~DSDDecoder() { free(m_dsdParams.state.output_samples); free(m_dsdParams.state.output_buffer); + free(m_dsdParams.state.input_samples); } -void DSDDecoder::setInBuffer(const short *inBuffer) -{ - m_dsdParams.state.input_samples = inBuffer; -} - -void DSDDecoder::pushSamples(int nbSamples) +void DSDDecoder::pushSamples(const short *samples,int nbSamples) { if (nbSamples == 0) { @@ -98,6 +96,7 @@ void DSDDecoder::pushSamples(int nbSamples) } else { + memcpy((void *) m_dsdParams.state.input_samples, (const void *) samples, nbSamples * sizeof(short)); m_dsdParams.state.input_offset = 0; m_dsdParams.state.input_length = nbSamples; m_dsdParams.state.output_finished = 0; diff --git a/plugins/channel/demoddsd/dsddecoder.h b/plugins/channel/demoddsd/dsddecoder.h index 5e47e938a..4cf7050cc 100644 --- a/plugins/channel/demoddsd/dsddecoder.h +++ b/plugins/channel/demoddsd/dsddecoder.h @@ -28,9 +28,7 @@ public: DSDDecoder(); ~DSDDecoder(); - void setInBuffer(const short *inBuffer); - void pushSample(short sample); - void pushSamples(int nbSamples); // Push this amount of samples to the DSD decoder thread + void pushSamples(const short *samples, int nbSamples); // Push this amount of samples to the DSD decoder thread void popAudioSamples(AudioFifo *audioFifo, bool audioMute); void start(); diff --git a/plugins/channel/demoddsd/dsddemod.cpp b/plugins/channel/demoddsd/dsddemod.cpp index 0474eb7ed..267c9bc5f 100644 --- a/plugins/channel/demoddsd/dsddemod.cpp +++ b/plugins/channel/demoddsd/dsddemod.cpp @@ -44,7 +44,6 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) : setObjectName("DSDDemod"); m_dsdInBuffer = new qint16[1<<18]; // 128 k Samples is the maximum size of all input devices sample buffers (Airspy or HackRF) = 2^(17+1) for 2 byte samples - m_dsdDecoder.setInBuffer(m_dsdInBuffer); m_config.m_inputSampleRate = 96000; m_config.m_inputFrequencyOffset = 0; @@ -105,45 +104,44 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto Complex c(it->real(), it->imag()); c *= m_nco.nextIQ(); - { - if (m_interpolator.interpolate(&m_interpolatorDistanceRemain, c, &ci)) - { - qint16 sample; + if (m_interpolator.interpolate(&m_interpolatorDistanceRemain, c, &ci)) + { + qint16 sample; - m_magsq = ((ci.real()*ci.real() + ci.imag()*ci.imag())) / (Real) (1<<30); - m_movingAverage.feed(m_magsq); + m_magsq = ((ci.real()*ci.real() + ci.imag()*ci.imag())) / (Real) (1<<30); + m_movingAverage.feed(m_magsq); - Real demod = 32768.0f * m_phaseDiscri.phaseDiscriminator(ci) * ((float) m_running.m_demodGain / 100.0f); - m_sampleCount++; + Real demod = 32768.0f * m_phaseDiscri.phaseDiscriminator(ci) * ((float) m_running.m_demodGain / 100.0f); + m_sampleCount++; - // AF processing + // AF processing - if (getMagSq() > m_squelchLevel) - { - if (m_squelchCount < m_squelchGate) - { - m_squelchCount++; - } - } - else - { - m_squelchCount = 0; - } + if (getMagSq() > m_squelchLevel) + { + if (m_squelchCount < m_squelchGate) + { + m_squelchCount++; + } + } + else + { + m_squelchCount = 0; + } - m_squelchOpen = m_squelchCount == m_squelchGate; + m_squelchOpen = m_squelchCount == m_squelchGate; - if (m_squelchOpen) - { - sample = demod; - } - else - { - sample = 0; - } + if (m_squelchOpen) + { + sample = demod; + } + else + { + sample = 0; + } - Sample s(sample, 0.0); - m_scopeSampleBuffer.push_back(s); - m_dsdInBuffer[m_dsdInCount++] = sample; + Sample s(sample, 0.0); + m_scopeSampleBuffer.push_back(s); + m_dsdInBuffer[m_dsdInCount++] = sample; // if (m_running.m_audioMute) // { @@ -170,9 +168,8 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto // m_audioBufferFill = 0; // } - m_interpolatorDistanceRemain += m_interpolatorDistance; - } - } + m_interpolatorDistanceRemain += m_interpolatorDistance; + } } @@ -189,9 +186,9 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto // } m_dsdDecoder.popAudioSamples(&m_audioFifo, m_running.m_audioMute); - m_dsdDecoder.pushSamples(m_dsdInCount); + m_dsdDecoder.pushSamples(m_dsdInBuffer, m_dsdInCount); - if((m_scope != 0) && (m_scopeEnabled)) + if ((m_scope != 0) && (m_scopeEnabled)) { m_scope->feed(m_scopeSampleBuffer.begin(), m_scopeSampleBuffer.end(), true); // true = real samples for what it's worth }