From 89311690a0c7efdaa58e6fc1fd2f93c7efa268fe Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 30 Sep 2022 02:14:54 -0500 Subject: [PATCH] chip flags rewrite, part 6 fix GUI (partially) --- src/engine/config.cpp | 4 + src/engine/engine.cpp | 70 +---------- src/engine/engine.h | 9 +- src/gui/gui.h | 2 +- src/gui/settings.cpp | 49 ++++---- src/gui/sysConf.cpp | 283 +++++++++++++++++++++++++++--------------- 6 files changed, 216 insertions(+), 201 deletions(-) diff --git a/src/engine/config.cpp b/src/engine/config.cpp index 1c15f4af6..47ff3997d 100644 --- a/src/engine/config.cpp +++ b/src/engine/config.cpp @@ -79,6 +79,8 @@ String DivConfig::toBase64() { ret+=base64Table[(groupOfThree>>12)&63]; ret+="=="; } + + logV("toBase64: %s",ret); return ret; } @@ -171,6 +173,8 @@ bool DivConfig::loadFromBase64(const char* buf) { } } + logV("fromBase64: %s",data); + return loadFromMemory(data.c_str()); } diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index de29ed186..7ae0a8d33 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -3467,76 +3467,8 @@ void DivEngine::setOrder(unsigned char order) { BUSY_END; } -void DivEngine::setSysFlags(int system, String key, bool value, bool restart) { +void DivEngine::updateSysFlags(int system, bool restart) { BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlags[system]); - disCont[system].setRates(got.rate); - if (restart && isPlaying()) { - playSub(false); - } - BUSY_END; -} - -void DivEngine::setSysFlags(int system, String key, int value, bool restart) { - BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlags[system]); - disCont[system].setRates(got.rate); - if (restart && isPlaying()) { - playSub(false); - } - BUSY_END; -} - -void DivEngine::setSysFlags(int system, String key, float value, bool restart) { - BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlags[system]); - disCont[system].setRates(got.rate); - if (restart && isPlaying()) { - playSub(false); - } - BUSY_END; -} - -void DivEngine::setSysFlags(int system, String key, double value, bool restart) { - BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlags[system]); - disCont[system].setRates(got.rate); - if (restart && isPlaying()) { - playSub(false); - } - BUSY_END; -} - -void DivEngine::setSysFlags(int system, String key, const char* value, bool restart) { - BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); - disCont[system].dispatch->setFlags(song.systemFlags[system]); - disCont[system].setRates(got.rate); - if (restart && isPlaying()) { - playSub(false); - } - BUSY_END; -} - -void DivEngine::setSysFlags(int system, String key, String value, bool restart) { - BUSY_BEGIN_SOFT; - saveLock.lock(); - song.systemFlags[system].set(key,value); - saveLock.unlock(); disCont[system].dispatch->setFlags(song.systemFlags[system]); disCont[system].setRates(got.rate); if (restart && isPlaying()) { diff --git a/src/engine/engine.h b/src/engine/engine.h index 0833f457c..4561ba920 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -821,13 +821,8 @@ class DivEngine { // go to order void setOrder(unsigned char order); - // set system flags - void setSysFlags(int system, String key, bool value, bool restart); - void setSysFlags(int system, String key, int value, bool restart); - void setSysFlags(int system, String key, float value, bool restart); - void setSysFlags(int system, String key, double value, bool restart); - void setSysFlags(int system, String key, const char* value, bool restart); - void setSysFlags(int system, String key, String value, bool restart); + // update system flags + void updateSysFlags(int system, bool restart); // set Hz void setSongRate(float hz, bool pal); diff --git a/src/gui/gui.h b/src/gui/gui.h index f0d305569..6bb0d38f7 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1619,7 +1619,7 @@ class FurnaceGUI { void drawAlgorithm(unsigned char alg, FurnaceGUIFMAlgs algType, const ImVec2& size); void drawFMEnv(unsigned char tl, unsigned char ar, unsigned char dr, unsigned char d2r, unsigned char rr, unsigned char sl, unsigned char sus, unsigned char egt, unsigned char algOrGlobalSus, float maxTl, float maxArDr, float maxRr, const ImVec2& size, unsigned short instType); void drawGBEnv(unsigned char vol, unsigned char len, unsigned char sLen, bool dir, const ImVec2& size); - void drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange); + bool drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange); void kvsConfig(DivInstrument* ins); // these ones offer ctrl-wheel fine value changes. diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index cbc8d64de..26557acd2 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -270,7 +270,7 @@ void FurnaceGUI::drawSettings() { if (ImGui::Button("Current system")) { settings.initialSys.clear(); for (int i=0; isong.systemLen; i++) { - settings.initialSys.set(fmt::sprintf("id%d",i),e->getSystemDef(e->song.system[i])->id); + settings.initialSys.set(fmt::sprintf("id%d",i),e->systemToFileFur(e->song.system[i])); settings.initialSys.set(fmt::sprintf("vol%d",i),(int)e->song.systemVol[i]); settings.initialSys.set(fmt::sprintf("pan%d",i),(int)e->song.systemPan[i]); settings.initialSys.set(fmt::sprintf("flags%d",i),e->song.systemFlags[i].toBase64()); @@ -285,27 +285,24 @@ void FurnaceGUI::drawSettings() { for (totalAvailSys=0; availableSystems[totalAvailSys]; totalAvailSys++); if (totalAvailSys>0) { for (int i=0; isystemToFileFur((DivSystem)availableSystems[rand()%totalAvailSys])); + settings.initialSys.set(fmt::sprintf("vol%d",i),64); + settings.initialSys.set(fmt::sprintf("pan%d",i),0); + settings.initialSys.set(fmt::sprintf("flags%d",i),""); } } else { - /* - settings.initialSys.push_back(DIV_SYSTEM_DUMMY); - settings.initialSys.push_back(64); - settings.initialSys.push_back(0); - settings.initialSys.push_back(0); - */ + settings.initialSys.set("id0",e->systemToFileFur(DIV_SYSTEM_DUMMY)); + settings.initialSys.set("vol0",64); + settings.initialSys.set("pan0",0); + settings.initialSys.set("flags0",""); + howMany=1; } // randomize system name std::vector wordPool[6]; - /* - for (size_t i=0; igetSystemName((DivSystem)settings.initialSys[i*4]); + DivSystem sysID=e->systemFromFileFur(settings.initialSys.getInt(fmt::sprintf("id%d",i),0)); + String sName=e->getSystemName(sysID); String nameWord; sName+=" "; for (char& i: sName) { @@ -326,16 +323,15 @@ void FurnaceGUI::drawSettings() { settings.initialSysName+=wordPool[i][rand()%wordPool[i].size()]; settings.initialSysName+=" "; } - */ } ImGui::SameLine(); if (ImGui::Button("Reset to defaults")) { settings.initialSys.clear(); - settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id); + settings.initialSys.set("id0",e->systemToFileFur(DIV_SYSTEM_YM2612)); settings.initialSys.set("vol0",64); settings.initialSys.set("pan0",0); settings.initialSys.set("flags0",""); - settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id); + settings.initialSys.set("id1",e->systemToFileFur(DIV_SYSTEM_SMS)); settings.initialSys.set("vol1",64); settings.initialSys.set("pan1",0); settings.initialSys.set("flags1",""); @@ -362,6 +358,7 @@ void FurnaceGUI::drawSettings() { for (int j=0; availableSystems[j]; j++) { if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),sysID==availableSystems[j])) { sysID=(DivSystem)availableSystems[j]; + settings.initialSys.set(fmt::sprintf("id%d",i),(int)e->systemToFileFur(sysID)); settings.initialSys.set(fmt::sprintf("flags%d",i),""); } } @@ -371,6 +368,7 @@ void FurnaceGUI::drawSettings() { ImGui::SameLine(); if (ImGui::Checkbox("Invert",&doInvert)) { sysVol^=128; + settings.initialSys.set(fmt::sprintf("vol%d",i),(int)sysVol); } ImGui::SameLine(); //ImGui::BeginDisabled(settings.initialSys.size()<=4); @@ -381,16 +379,21 @@ void FurnaceGUI::drawSettings() { ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); if (CWSliderScalar("Volume",ImGuiDataType_S8,&vol,&_ZERO,&_ONE_HUNDRED_TWENTY_SEVEN)) { sysVol=(sysVol&128)|vol; + settings.initialSys.set(fmt::sprintf("vol%d",i),(int)sysVol); } rightClickable ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); - CWSliderScalar("Panning",ImGuiDataType_S8,&sysPan,&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); rightClickable + if (CWSliderScalar("Panning",ImGuiDataType_S8,&sysPan,&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN)) { + settings.initialSys.set(fmt::sprintf("pan%d",i),(int)sysPan); + } rightClickable // oh please MSVC don't cry if (ImGui::TreeNode("Configure")) { String sysFlagsS=settings.initialSys.getString(fmt::sprintf("flags%d",i),""); DivConfig sysFlags; sysFlags.loadFromBase64(sysFlagsS.c_str()); - drawSysConf(-1,sysID,sysFlags,false); + if (drawSysConf(-1,sysID,sysFlags,false)) { + settings.initialSys.set(fmt::sprintf("flags%d",i),sysFlags.toBase64()); + } ImGui::TreePop(); } @@ -2461,11 +2464,11 @@ void FurnaceGUI::syncSettings() { settings.initialSys.loadFromBase64(initialSys2.c_str()); if (settings.initialSys.getInt("id0",0)==0) { settings.initialSys.clear(); - settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id); + settings.initialSys.set("id0",e->systemToFileFur(DIV_SYSTEM_YM2612)); settings.initialSys.set("vol0",64); settings.initialSys.set("pan0",0); settings.initialSys.set("flags0",""); - settings.initialSys.set("id1",e->getSystemDef(DIV_SYSTEM_SMS)->id); + settings.initialSys.set("id1",e->systemToFileFur(DIV_SYSTEM_SMS)); settings.initialSys.set("vol1",64); settings.initialSys.set("pan1",0); settings.initialSys.set("flags1",""); diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 333c26ee0..da0aa858a 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -19,177 +19,250 @@ #include "gui.h" -void FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange) { - ImGui::Text("temporarily unavailable!"); - return; - /* +bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange) { + bool altered=false; bool restart=settings.restartOnFlagChange && modifyOnChange; - bool sysPal=flags&1; - unsigned int copyOfFlags=flags; + switch (type) { case DIV_SYSTEM_YM2612: case DIV_SYSTEM_YM2612_EXT: case DIV_SYSTEM_YM2612_FRAC: case DIV_SYSTEM_YM2612_FRAC_EXT: { - if (ImGui::RadioButton("NTSC (7.67MHz)",(flags&(~0x80000000))==0)) { - copyOfFlags=(flags&0x80000000)|0; + int clockSel=flags.getInt("clockSel",0); + bool ladder=flags.getBool("ladderEffect",0); + + if (ImGui::RadioButton("NTSC (7.67MHz)",clockSel==0)) { + clockSel=0; + altered=true; } - if (ImGui::RadioButton("PAL (7.61MHz)",(flags&(~0x80000000))==1)) { - copyOfFlags=(flags&0x80000000)|1; + if (ImGui::RadioButton("PAL (7.61MHz)",clockSel==1)) { + clockSel=1; + altered=true; } - if (ImGui::RadioButton("FM Towns (8MHz)",(flags&(~0x80000000))==2)) { - copyOfFlags=(flags&0x80000000)|2; + if (ImGui::RadioButton("FM Towns (8MHz)",clockSel==2)) { + clockSel=2; + altered=true; } - if (ImGui::RadioButton("AtGames Genesis (6.13MHz)",(flags&(~0x80000000))==3)) { - copyOfFlags=(flags&0x80000000)|3; + if (ImGui::RadioButton("AtGames Genesis (6.13MHz)",clockSel==3)) { + clockSel=3; + altered=true; } - if (ImGui::RadioButton("Sega System 32 (8.05MHz)",(flags&(~0x80000000))==4)) { - copyOfFlags=(flags&0x80000000)|4; + if (ImGui::RadioButton("Sega System 32 (8.05MHz)",clockSel==4)) { + clockSel=4; + altered=true; } - bool ladder=flags&0x80000000; if (ImGui::Checkbox("Enable DAC distortion",&ladder)) { - copyOfFlags=(flags&(~0x80000000))|(ladder?0x80000000:0); + altered=true; + } + + if (altered) { + e->lockSave([&]() { + flags.set("clockSel",clockSel); + flags.set("ladderEffect",ladder); + }); } break; } case DIV_SYSTEM_SMS: { + int clockSel=flags.getInt("clockSel",0); + int chipType=flags.getInt("chipType",0); + bool noPhaseReset=flags.getBool("noPhaseReset",false); + ImGui::Text("Clock rate:"); - if (ImGui::RadioButton("3.58MHz (NTSC)",(flags&0xff03)==0x0000)) { - copyOfFlags=(flags&(~0xff03))|0x0000; + if (ImGui::RadioButton("3.58MHz (NTSC)",clockSel==0)) { + clockSel=0; + altered=true; } - if (ImGui::RadioButton("3.55MHz (PAL)",(flags&0xff03)==0x0001)) { - copyOfFlags=(flags&(~0xff03))|0x0001; + if (ImGui::RadioButton("3.55MHz (PAL)",clockSel==1)) { + clockSel=1; + altered=true; } - if (ImGui::RadioButton("4MHz (BBC Micro)",(flags&0xff03)==0x0002)) { - copyOfFlags=(flags&(~0xff03))|0x0002; + if (ImGui::RadioButton("4MHz (BBC Micro)",clockSel==2)) { + clockSel=2; + altered=true; } - if (ImGui::RadioButton("1.79MHz (Half NTSC)",(flags&0xff03)==0x0003)) { - copyOfFlags=(flags&(~0xff03))|0x0003; + if (ImGui::RadioButton("1.79MHz (Half NTSC)",clockSel==3)) { + clockSel=3; + altered=true; } - if (ImGui::RadioButton("3MHz (Exed Exes)",(flags&0xff03)==0x0100)) { - copyOfFlags=(flags&(~0xff03))|0x0100; + if (ImGui::RadioButton("3MHz (Exed Exes)",clockSel==4)) { + clockSel=4; + altered=true; } - if (ImGui::RadioButton("2MHz (Sega System 1)",(flags&0xff03)==0x0101)) { - copyOfFlags=(flags&(~0xff03))|0x0101; + if (ImGui::RadioButton("2MHz (Sega System 1)",clockSel==5)) { + clockSel=5; + altered=true; } - if (ImGui::RadioButton("447KHz (TI-99/4A)",(flags&0xff03)==0x0102)) { - copyOfFlags=(flags&(~0xff03))|0x0102; + if (ImGui::RadioButton("447KHz (TI-99/4A)",clockSel==6)) { + clockSel=6; + altered=true; } ImGui::Text("Chip type:"); - if (ImGui::RadioButton("Sega VDP/Master System",(flags&0xcc)==0x00)) { - copyOfFlags=(flags&(~0xcc))|0x00; + if (ImGui::RadioButton("Sega VDP/Master System",chipType==0)) { + chipType=0; + altered=true; } - if (ImGui::RadioButton("TI SN76489",(flags&0xcc)==0x04)) { - copyOfFlags=(flags&(~0xcc))|0x04; + if (ImGui::RadioButton("TI SN76489",chipType==1)) { + chipType=1; + altered=true; } - if (ImGui::RadioButton("TI SN76489 with Atari-like short noise",(flags&0xcc)==0x08)) { - copyOfFlags=(flags&(~0xcc))|0x08; + if (ImGui::RadioButton("TI SN76489 with Atari-like short noise",chipType==2)) { + chipType=2; + altered=true; } - if (ImGui::RadioButton("Game Gear",(flags&0xcc)==0x0c)) { - copyOfFlags=(flags&(~0xcc))|0x0c; + if (ImGui::RadioButton("Game Gear",chipType==3)) { + chipType=3; + altered=true; } - if (ImGui::RadioButton("TI SN76489A",(flags&0xcc)==0x40)) { - copyOfFlags=(flags&(~0xcc))|0x40; + if (ImGui::RadioButton("TI SN76489A",chipType==4)) { + chipType=4; + altered=true; } - if (ImGui::RadioButton("TI SN76496",(flags&0xcc)==0x44)) { - copyOfFlags=(flags&(~0xcc))|0x44; + if (ImGui::RadioButton("TI SN76496",chipType==5)) { + chipType=5; + altered=true; } - if (ImGui::RadioButton("NCR 8496",(flags&0xcc)==0x48)) { - copyOfFlags=(flags&(~0xcc))|0x48; + if (ImGui::RadioButton("NCR 8496",chipType==6)) { + chipType=6; + altered=true; } - if (ImGui::RadioButton("Tandy PSSJ 3-voice sound",(flags&0xcc)==0x4c)) { - copyOfFlags=(flags&(~0xcc))|0x4c; + if (ImGui::RadioButton("Tandy PSSJ 3-voice sound",chipType==7)) { + chipType=7; + altered=true; } - if (ImGui::RadioButton("TI SN94624",(flags&0xcc)==0x80)) { - copyOfFlags=(flags&(~0xcc))|0x80; + if (ImGui::RadioButton("TI SN94624",chipType==8)) { + chipType=8; + altered=true; } - if (ImGui::RadioButton("TI SN76494",(flags&0xcc)==0x84)) { - copyOfFlags=(flags&(~0xcc))|0x84; + if (ImGui::RadioButton("TI SN76494",chipType==9)) { + chipType=9; + altered=true; } - bool noPhaseReset=flags&16; + if (ImGui::Checkbox("Disable noise period change phase reset",&noPhaseReset)) { - copyOfFlags=(flags&(~16))|(noPhaseReset<<4); + altered=true; + } + + if (altered) { + e->lockSave([&]() { + flags.set("clockSel",clockSel); + flags.set("chipType",chipType); + flags.set("noPhaseReset",noPhaseReset); + }); } break; } case DIV_SYSTEM_PCE: { - sysPal=flags&1; - if (ImGui::Checkbox("Pseudo-PAL",&sysPal)) { - copyOfFlags=(flags&(~1))|(unsigned int)sysPal; + bool clockSel=flags.getInt("clockSel",0); + int chipType=flags.getInt("chipType",0); + bool noAntiClick=flags.getBool("noAntiClick",false); + + if (ImGui::Checkbox("Pseudo-PAL",&clockSel)) { + altered=true; } - bool antiClick=flags&8; - if (ImGui::Checkbox("Disable anti-click",&antiClick)) { - copyOfFlags=(flags&(~8))|(antiClick<<3); + if (ImGui::Checkbox("Disable anti-click",&noAntiClick)) { + altered=true; } ImGui::Text("Chip revision:"); - if (ImGui::RadioButton("HuC6280 (original)",(flags&4)==0)) { - copyOfFlags=(flags&(~4))|0; + if (ImGui::RadioButton("HuC6280 (original)",chipType==0)) { + chipType=0; + altered=true; } - if (ImGui::RadioButton("HuC6280A (SuperGrafx)",(flags&4)==4)) { - copyOfFlags=(flags&(~4))|4; + if (ImGui::RadioButton("HuC6280A (SuperGrafx)",chipType==1)) { + chipType=1; + altered=true; + } + + if (altered) { + flags.set("clockSel",(int)clockSel); + flags.set("chipType",chipType); + flags.set("noPhaseReset",noAntiClick); } break; } case DIV_SYSTEM_SOUND_UNIT: { + int clockSel=flags.getInt("clockSel",0); + bool echo=flags.getBool("echo",false); + bool swapEcho=flags.getBool("swapEcho",false); + int sampleMemSize=flags.getInt("sampleMemSize",0); + bool pdm=flags.getBool("pdm",false); + int echoDelay=flags.getInt("echoDelay",0); + int echoFeedback=flags.getInt("echoFeedback",0); + int echoResolution=flags.getInt("echoResolution",0); + int echoVol=(signed char)flags.getInt("echoVol",0); + ImGui::Text("CPU rate:"); - if (ImGui::RadioButton("6.18MHz (NTSC)",(flags&3)==0)) { - copyOfFlags=(flags&(~3))|0; + if (ImGui::RadioButton("6.18MHz (NTSC)",clockSel==0)) { + clockSel=0; + altered=true; } - if (ImGui::RadioButton("5.95MHz (PAL)",(flags&3)==1)) { - copyOfFlags=(flags&(~3))|1; + if (ImGui::RadioButton("5.95MHz (PAL)",clockSel==1)) { + clockSel=1; + altered=true; } ImGui::Text("Sample memory:"); - if (ImGui::RadioButton("8K (rev A/B/E)",(flags&16)==0)) { - copyOfFlags=(flags&(~16))|0; + if (ImGui::RadioButton("8K (rev A/B/E)",sampleMemSize==0)) { + sampleMemSize=0; + altered=true; } - if (ImGui::RadioButton("64K (rev D/F)",(flags&16)==16)) { - copyOfFlags=(flags&(~16))|16; + if (ImGui::RadioButton("64K (rev D/F)",sampleMemSize==1)) { + sampleMemSize=1; + altered=true; } - ImGui::Text("DAC resolution"); - if (ImGui::RadioButton("16-bit (rev A/B/D/F)",(flags&32)==0)) { - copyOfFlags=(flags&(~32))|0; + ImGui::Text("DAC resolution:"); + if (ImGui::RadioButton("16-bit (rev A/B/D/F)",pdm==0)) { + pdm=false; + altered=true; } - if (ImGui::RadioButton("1-bit PDM (rev C/E)",(flags&32)==32)) { - copyOfFlags=(flags&(~32))|32; + if (ImGui::RadioButton("1-bit PDM (rev C/E)",pdm==1)) { + pdm=true; + altered=true; } - bool echo=flags&4; if (ImGui::Checkbox("Enable echo",&echo)) { - copyOfFlags=(flags&(~4))|(echo<<2); + altered=true; } - bool flipEcho=flags&8; - if (ImGui::Checkbox("Swap echo channels",&flipEcho)) { - copyOfFlags=(flags&(~8))|(flipEcho<<3); + if (ImGui::Checkbox("Swap echo channels",&swapEcho)) { + altered=true; } ImGui::Text("Echo delay:"); - int echoBufSize=(flags&0x3f00)>>8; - if (CWSliderInt("##EchoBufSize",&echoBufSize,0,63)) { - if (echoBufSize<0) echoBufSize=0; - if (echoBufSize>63) echoBufSize=63; - copyOfFlags=(flags&~0x3f00)|(echoBufSize<<8); + if (CWSliderInt("##EchoBufSize",&echoDelay,0,63)) { + if (echoDelay<0) echoDelay=0; + if (echoDelay>63) echoDelay=63; + altered=true; } rightClickable ImGui::Text("Echo resolution:"); - int echoResolution=(flags&0xf00000)>>20; if (CWSliderInt("##EchoResolution",&echoResolution,0,15)) { if (echoResolution<0) echoResolution=0; if (echoResolution>15) echoResolution=15; - copyOfFlags=(flags&(~0xf00000))|(echoResolution<<20); + altered=true; } rightClickable ImGui::Text("Echo feedback:"); - int echoFeedback=(flags&0xf0000)>>16; if (CWSliderInt("##EchoFeedback",&echoFeedback,0,15)) { if (echoFeedback<0) echoFeedback=0; if (echoFeedback>15) echoFeedback=15; - copyOfFlags=(flags&(~0xf0000))|(echoFeedback<<16); + altered=true; } rightClickable ImGui::Text("Echo volume:"); - int echoVolume=(signed char)((flags&0xff000000)>>24); - if (CWSliderInt("##EchoVolume",&echoVolume,-128,127)) { - if (echoVolume<-128) echoVolume=-128; - if (echoVolume>127) echoVolume=127; - copyOfFlags=(flags&(~0xff000000))|(((unsigned char)echoVolume)<<24); + if (CWSliderInt("##EchoVolume",&echoVol,-128,127)) { + if (echoVol<-128) echoVol=-128; + if (echoVol>127) echoVol=127; + altered=true; } rightClickable + + if (altered) { + flags.set("clockSel",clockSel); + flags.set("echo",echo); + flags.set("swapEcho",swapEcho); + flags.set("sampleMemSize",sampleMemSize); + flags.set("pdm",pdm); + flags.set("echoDelay",echoDelay); + flags.set("echoFeedback",echoFeedback); + flags.set("echoResolution",echoResolution); + flags.set("echoVol",(unsigned char)echoVol); + } break; } + /* case DIV_SYSTEM_GB: { bool antiClick=flags&8; if (ImGui::Checkbox("Disable anti-click",&antiClick)) { @@ -787,18 +860,26 @@ void FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo copyOfFlags=sysPal; } break; + */ + default: + ImGui::Text("Wait... is that right? No... I don't think so."); + + if (ImGui::Button("But it is right!")) { + showError("https://github.com/tildearrow/furnace/issues/new"); + } + break; } - if (copyOfFlags!=flags) { + if (altered) { if (chan>=0) { - e->setSysFlags(chan,copyOfFlags,restart); + e->updateSysFlags(chan,restart); if (e->song.autoSystem) { autoDetectSystem(); } updateWindowTitle(); - } else { - flags=copyOfFlags; } + MARK_MODIFIED; } - */ + + return altered; }