From 38fab6ac5197c99a9ede9877552c54d7fb055cf4 Mon Sep 17 00:00:00 2001 From: "Charles J. Cliffe" Date: Thu, 12 Oct 2017 00:07:05 -0400 Subject: [PATCH] Add 'R' toggle key + fixes from initial testing --- src/AppConfig.cpp | 2 +- src/AppFrame.cpp | 6 ++++++ src/BookmarkMgr.cpp | 6 +++++- src/CubicSDR.cpp | 8 ++++++++ src/CubicSDR.h | 3 +++ src/demod/DemodulatorMgr.cpp | 1 - src/demod/DemodulatorThread.cpp | 2 +- src/visual/PrimaryGLContext.cpp | 24 ++++++++++++++++++------ 8 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/AppConfig.cpp b/src/AppConfig.cpp index fc75440..4fbff52 100644 --- a/src/AppConfig.cpp +++ b/src/AppConfig.cpp @@ -756,7 +756,7 @@ bool AppConfig::load() { DataNode *rec_node = cfg.rootNode()->getNext("recording"); if (rec_node->hasAnother("path")) { - DataNode *rec_path = cfg.rootNode()->getNext("path"); + DataNode *rec_path = rec_node->getNext("path"); recordingPath = rec_path->element()->toString(); } } diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 4617a91..b7b71d4 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -2502,6 +2502,7 @@ int AppFrame::OnGlobalKeyDown(wxKeyEvent &event) { case 'S': case 'P': case 'M': + case 'R': return 1; case '0': case '1': @@ -2642,6 +2643,11 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) { wxGetApp().setSoloMode(!wxGetApp().getSoloMode()); return 1; break; + case 'R': + if (activeDemod) { + activeDemod->setRecording(!activeDemod->isRecording()); + } + break; case 'P': wxGetApp().getSpectrumProcessor()->setPeakHold(!wxGetApp().getSpectrumProcessor()->getPeakHold()); if (wxGetApp().getDemodSpectrumProcessor()) { diff --git a/src/BookmarkMgr.cpp b/src/BookmarkMgr.cpp index fb9e58e..69c234e 100644 --- a/src/BookmarkMgr.cpp +++ b/src/BookmarkMgr.cpp @@ -360,7 +360,11 @@ bool BookmarkMgr::getExpandState(std::string groupName) { void BookmarkMgr::updateActiveList() { - std::lock_guard < std::recursive_mutex > lockData(busy_lock); + std::lock_guard < std::recursive_mutex > lockData(busy_lock); + + if (wxGetApp().isShuttingDown()) { + return; + } BookmarkView *bmv = wxGetApp().getAppFrame()->getBookmarkView(); diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index f4cb6aa..898f53f 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -203,6 +203,7 @@ CubicSDR::CubicSDR() : frequency(0), offset(0), ppm(0), snap(1), sampleRate(DEFA sampleRateInitialized.store(false); agcMode.store(true); soloMode.store(false); + shuttingDown.store(false); fdlgTarget = FrequencyDialog::FDIALOG_TARGET_DEFAULT; stoppedDev = nullptr; } @@ -384,6 +385,8 @@ bool CubicSDR::OnInit() { } int CubicSDR::OnExit() { + shuttingDown.store(true); + #if USE_HAMLIB if (rigIsActive()) { std::cout << "Terminating Rig thread.." << std::endl << std::flush; @@ -1025,6 +1028,11 @@ bool CubicSDR::getSoloMode() { return soloMode.load(); } +bool CubicSDR::isShuttingDown() +{ + return shuttingDown.load(); +} + int CubicSDR::FilterEvent(wxEvent& event) { if (!appframe) { return -1; diff --git a/src/CubicSDR.h b/src/CubicSDR.h index c167509..71dd1a2 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -170,6 +170,8 @@ public: void setSoloMode(bool solo); bool getSoloMode(); + + bool isShuttingDown(); #ifdef USE_HAMLIB RigThread *getRigThread(); @@ -195,6 +197,7 @@ private: std::atomic_llong sampleRate; std::string antennaName; std::atomic_bool agcMode; + std::atomic_bool shuttingDown; SDRThread *sdrThread = nullptr; SDREnumerator *sdrEnum = nullptr; diff --git a/src/demod/DemodulatorMgr.cpp b/src/demod/DemodulatorMgr.cpp index 9b449c6..442b6a6 100644 --- a/src/demod/DemodulatorMgr.cpp +++ b/src/demod/DemodulatorMgr.cpp @@ -58,7 +58,6 @@ void DemodulatorMgr::terminateAll() { DemodulatorInstancePtr d = demods.back(); demods.pop_back(); - wxGetApp().removeDemodulator(d); deleteThread(d); } } diff --git a/src/demod/DemodulatorThread.cpp b/src/demod/DemodulatorThread.cpp index 9b9d5c9..8e243c0 100644 --- a/src/demod/DemodulatorThread.cpp +++ b/src/demod/DemodulatorThread.cpp @@ -44,7 +44,7 @@ void DemodulatorThread::onBindOutput(std::string name, ThreadQueueBasePtr thread audioVisOutputQueue = std::static_pointer_cast(threadQueue); } - if (name == "AudioSinkOutput") { + if (name == "AudioSink") { std::lock_guard < std::mutex > lock(m_mutexAudioVisOutputQueue); audioSinkOutputQueue = std::static_pointer_cast(threadQueue); diff --git a/src/visual/PrimaryGLContext.cpp b/src/visual/PrimaryGLContext.cpp index 5211d5e..15030e0 100644 --- a/src/visual/PrimaryGLContext.cpp +++ b/src/visual/PrimaryGLContext.cpp @@ -104,17 +104,25 @@ void PrimaryGLContext::DrawDemodInfo(DemodulatorInstancePtr demod, RGBA4f color, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); bool soloMode = wxGetApp().getSoloMode(); + bool isRecording = demod->isRecording(); bool isSolo = soloMode && demod == wxGetApp().getDemodMgr().getLastActiveDemodulator(); + RGBA4f labelBg(0, 0, 0, 0.35f); + if (isSolo) { - glColor4f(0.8f, 0.8f, 0, 0.35f); + labelBg.r = labelBg.g = 0.8f; } else if (demod->isMuted()) { - glColor4f(0.8f, 0, 0, 0.35f); + labelBg.r = 0.8f; } else if (soloMode) { - glColor4f(0.2f, 0, 0, 0.35f); - } else { - glColor4f(0, 0, 0, 0.35f); + labelBg.r = 0.2f; } + + // TODO: Better recording indicator... pulsating red circle? + if (isRecording) { + labelBg.g = 1.0f; + } + + glColor4f(labelBg.r, labelBg.g, labelBg.b, labelBg.a); glBegin(GL_QUADS); glVertex3f(uxPos - ofsLeft, hPos + labelHeight, 0.0); @@ -167,7 +175,11 @@ void PrimaryGLContext::DrawDemodInfo(DemodulatorInstancePtr demod, RGBA4f color, if (demod->isDeltaLock()) { demodLabel.append(" [V]"); } - + + if (isRecording) { + demodLabel.append(" [R]"); + } + if (demod->getDemodulatorType() == "USB") { GLFont::getFont(16, GLFont::getScaleFactor()).drawString(demodLabel, uxPos, hPos, GLFont::GLFONT_ALIGN_LEFT, GLFont::GLFONT_ALIGN_CENTER, 0, 0, true); } else if (demod->getDemodulatorType() == "LSB") {