1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-07 15:47:50 -04:00

DSD demod plugin: integration with new DSDplus library

This commit is contained in:
f4exb 2016-04-11 02:48:12 +02:00
parent 44f608d7be
commit 7412a47ba2
15 changed files with 184 additions and 132 deletions

View File

@ -2,6 +2,7 @@ project(dsdplus)
set(dsdplus_SOURCES set(dsdplus_SOURCES
descramble.cpp descramble.cpp
dmr_data.cpp
dmr_voice.cpp dmr_voice.cpp
dsd_decoder.cpp dsd_decoder.cpp
dsd_filters.cpp dsd_filters.cpp
@ -13,6 +14,7 @@ set(dsdplus_SOURCES
set(dsdplus_HEADERS set(dsdplus_HEADERS
descramble.h descramble.h
dmr_data.h
dmr_voice.h dmr_voice.h
dsd_decoder.h dsd_decoder.h
dsd_filters.h dsd_filters.h

View File

@ -212,7 +212,7 @@ void DSDDMRData::preProcess()
if (m_dsdDecoder->m_opts.errorbars == 1) if (m_dsdDecoder->m_opts.errorbars == 1)
{ {
fprintf(m_dsdDecoder->m_state.logfile, "%s %s ", m_dsdDecoder->m_state.slot0light, m_dsdDecoder->m_state.slot1light); fprintf(stderr, "%s %s ", m_dsdDecoder->m_state.slot0light, m_dsdDecoder->m_state.slot1light);
} }
} }

View File

@ -351,7 +351,7 @@ void DSDDMRVoice::processSlot4(int symbolIndex) // Slot4 is a 24 symbol slot
if ((m_majorBlock == 0) && (m_dsdDecoder->m_opts.errorbars == 1)) if ((m_majorBlock == 0) && (m_dsdDecoder->m_opts.errorbars == 1))
{ {
fprintf(m_dsdDecoder->m_state.logfile, "%s %s VOICE e:", m_dsdDecoder->m_state.slot0light, m_dsdDecoder->m_state.slot1light); fprintf(stderr, "%s %s VOICE e:", m_dsdDecoder->m_state.slot0light, m_dsdDecoder->m_state.slot1light);
} }
} }
} }

View File

