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:
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user