DSD demod: diagnostics on GUI. Audio volume and audio mute

This commit is contained in:
f4exb 2016-04-22 03:53:16 +02:00
parent 17de736f36
commit 837c22fd67
9 changed files with 98 additions and 58 deletions

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //
@ -32,6 +32,12 @@ public:
short *getAudio(int& nbSamples) { return m_decoder.getAudio(nbSamples); }
void resetAudio() { m_decoder.resetAudio(); }
int getInLevel() const { return m_decoder.getInLevel(); }
const char *getFrameTypeText() const { return m_decoder.getFrameTypeText(); }
const char *getModulationText() const { return m_decoder.getModulationText(); }
void setAudioGain(float gain) { m_decoder.setAudioGain(gain); }
private:
DSDcc::DSDDecoder m_decoder;
};

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //
@ -157,64 +157,21 @@ void DSDDemod::feed(const SampleVector::const_iterator& begin, const SampleVecto
m_scopeSampleBuffer.push_back(s);
m_dsdDecoder.pushSample(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_running.m_volume) / 100;
// m_audioBuffer[m_audioBufferFill].r = (sample * m_running.m_volume) / 100;
// }
//
// ++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);
// }
//
// m_audioBufferFill = 0;
// }
int nbAudioSamples;
short *dsdAudio = m_dsdDecoder.getAudio(nbAudioSamples);
if (nbAudioSamples > 0)
{
uint res = m_audioFifo.write((const quint8*) dsdAudio, nbAudioSamples, 10);
qDebug("DSDDemod::feed: written %d audio samples (%d)", res, nbAudioSamples);
m_dsdDecoder.resetAudio();
// qDebug("\nDSDDemod::feed: got %d audio samples (%lu)", nbAudioSamples, m_audioBuffer.size());
}
if (!m_running.m_audioMute) {
uint res = m_audioFifo.write((const quint8*) dsdAudio, nbAudioSamples, 10);
}
// if (nbAudioSamples >= m_audioBuffer.size())
// {
// uint res = m_audioFifo.write((const quint8*) dsdAudio, nbAudioSamples, 10);
// qDebug("DSDDemod::feed: written %d audio samples (%d)", res, nbAudioSamples);
// m_dsdDecoder.resetAudio();
// }
m_dsdDecoder.resetAudio();
}
if ((m_scope != 0) && (m_scopeEnabled))
{
@ -318,6 +275,11 @@ void DSDDemod::apply()
//m_squelchLevel *= m_squelchLevel;
}
if (m_config.m_volume != m_running.m_volume)
{
m_dsdDecoder.setAudioGain(m_config.m_volume / 10.0f);
}
m_running.m_inputSampleRate = m_config.m_inputSampleRate;
m_running.m_inputFrequencyOffset = m_config.m_inputFrequencyOffset;
m_running.m_rfBandwidth = m_config.m_rfBandwidth;

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //
@ -61,6 +61,8 @@ public:
Real getMagSq() { return m_magsq; }
bool getSquelchOpen() const { return m_squelchOpen; }
const DSDDecoder& getDecoder() const { return m_dsdDecoder; }
private:
class MsgConfigureDSDDemod : public Message {
MESSAGE_CLASS_DECLARATION

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //
@ -251,7 +251,8 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, QWidget* parent) :
m_basicSettingsShown(false),
m_doApplySettings(true),
m_squelchOpen(false),
m_channelPowerDbAvg(20,0)
m_channelPowerDbAvg(20,0),
m_tickCount(0)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose, true);
@ -369,4 +370,18 @@ void DSDDemodGUI::tick()
ui->audioMute->setStyleSheet("QToolButton { background:rgb(79,79,79); }");
}
}
// "slow" updates
if (m_tickCount < 10)
{
m_tickCount++;
}
else
{
ui->inLevelText->setText(QString::number(m_dsdDemod->getDecoder().getInLevel()));
ui->syncText->setText(QString(m_dsdDemod->getDecoder().getFrameTypeText()));
ui->modulationText->setText(QString(m_dsdDemod->getDecoder().getModulationText()));
m_tickCount = 0;
}
}

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //
@ -83,6 +83,7 @@ private:
bool m_audioMute;
bool m_squelchOpen;
MovingAverage<Real> m_channelPowerDbAvg;
int m_tickCount;
explicit DSDDemodGUI(PluginAPI* pluginAPI, QWidget* parent = NULL);
virtual ~DSDDemodGUI();

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>503</width>
<width>520</width>
<height>898</height>
</rect>
</property>
@ -16,6 +16,12 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>520</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<family>Sans Serif</family>
@ -129,6 +135,54 @@
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="modulationText">
<property name="minimumSize">
<size>
<width>30</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Modulation type detected</string>
</property>
<property name="text">
<string>____</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="syncText">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Synchronized on this frame type</string>
</property>
<property name="text">
<string>No Sync______</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="inLevelText">
<property name="minimumSize">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Input level (%) valid when synchronized</string>
</property>
<property name="text">
<string>00</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="channnelPowerLayout">
<item>

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2015 F4EXB //
// Copyright (C) 2016 F4EXB //
// written by Edouard Griffiths //
// //
// This program is free software; you can redistribute it and/or modify //