@ -32,12 +32,11 @@ DSDDecoder::DSDDecoder() :
resetSymbol(); resetSymbol();
resetFrameSync(); resetFrameSync();
noCarrier(); noCarrier();
m_state.logfile = fdopen(fileno(stderr), (const char *) 'w');
} }
DSDDecoder::~DSDDecoder() DSDDecoder::~DSDDecoder()
{ {
fclose(m_state.logfile); fclose(stderr);
} }
void DSDDecoder::run(short sample) void DSDDecoder::run(short sample)
@ -196,7 +195,7 @@ bool DSDDecoder::pushSample(short sample, int have_sync)
if ((m_opts.symboltiming == 1) && (have_sync == 0) if ((m_opts.symboltiming == 1) && (have_sync == 0)
&& (m_state.lastsynctype != -1)) && (m_state.lastsynctype != -1))
{ {
fprintf(m_state.logfile, "O"); fprintf(stderr, "O");
} }
} }
else else
@ -204,7 +203,7 @@ bool DSDDecoder::pushSample(short sample, int have_sync)
if ((m_opts.symboltiming == 1) && (have_sync == 0) if ((m_opts.symboltiming == 1) && (have_sync == 0)
&& (m_state.lastsynctype != -1)) && (m_state.lastsynctype != -1))
{ {
fprintf(m_state.logfile, "+"); fprintf(stderr, "+");
} }
if ((m_state.jitter < 0) if ((m_state.jitter < 0)
&& (m_state.lastsample < m_state.center) && (m_state.lastsample < m_state.center)
@ -233,7 +232,7 @@ bool DSDDecoder::pushSample(short sample, int have_sync)
if ((m_opts.symboltiming == 1) && (have_sync == 0) if ((m_opts.symboltiming == 1) && (have_sync == 0)
&& (m_state.lastsynctype != -1)) && (m_state.lastsynctype != -1))
{ {
fprintf(m_state.logfile, "X"); fprintf(stderr, "X");
} }
} }
else else
@ -241,7 +240,7 @@ bool DSDDecoder::pushSample(short sample, int have_sync)
if ((m_opts.symboltiming == 1) && (have_sync == 0) if ((m_opts.symboltiming == 1) && (have_sync == 0)
&& (m_state.lastsynctype != -1)) && (m_state.lastsynctype != -1))
{ {
fprintf(m_state.logfile, "-"); fprintf(stderr, "-");
} }
if ((m_state.jitter < 0) if ((m_state.jitter < 0)
&& (m_state.lastsample > m_state.center) && (m_state.lastsample > m_state.center)
@ -291,11 +290,11 @@ bool DSDDecoder::pushSample(short sample, int have_sync)
{ {
if (m_state.jitter >= 0) if (m_state.jitter >= 0)
{ {
fprintf(m_state.logfile, " %i\n", m_state.jitter); fprintf(stderr, " %i\n", m_state.jitter);
} }
else else
{ {
fprintf(m_state.logfile, "\n"); fprintf(stderr, "\n");
} }
} }
@ -407,25 +406,25 @@ int DSDDecoder::getDibit()
if (m_state.symbolcnt > (4800 / m_opts.scoperate)) if (m_state.symbolcnt > (4800 / m_opts.scoperate))
{ {
m_state.symbolcnt = 0; m_state.symbolcnt = 0;
fprintf(m_state.logfile, "\n"); fprintf(stderr, "\n");
fprintf(m_state.logfile, fprintf(stderr,
"Demod mode: %s Nac: %4X\n", "Demod mode: %s Nac: %4X\n",
modulation, m_state.nac); modulation, m_state.nac);
fprintf(m_state.logfile, fprintf(stderr,
"Frame Type: %s Talkgroup: %7i\n", "Frame Type: %s Talkgroup: %7i\n",
m_state.ftype, m_state.lasttg); m_state.ftype, m_state.lasttg);
fprintf(m_state.logfile, fprintf(stderr,
"Frame Subtype: %s Source: %12i\n", "Frame Subtype: %s Source: %12i\n",
m_state.fsubtype, m_state.lastsrc); m_state.fsubtype, m_state.lastsrc);
fprintf(m_state.logfile, fprintf(stderr,
"TDMA activity: %s %s Voice errors: %s\n", "TDMA activity: %s %s Voice errors: %s\n",
m_state.slot0light, m_state.slot1light, m_state.err_str); m_state.slot0light, m_state.slot1light, m_state.err_str);
fprintf(m_state.logfile, fprintf(stderr,
"+----------------------------------------------------------------+\n"); "+----------------------------------------------------------------+\n");
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
for (j = 0; j < 64; j++) for (j = 0; j < 64; j++)
{ {
@ -434,26 +433,26 @@ int DSDDecoder::getDibit()
if ((j == ((m_state.min) + 32768) / 1024) if ((j == ((m_state.min) + 32768) / 1024)
|| (j == ((m_state.max) + 32768) / 1024)) || (j == ((m_state.max) + 32768) / 1024))
{ {
fprintf(m_state.logfile, "#"); fprintf(stderr, "#");
} }
else if ((j == ((m_state.lmid) + 32768) / 1024) else if ((j == ((m_state.lmid) + 32768) / 1024)
|| (j == ((m_state.umid) + 32768) / 1024)) || (j == ((m_state.umid) + 32768) / 1024))
{ {
fprintf(m_state.logfile, "^"); fprintf(stderr, "^");
} }
else if (j == (m_state.center + 32768) / 1024) else if (j == (m_state.center + 32768) / 1024)
{ {
fprintf(m_state.logfile, "!"); fprintf(stderr, "!");
} }
else else
{ {
if (j == 32) if (j == 32)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
} }
else else
{ {
fprintf(m_state.logfile, " "); fprintf(stderr, " ");
} }
} }
} }
@ -461,24 +460,24 @@ int DSDDecoder::getDibit()
{ {
if (spectrum[j] > 9 - i) if (spectrum[j] > 9 - i)
{ {
fprintf(m_state.logfile, "*"); fprintf(stderr, "*");
} }
else else
{ {
if (j == 32) if (j == 32)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
} }
else else
{ {
fprintf(m_state.logfile, " "); fprintf(stderr, " ");
} }
} }
} }
} }
fprintf(m_state.logfile, "|\n"); fprintf(stderr, "|\n");
} }
fprintf(m_state.logfile, fprintf(stderr,
"+----------------------------------------------------------------+\n"); "+----------------------------------------------------------------+\n");
} }
} }
@ -620,7 +619,7 @@ void DSDDecoder::resetFrameSync()
if ((m_opts.symboltiming == 1) && (m_state.carrier == 1)) if ((m_opts.symboltiming == 1) && (m_state.carrier == 1))
{ {
fprintf(m_state.logfile, "\nSymbol Timing:\n"); fprintf(stderr, "\nSymbol Timing:\n");
} }
m_fsmState = DSDLookForSync; m_fsmState = DSDLookForSync;
@ -630,19 +629,19 @@ void DSDDecoder::printFrameSync(const char *frametype, int offset, char *modulat
{ {
if (m_opts.verbose > 0) if (m_opts.verbose > 0)
{ {
fprintf(m_state.logfile, "Sync: %s ", frametype); fprintf(stderr, "\nSync: %s ", frametype);
} }
if (m_opts.verbose > 2) if (m_opts.verbose > 2)
{ {
fprintf(m_state.logfile, "o: %4i ", offset); fprintf(stderr, "o: %4i ", offset);
} }
if (m_opts.verbose > 1) if (m_opts.verbose > 1)
{ {
fprintf(m_state.logfile, "mod: %s ", modulation); fprintf(stderr, "mod: %s ", modulation);
} }
if (m_opts.verbose > 2) if (m_opts.verbose > 2)
{ {
fprintf(m_state.logfile, "g: %f ", m_state.aout_gain); fprintf(stderr, "g: %f ", m_state.aout_gain);
} }
} }
@ -834,26 +833,26 @@ int DSDDecoder::getFrameSync()
{ {
m_state.symbolcnt = 0; m_state.symbolcnt = 0;
fprintf(m_state.logfile, "\n"); fprintf(stderr, "\n");
fprintf(m_state.logfile, fprintf(stderr,
"Demod mode: %s Nac: %4X\n", "Demod mode: %s Nac: %4X\n",
m_modulation, m_state.nac); m_modulation, m_state.nac);
fprintf(m_state.logfile, fprintf(stderr,
"Frame Type: %s Talkgroup: %7i\n", "Frame Type: %s Talkgroup: %7i\n",
m_state.ftype, m_state.lasttg); m_state.ftype, m_state.lasttg);
fprintf(m_state.logfile, fprintf(stderr,
"Frame Subtype: %s Source: %12i\n", "Frame Subtype: %s Source: %12i\n",
m_state.fsubtype, m_state.lastsrc); m_state.fsubtype, m_state.lastsrc);
fprintf(m_state.logfile, fprintf(stderr,
"TDMA activity: %s %s Voice errors: %s\n", "TDMA activity: %s %s Voice errors: %s\n",
m_state.slot0light, m_state.slot1light, m_state.slot0light, m_state.slot1light,
m_state.err_str); m_state.err_str);
fprintf(m_state.logfile, fprintf(stderr,
"+----------------------------------------------------------------+\n"); "+----------------------------------------------------------------+\n");
for (int i = 0; i < 10; i++) for (int i = 0; i < 10; i++)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
for (int j = 0; j < 64; j++) for (int j = 0; j < 64; j++)
{ {
@ -861,21 +860,21 @@ int DSDDecoder::getFrameSync()
{ {
if ((j == ((m_state.min) + 32768) / 1024) || (j == ((m_state.max) + 32768) / 1024)) if ((j == ((m_state.min) + 32768) / 1024) || (j == ((m_state.max) + 32768) / 1024))
{ {
fprintf(m_state.logfile, "#"); fprintf(stderr, "#");
} }
else if (j == (m_state.center + 32768) / 1024) else if (j == (m_state.center + 32768) / 1024)
{ {
fprintf(m_state.logfile, "!"); fprintf(stderr, "!");
} }
else else
{ {
if (j == 32) if (j == 32)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
} }
else else
{ {
fprintf(m_state.logfile, " "); fprintf(stderr, " ");
} }
} }
} }
@ -883,26 +882,26 @@ int DSDDecoder::getFrameSync()
{ {
if (m_spectrum[j] > 9 - i) if (m_spectrum[j] > 9 - i)
{ {
fprintf(m_state.logfile, "*"); fprintf(stderr, "*");
} }
else else
{ {
if (j == 32) if (j == 32)
{ {
fprintf(m_state.logfile, "|"); fprintf(stderr, "|");
} }
else else
{ {
fprintf(m_state.logfile, " "); fprintf(stderr, " ");
} }
} }
} }
} }
fprintf(m_state.logfile, "|\n"); fprintf(stderr, "|\n");
} }
fprintf(m_state.logfile, fprintf(stderr,
"+----------------------------------------------------------------+\n"); "+----------------------------------------------------------------+\n");
} }
} }
@ -1513,7 +1512,7 @@ int DSDDecoder::getFrameSync()
if ((m_opts.errorbars == 1) && (m_opts.verbose > 1) if ((m_opts.errorbars == 1) && (m_opts.verbose > 1)
&& (m_state.carrier == 1)) && (m_state.carrier == 1))
{ {
printf("Sync: no sync\n"); printf("\nSync: no sync\n");
} }
noCarrier(); noCarrier();
@ -1573,19 +1572,19 @@ void DSDDecoder::printFrameInfo()
if (m_opts.verbose > 0) if (m_opts.verbose > 0)
{ {
fprintf(m_state.logfile, "inlvl: %2i%% ", level); fprintf(stderr, "inlvl: %2i%% ", level);
} }
if (m_state.nac != 0) if (m_state.nac != 0)
{ {
fprintf(m_state.logfile, "nac: %4X ", m_state.nac); fprintf(stderr, "nac: %4X ", m_state.nac);
} }
if (m_opts.verbose > 1) if (m_opts.verbose > 1)
{ {
fprintf(m_state.logfile, "src: %8i ", m_state.lastsrc); fprintf(stderr, "src: %8i ", m_state.lastsrc);
} }
fprintf(m_state.logfile, "tg: %5i ", m_state.lasttg); fprintf(stderr, "tg: %5i ", m_state.lasttg);
} }
int DSDDecoder::comp(const void *a, const void *b) int DSDDecoder::comp(const void *a, const void *b)
@ -1622,7 +1621,7 @@ void DSDDecoder::processFrame()
if (m_opts.verbose > 0) if (m_opts.verbose > 0)
{ {
int level = (int) m_state.max / 164; int level = (int) m_state.max / 164;
fprintf(m_state.logfile, "inlvl: %2i%% ", level); fprintf(stderr, "inlvl: %2i%% ", level);
} }
} }
@ -1670,7 +1669,7 @@ void DSDDecoder::processFrame()
if (m_opts.verbose > 0) if (m_opts.verbose > 0)
{ {
int level = (int) m_state.max / 164; int level = (int) m_state.max / 164;
fprintf(m_state.logfile, "inlvl: %2i%% ", level); fprintf(stderr, "inlvl: %2i%% ", level);
} }
} }

