From b48a2368bed445e11da1265600bf17f71a8456d2 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 15 Apr 2022 22:22:47 -0500 Subject: [PATCH] more low-latency mode work playSub() runs at normal tick rate --- src/engine/engine.cpp | 1 + src/engine/playback.cpp | 10 +++-- src/gui/gui.cpp | 91 +++++++++++++++++++---------------------- src/gui/gui.h | 1 + 4 files changed, 51 insertions(+), 52 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 6257ff537..bb53fd2a3 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -853,6 +853,7 @@ void DivEngine::playSub(bool preserveDrift, int goalRow) { } if (!preserveDrift) { ticks=1; + subticks=1; } skipping=false; cmdStream.clear(); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 2b22abd24..bd8b2b8af 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1476,15 +1476,17 @@ bool DivEngine::nextTick(bool noAccum) { bool ret=false; if (divider<10) divider=10; - if (lowLatency) { + if (lowLatency && !skipping) { tickMult=1000/divider; if (tickMult<1) tickMult=1; + } else { + tickMult=1; } cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/(divider*tickMult); - clockDrift+=fmod(got.rate*pow(2,MASTER_CLOCK_PREC),(double)divider); - if (clockDrift>=divider) { - clockDrift-=divider; + clockDrift+=fmod(got.rate*pow(2,MASTER_CLOCK_PREC),(double)(divider*tickMult)); + if (clockDrift>=(divider*tickMult)) { + clockDrift-=(divider*tickMult); cycles++; } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index ba83b8654..4fcd60ddd 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1078,9 +1078,6 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { if (edit) { noteInput(num,key); } - if (key!=100 && key!=101 && key!=102) { - previewNote(cursor.xCoarse,num); - } } catch (std::out_of_range& e) { } } else if (edit) { // value @@ -1184,22 +1181,8 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { } // PER-WINDOW PREVIEW KEYS + // TODO: move this to new event handler switch (curWindow) { - case GUI_WINDOW_INS_EDIT: - case GUI_WINDOW_INS_LIST: - case GUI_WINDOW_EDIT_CONTROLS: - case GUI_WINDOW_SONG_INFO: - if (!ev.key.repeat) { - try { - int key=noteKeys.at(ev.key.keysym.scancode); - int num=12*curOctave+key; - if (key!=100 && key!=101 && key!=102) { - previewNote(cursor.xCoarse,num); - } - } catch (std::out_of_range& e) { - } - } - break; case GUI_WINDOW_SAMPLE_EDIT: case GUI_WINDOW_SAMPLE_LIST: if (!ev.key.repeat) { @@ -1238,19 +1221,7 @@ void FurnaceGUI::keyDown(SDL_Event& ev) { } void FurnaceGUI::keyUp(SDL_Event& ev) { - stopPreviewNote(ev.key.keysym.scancode,true); - if (wavePreviewOn) { - if (ev.key.keysym.scancode==wavePreviewKey) { - wavePreviewOn=false; - e->stopWavePreview(); - } - } - if (samplePreviewOn) { - if (ev.key.keysym.scancode==samplePreviewKey) { - samplePreviewOn=false; - e->stopSamplePreview(); - } - } + // nothing for now } bool dirExists(String what) { @@ -2021,7 +1992,47 @@ void FurnaceGUI::editOptions(bool topMenu) { } } +int _processEvent(void* instance, SDL_Event* event) { + return ((FurnaceGUI*)instance)->processEvent(event); +} + +int FurnaceGUI::processEvent(SDL_Event* ev) { + if (ev->type==SDL_KEYDOWN) { + if (!ev->key.repeat) { + try { + int key=noteKeys.at(ev->key.keysym.scancode); + int num=12*curOctave+key; + + if (num<-60) num=-60; // C-(-5) + if (num>119) num=119; // B-9 + + if (key!=100 && key!=101 && key!=102) { + previewNote(cursor.xCoarse,num); + } + } catch (std::out_of_range& e) { + } + } + } else if (ev->type==SDL_KEYUP) { + stopPreviewNote(ev->key.keysym.scancode,true); + if (wavePreviewOn) { + if (ev->key.keysym.scancode==wavePreviewKey) { + wavePreviewOn=false; + e->stopWavePreview(); + } + } + if (samplePreviewOn) { + if (ev->key.keysym.scancode==samplePreviewKey) { + samplePreviewOn=false; + e->stopSamplePreview(); + } + } + } + return 1; +} + bool FurnaceGUI::loop() { + SDL_SetEventFilter(_processEvent,this); + while (!quit) { SDL_Event ev; while (SDL_PollEvent(&ev)) { @@ -2131,23 +2142,7 @@ bool FurnaceGUI::loop() { } break; case SDL_KEYUP: - if (!ImGui::GetIO().WantCaptureKeyboard) { - keyUp(ev); - } else { - stopPreviewNote(ev.key.keysym.scancode,true); - if (wavePreviewOn) { - if (ev.key.keysym.scancode==wavePreviewKey) { - wavePreviewOn=false; - e->stopWavePreview(); - } - } - if (samplePreviewOn) { - if (ev.key.keysym.scancode==samplePreviewKey) { - samplePreviewOn=false; - e->stopSamplePreview(); - } - } - } + // for now break; case SDL_DROPFILE: if (ev.drop.file!=NULL) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 67d084a47..5983057b5 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1215,6 +1215,7 @@ class FurnaceGUI { void addScroll(int amount); void setFileName(String name); void runBackupThread(); + int processEvent(SDL_Event* ev); bool loop(); bool finish(); bool init();