diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 5efdd4a..808a6b9 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -950,6 +950,8 @@ void AppFrame::OnIdle(wxIdleEvent& event) { demodGainMeter->setLevel(demodGainMeter->getInputValue()); } activeDemodulator = demod; + } else if (demod) { + // Wait state for current demodulator modem to activate.. } else { DemodulatorMgr *mgr = &wxGetApp().getDemodMgr(); diff --git a/src/demod/DemodulatorInstance.cpp b/src/demod/DemodulatorInstance.cpp index d09b587..d10f8cb 100644 --- a/src/demod/DemodulatorInstance.cpp +++ b/src/demod/DemodulatorInstance.cpp @@ -240,6 +240,10 @@ int DemodulatorInstance::getOutputDevice() { void DemodulatorInstance::setDemodulatorType(std::string demod_type_in) { setGain(getGain()); if (demodulatorPreThread) { + std::string currentDemodType = demodulatorPreThread->getDemodType(); + if ((currentDemodType != "") && (currentDemodType != demod_type_in)) { + lastModemSettings[currentDemodType] = demodulatorPreThread->readModemSettings(); + } demodulatorPreThread->setDemodType(demod_type_in); } } @@ -366,4 +370,13 @@ void DemodulatorInstance::writeModemSettings(ModemSettings settings) { bool DemodulatorInstance::isModemInitialized() { return demodulatorPreThread->isInitialized(); -} \ No newline at end of file +} + +ModemSettings DemodulatorInstance::getLastModemSettings(std::string demodType) { + if (lastModemSettings.find(demodType) != lastModemSettings.end()) { + return lastModemSettings[demodType]; + } else { + ModemSettings mods; + return mods; + } +} diff --git a/src/demod/DemodulatorInstance.h b/src/demod/DemodulatorInstance.h index 6f01ee7..84a91e0 100644 --- a/src/demod/DemodulatorInstance.h +++ b/src/demod/DemodulatorInstance.h @@ -89,7 +89,8 @@ public: void writeModemSettings(ModemSettings settings); bool isModemInitialized(); - + ModemSettings getLastModemSettings(std::string demodType); + protected: DemodulatorThreadInputQueue* pipeIQInputData; DemodulatorThreadPostInputQueue* pipeIQDemodData; @@ -113,4 +114,5 @@ private: std::atomic_int currentOutputDevice; std::atomic currentAudioGain; std::atomic_bool follow, tracking; + std::map lastModemSettings; }; diff --git a/src/demod/DemodulatorPreThread.cpp b/src/demod/DemodulatorPreThread.cpp index 471fafe..277b6c9 100644 --- a/src/demod/DemodulatorPreThread.cpp +++ b/src/demod/DemodulatorPreThread.cpp @@ -103,7 +103,15 @@ void DemodulatorPreThread::run() { demodType = newDemodType; sampleRateChanged.store(false); audioSampleRateChanged.store(false); - if (modemSettingsBuffered.size()) { + ModemSettings lastSettings = parent->getLastModemSettings(newDemodType); + if (lastSettings.size() != 0) { + command.settings = lastSettings; + if (modemSettingsBuffered.size()) { + for (ModemSettings::const_iterator msi = modemSettingsBuffered.begin(); msi != modemSettingsBuffered.end(); msi++) { + command.settings[msi->first] = msi->second; + } + } + } else { command.settings = modemSettingsBuffered; } modemSettingsBuffered.clear();