diff --git a/plugins/channelrx/demoddsd/CMakeLists.txt b/plugins/channelrx/demoddsd/CMakeLists.txt index 43faa4559..87ea94025 100644 --- a/plugins/channelrx/demoddsd/CMakeLists.txt +++ b/plugins/channelrx/demoddsd/CMakeLists.txt @@ -1,5 +1,7 @@ project(dsddemod) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(dsddemod_SOURCES dsddemod.cpp dsddemodgui.cpp diff --git a/plugins/channelrx/demoddsd/dsddemod.cpp b/plugins/channelrx/demoddsd/dsddemod.cpp index 08d0d56c6..ae8b6a9d8 100644 --- a/plugins/channelrx/demoddsd/dsddemod.cpp +++ b/plugins/channelrx/demoddsd/dsddemod.cpp @@ -74,6 +74,7 @@ DSDDemod::DSDDemod(DeviceSourceAPI *deviceAPI) : DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo1, getInputMessageQueue()); DSPEngine::instance()->getAudioDeviceManager()->addAudioSink(&m_audioFifo2, getInputMessageQueue()); + m_audioSampleRate = DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate(); applyChannelSettings(m_inputSampleRate, m_inputFrequencyOffset, true); applySettings(m_settings, true); @@ -358,6 +359,20 @@ bool DSDDemod::handleMessage(const Message& cmd) m_dsdDecoder.setMyPoint(cfg.getMyLatitude(), cfg.getMyLongitude()); return true; } + else if (DSPConfigureAudio::match(cmd)) + { + DSPConfigureAudio& cfg = (DSPConfigureAudio&) cmd; + uint32_t sampleRate = cfg.getSampleRate(); + + qDebug() << "DSDDemod::handleMessage: DSPConfigureAudio:" + << " sampleRate: " << sampleRate; + + if (sampleRate != m_audioSampleRate) { + applyAudioSampleRate(sampleRate); + } + + return true; + } else if (BasebandSampleSink::MsgThreadedSink::match(cmd)) { return true; @@ -372,6 +387,17 @@ bool DSDDemod::handleMessage(const Message& cmd) } } +void DSDDemod::applyAudioSampleRate(int sampleRate) +{ + qDebug("DSDDemod::applyAudioSampleRate: %d", sampleRate); + + if (sampleRate != 48000) { + qWarning("DSDDemod::applyAudioSampleRate: audio does not work properly with sample rates other than 48 kS/s"); + } + + m_audioSampleRate = sampleRate; +} + void DSDDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force) { qDebug() << "DSDDemod::applyChannelSettings:" @@ -389,7 +415,7 @@ void DSDDemod::applyChannelSettings(int inputSampleRate, int inputFrequencyOffse m_settingsMutex.lock(); m_interpolator.create(16, inputSampleRate, (m_settings.m_rfBandwidth) / 2.2); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) inputSampleRate / (Real) m_settings.m_audioSampleRate; + m_interpolatorDistance = (Real) inputSampleRate / (Real) 48000; m_settingsMutex.unlock(); } @@ -418,6 +444,7 @@ void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) << " m_udpAddress: " << m_settings.m_udpAddress << " m_udpPort: " << m_settings.m_udpPort << " m_highPassFilter: "<< m_settings.m_highPassFilter + << " m_audioDeviceName: " << settings.m_audioDeviceName << " force: " << force; if ((settings.m_rfBandwidth != m_settings.m_rfBandwidth) || force) @@ -425,7 +452,7 @@ void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) m_settingsMutex.lock(); m_interpolator.create(16, m_inputSampleRate, (settings.m_rfBandwidth) / 2.2); m_interpolatorDistanceRemain = 0; - m_interpolatorDistance = (Real) m_inputSampleRate / (Real) settings.m_audioSampleRate; + m_interpolatorDistance = (Real) m_inputSampleRate / (Real) 48000; m_phaseDiscri.setFMScaling((float) settings.m_rfBandwidth / (float) settings.m_fmDeviation); m_settingsMutex.unlock(); } @@ -477,6 +504,20 @@ void DSDDemod::applySettings(const DSDDemodSettings& settings, bool force) m_dsdDecoder.useHPMbelib(settings.m_highPassFilter); } + if ((settings.m_audioDeviceName != m_settings.m_audioDeviceName) || force) + { + AudioDeviceManager *audioDeviceManager = DSPEngine::instance()->getAudioDeviceManager(); + int audioDeviceIndex = audioDeviceManager->getOutputDeviceIndex(settings.m_audioDeviceName); + //qDebug("AMDemod::applySettings: audioDeviceName: %s audioDeviceIndex: %d", qPrintable(settings.m_audioDeviceName), audioDeviceIndex); + audioDeviceManager->addAudioSink(&m_audioFifo1, getInputMessageQueue(), audioDeviceIndex); + audioDeviceManager->addAudioSink(&m_audioFifo2, getInputMessageQueue(), audioDeviceIndex); + uint32_t audioSampleRate = audioDeviceManager->getOutputSampleRate(audioDeviceIndex); + + if (m_audioSampleRate != audioSampleRate) { + applyAudioSampleRate(audioSampleRate); + } + } + m_settings = settings; } diff --git a/plugins/channelrx/demoddsd/dsddemod.h b/plugins/channelrx/demoddsd/dsddemod.h index ff46f6e78..bd98370ca 100644 --- a/plugins/channelrx/demoddsd/dsddemod.h +++ b/plugins/channelrx/demoddsd/dsddemod.h @@ -163,6 +163,7 @@ private: int m_inputSampleRate; int m_inputFrequencyOffset; DSDDemodSettings m_settings; + quint32 m_audioSampleRate; NCO m_nco; Interpolator m_interpolator; @@ -200,6 +201,7 @@ private: static const int m_udpBlockSize; + void applyAudioSampleRate(int sampleRate); void applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force = false); void applySettings(const DSDDemodSettings& settings, bool force = false); }; diff --git a/plugins/channelrx/demoddsd/dsddemodgui.cpp b/plugins/channelrx/demoddsd/dsddemodgui.cpp index ef1caa5a7..4b282a557 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.cpp +++ b/plugins/channelrx/demoddsd/dsddemodgui.cpp @@ -30,6 +30,8 @@ #include "util/simpleserializer.h" #include "util/db.h" #include "gui/basicchannelsettingsdialog.h" +#include "gui/crightclickenabler.h" +#include "gui/audioselectdialog.h" #include "dsp/dspengine.h" #include "mainwindow.h" @@ -289,6 +291,9 @@ DSDDemodGUI::DSDDemodGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Baseban connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); + CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute); + connect(audioMuteRightClickEnabler, SIGNAL(rightClick()), this, SLOT(audioSelect())); + m_scopeVisXY = new ScopeVisXY(ui->screenTV); m_scopeVisXY->setScale(2.0); m_scopeVisXY->setPixelsPerFrame(4001); @@ -603,6 +608,19 @@ void DSDDemodGUI::channelMarkerHighlightedByCursor() setHighlighted(m_channelMarker.getHighlighted()); } +void DSDDemodGUI::audioSelect() +{ + qDebug("DSDDemodGUI::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 DSDDemodGUI::tick() { double magsqAvg, magsqPeak; diff --git a/plugins/channelrx/demoddsd/dsddemodgui.h b/plugins/channelrx/demoddsd/dsddemodgui.h index eb0b4ecd3..77edd0f09 100644 --- a/plugins/channelrx/demoddsd/dsddemodgui.h +++ b/plugins/channelrx/demoddsd/dsddemodgui.h @@ -132,6 +132,7 @@ private slots: void on_symbolPLLLock_toggled(bool checked); void onWidgetRolled(QWidget* widget, bool rollDown); void onMenuDialogCalled(const QPoint& p); + void audioSelect(); void tick(); }; diff --git a/plugins/channelrx/demoddsd/dsddemodplugin.cpp b/plugins/channelrx/demoddsd/dsddemodplugin.cpp index e88f2401f..c3c5a6644 100644 --- a/plugins/channelrx/demoddsd/dsddemodplugin.cpp +++ b/plugins/channelrx/demoddsd/dsddemodplugin.cpp @@ -25,7 +25,7 @@ const PluginDescriptor DSDDemodPlugin::m_pluginDescriptor = { QString("DSD Demodulator"), - QString("3.13.0"), + QString("3.14.0"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.cpp b/plugins/channelrx/demoddsd/dsddemodsettings.cpp index 67d99e017..cba976937 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.cpp +++ b/plugins/channelrx/demoddsd/dsddemodsettings.cpp @@ -39,7 +39,6 @@ void DSDDemodSettings::resetToDefaults() m_squelchGate = 5; // 10s of ms at 48000 Hz sample rate. Corresponds to 2400 for AGC attack m_squelch = -40.0; m_audioMute = false; - m_audioSampleRate = DSPEngine::instance()->getDefaultAudioSampleRate(); m_enableCosineFiltering = false; m_syncOrConstellation = false; m_slot1On = true; @@ -54,6 +53,7 @@ void DSDDemodSettings::resetToDefaults() m_traceLengthMutliplier = 6; // 300 ms m_traceStroke = 100; m_traceDecay = 200; + m_audioDeviceName = AudioDeviceManager::m_defaultDeviceName; } QByteArray DSDDemodSettings::serialize() const @@ -85,6 +85,7 @@ QByteArray DSDDemodSettings::serialize() const s.writeString(18, m_title); s.writeBool(19, m_highPassFilter); + s.writeString(20, m_audioDeviceName); s.writeS32(21, m_traceLengthMutliplier); s.writeS32(22, m_traceStroke); s.writeS32(23, m_traceDecay); @@ -141,6 +142,7 @@ bool DSDDemodSettings::deserialize(const QByteArray& data) d.readBool(16, &m_tdmaStereo, false); d.readString(18, &m_title, "DSD Demodulator"); d.readBool(19, &m_highPassFilter, false); + d.readString(20, &m_audioDeviceName, AudioDeviceManager::m_defaultDeviceName); d.readS32(21, &tmp, 6); m_traceLengthMutliplier = tmp < 2 ? 2 : tmp > 30 ? 30 : tmp; d.readS32(22, &tmp, 100); diff --git a/plugins/channelrx/demoddsd/dsddemodsettings.h b/plugins/channelrx/demoddsd/dsddemodsettings.h index c996f2114..271b6dac0 100644 --- a/plugins/channelrx/demoddsd/dsddemodsettings.h +++ b/plugins/channelrx/demoddsd/dsddemodsettings.h @@ -32,7 +32,6 @@ struct DSDDemodSettings int m_squelchGate; Real m_squelch; bool m_audioMute; - quint32 m_audioSampleRate; bool m_enableCosineFiltering; bool m_syncOrConstellation; bool m_slot1On; @@ -47,6 +46,7 @@ struct DSDDemodSettings int m_traceLengthMutliplier; // x 50ms int m_traceStroke; // [0..255] int m_traceDecay; // [0..255] + QString m_audioDeviceName; Serializable *m_channelMarker; Serializable *m_scopeGUI;