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();