diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index fee404523..4d07acd45 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2166,6 +2166,13 @@ int DivEngine::getRow() { return prevRow; } +void DivEngine::getPlayPos(int& order, int& row) { + playPosLock.lock(); + order=prevOrder; + row=prevRow; + playPosLock.unlock(); +} + int DivEngine::getElapsedBars() { return elapsedBars; } diff --git a/src/engine/engine.h b/src/engine/engine.h index 2f312173b..3f755e837 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -446,7 +446,7 @@ class DivEngine { // bitfield unsigned char walked[8192]; bool isMuted[DIV_MAX_CHANS]; - std::mutex isBusy, saveLock; + std::mutex isBusy, saveLock, playPosLock; String configPath; String configFile; String lastError; @@ -848,6 +848,9 @@ class DivEngine { // get current row int getRow(); + // synchronous get order/row + void getPlayPos(int& order, int& row); + // get beat/bar int getElapsedBars(); int getElapsedBeats(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 220ff7167..affd720e8 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1164,8 +1164,10 @@ void DivEngine::nextRow() { } if (!stepPlay) { + playPosLock.lock(); prevOrder=curOrder; prevRow=curRow; + playPosLock.unlock(); } for (int i=0; igetPlayPos(nextPlayOrder,nextOldRow); + playOrder=nextPlayOrder; + if (followPattern) { + curOrder=playOrder; + } + if (e->isPlaying()) { + oldRow=nextOldRow; + } + if (!mobileUI) { ImGui::BeginMainMenuBar(); if (ImGui::BeginMenu(settings.capitalMenuBar?"File":"file")) { @@ -4459,16 +4470,6 @@ bool FurnaceGUI::loop() { MEASURE(calcChanOsc,calcChanOsc()); - e->synchronized([this]() { - playOrder=e->getOrder(); - if (followPattern) { - curOrder=playOrder; - } - if (e->isPlaying()) { - oldRow=e->getRow(); - } - }); - if (mobileUI) { globalWinFlags=ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoBringToFrontOnFocus; //globalWinFlags=ImGuiWindowFlags_NoTitleBar;