From 4e55368787fc16ef513dac8a66ecd6d3ac2eaad6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 6 Apr 2023 01:42:52 -0500 Subject: [PATCH] GUI: fix per-chan osc visual glitch when stopping --- src/engine/engine.cpp | 10 ++++++++++ src/engine/playback.cpp | 9 +++++++++ src/gui/gui.cpp | 19 +++++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 00805411..847824fd 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2441,6 +2441,16 @@ void DivEngine::stop() { } } } + + // reset all chan oscs + for (int i=0; igetOscBuffer(dispatchChanOfChan[i]); + if (buf!=NULL) { + memset(buf->data,0,65536*sizeof(short)); + buf->needle=0; + buf->readNeedle=0; + } + } BUSY_END; } diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 6c3db805..1ca9df58 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1412,6 +1412,15 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) { ret=true; shallStop=false; shallStopSched=false; + // reset all chan oscs + for (int i=0; igetOscBuffer(dispatchChanOfChan[i]); + if (buf!=NULL) { + memset(buf->data,0,65536*sizeof(short)); + buf->needle=0; + buf->readNeedle=0; + } + } return ret; } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2c6ecaeb..bc242648 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1076,10 +1076,6 @@ void FurnaceGUI::stop() { e->stop(); curNibble=false; orderNibble=false; - activeNotes.clear(); - memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); - memset(chanOscPitch,0,DIV_MAX_CHANS*sizeof(float)); - memset(chanOscBright,0,DIV_MAX_CHANS*sizeof(float)); } void FurnaceGUI::previewNote(int refChan, int note, bool autoNote) { @@ -3573,6 +3569,21 @@ bool FurnaceGUI::loop() { } } + if (!e->isRunning()) { + activeNotes.clear(); + memset(chanOscVol,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscPitch,0,DIV_MAX_CHANS*sizeof(float)); + memset(chanOscBright,0,DIV_MAX_CHANS*sizeof(float)); + + e->synchronized([this]() { + for (int i=0; igetTotalChannelCount(); i++) { + DivDispatchOscBuffer* buf=e->getOscBuffer(i); + buf->needle=0; + buf->readNeedle=0; + } + }); + } + layoutTimeBegin=SDL_GetPerformanceCounter(); ImGui_ImplSDLRenderer_NewFrame();