1
0
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:
f4exb
2016-04-09 13:12:48 +02:00
parent 9ef7497c40
commit 5872ee0ca7
10 changed files with 526 additions and 403 deletions
+49 -6
View File
@@ -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");
}
+6
View File
@@ -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_ */
+37 -38
View File
@@ -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))
{