View File

@ -91,6 +91,19 @@ public:
~DSDDecoder(); ~DSDDecoder();
void run(short sample); void run(short sample);
short *getAudio(int& nbSamples)
{
nbSamples = m_state.audio_out_nb_samples;
return m_state.audio_out_buf;
}
void resetAudio()
{
m_state.audio_out_nb_samples = 0;
m_state.audio_out_buf_p = m_state.audio_out_buf;
}
DSDOpts *getOpts() { return &m_opts; } DSDOpts *getOpts() { return &m_opts; }
DSDState *getState() { return &m_state; } DSDState *getState() { return &m_state; }

View File

@ -16,10 +16,13 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <mbelib.h>
#include "dsd_mbe.h" #include "dsd_mbe.h"
#include "dsd_decoder.h" #include "dsd_decoder.h"
extern "C" {
#include <mbelib.h>
}
namespace DSDplus namespace DSDplus
{ {
@ -68,7 +71,7 @@ void DSDMBEDecoder::processFrame(char imbe_fr[8][23], char ambe_fr[4][24], char
if (m_dsdDecoder->m_opts.errorbars == 1) if (m_dsdDecoder->m_opts.errorbars == 1)
{ {
fprintf(m_dsdDecoder->m_state.logfile, "%s", m_dsdDecoder->m_state.err_str); fprintf(stderr, "%s", m_dsdDecoder->m_state.err_str);
} }
processAudio(); processAudio();
@ -179,11 +182,18 @@ void DSDMBEDecoder::processAudio()
m_dsdDecoder->m_state.aout_gain += ((float) 160 * gaindelta); m_dsdDecoder->m_state.aout_gain += ((float) 160 * gaindelta);
} }
// copy audio datat to output buffer and upsample if necessary // copy audio data to output buffer and upsample if necessary
m_dsdDecoder->m_state.audio_out_temp_buf_p = m_dsdDecoder->m_state.audio_out_temp_buf; m_dsdDecoder->m_state.audio_out_temp_buf_p = m_dsdDecoder->m_state.audio_out_temp_buf;
if (m_dsdDecoder->m_opts.split == 0) if ((m_dsdDecoder->m_opts.split == 0) || (m_dsdDecoder->m_opts.upsample != 0)) // upsampling to 48k
{ {
if (m_dsdDecoder->m_state.audio_out_nb_samples + 960 >= m_dsdDecoder->m_state.audio_out_buf_size)
{
m_dsdDecoder->resetAudio();
}
m_dsdDecoder->m_state.audio_out_float_buf_p = m_dsdDecoder->m_state.audio_out_float_buf;
for (n = 0; n < 160; n++) for (n = 0; n < 160; n++)
{ {
upsample(*m_dsdDecoder->m_state.audio_out_temp_buf_p); upsample(*m_dsdDecoder->m_state.audio_out_temp_buf_p);
@ -193,7 +203,7 @@ void DSDMBEDecoder::processAudio()
m_dsdDecoder->m_state.audio_out_idx2 += 6; m_dsdDecoder->m_state.audio_out_idx2 += 6;
} }
m_dsdDecoder->m_state.audio_out_float_buf_p -= (960 + m_dsdDecoder->m_opts.playoffset); m_dsdDecoder->m_state.audio_out_float_buf_p = m_dsdDecoder->m_state.audio_out_float_buf;
// copy to output (short) buffer // copy to output (short) buffer
for (n = 0; n < 960; n++) for (n = 0; n < 960; n++)
@ -209,13 +219,26 @@ void DSDMBEDecoder::processAudio()
*m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_float_buf_p; *m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_float_buf_p;
m_dsdDecoder->m_state.audio_out_buf_p++; m_dsdDecoder->m_state.audio_out_buf_p++;
if (m_dsdDecoder->m_opts.stereo) // produce second channel
{
*m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_float_buf_p;
m_dsdDecoder->m_state.audio_out_buf_p++;
}
m_dsdDecoder->m_state.audio_out_nb_samples++;
m_dsdDecoder->m_state.audio_out_float_buf_p++; m_dsdDecoder->m_state.audio_out_float_buf_p++;
} }
m_dsdDecoder->m_state.audio_out_float_buf_p += m_dsdDecoder->m_opts.playoffset; m_dsdDecoder->m_state.audio_out_float_buf_p += m_dsdDecoder->m_opts.playoffset;
} }
else else // leave at 8k
{ {
if (m_dsdDecoder->m_state.audio_out_nb_samples + 160 >= m_dsdDecoder->m_state.audio_out_buf_size)
{
m_dsdDecoder->resetAudio();
}
for (n = 0; n < 160; n++) for (n = 0; n < 160; n++)
{ {
if (*m_dsdDecoder->m_state.audio_out_temp_buf_p > (float) 32760) if (*m_dsdDecoder->m_state.audio_out_temp_buf_p > (float) 32760)
@ -229,13 +252,19 @@ void DSDMBEDecoder::processAudio()
*m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_temp_buf_p; *m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_temp_buf_p;
m_dsdDecoder->m_state.audio_out_buf_p++; m_dsdDecoder->m_state.audio_out_buf_p++;
if (m_dsdDecoder->m_opts.stereo) // produce second channel
{
*m_dsdDecoder->m_state.audio_out_buf_p = (short) *m_dsdDecoder->m_state.audio_out_float_buf_p;
m_dsdDecoder->m_state.audio_out_buf_p++;
}
m_dsdDecoder->m_state.audio_out_nb_samples++;
m_dsdDecoder->m_state.audio_out_temp_buf_p++; m_dsdDecoder->m_state.audio_out_temp_buf_p++;
m_dsdDecoder->m_state.audio_out_idx++; m_dsdDecoder->m_state.audio_out_idx++;
m_dsdDecoder->m_state.audio_out_idx2++; m_dsdDecoder->m_state.audio_out_idx2++;
} }
} }
// TODO: flag audio is uvailable
} }
void DSDMBEDecoder::upsample(float invalue) void DSDMBEDecoder::upsample(float invalue)

