From 345962092e6f9dec5b1838a1febffcf5a7f6c73f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 18 Jan 2022 00:25:10 -0500 Subject: [PATCH] add notifyWaveChange fixes #8 --- src/engine/dispatch.h | 5 +++++ src/engine/engine.cpp | 8 ++++++++ src/engine/engine.h | 2 ++ src/engine/platform/abstract.cpp | 4 ++++ src/engine/platform/amiga.cpp | 4 ++++ src/engine/platform/amiga.h | 1 + src/engine/platform/gb.cpp | 7 +++++++ src/engine/platform/gb.h | 1 + src/engine/platform/pce.cpp | 8 ++++++++ src/engine/platform/pce.h | 1 + src/gui/gui.cpp | 8 ++++++++ 11 files changed, 49 insertions(+) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 7406473d7..d05be0746 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -220,6 +220,11 @@ class DivDispatch { */ virtual void notifyInsChange(int ins); + /** + * notify wavetable change. + */ + virtual void notifyWaveChange(int wave); + /** * notify deletion of an instrument. */ diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 979ef5c3c..e76d238c1 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -2214,6 +2214,14 @@ void DivEngine::notifyInsChange(int ins) { isBusy.unlock(); } +void DivEngine::notifyWaveChange(int wave) { + isBusy.lock(); + for (int i=0; inotifyWaveChange(wave); + } + isBusy.unlock(); +} + #ifdef _WIN32 #define CONFIG_FILE "\\furnace.cfg" #else diff --git a/src/engine/engine.h b/src/engine/engine.h index 7d1a27fec..cc348ce87 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -221,6 +221,8 @@ class DivEngine { bool haltAudioFile(); // notify instrument parameter change void notifyInsChange(int ins); + // notify wavetable change + void notifyWaveChange(int wave); // save config bool saveConf(); diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index f43f3f38b..7910a3b93 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -50,6 +50,10 @@ void DivDispatch::notifyInsChange(int ins) { } +void DivDispatch::notifyWaveChange(int ins) { + +} + void DivDispatch::notifyInsDeletion(void* ins) { } diff --git a/src/engine/platform/amiga.cpp b/src/engine/platform/amiga.cpp index 895848aa8..831416a0a 100644 --- a/src/engine/platform/amiga.cpp +++ b/src/engine/platform/amiga.cpp @@ -219,6 +219,10 @@ void DivPlatformAmiga::notifyInsChange(int ins) { } } +void DivPlatformAmiga::notifyWaveChange(int wave) { + // TODO when wavetables are added +} + void DivPlatformAmiga::notifyInsDeletion(void* ins) { for (int i=0; i<4; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/amiga.h b/src/engine/platform/amiga.h index 6ad3bbbb3..34da47d4a 100644 --- a/src/engine/platform/amiga.h +++ b/src/engine/platform/amiga.h @@ -55,6 +55,7 @@ class DivPlatformAmiga: public DivDispatch { bool keyOffAffectsArp(int ch); void setPAL(bool pal); void notifyInsChange(int ins); + void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, bool pal); void quit(); diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index e6a32d466..7cef95f58 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -324,6 +324,13 @@ void DivPlatformGB::notifyInsChange(int ins) { } } +void DivPlatformGB::notifyWaveChange(int wave) { + if (chan[2].wave==wave) { + updateWave(); + if (!chan[2].keyOff) chan[2].keyOn=true; + } +} + void DivPlatformGB::notifyInsDeletion(void* ins) { for (int i=0; i<4; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/gb.h b/src/engine/platform/gb.h index be466addc..58a9d8606 100644 --- a/src/engine/platform/gb.h +++ b/src/engine/platform/gb.h @@ -46,6 +46,7 @@ class DivPlatformGB: public DivDispatch { void muteChannel(int ch, bool mute); bool isStereo(); void notifyInsChange(int ins); + void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, bool pal); void quit(); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index 19df399ab..666cb2b99 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -313,6 +313,14 @@ bool DivPlatformPCE::keyOffAffectsArp(int ch) { return true; } +void DivPlatformPCE::notifyWaveChange(int wave) { + for (int i=0; i<6; i++) { + if (chan[i].wave==wave) { + updateWave(i); + } + } +} + void DivPlatformPCE::notifyInsDeletion(void* ins) { for (int i=0; i<6; i++) { chan[i].std.notifyInsDeletion((DivInstrument*)ins); diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index e67c5a847..ade62bb34 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -65,6 +65,7 @@ class DivPlatformPCE: public DivDispatch { bool isStereo(); bool keyOffAffectsArp(int ch); void setPAL(bool pal); + void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); int init(DivEngine* parent, int channels, int sugRate, bool pal); void quit(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 05fa40f4d..5aa8c81b1 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1132,6 +1132,8 @@ void FurnaceGUI::drawWaveEdit() { if (ImGui::InputInt("##_WTW",&wave->len,1,2)) { if (wave->len>256) wave->len=256; if (wave->len<1) wave->len=1; + e->notifyWaveChange(curWave); + modified=true; } ImGui::SameLine(); ImGui::Text("Height"); @@ -1143,6 +1145,8 @@ void FurnaceGUI::drawWaveEdit() { if (ImGui::InputInt("##_WTH",&wave->max,1,2)) { if (wave->max>255) wave->max=255; if (wave->max<1) wave->max=1; + e->notifyWaveChange(curWave); + modified=true; } for (int i=0; ilen; i++) { wavePreview[i]=wave->data[i]; @@ -1160,6 +1164,8 @@ void FurnaceGUI::drawWaveEdit() { waveDragActive=true; waveDragTarget=wave->data; processDrags(ImGui::GetMousePos().x,ImGui::GetMousePos().y); + e->notifyWaveChange(curWave); + modified=true; } ImGui::PopStyleVar(); } @@ -3026,6 +3032,8 @@ void FurnaceGUI::processDrags(int dragX, int dragY) { if (y>waveDragMax) y=waveDragMax; if (ynotifyWaveChange(curWave); + modified=true; } } }