From a49306b4bd1fda05e26b212d82eb413963726b7b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 29 Oct 2025 19:25:08 -0500 Subject: [PATCH] more reference player work --- src/engine/engine.cpp | 5 +++++ src/engine/engine.h | 2 +- src/engine/filePlayer.cpp | 4 ++-- src/gui/gui.cpp | 16 +++++++++++++++- src/gui/newSong.cpp | 1 + src/gui/refPlayer.cpp | 8 +++++++- src/gui/subSongs.cpp | 3 +++ 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index ee9f599ff..e0e3e2b5b 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -569,6 +569,7 @@ void DivEngine::createNew(const char* description, String sysName, bool inBase64 BUSY_BEGIN; renderSamples(); reset(); + calcSongTimestamps(); BUSY_END; } @@ -606,6 +607,7 @@ void DivEngine::createNewFromDefaults() { BUSY_BEGIN; renderSamples(); reset(); + calcSongTimestamps(); BUSY_END; } @@ -3999,6 +4001,9 @@ void DivEngine::quitDispatch() { totalCmds=0; lastCmds=0; cmdsPerSecond=0; + if (filePlayerSync) { + if (curFilePlayer!=NULL) curFilePlayer->stop(); + } for (int i=0; i=outRate) { rateAccum-=outRate; playPos++; - if (playPos>=(ssize_t)si.frames) { + /*if (playPos>=(ssize_t)si.frames) { playPos=0; - } + }*/ } } else { for (int j=0; jisPlaying()) { WAKE_UP; } @@ -7384,6 +7385,19 @@ bool FurnaceGUI::loop() { recalcTimestamps=false; } + if (!e->isPlaying() && e->getFilePlayerSync()) { + if (cursor.y!=prevCursor.y || cursor.order) { + DivFilePlayer* fp=e->getFilePlayer(); + logV("cursor moved to %d:%d",cursor.order,cursor.y); + if (!fp->isPlaying()) { + DivSongTimestamps::Timestamp rowTS=e->curSubSong->ts.getTimes(cursor.order,cursor.y); + if (rowTS.seconds!=-1) { + fp->setPosSeconds(rowTS.seconds,rowTS.micros); + } + } + } + } + sampleMapWaitingInput=(curWindow==GUI_WINDOW_INS_EDIT && sampleMapFocused); curWindowThreadSafe=curWindow; @@ -8598,7 +8612,7 @@ FurnaceGUI::FurnaceGUI(): noteInputPoly(true), notifyWaveChange(false), notifySampleChange(false), - recalcTimestamps(false), + recalcTimestamps(true), wantScrollListIns(false), wantScrollListWave(false), wantScrollListSample(false), diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index bb92c81d1..b7c582c0c 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -290,6 +290,7 @@ void FurnaceGUI::drawNewSong() { samplePos=0; updateSampleTex=true; notifySampleChange=true; + e->calcSongTimestamps(); selStart=SelectionPoint(); selEnd=SelectionPoint(); cursor=SelectionPoint(); diff --git a/src/gui/refPlayer.cpp b/src/gui/refPlayer.cpp index 70812c4e7..ca0b3d2ff 100644 --- a/src/gui/refPlayer.cpp +++ b/src/gui/refPlayer.cpp @@ -86,6 +86,7 @@ void FurnaceGUI::drawRefPlayer() { popToggleColors(); float vol=fp->getVolume(); + ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); if (ImGui::SliderFloat("##Volume",&vol,0.0f,1.0f)) { if (vol<0.0f) vol=0.0f; @@ -93,7 +94,12 @@ void FurnaceGUI::drawRefPlayer() { fp->setVolume(vol); } - ImGui::Text("Memory usage: %" PRIu64 "K",fp->getMemUsage()>>10); + //ImGui::Text("Memory usage: %" PRIu64 "K",fp->getMemUsage()>>10); + + if (!refPlayerOpen) { + fp->stop(); + e->setFilePlayerSync(false); + } } if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows)) curWindow=GUI_WINDOW_REF_PLAYER; ImGui::End(); diff --git a/src/gui/subSongs.cpp b/src/gui/subSongs.cpp index 97732c027..b21861251 100644 --- a/src/gui/subSongs.cpp +++ b/src/gui/subSongs.cpp @@ -38,6 +38,7 @@ void FurnaceGUI::drawSubSongs(bool asChild) { if (ImGui::Selectable(id,i==e->getCurrentSubSong())) { makeCursorUndo(); e->changeSongP(i); + recalcTimestamps=true; updateScroll(0); oldRow=0; cursor.xCoarse=0; @@ -76,6 +77,7 @@ void FurnaceGUI::drawSubSongs(bool asChild) { } else { makeCursorUndo(); e->changeSongP(e->song.subsong.size()-1); + recalcTimestamps=true; updateScroll(0); oldRow=0; cursor.xCoarse=0; @@ -98,6 +100,7 @@ void FurnaceGUI::drawSubSongs(bool asChild) { } else { makeCursorUndo(); e->changeSongP(e->song.subsong.size()-1); + recalcTimestamps=true; updateScroll(0); oldRow=0; cursor.xCoarse=0;