View File

@ -56,6 +56,7 @@ DSDOpts::DSDOpts()
use_cosine_filter = 1; use_cosine_filter = 1;
unmute_encrypted_p25 = 0; unmute_encrypted_p25 = 0;
upsample = 0; upsample = 0;
stereo = 0;
} }
DSDOpts::~DSDOpts() DSDOpts::~DSDOpts()

View File

@ -60,7 +60,8 @@ public:
int delay; int delay;
int use_cosine_filter; int use_cosine_filter;
int unmute_encrypted_p25; int unmute_encrypted_p25;
int upsample; int upsample; //!< force audio upsampling to 48k
int stereo; //!< double each audio sample to produce L+R channels
}; };
} // namespace dsdplus } // namespace dsdplus

View File

@ -23,19 +23,27 @@ DSDState::DSDState()
{ {
int i, j; int i, j;
dibit_buf = (int *) malloc(sizeof(int) * 1000000);
dibit_buf_p = dibit_buf + 200;
memset (dibit_buf, 0, sizeof (int) * 200);
repeat = 0; repeat = 0;
audio_out_buf = (short *) malloc(sizeof(short) * 1000000);
memset (audio_out_buf, 0, 100 * sizeof (short)); dibit_buf = (int *) malloc(sizeof(int) * 1000000);
audio_out_buf_p = audio_out_buf + 100; memset(dibit_buf, 0, sizeof(int) * 200);
audio_out_float_buf = (float *) malloc(sizeof(float) * 1000000); dibit_buf_p = dibit_buf + 200;
memset (audio_out_float_buf, 0, 100 * sizeof (float));
audio_out_float_buf_p = audio_out_float_buf + 100; audio_out_buf = (short *) malloc(sizeof(short) * 2 * 48000); // 1s of L+R S16LE samples
memset(audio_out_buf, 0, sizeof(short) * 2 * 48000);
audio_out_buf_p = audio_out_buf;
audio_out_nb_samples = 0;
audio_out_buf_size = 48000; // given in number of unique samples
audio_out_float_buf = (float *) malloc(sizeof(float) * 960); // 1 frame of 160 samples upampled 6 times
memset(audio_out_float_buf, 0, sizeof(float) * 960);
audio_out_float_buf_p = audio_out_float_buf;
audio_out_temp_buf_p = audio_out_temp_buf;
audio_out_idx = 0; audio_out_idx = 0;
audio_out_idx2 = 0; audio_out_idx2 = 0;
audio_out_temp_buf_p = audio_out_temp_buf;
center = 0; center = 0;
jitter = -1; jitter = -1;
synctype = -1; synctype = -1;
@ -46,23 +54,28 @@ DSDState::DSDState()
minref = -12000; minref = -12000;
maxref = 12000; maxref = 12000;
lastsample = 0; lastsample = 0;
for (i = 0; i < 128; i++) for (i = 0; i < 128; i++)
{ {
sbuf[i] = 0; sbuf[i] = 0;
} }
sidx = 0; sidx = 0;
for (i = 0; i < 1024; i++) for (i = 0; i < 1024; i++)
{ {
maxbuf[i] = 15000; maxbuf[i] = 15000;
} }
for (i = 0; i < 1024; i++) for (i = 0; i < 1024; i++)
{ {
minbuf[i] = -15000; minbuf[i] = -15000;
} }
midx = 0; midx = 0;
err_str[0] = 0; err_str[0] = 0;
sprintf (fsubtype, " "); sprintf(fsubtype, " ");
sprintf (ftype, " "); sprintf(ftype, " ");
symbolcnt = 0; symbolcnt = 0;
rf_mod = 0; rf_mod = 0;
numflips = 0; numflips = 0;
@ -70,13 +83,15 @@ DSDState::DSDState()
lastp25type = 0; lastp25type = 0;
offset = 0; offset = 0;
carrier = 0; carrier = 0;
for (i = 0; i < 25; i++) for (i = 0; i < 25; i++)
{ {
for (j = 0; j < 16; j++) for (j = 0; j < 16; j++)
{ {
tg[i][j] = 48; tg[i][j] = 48;
} }
} }
tgcount = 0; tgcount = 0;
lasttg = 0; lasttg = 0;
lastsrc = 0; lastsrc = 0;
@ -87,30 +102,27 @@ DSDState::DSDState()
optind = 0; optind = 0;
numtdulc = 0; numtdulc = 0;
firstframe = 0; firstframe = 0;
sprintf (slot0light, " slot0 "); sprintf(slot0light, " slot0 ");
sprintf (slot1light, " slot1 "); sprintf(slot1light, " slot1 ");
aout_gain = 25; aout_gain = 25;
memset (aout_max_buf, 0, sizeof (float) * 200); memset(aout_max_buf, 0, sizeof(float) * 200);
aout_max_buf_p = aout_max_buf; aout_max_buf_p = aout_max_buf;
aout_max_buf_idx = 0; aout_max_buf_idx = 0;
samplesPerSymbol = 10; samplesPerSymbol = 10;
symbolCenter = 4; symbolCenter = 4;
sprintf (algid, "________"); sprintf(algid, "________");
sprintf (keyid, "________________"); sprintf(keyid, "________________");
currentslot = 0; currentslot = 0;
cur_mp = (mbe_parms *) malloc (sizeof (mbe_parms)); cur_mp = (mbe_parms *) malloc(sizeof(mbe_parms));
prev_mp = (mbe_parms *) malloc (sizeof (mbe_parms)); prev_mp = (mbe_parms *) malloc(sizeof(mbe_parms));
prev_mp_enhanced = (mbe_parms *) malloc (sizeof (mbe_parms)); prev_mp_enhanced = (mbe_parms *) malloc(sizeof(mbe_parms));
mbe_initMbeParms (cur_mp, prev_mp, prev_mp_enhanced); mbe_initMbeParms(cur_mp, prev_mp, prev_mp_enhanced);
p25kid = 0; p25kid = 0;
output_finished = 0; output_finished = 0;
input_offset = 0;
output_offset = 0; output_offset = 0;
input_samples = 0;
output_num_samples = 0; output_num_samples = 0;
output_samples = 0; output_samples = 0;
input_length = 0;
output_length = 0; output_length = 0;
output_buffer = 0; output_buffer = 0;
} }

