mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-20 06:38:36 -04:00
DSD demod plugin: DSD proper integration interim state #1
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
#include <QtGlobal>
|
||||
#include "dsddecoder.h"
|
||||
#include "dsd_livescanner.h"
|
||||
#include "audio/audiofifo.h"
|
||||
|
||||
|
||||
DSDDecoder::DSDDecoder()
|
||||
{
|
||||
@@ -25,6 +27,7 @@ DSDDecoder::DSDDecoder()
|
||||
initState(&m_dsdParams.state);
|
||||
|
||||
m_dsdParams.opts.split = 1;
|
||||
m_dsdParams.opts.upsample = 1; // force upsampling of audio to 48k
|
||||
m_dsdParams.opts.playoffset = 0;
|
||||
m_dsdParams.opts.delay = 0;
|
||||
m_dsdParams.opts.audio_in_type = 0;
|
||||
@@ -54,6 +57,7 @@ DSDDecoder::DSDDecoder()
|
||||
|
||||
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;
|
||||
m_dsdParams.state.output_finished = 0;
|
||||
|
||||
if (m_dsdParams.state.output_buffer == NULL)
|
||||
{
|
||||
@@ -61,13 +65,17 @@ DSDDecoder::DSDDecoder()
|
||||
}
|
||||
|
||||
m_dsdParams.state.output_samples = (short *) malloc(1<<19); // Audio output buffer with L+R S16LE samples (max: 128 kS)
|
||||
m_dsdParams.state.output_length = 1<<19; // the buffer size fixed
|
||||
m_dsdParams.state.output_buffers_size = 1<<17; // the buffers size in number of samples: 128 kS
|
||||
|
||||
if (m_dsdParams.state.output_samples == NULL)
|
||||
{
|
||||
qCritical("DSDDecoder::DSDDecoder: Unable to allocate audio L+R buffer.");
|
||||
}
|
||||
|
||||
m_dsdParams.state.output_offset = 0;
|
||||
m_zeroBuffer = new short[1<<18]; // 128 kS
|
||||
memset(m_zeroBuffer, 0, sizeof(short) * (1<<18));
|
||||
m_lastNbSamples = 0;
|
||||
}
|
||||
|
||||
DSDDecoder::~DSDDecoder()
|
||||
@@ -83,12 +91,45 @@ void DSDDecoder::setInBuffer(const short *inBuffer)
|
||||
|
||||
void DSDDecoder::pushSamples(int nbSamples)
|
||||
{
|
||||
m_dsdParams.state.input_offset = 0;
|
||||
m_dsdParams.state.input_length = nbSamples;
|
||||
|
||||
if (pthread_cond_signal(&m_dsdParams.state.input_ready)) {
|
||||
printf("DSDDecoder::pushSamples: Unable to signal input ready");
|
||||
if (nbSamples == 0)
|
||||
{
|
||||
m_lastNbSamples = 0;
|
||||
m_dsdParams.state.output_offset = 0; // reset output
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dsdParams.state.input_offset = 0;
|
||||
m_dsdParams.state.input_length = nbSamples;
|
||||
m_dsdParams.state.output_finished = 0;
|
||||
m_dsdParams.state.output_length = m_lastNbSamples;
|
||||
m_lastNbSamples = nbSamples;
|
||||
|
||||
if (pthread_cond_signal(&m_dsdParams.state.input_ready)) {
|
||||
printf("DSDDecoder::pushSamples: Unable to signal input ready");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DSDDecoder::popAudioSamples(AudioFifo *audioFifo, bool audioMute)
|
||||
{
|
||||
if (audioMute)
|
||||
{
|
||||
uint res = audioFifo->write((const quint8*) m_zeroBuffer, m_dsdParams.state.output_num_samples, 10);
|
||||
|
||||
if (res != m_dsdParams.state.output_num_samples) {
|
||||
qDebug("DSDDemod::feed: %u/%u audio samples written", res, m_dsdParams.state.output_num_samples);
|
||||
}
|
||||
}
|
||||
else if (m_dsdParams.state.output_finished)
|
||||
{
|
||||
uint res = audioFifo->write((const quint8*) m_dsdParams.state.output_samples, m_dsdParams.state.output_num_samples, 10);
|
||||
|
||||
if (res != m_dsdParams.state.output_num_samples) {
|
||||
qDebug("DSDDemod::feed: %u/%u audio samples written", res, m_dsdParams.state.output_num_samples);
|
||||
}
|
||||
}
|
||||
|
||||
m_dsdParams.state.output_finished = 0; // will be done by the next push anyway
|
||||
}
|
||||
|
||||
void DSDDecoder::start()
|
||||
@@ -102,6 +143,8 @@ void DSDDecoder::start()
|
||||
m_dsdParams.state.dsd_running = 0;
|
||||
}
|
||||
|
||||
m_lastNbSamples = 0;
|
||||
|
||||
qDebug("DSDDecoder::start: started");
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
|
||||
#include "dsd.h"
|
||||
|
||||
class AudioFifo;
|
||||
|
||||
class DSDDecoder
|
||||
{
|
||||
public:
|
||||
@@ -27,7 +29,9 @@ public:
|
||||
~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 popAudioSamples(AudioFifo *audioFifo, bool audioMute);
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
@@ -42,6 +46,8 @@ private:
|
||||
static void* run_dsd(void *arg);
|
||||
|
||||
dsd_params m_dsdParams;
|
||||
short *m_zeroBuffer;
|
||||
int m_lastNbSamples;
|
||||
};
|
||||
|
||||
#endif /* PLUGINS_CHANNEL_DEMODDSD_DSDDECODER_H_ */
|
||||
|
||||
@@ -145,52 +145,51 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
|
||||
m_scopeSampleBuffer.push_back(s);
|
||||
m_dsdInBuffer[m_dsdInCount++] = sample;
|
||||
|
||||
if (m_running.m_audioMute)
|
||||
{
|
||||
m_audioBuffer[m_audioBufferFill].l = 0;
|
||||
m_audioBuffer[m_audioBufferFill].r = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_audioBuffer[m_audioBufferFill].l = sample;
|
||||
m_audioBuffer[m_audioBufferFill].r = sample;
|
||||
}
|
||||
|
||||
++m_audioBufferFill;
|
||||
|
||||
if (m_audioBufferFill >= m_audioBuffer.size())
|
||||
{
|
||||
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 10);
|
||||
|
||||
if (res != m_audioBufferFill)
|
||||
{
|
||||
qDebug("DSDDemod::feed: %u/%u audio samples written", res, m_audioBufferFill);
|
||||
}
|
||||
|
||||
m_audioBufferFill = 0;
|
||||
}
|
||||
// if (m_running.m_audioMute)
|
||||
// {
|
||||
// m_audioBuffer[m_audioBufferFill].l = 0;
|
||||
// m_audioBuffer[m_audioBufferFill].r = 0;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// m_audioBuffer[m_audioBufferFill].l = sample;
|
||||
// m_audioBuffer[m_audioBufferFill].r = sample;
|
||||
// }
|
||||
//
|
||||
// ++m_audioBufferFill;
|
||||
//
|
||||
// if (m_audioBufferFill >= m_audioBuffer.size())
|
||||
// {
|
||||
// uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 10);
|
||||
//
|
||||
// if (res != m_audioBufferFill)
|
||||
// {
|
||||
// qDebug("DSDDemod::feed: %u/%u audio samples written", res, m_audioBufferFill);
|
||||
// }
|
||||
//
|
||||
// m_audioBufferFill = 0;
|
||||
// }
|
||||
|
||||
m_interpolatorDistanceRemain += m_interpolatorDistance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (m_audioBufferFill > 0)
|
||||
{
|
||||
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 10);
|
||||
|
||||
if (res != m_audioBufferFill)
|
||||
{
|
||||
qDebug("NFMDemod::feed: %u/%u tail samples written", res, m_audioBufferFill);
|
||||
}
|
||||
// if (m_audioBufferFill > 0)
|
||||
// {
|
||||
// uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 10);
|
||||
//
|
||||
// if (res != m_audioBufferFill)
|
||||
// {
|
||||
// qDebug("NFMDemod::feed: %u/%u tail samples written", res, m_audioBufferFill);
|
||||
// }
|
||||
//
|
||||
// m_audioBufferFill = 0;
|
||||
// }
|
||||
|
||||
m_audioBufferFill = 0;
|
||||
}
|
||||
|
||||
if (m_dsdInCount > 0)
|
||||
{
|
||||
m_dsdDecoder.pushSamples(m_dsdInCount);
|
||||
}
|
||||
m_dsdDecoder.popAudioSamples(&m_audioFifo, m_running.m_audioMute);
|
||||
m_dsdDecoder.pushSamples(m_dsdInCount);
|
||||
|
||||
if((m_scope != 0) && (m_scopeEnabled))
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user