From 4ffa518dcc49e8c7a087683b2cabcf603ae9f712 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 2 Nov 2015 19:27:34 -0500 Subject: [PATCH 1/2] Update appframe menus from appframe instead of app thread.. - Possible fix for Linux menu update crash --- src/AppFrame.cpp | 32 +++++++++++++++++++++++++++----- src/AppFrame.h | 3 +++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index ad5f82a..b4d16b6 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -416,7 +416,8 @@ AppFrame::AppFrame() : wxAcceleratorTable accel(3, entries); SetAcceleratorTable(accel); - + deviceChanged.store(false); + devInfo = NULL; wxGetApp().deviceSelector(); // static const int attribs[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER, 0 }; @@ -430,10 +431,25 @@ AppFrame::~AppFrame() { } void AppFrame::initDeviceParams(SDRDeviceInfo *devInfo) { - std::string deviceId = devInfo->getName(); + this->devInfo = devInfo; + deviceChanged.store(true); +} - DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId); +void AppFrame::updateDeviceParams() { + if (!deviceChanged.load()) { + return; + } + + if (!devInfo) { + deviceChanged.store(false); + return; + } + + std::string deviceId = devInfo->getName(); + + DeviceConfig *devConfig = wxGetApp().getConfig()->getDevice(deviceId); + int dsMode = devConfig->getDirectSampling(); if (dsMode > 0 && dsMode <= 2) { @@ -450,7 +466,7 @@ void AppFrame::initDeviceParams(SDRDeviceInfo *devInfo) { for (std::map::iterator i = sampleRateMenuItems.begin(); i != sampleRateMenuItems.end(); i++) { sampleRateMenu->Remove(i->first); } - + sampleRateMenuItems.erase(sampleRateMenuItems.begin(),sampleRateMenuItems.end()); int ofs = 0; @@ -470,7 +486,7 @@ void AppFrame::initDeviceParams(SDRDeviceInfo *devInfo) { if (!checked) { sampleRateMenuItems[wxID_BANDWIDTH_MANUAL]->Check(true); } - + if (!wxGetApp().getAGCMode()) { gainSpacerItem->Show(true); gainSizerItem->Show(true); @@ -486,6 +502,8 @@ void AppFrame::initDeviceParams(SDRDeviceInfo *devInfo) { } agcMenuItem->Check(wxGetApp().getAGCMode()); + + deviceChanged.store(false); } @@ -722,6 +740,10 @@ void AppFrame::OnThread(wxCommandEvent& event) { void AppFrame::OnIdle(wxIdleEvent& event) { + if (deviceChanged.load()) { + updateDeviceParams(); + } + DemodulatorInstance *demod = wxGetApp().getDemodMgr().getLastActiveDemodulator(); if (demod) { diff --git a/src/AppFrame.h b/src/AppFrame.h index 28e5589..b15108c 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -59,6 +59,7 @@ public: void OnThread(wxCommandEvent& event); void OnEventInput(wxThreadEvent& event); void initDeviceParams(SDRDeviceInfo *devInfo); + void updateDeviceParams(); void saveSession(std::string fileName); bool loadSession(std::string fileName); @@ -110,6 +111,8 @@ private: FFTVisualDataThread *waterfallDataThread; std::thread *t_FFTData; + SDRDeviceInfo *devInfo; + std::atomic_bool deviceChanged; wxDECLARE_EVENT_TABLE(); }; From 0d928543d89a69e0141242dbecbcbeff7641b937 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Mon, 2 Nov 2015 21:04:02 -0500 Subject: [PATCH 2/2] Fix for ubuntu menu update crash --- src/AppFrame.cpp | 25 ++++++++++++------------- src/AppFrame.h | 1 + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index b4d16b6..9ad2e25 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -236,7 +236,7 @@ AppFrame::AppFrame() : // SetIcon(wxICON(sample)); // Make a menubar - wxMenuBar *menuBar = new wxMenuBar; + menuBar = new wxMenuBar; wxMenu *menu = new wxMenu; menu->Append(wxID_SDR_DEVICES, "SDR Devices"); @@ -316,9 +316,6 @@ AppFrame::AppFrame() : menuBar->Append(menu, wxT("&Color Scheme")); - sampleRateMenu = new wxMenu; - menuBar->Append(sampleRateMenu, wxT("&Input Bandwidth")); - menu = new wxMenu; #define NUM_RATES_DEFAULT 4 @@ -367,6 +364,10 @@ AppFrame::AppFrame() : } } + sampleRateMenu = new wxMenu; + + menuBar->Append(sampleRateMenu, wxT("&Input Bandwidth")); + menuBar->Append(menu, wxT("Audio &Bandwidth")); SetMenuBar(menuBar); @@ -462,18 +463,14 @@ void AppFrame::updateDeviceParams() { // Build sample rate menu from device info sampleRates = devInfo->getRxChannel()->getSampleRates(); - - for (std::map::iterator i = sampleRateMenuItems.begin(); i != sampleRateMenuItems.end(); i++) { - sampleRateMenu->Remove(i->first); - } - sampleRateMenuItems.erase(sampleRateMenuItems.begin(),sampleRateMenuItems.end()); + wxMenu *newSampleRateMenu = new wxMenu; int ofs = 0; long sampleRate = wxGetApp().getSampleRate(); bool checked = false; for (vector::iterator i = sampleRates.begin(); i != sampleRates.end(); i++) { - sampleRateMenuItems[wxID_BANDWIDTH_BASE+ofs] = sampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_BASE+ofs, frequencyToStr(*i)); + sampleRateMenuItems[wxID_BANDWIDTH_BASE+ofs] = newSampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_BASE+ofs, frequencyToStr(*i)); if (sampleRate == (*i)) { sampleRateMenuItems[wxID_BANDWIDTH_BASE+ofs]->Check(true); checked = true; @@ -481,12 +478,14 @@ void AppFrame::updateDeviceParams() { ofs++; } - sampleRateMenuItems[wxID_BANDWIDTH_MANUAL] = sampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_MANUAL, "Manual Entry"); - + sampleRateMenuItems[wxID_BANDWIDTH_MANUAL] = newSampleRateMenu->AppendRadioItem(wxID_BANDWIDTH_MANUAL, wxT("Manual Entry")); if (!checked) { sampleRateMenuItems[wxID_BANDWIDTH_MANUAL]->Check(true); } - + + menuBar->Replace(4, newSampleRateMenu, wxT("&Input Bandwidth")); + sampleRateMenu = newSampleRateMenu; + if (!wxGetApp().getAGCMode()) { gainSpacerItem->Show(true); gainSizerItem->Show(true); diff --git a/src/AppFrame.h b/src/AppFrame.h index b15108c..f3baa88 100644 --- a/src/AppFrame.h +++ b/src/AppFrame.h @@ -101,6 +101,7 @@ private: std::map sampleRateMenuItems; std::map audioSampleRateMenuItems; std::map directSamplingMenuItems; + wxMenuBar *menuBar; wxMenuItem *iqSwapMenuItem; wxMenu *sampleRateMenu; wxMenuItem *agcMenuItem;