View File

@ -20,7 +20,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
extern "C" {
#include <mbelib.h> #include <mbelib.h>
}
namespace DSDplus namespace DSDplus
{ {
@ -34,11 +37,13 @@ public:
int *dibit_buf; int *dibit_buf;
int *dibit_buf_p; int *dibit_buf_p;
int repeat; int repeat;
short *audio_out_buf; short *audio_out_buf; //!< final result
short *audio_out_buf_p; short *audio_out_buf_p;
float *audio_out_float_buf; int audio_out_nb_samples;
int audio_out_buf_size;
float *audio_out_float_buf; //!< output of upsampler
float *audio_out_float_buf_p; float *audio_out_float_buf_p;
float audio_out_temp_buf[160]; float audio_out_temp_buf[160]; //!< output of decoder
float *audio_out_temp_buf_p; float *audio_out_temp_buf_p;
int audio_out_idx; int audio_out_idx;
int audio_out_idx2; int audio_out_idx2;
@ -94,17 +99,12 @@ public:
mbe_parms *prev_mp_enhanced; mbe_parms *prev_mp_enhanced;
int p25kid; int p25kid;
const float *input_samples;
int input_length;
int input_offset;
short *output_buffer; short *output_buffer;
int output_offset; int output_offset;
float *output_samples; float *output_samples;
int output_num_samples; int output_num_samples;
int output_length; int output_length;
int output_finished; int output_finished;
FILE *logfile;
}; };
} // namespace dsdplus } // namespace dsdplus

