From 107187a20ca16ef2139713655ca35455aa8876d8 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 6 Feb 2022 00:07:35 -0500 Subject: [PATCH] GUI: add ability to play from cursor position Shift-Enter or F7 --- src/engine/engine.cpp | 16 ++++++++++++++-- src/engine/engine.h | 5 ++++- src/gui/gui.cpp | 18 ++++++++++++++---- src/gui/gui.h | 2 +- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 7e3d4a1db..d327e7f5f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4748,7 +4748,7 @@ void* DivEngine::getDispatchChanState(int ch) { return disCont[dispatchOfChan[ch]].dispatch->getChanState(dispatchChanOfChan[ch]); } -void DivEngine::playSub(bool preserveDrift) { +void DivEngine::playSub(bool preserveDrift, int goalRow) { reset(); if (preserveDrift && curOrder==0) return; bool oldRepeatPattern=repeatPattern; @@ -4774,8 +4774,13 @@ void DivEngine::playSub(bool preserveDrift) { while (curOrdersetSkipRegisterWrites(false); - if (goal>0) { + if (goal>0 || goalRow>0) { for (int i=0; iforceIns(); } repeatPattern=oldRepeatPattern; @@ -4815,6 +4820,13 @@ void DivEngine::play() { isBusy.unlock(); } +void DivEngine::playToRow(int row) { + isBusy.lock(); + freelance=false; + playSub(false,row); + isBusy.unlock(); +} + void DivEngine::stop() { isBusy.lock(); freelance=false; diff --git a/src/engine/engine.h b/src/engine/engine.h index 412405591..6c4e146fe 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -206,7 +206,7 @@ class DivEngine { void recalcChans(); void renderSamples(); void reset(); - void playSub(bool preserveDrift); + void playSub(bool preserveDrift, int goalRow=0); bool loadDMF(unsigned char* file, size_t len); bool loadFur(unsigned char* file, size_t len); @@ -285,6 +285,9 @@ class DivEngine { // play void play(); + // play to row + void playToRow(int row); + // stop void stop(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index d0e6e2d5d..bf7d2e0c4 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -4630,9 +4630,13 @@ void FurnaceGUI::doRedo() { redoHist.pop_back(); } -void FurnaceGUI::play() { +void FurnaceGUI::play(int row) { e->walkSong(loopOrder,loopRow,loopEnd); - e->play(); + if (row>0) { + e->playToRow(row); + } else { + e->play(); + } curNibble=false; orderNibble=false; activeNotes.clear(); @@ -4726,7 +4730,9 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { play(); break; case SDLK_F7: - play(); + if (!e->isPlaying()) { + play(cursor.y); + } break; case SDLK_F8: stop(); @@ -4755,7 +4761,11 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { if (e->isPlaying()) { stop(); } else { - play(); + if (ev.key.keysym.mod&KMOD_SHIFT) { + play(cursor.y); + } else { + play(); + } } break; } diff --git a/src/gui/gui.h b/src/gui/gui.h index e16b26ac0..57c747171 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -383,7 +383,7 @@ class FurnaceGUI { void doUndo(); void doRedo(); - void play(); + void play(int row=0); void stop(); void previewNote(int refChan, int note);