1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-08 17:04:46 -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");
}