View File

@ -136,7 +136,7 @@ DSDDstar::~DSDDstar()
void DSDDstar::init() void DSDDstar::init()
{ {
if (m_dsdDecoder->m_opts.errorbars == 1) { if (m_dsdDecoder->m_opts.errorbars == 1) {
fprintf(m_dsdDecoder->m_state.logfile, "e:"); fprintf(stderr, "e:");
} }
if (m_dsdDecoder->m_state.synctype == 18) { if (m_dsdDecoder->m_state.synctype == 18) {
@ -226,7 +226,7 @@ void DSDDstar::processVoice()
if ((bitbuffer & 0x00FFFFFF) == 0x00AAB468) if ((bitbuffer & 0x00FFFFFF) == 0x00AAB468)
{ {
// we're slipping bits // we're slipping bits
fprintf(m_dsdDecoder->m_state.logfile, "sync in voice after i=%d, restarting\n", i); fprintf(stderr, "sync in voice after i=%d, restarting\n", i);
//ugh just start over //ugh just start over
i = 0; i = 0;
w = dW; w = dW;
@ -267,7 +267,7 @@ void DSDDstar::processData()
// looking if we're slipping bits // looking if we're slipping bits
if (i != 96) if (i != 96)
{ {
fprintf(m_dsdDecoder->m_state.logfile, "sync after i=%d\n", i); fprintf(stderr, "sync after i=%d\n", i);
break; break;
} }
} }

View File

@ -50,19 +50,10 @@ DSDDecoder::DSDDecoder()
dsdstate->rf_mod = 0; dsdstate->rf_mod = 0;
dsdstate->output_offset = 0; dsdstate->output_offset = 0;
dsdopts->upsample = 1;
m_zeroBuffer = new short[1<<18]; // 128 kS dsdopts->stereo = 1;
memset(m_zeroBuffer, 0, sizeof(short) * (1<<18));
} }
DSDDecoder::~DSDDecoder() DSDDecoder::~DSDDecoder()
{ {
} }
void DSDDecoder::pushSamples(const short *samples,int nbSamples)
{
}
void DSDDecoder::popAudioSamples(AudioFifo *audioFifo, bool audioMute)
{
}

View File

@ -28,12 +28,12 @@ public:
DSDDecoder(); DSDDecoder();
~DSDDecoder(); ~DSDDecoder();
void pushSamples(const short *samples, int nbSamples); // Push this amount of samples to the DSD decoder thread void pushSample(short sample) { m_decoder.run(sample); }
void popAudioSamples(AudioFifo *audioFifo, bool audioMute); short *getAudio(int& nbSamples) { return m_decoder.getAudio(nbSamples); }
void resetAudio() { m_decoder.resetAudio(); }
private: private:
DSDplus::DSDDecoder m_decoder; DSDplus::DSDDecoder m_decoder;
short *m_zeroBuffer;
}; };
#endif /* PLUGINS_CHANNEL_DEMODDSD_DSDDECODER_H_ */ #endif /* PLUGINS_CHANNEL_DEMODDSD_DSDDECODER_H_ */

