mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-08-25 17:02:26 -04:00
Multiple audio support: SSB demodulator
This commit is contained in:
parent
d683c90c43
commit
4fbb8f74c8
@ -223,6 +223,8 @@ bool AMDemod::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
void AMDemod::applyAudioSampleRate(int sampleRate)
|
void AMDemod::applyAudioSampleRate(int sampleRate)
|
||||||
{
|
{
|
||||||
|
qDebug("AMDemod::applyAudioSampleRate: %d", sampleRate);
|
||||||
|
|
||||||
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
||||||
sampleRate, m_settings.m_inputFrequencyOffset);
|
sampleRate, m_settings.m_inputFrequencyOffset);
|
||||||
m_inputMessageQueue.push(channelConfigMsg);
|
m_inputMessageQueue.push(channelConfigMsg);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>352</width>
|
<width>396</width>
|
||||||
<height>170</height>
|
<height>170</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
@ -42,7 +42,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>350</width>
|
<width>390</width>
|
||||||
<height>131</height>
|
<height>131</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
project(ssb)
|
project(ssb)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||||
|
|
||||||
set(ssb_SOURCES
|
set(ssb_SOURCES
|
||||||
ssbdemod.cpp
|
ssbdemod.cpp
|
||||||
ssbdemodgui.cpp
|
ssbdemodgui.cpp
|
||||||
|
@ -45,13 +45,13 @@ Toggles between SSB (icon with one sideband signal) and DSB (icon with double si
|
|||||||
|
|
||||||
<h3>8: Spectrum display frequency span</h3>
|
<h3>8: Spectrum display frequency span</h3>
|
||||||
|
|
||||||
The 48 kHz channel sample rate is further decimated by powers of two for the spectrum display and in channel filter limits. This effectively sets the total available bandwidth depending on the decimation:
|
The audio sample rate SR is further decimated by powers of two for the spectrum display and in channel filter limits. This effectively sets the total available bandwidth depending on the decimation:
|
||||||
|
|
||||||
- 1 (no decimation): 24 kHz (SSB) or 48 kHz (DSB)
|
- 1 (no decimation): SR/2 (SSB) or SR (DSB)
|
||||||
- 2: 12 kHz (SSB) or 24 kHz (DSB)
|
- 2: SR/4 (SSB) or SR/2 (DSB)
|
||||||
- 4: 6 kHz (SSB) or 12 kHz (DSB)
|
- 4: SR/8 (SSB) or SR/4 (DSB)
|
||||||
- 8: 3 kHz (SSB) or 6 kHz (DSB)
|
- 8: SR/16 (SSB) or SR/8 (DSB)
|
||||||
- 16: 1.5 kHz (SSB) or 3 kHz (DSB)
|
- 16: SR/32 (SSB) or SR/16 (DSB)
|
||||||
|
|
||||||
The span value display is set as follows depending on the SSB or DSB mode:
|
The span value display is set as follows depending on the SSB or DSB mode:
|
||||||
|
|
||||||
|
@ -87,7 +87,6 @@ SSBDemod::SSBDemod(DeviceSourceAPI *deviceAPI) :
|
|||||||
SSBFilter = new fftfilt(m_LowCutoff / m_audioSampleRate, m_Bandwidth / m_audioSampleRate, ssbFftLen);
|
SSBFilter = new fftfilt(m_LowCutoff / m_audioSampleRate, m_Bandwidth / m_audioSampleRate, ssbFftLen);
|
||||||
DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen);
|
DSBFilter = new fftfilt((2.0f * m_Bandwidth) / m_audioSampleRate, 2 * ssbFftLen);
|
||||||
|
|
||||||
DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo, getInputMessageQueue());
|
|
||||||
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
m_audioNetSink = new AudioNetSink(0); // parent thread allocated dynamically - no RTP
|
||||||
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
m_audioNetSink->setDestination(m_settings.m_udpAddress, m_settings.m_udpPort);
|
||||||
|
|
||||||
@ -336,6 +335,20 @@ bool SSBDemod::handleMessage(const Message& cmd)
|
|||||||
m_audioNetSink->moveToThread(const_cast<QThread*>(thread)); // use the thread for udp sinks
|
m_audioNetSink->moveToThread(const_cast<QThread*>(thread)); // use the thread for udp sinks
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (DSPConfigureAudio::match(cmd))
|
||||||
|
{
|
||||||
|
DSPConfigureAudio& cfg = (DSPConfigureAudio&) cmd;
|
||||||
|
uint32_t sampleRate = cfg.getSampleRate();
|
||||||
|
|
||||||
|
qDebug() << "SSBDemod::handleMessage: DSPConfigureAudio:"
|
||||||
|
<< " sampleRate: " << sampleRate;
|
||||||
|
|
||||||
|
if (sampleRate != m_audioSampleRate) {
|
||||||
|
applyAudioSampleRate(sampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (DSPSignalNotification::match(cmd))
|
else if (DSPSignalNotification::match(cmd))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@ -370,7 +383,7 @@ void SSBDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffse
|
|||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolator.create(16, inputSampleRate, m_Bandwidth * 1.5f, 2.0f);
|
m_interpolator.create(16, inputSampleRate, m_Bandwidth * 1.5f, 2.0f);
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate;
|
m_interpolatorDistance = (Real) inputSampleRate / (Real) m_audioSampleRate;
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,6 +391,31 @@ void SSBDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffse
|
|||||||
m_inputFrequencyOffset = inputFrequencyOffset;
|
m_inputFrequencyOffset = inputFrequencyOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBDemod::applyAudioSampleRate(int sampleRate)
|
||||||
|
{
|
||||||
|
qDebug("SSBDemod::applyAudioSampleRate: %d", sampleRate);
|
||||||
|
|
||||||
|
MsgConfigureChannelizer* channelConfigMsg = MsgConfigureChannelizer::create(
|
||||||
|
sampleRate, m_settings.m_inputFrequencyOffset);
|
||||||
|
m_inputMessageQueue.push(channelConfigMsg);
|
||||||
|
|
||||||
|
m_settingsMutex.lock();
|
||||||
|
m_interpolator.create(16, m_inputSampleRate, m_Bandwidth * 1.5f, 2.0f);
|
||||||
|
m_interpolatorDistanceRemain = 0;
|
||||||
|
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) sampleRate;
|
||||||
|
SSBFilter->create_filter(m_LowCutoff / (float) sampleRate, m_Bandwidth / (float) sampleRate);
|
||||||
|
DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) sampleRate);
|
||||||
|
m_settingsMutex.unlock();
|
||||||
|
|
||||||
|
m_audioSampleRate = sampleRate;
|
||||||
|
|
||||||
|
if (m_guiMessageQueue) // forward to GUI if any
|
||||||
|
{
|
||||||
|
DSPConfigureAudio *cfg = new DSPConfigureAudio(m_audioSampleRate);
|
||||||
|
m_guiMessageQueue->push(cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force)
|
void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force)
|
||||||
{
|
{
|
||||||
qDebug() << "SSBDemod::applySettings:"
|
qDebug() << "SSBDemod::applySettings:"
|
||||||
@ -395,17 +433,17 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force)
|
|||||||
<< " m_agcClamping: " << settings.m_agcClamping
|
<< " m_agcClamping: " << settings.m_agcClamping
|
||||||
<< " m_agcTimeLog2: " << settings.m_agcTimeLog2
|
<< " m_agcTimeLog2: " << settings.m_agcTimeLog2
|
||||||
<< " agcPowerThreshold: " << settings.m_agcPowerThreshold
|
<< " agcPowerThreshold: " << settings.m_agcPowerThreshold
|
||||||
<< " agcThresholdGate: " << settings.m_agcThresholdGate;
|
<< " agcThresholdGate: " << settings.m_agcThresholdGate
|
||||||
|
<< " m_audioDeviceName: " << settings.m_audioDeviceName
|
||||||
|
<< " force: " << force;
|
||||||
|
|
||||||
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
|
if((m_settings.m_rfBandwidth != settings.m_rfBandwidth) ||
|
||||||
(m_settings.m_lowCutoff != settings.m_lowCutoff) ||
|
(m_settings.m_lowCutoff != settings.m_lowCutoff) || force)
|
||||||
(m_settings.m_audioSampleRate != settings.m_audioSampleRate) || force)
|
|
||||||
{
|
{
|
||||||
float band, lowCutoff;
|
float band, lowCutoff;
|
||||||
|
|
||||||
band = settings.m_rfBandwidth;
|
band = settings.m_rfBandwidth;
|
||||||
lowCutoff = settings.m_lowCutoff;
|
lowCutoff = settings.m_lowCutoff;
|
||||||
m_audioSampleRate = settings.m_audioSampleRate;
|
|
||||||
|
|
||||||
if (band < 0) {
|
if (band < 0) {
|
||||||
band = -band;
|
band = -band;
|
||||||
@ -427,7 +465,7 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force)
|
|||||||
m_settingsMutex.lock();
|
m_settingsMutex.lock();
|
||||||
m_interpolator.create(16, m_inputSampleRate, m_Bandwidth * 1.5f, 2.0f);
|
m_interpolator.create(16, m_inputSampleRate, m_Bandwidth * 1.5f, 2.0f);
|
||||||
m_interpolatorDistanceRemain = 0;
|
m_interpolatorDistanceRemain = 0;
|
||||||
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) m_settings.m_audioSampleRate;
|
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) m_audioSampleRate;
|
||||||
SSBFilter->create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate);
|
SSBFilter->create_filter(m_LowCutoff / (float) m_audioSampleRate, m_Bandwidth / (float) m_audioSampleRate);
|
||||||
DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) m_audioSampleRate);
|
DSBFilter->create_dsb_filter((2.0f * m_Bandwidth) / (float) m_audioSampleRate);
|
||||||
m_settingsMutex.unlock();
|
m_settingsMutex.unlock();
|
||||||
@ -490,6 +528,18 @@ void SSBDemod::applySettings(const SSBDemodSettings& settings, bool force)
|
|||||||
m_audioNetSink->setDestination(settings.m_udpAddress, settings.m_udpPort);
|
m_audioNetSink->setDestination(settings.m_udpAddress, settings.m_udpPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force)
|
||||||
|
{
|
||||||
|
AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager();
|
||||||
|
int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName);
|
||||||
|
audioDeviceManager->addAudioSink(&m_audioFifo, getInputMessageQueue(), audioDeviceIndex);
|
||||||
|
uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex);
|
||||||
|
|
||||||
|
if (m_audioSampleRate != audioSampleRate) {
|
||||||
|
applyAudioSampleRate(audioSampleRate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_spanLog2 = settings.m_spanLog2;
|
m_spanLog2 = settings.m_spanLog2;
|
||||||
m_audioBinaual = settings.m_audioBinaural;
|
m_audioBinaual = settings.m_audioBinaural;
|
||||||
m_audioFlipChannels = settings.m_audioFlipChannels;
|
m_audioFlipChannels = settings.m_audioFlipChannels;
|
||||||
|
@ -120,6 +120,7 @@ public:
|
|||||||
virtual QByteArray serialize() const;
|
virtual QByteArray serialize() const;
|
||||||
virtual bool deserialize(const QByteArray& data);
|
virtual bool deserialize(const QByteArray& data);
|
||||||
|
|
||||||
|
uint32_t getAudioSampleRate() const { return m_audioSampleRate; }
|
||||||
double getMagSq() const { return m_magsq; }
|
double getMagSq() const { return m_magsq; }
|
||||||
bool getAudioActive() const { return m_audioActive; }
|
bool getAudioActive() const { return m_audioActive; }
|
||||||
|
|
||||||
@ -282,6 +283,7 @@ private:
|
|||||||
|
|
||||||
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false);
|
void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false);
|
||||||
void applySettings(const SSBDemodSettings& settings, bool force = false);
|
void applySettings(const SSBDemodSettings& settings, bool force = false);
|
||||||
|
void applyAudioSampleRate(int sampleRate);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_SSBDEMOD_H
|
#endif // INCLUDE_SSBDEMOD_H
|
||||||
|
@ -9,11 +9,14 @@
|
|||||||
#include "ui_ssbdemodgui.h"
|
#include "ui_ssbdemodgui.h"
|
||||||
#include "dsp/spectrumvis.h"
|
#include "dsp/spectrumvis.h"
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
|
#include "dsp/dspcommands.h"
|
||||||
#include "gui/glspectrum.h"
|
#include "gui/glspectrum.h"
|
||||||
#include "gui/basicchannelsettingsdialog.h"
|
#include "gui/basicchannelsettingsdialog.h"
|
||||||
#include "plugin/pluginapi.h"
|
#include "plugin/pluginapi.h"
|
||||||
#include "util/simpleserializer.h"
|
#include "util/simpleserializer.h"
|
||||||
#include "util/db.h"
|
#include "util/db.h"
|
||||||
|
#include "gui/crightclickenabler.h"
|
||||||
|
#include "gui/audioselectdialog.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ssbdemod.h"
|
#include "ssbdemod.h"
|
||||||
|
|
||||||
@ -77,9 +80,31 @@ bool SSBDemodGUI::deserialize(const QByteArray& data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SSBDemodGUI::handleMessage(const Message& message __attribute__((unused)))
|
bool SSBDemodGUI::handleMessage(const Message& message)
|
||||||
{
|
{
|
||||||
|
if (DSPConfigureAudio::match(message))
|
||||||
|
{
|
||||||
|
qDebug("SSBDemodGUI::handleMessage: DSPConfigureAudio: %d", m_ssbDemod->getAudioSampleRate());
|
||||||
|
applyBandwidths(); // will update spectrum details with new sample rate
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SSBDemodGUI::handleInputMessages()
|
||||||
|
{
|
||||||
|
Message* message;
|
||||||
|
|
||||||
|
while ((message = getInputMessageQueue()->pop()) != 0)
|
||||||
|
{
|
||||||
|
if (handleMessage(*message))
|
||||||
|
{
|
||||||
|
delete message;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSBDemodGUI::channelMarkerChangedByCursor()
|
void SSBDemodGUI::channelMarkerChangedByCursor()
|
||||||
@ -249,6 +274,9 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
|||||||
m_ssbDemod->setMessageQueueToGUI(getInputMessageQueue());
|
m_ssbDemod->setMessageQueueToGUI(getInputMessageQueue());
|
||||||
m_ssbDemod->setSampleSink(m_spectrumVis);
|
m_ssbDemod->setSampleSink(m_spectrumVis);
|
||||||
|
|
||||||
|
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
|
||||||
|
connect(audioMuteRightClickEnabler, SIGNAL(rightClick()), this, SLOT(audioSelect()));
|
||||||
|
|
||||||
ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
|
ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
|
||||||
ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
|
ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
|
||||||
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
|
ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
|
||||||
@ -284,6 +312,7 @@ SSBDemodGUI::SSBDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban
|
|||||||
|
|
||||||
connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor()));
|
connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor()));
|
||||||
connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor()));
|
connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor()));
|
||||||
|
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||||
|
|
||||||
ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
|
ui->spectrumGUI->setBuddies(m_spectrumVis->getInputMessageQueue(), m_spectrumVis, ui->glSpectrum);
|
||||||
|
|
||||||
@ -316,7 +345,7 @@ void SSBDemodGUI::applySettings(bool force)
|
|||||||
if (m_doApplySettings)
|
if (m_doApplySettings)
|
||||||
{
|
{
|
||||||
SSBDemod::MsgConfigureChannelizer* channelConfigMsg = SSBDemod::MsgConfigureChannelizer::create(
|
SSBDemod::MsgConfigureChannelizer* channelConfigMsg = SSBDemod::MsgConfigureChannelizer::create(
|
||||||
48000, m_channelMarker.getCenterFrequency());
|
m_ssbDemod->getAudioSampleRate(), m_channelMarker.getCenterFrequency());
|
||||||
m_ssbDemod->getInputMessageQueue()->push(channelConfigMsg);
|
m_ssbDemod->getInputMessageQueue()->push(channelConfigMsg);
|
||||||
|
|
||||||
SSBDemod::MsgConfigureSSBDemod* message = SSBDemod::MsgConfigureSSBDemod::create( m_settings, force);
|
SSBDemod::MsgConfigureSSBDemod* message = SSBDemod::MsgConfigureSSBDemod::create( m_settings, force);
|
||||||
@ -328,10 +357,10 @@ void SSBDemodGUI::applyBandwidths(bool force)
|
|||||||
{
|
{
|
||||||
bool dsb = ui->dsb->isChecked();
|
bool dsb = ui->dsb->isChecked();
|
||||||
int spanLog2 = ui->spanLog2->value();
|
int spanLog2 = ui->spanLog2->value();
|
||||||
m_spectrumRate = 48000 / (1<<spanLog2);
|
m_spectrumRate = m_ssbDemod->getAudioSampleRate() / (1<<spanLog2);
|
||||||
int bw = ui->BW->value();
|
int bw = ui->BW->value();
|
||||||
int lw = ui->lowCut->value();
|
int lw = ui->lowCut->value();
|
||||||
int bwMax = 480/(1<<spanLog2);
|
int bwMax = m_ssbDemod->getAudioSampleRate() / (100*(1<<spanLog2));
|
||||||
int tickInterval = m_spectrumRate / 1200;
|
int tickInterval = m_spectrumRate / 1200;
|
||||||
tickInterval = tickInterval == 0 ? 1 : tickInterval;
|
tickInterval = tickInterval == 0 ? 1 : tickInterval;
|
||||||
|
|
||||||
@ -545,6 +574,19 @@ void SSBDemodGUI::enterEvent(QEvent*)
|
|||||||
m_channelMarker.setHighlighted(true);
|
m_channelMarker.setHighlighted(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SSBDemodGUI::audioSelect()
|
||||||
|
{
|
||||||
|
qDebug("SSBDemodGUI::audioSelect");
|
||||||
|
AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName);
|
||||||
|
audioSelect.exec();
|
||||||
|
|
||||||
|
if (audioSelect.m_selected)
|
||||||
|
{
|
||||||
|
m_settings.m_audioDeviceName = audioSelect.m_audioDeviceName;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SSBDemodGUI::tick()
|
void SSBDemodGUI::tick()
|
||||||
{
|
{
|
||||||
double magsqAvg, magsqPeak;
|
double magsqAvg, magsqPeak;
|
||||||
|
@ -98,6 +98,8 @@ private slots:
|
|||||||
void on_copyAudioToUDP_toggled(bool copy);
|
void on_copyAudioToUDP_toggled(bool copy);
|
||||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||||
void onMenuDialogCalled(const QPoint& p);
|
void onMenuDialogCalled(const QPoint& p);
|
||||||
|
void handleInputMessages();
|
||||||
|
void audioSelect();
|
||||||
void tick();
|
void tick();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,19 +6,19 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>413</width>
|
<width>412</width>
|
||||||
<height>190</height>
|
<height>190</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>400</width>
|
<width>412</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
|
@ -53,11 +53,11 @@ void SSBDemodSettings::resetToDefaults()
|
|||||||
m_volume = 3.0;
|
m_volume = 3.0;
|
||||||
m_spanLog2 = 3;
|
m_spanLog2 = 3;
|
||||||
m_inputFrequencyOffset = 0;
|
m_inputFrequencyOffset = 0;
|
||||||
m_audioSampleRate = DSPEngine::instance()->getDefaultAudioSampleRate();
|
|
||||||
m_udpAddress = "127.0.0.1";
|
m_udpAddress = "127.0.0.1";
|
||||||
m_udpPort = 9999;
|
m_udpPort = 9999;
|
||||||
m_rgbColor = QColor(0, 255, 0).rgb();
|
m_rgbColor = QColor(0, 255, 0).rgb();
|
||||||
m_title = "SSB Demodulator";
|
m_title = "SSB Demodulator";
|
||||||
|
m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray SSBDemodSettings::serialize() const
|
QByteArray SSBDemodSettings::serialize() const
|
||||||
@ -83,6 +83,7 @@ QByteArray SSBDemodSettings::serialize() const
|
|||||||
s.writeS32(14, m_agcThresholdGate);
|
s.writeS32(14, m_agcThresholdGate);
|
||||||
s.writeBool(15, m_agcClamping);
|
s.writeBool(15, m_agcClamping);
|
||||||
s.writeString(16, m_title);
|
s.writeString(16, m_title);
|
||||||
|
s.writeString(17, m_audioDeviceName);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
@ -127,6 +128,7 @@ bool SSBDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(14, &m_agcThresholdGate, 4);
|
d.readS32(14, &m_agcThresholdGate, 4);
|
||||||
d.readBool(15, &m_agcClamping, false);
|
d.readBool(15, &m_agcClamping, false);
|
||||||
d.readString(16, &m_title, "SSB Demodulator");
|
d.readString(16, &m_title, "SSB Demodulator");
|
||||||
|
d.readString(17, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,6 @@ class Serializable;
|
|||||||
struct SSBDemodSettings
|
struct SSBDemodSettings
|
||||||
{
|
{
|
||||||
qint32 m_inputFrequencyOffset;
|
qint32 m_inputFrequencyOffset;
|
||||||
quint32 m_audioSampleRate;
|
|
||||||
Real m_rfBandwidth;
|
Real m_rfBandwidth;
|
||||||
Real m_lowCutoff;
|
Real m_lowCutoff;
|
||||||
Real m_volume;
|
Real m_volume;
|
||||||
@ -43,6 +42,7 @@ struct SSBDemodSettings
|
|||||||
quint16 m_udpPort;
|
quint16 m_udpPort;
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
QString m_title;
|
QString m_title;
|
||||||
|
QString m_audioDeviceName;
|
||||||
|
|
||||||
Serializable *m_channelMarker;
|
Serializable *m_channelMarker;
|
||||||
Serializable *m_spectrumGUI;
|
Serializable *m_spectrumGUI;
|
||||||
|
@ -1539,9 +1539,6 @@ margin-bottom: 20px;
|
|||||||
"copyAudioToUDP" : {
|
"copyAudioToUDP" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
},
|
},
|
||||||
"copyAudioUseRTP" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"udpAddress" : {
|
"udpAddress" : {
|
||||||
"type" : "string"
|
"type" : "string"
|
||||||
},
|
},
|
||||||
@ -18063,7 +18060,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2018-03-27T01:15:44.809+02:00
|
Generated 2018-03-27T09:54:41.046+02:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -37,8 +37,6 @@ NFMDemodSettings:
|
|||||||
type: integer
|
type: integer
|
||||||
copyAudioToUDP:
|
copyAudioToUDP:
|
||||||
type: integer
|
type: integer
|
||||||
copyAudioUseRTP:
|
|
||||||
type: integer
|
|
||||||
udpAddress:
|
udpAddress:
|
||||||
type: string
|
type: string
|
||||||
udpPort:
|
udpPort:
|
||||||
|
@ -1539,9 +1539,6 @@ margin-bottom: 20px;
|
|||||||
"copyAudioToUDP" : {
|
"copyAudioToUDP" : {
|
||||||
"type" : "integer"
|
"type" : "integer"
|
||||||
},
|
},
|
||||||
"copyAudioUseRTP" : {
|
|
||||||
"type" : "integer"
|
|
||||||
},
|
|
||||||
"udpAddress" : {
|
"udpAddress" : {
|
||||||
"type" : "string"
|
"type" : "string"
|
||||||
},
|
},
|
||||||
@ -18063,7 +18060,7 @@ except ApiException as e:
|
|||||||
</div>
|
</div>
|
||||||
<div id="generator">
|
<div id="generator">
|
||||||
<div class="content">
|
<div class="content">
|
||||||
Generated 2018-03-27T01:15:44.809+02:00
|
Generated 2018-03-27T09:54:41.046+02:00
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -54,8 +54,6 @@ SWGNFMDemodSettings::SWGNFMDemodSettings() {
|
|||||||
m_audio_sample_rate_isSet = false;
|
m_audio_sample_rate_isSet = false;
|
||||||
copy_audio_to_udp = 0;
|
copy_audio_to_udp = 0;
|
||||||
m_copy_audio_to_udp_isSet = false;
|
m_copy_audio_to_udp_isSet = false;
|
||||||
copy_audio_use_rtp = 0;
|
|
||||||
m_copy_audio_use_rtp_isSet = false;
|
|
||||||
udp_address = nullptr;
|
udp_address = nullptr;
|
||||||
m_udp_address_isSet = false;
|
m_udp_address_isSet = false;
|
||||||
udp_port = 0;
|
udp_port = 0;
|
||||||
@ -98,8 +96,6 @@ SWGNFMDemodSettings::init() {
|
|||||||
m_audio_sample_rate_isSet = false;
|
m_audio_sample_rate_isSet = false;
|
||||||
copy_audio_to_udp = 0;
|
copy_audio_to_udp = 0;
|
||||||
m_copy_audio_to_udp_isSet = false;
|
m_copy_audio_to_udp_isSet = false;
|
||||||
copy_audio_use_rtp = 0;
|
|
||||||
m_copy_audio_use_rtp_isSet = false;
|
|
||||||
udp_address = new QString("");
|
udp_address = new QString("");
|
||||||
m_udp_address_isSet = false;
|
m_udp_address_isSet = false;
|
||||||
udp_port = 0;
|
udp_port = 0;
|
||||||
@ -125,7 +121,6 @@ SWGNFMDemodSettings::cleanup() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(udp_address != nullptr) {
|
if(udp_address != nullptr) {
|
||||||
delete udp_address;
|
delete udp_address;
|
||||||
}
|
}
|
||||||
@ -173,8 +168,6 @@ SWGNFMDemodSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(©_audio_to_udp, pJson["copyAudioToUDP"], "qint32", "");
|
::SWGSDRangel::setValue(©_audio_to_udp, pJson["copyAudioToUDP"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(©_audio_use_rtp, pJson["copyAudioUseRTP"], "qint32", "");
|
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&udp_address, pJson["udpAddress"], "QString", "QString");
|
::SWGSDRangel::setValue(&udp_address, pJson["udpAddress"], "QString", "QString");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&udp_port, pJson["udpPort"], "qint32", "");
|
::SWGSDRangel::setValue(&udp_port, pJson["udpPort"], "qint32", "");
|
||||||
@ -238,9 +231,6 @@ SWGNFMDemodSettings::asJsonObject() {
|
|||||||
if(m_copy_audio_to_udp_isSet){
|
if(m_copy_audio_to_udp_isSet){
|
||||||
obj->insert("copyAudioToUDP", QJsonValue(copy_audio_to_udp));
|
obj->insert("copyAudioToUDP", QJsonValue(copy_audio_to_udp));
|
||||||
}
|
}
|
||||||
if(m_copy_audio_use_rtp_isSet){
|
|
||||||
obj->insert("copyAudioUseRTP", QJsonValue(copy_audio_use_rtp));
|
|
||||||
}
|
|
||||||
if(udp_address != nullptr && *udp_address != QString("")){
|
if(udp_address != nullptr && *udp_address != QString("")){
|
||||||
toJsonValue(QString("udpAddress"), udp_address, obj, QString("QString"));
|
toJsonValue(QString("udpAddress"), udp_address, obj, QString("QString"));
|
||||||
}
|
}
|
||||||
@ -387,16 +377,6 @@ SWGNFMDemodSettings::setCopyAudioToUdp(qint32 copy_audio_to_udp) {
|
|||||||
this->m_copy_audio_to_udp_isSet = true;
|
this->m_copy_audio_to_udp_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint32
|
|
||||||
SWGNFMDemodSettings::getCopyAudioUseRtp() {
|
|
||||||
return copy_audio_use_rtp;
|
|
||||||
}
|
|
||||||
void
|
|
||||||
SWGNFMDemodSettings::setCopyAudioUseRtp(qint32 copy_audio_use_rtp) {
|
|
||||||
this->copy_audio_use_rtp = copy_audio_use_rtp;
|
|
||||||
this->m_copy_audio_use_rtp_isSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString*
|
QString*
|
||||||
SWGNFMDemodSettings::getUdpAddress() {
|
SWGNFMDemodSettings::getUdpAddress() {
|
||||||
return udp_address;
|
return udp_address;
|
||||||
@ -455,7 +435,6 @@ SWGNFMDemodSettings::isSet(){
|
|||||||
if(m_ctcss_index_isSet){ isObjectUpdated = true; break;}
|
if(m_ctcss_index_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_audio_sample_rate_isSet){ isObjectUpdated = true; break;}
|
if(m_audio_sample_rate_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_copy_audio_to_udp_isSet){ isObjectUpdated = true; break;}
|
if(m_copy_audio_to_udp_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_copy_audio_use_rtp_isSet){ isObjectUpdated = true; break;}
|
|
||||||
if(udp_address != nullptr && *udp_address != QString("")){ isObjectUpdated = true; break;}
|
if(udp_address != nullptr && *udp_address != QString("")){ isObjectUpdated = true; break;}
|
||||||
if(m_udp_port_isSet){ isObjectUpdated = true; break;}
|
if(m_udp_port_isSet){ isObjectUpdated = true; break;}
|
||||||
if(m_rgb_color_isSet){ isObjectUpdated = true; break;}
|
if(m_rgb_color_isSet){ isObjectUpdated = true; break;}
|
||||||
|
@ -81,9 +81,6 @@ public:
|
|||||||
qint32 getCopyAudioToUdp();
|
qint32 getCopyAudioToUdp();
|
||||||
void setCopyAudioToUdp(qint32 copy_audio_to_udp);
|
void setCopyAudioToUdp(qint32 copy_audio_to_udp);
|
||||||
|
|
||||||
qint32 getCopyAudioUseRtp();
|
|
||||||
void setCopyAudioUseRtp(qint32 copy_audio_use_rtp);
|
|
||||||
|
|
||||||
QString* getUdpAddress();
|
QString* getUdpAddress();
|
||||||
void setUdpAddress(QString* udp_address);
|
void setUdpAddress(QString* udp_address);
|
||||||
|
|
||||||
@ -139,9 +136,6 @@ private:
|
|||||||
qint32 copy_audio_to_udp;
|
qint32 copy_audio_to_udp;
|
||||||
bool m_copy_audio_to_udp_isSet;
|
bool m_copy_audio_to_udp_isSet;
|
||||||
|
|
||||||
qint32 copy_audio_use_rtp;
|
|
||||||
bool m_copy_audio_use_rtp_isSet;
|
|
||||||
|
|
||||||
QString* udp_address;
|
QString* udp_address;
|
||||||
bool m_udp_address_isSet;
|
bool m_udp_address_isSet;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user