View File

@ -43,8 +43,6 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) :
{ {
setObjectName("DSDDemod"); setObjectName("DSDDemod");
m_samplesBuffer = 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_config.m_inputSampleRate = 96000; m_config.m_inputSampleRate = 96000;
m_config.m_inputFrequencyOffset = 0; m_config.m_inputFrequencyOffset = 0;
m_config.m_rfBandwidth = 100; m_config.m_rfBandwidth = 100;
@ -69,7 +67,6 @@ DSDDemod::DSDDemod(SampleSink* sampleSink) :
DSDDemod::~DSDDemod() DSDDemod::~DSDDemod()
{ {
DSPEngine::instance()->removeAudioSink(&m_audioFifo); DSPEngine::instance()->removeAudioSink(&m_audioFifo);
delete[] m_samplesBuffer;
} }
void DSDDemod::configure(MessageQueue* messageQueue, void DSDDemod::configure(MessageQueue* messageQueue,
@ -96,7 +93,6 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
Complex ci; Complex ci;
m_settingsMutex.lock(); m_settingsMutex.lock();
m_samplesBufferIndex = 0;
m_scopeSampleBuffer.clear(); m_scopeSampleBuffer.clear();
for (SampleVector::const_iterator it = begin; it != end; ++it) for (SampleVector::const_iterator it = begin; it != end; ++it)
@ -141,7 +137,7 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
Sample s(sample, 0.0); Sample s(sample, 0.0);
m_scopeSampleBuffer.push_back(s); m_scopeSampleBuffer.push_back(s);
m_samplesBuffer[m_samplesBufferIndex++] = sample; m_dsdDecoder.pushSample(sample);
// if (m_running.m_audioMute) // if (m_running.m_audioMute)
// { // {
@ -185,8 +181,18 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
// m_audioBufferFill = 0; // m_audioBufferFill = 0;
// } // }
m_dsdDecoder.popAudioSamples(&m_audioFifo, m_running.m_audioMute); int nbAudioSamples;
m_dsdDecoder.pushSamples(m_samplesBuffer, m_samplesBufferIndex); short *audio = m_dsdDecoder.getAudio(nbAudioSamples);
if (nbAudioSamples > 0)
{
uint res = m_audioFifo.write((const quint8*)&m_audioBuffer[0], nbAudioSamples, 10);
if (res != nbAudioSamples)
{
qDebug("NFMDemod::feed: %u/%u tail samples written", res, nbAudioSamples);
}
}
if ((m_scope != 0) && (m_scopeEnabled)) if ((m_scope != 0) && (m_scopeEnabled))
{ {

View File

@ -169,8 +169,6 @@ private:
Real m_fmExcursion; Real m_fmExcursion;
qint16 *m_samplesBuffer; //!< Input buffer for DSD decoder process
int m_samplesBufferIndex;
SampleVector m_scopeSampleBuffer; SampleVector m_scopeSampleBuffer;
AudioVector m_audioBuffer; AudioVector m_audioBuffer;
uint m_audioBufferFill; uint m_audioBufferFill;