diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 5073fcf67..de29ed186 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1037,21 +1037,8 @@ void DivEngine::renderSamples() { } } -String DivEngine::encodeSysDesc(std::vector& desc) { - String ret; - if (desc[0]!=0) { - int index=0; - for (size_t i=0; i=32) break; - } - } - return ret; -} - -std::vector DivEngine::decodeSysDesc(String desc) { - std::vector ret; +String DivEngine::decodeSysDesc(String desc) { + DivConfig newDesc; bool hasVal=false; bool negative=false; int val=0; @@ -1060,6 +1047,7 @@ std::vector DivEngine::decodeSysDesc(String desc) { int sysVol=0; int sysPan=0; int sysFlags=0; + int curSys=0; desc+=' '; // ha for (char i: desc) { switch (i) { @@ -1082,15 +1070,19 @@ std::vector DivEngine::decodeSysDesc(String desc) { case 3: sysFlags=val; - if (systemFromFileFur(sysID)!=0) { + if (sysID!=0) { if (sysVol<-128) sysVol=-128; if (sysVol>127) sysVol=127; if (sysPan<-128) sysPan=-128; if (sysPan>127) sysPan=127; - ret.push_back(systemFromFileFur(sysID)); - ret.push_back(sysVol); - ret.push_back(sysPan); - ret.push_back(sysFlags); + newDesc.set(fmt::sprintf("id%d",curSys),sysID); + newDesc.set(fmt::sprintf("vol%d",curSys),sysVol); + newDesc.set(fmt::sprintf("pan%d",curSys),sysPan); + DivConfig newFlagsC; + newFlagsC.clear(); + convertOldFlags((unsigned int)sysFlags,newFlagsC,systemFromFileFur(sysID)); + newDesc.set(fmt::sprintf("flags%d",curSys),newFlagsC.toBase64()); + curSys++; } curStage=0; @@ -1111,28 +1103,35 @@ std::vector DivEngine::decodeSysDesc(String desc) { break; } } - return ret; + + return newDesc.toBase64(); } -void DivEngine::initSongWithDesc(const int* description) { +void DivEngine::initSongWithDesc(const char* description) { int chanCount=0; - if (description[0]!=0) { - int index=0; - for (int i=0; description[i]; i+=4) { - song.system[index]=(DivSystem)description[i]; - song.systemVol[index]=description[i+1]; - song.systemPan[index]=description[i+2]; - song.systemFlagsOld[index]=description[i+3]; - index++; - chanCount+=getChannelCount(song.system[index]); - if (chanCount>=DIV_MAX_CHANS) break; - if (index>=32) break; + DivConfig c; + c.loadFromBase64(description); + int index=0; + for (; index<32; index++) { + song.system[index]=systemFromFileFur(c.getInt(fmt::sprintf("id%d",index),0)); + if (song.system[index]==DIV_SYSTEM_NULL) { + break; } - song.systemLen=index; + chanCount+=getChannelCount(song.system[index]); + if (chanCount>=DIV_MAX_CHANS) { + song.system[index]=DIV_SYSTEM_NULL; + break; + } + song.systemVol[index]=c.getInt(fmt::sprintf("vol%d",index),DIV_SYSTEM_NULL); + song.systemPan[index]=c.getInt(fmt::sprintf("pan%d",index),DIV_SYSTEM_NULL); + song.systemFlags[index].clear(); + String flags=c.getString(fmt::sprintf("flags%d",index),""); + song.systemFlags[index].loadFromBase64(flags.c_str()); } + song.systemLen=index; } -void DivEngine::createNew(const int* description, String sysName) { +void DivEngine::createNew(const char* description, String sysName) { quitDispatch(); BUSY_BEGIN; saveLock.lock(); @@ -1345,7 +1344,7 @@ void DivEngine::changeSystem(int index, DivSystem which, bool preserveOrder) { } song.system[index]=which; - song.systemFlagsOld[index]=0; + song.systemFlags[index].clear(); recalcChans(); saveLock.unlock(); BUSY_END; @@ -1371,7 +1370,7 @@ bool DivEngine::addSystem(DivSystem which) { song.system[song.systemLen]=which; song.systemVol[song.systemLen]=64; song.systemPan[song.systemLen]=0; - song.systemFlagsOld[song.systemLen++]=0; + song.systemFlags[song.systemLen++].clear(); recalcChans(); saveLock.unlock(); BUSY_END; @@ -1415,7 +1414,7 @@ bool DivEngine::removeSystem(int index, bool preserveOrder) { song.system[i]=song.system[i+1]; song.systemVol[i]=song.systemVol[i+1]; song.systemPan[i]=song.systemPan[i+1]; - song.systemFlagsOld[i]=song.systemFlagsOld[i+1]; + song.systemFlags[i]=song.systemFlags[i+1]; } recalcChans(); saveLock.unlock(); @@ -1541,9 +1540,10 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) { song.systemPan[dest]^=song.systemPan[src]; song.systemPan[src]^=song.systemPan[dest]; - song.systemFlagsOld[src]^=song.systemFlagsOld[dest]; - song.systemFlagsOld[dest]^=song.systemFlagsOld[src]; - song.systemFlagsOld[src]^=song.systemFlagsOld[dest]; + // I am kinda scared to use std::swap + DivConfig oldFlags=song.systemFlags[src]; + song.systemFlags[src]=song.systemFlags[dest]; + song.systemFlags[dest]=oldFlags; recalcChans(); saveLock.unlock(); @@ -3886,11 +3886,14 @@ bool DivEngine::init() { // set default system preset if (!hasLoadedSomething) { logD("setting default preset"); - std::vector preset=decodeSysDesc(getConfString("initialSys","")); + String preset=getConfString("initialSys2",""); + if (preset.empty()) { + // try loading old preset + preset=decodeSysDesc(getConfString("initialSys","")); + } logD("preset size %ld",preset.size()); if (preset.size()>0 && (preset.size()&3)==0) { - preset.push_back(0); - initSongWithDesc(preset.data()); + initSongWithDesc(preset.c_str()); } String sysName=getConfString("initialSysName",""); if (sysName=="") { diff --git a/src/engine/engine.h b/src/engine/engine.h index fd190294b..0833f457c 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -425,10 +425,6 @@ class DivEngine { // MIDI stuff std::function midiCallback=[](const TAMidiMessage&) -> int {return -2;}; - DivSystem systemFromFileFur(unsigned char val); - unsigned char systemToFileFur(DivSystem val); - DivSystem systemFromFileDMF(unsigned char val); - unsigned char systemToFileDMF(DivSystem val); int dispatchCmd(DivCommand c); void processRow(int i, bool afterDelay); void nextOrder(); @@ -471,7 +467,7 @@ class DivEngine { bool deinitAudioBackend(bool dueToSwitchMaster=false); void registerSystems(); - void initSongWithDesc(const int* description); + void initSongWithDesc(const char* description); void exchangeIns(int one, int two); void swapChannels(int src, int dest); @@ -502,11 +498,10 @@ class DivEngine { DivWavetable* getWave(int index); DivSample* getSample(int index); DivDispatch* getDispatch(int index); - // parse system setup description - String encodeSysDesc(std::vector& desc); - std::vector decodeSysDesc(String desc); + // parse old system setup description + String decodeSysDesc(String desc); // start fresh - void createNew(const int* description, String sysName); + void createNew(const char* description, String sysName); // load a file. bool load(unsigned char* f, size_t length); // save as .dmf. @@ -534,6 +529,12 @@ class DivEngine { // notify wavetable change void notifyWaveChange(int wave); + // get system IDs + DivSystem systemFromFileFur(unsigned char val); + unsigned char systemToFileFur(DivSystem val); + DivSystem systemFromFileDMF(unsigned char val); + unsigned char systemToFileDMF(DivSystem val); + // benchmark (returns time in seconds) double benchmarkPlayback(); double benchmarkSeek(); diff --git a/src/engine/song.h b/src/engine/song.h index 975cc6e86..ba2d60f3b 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -233,9 +233,6 @@ struct DivSong { unsigned char systemLen; signed char systemVol[32]; signed char systemPan[32]; - // this one will be removed soon... - unsigned int systemFlagsOld[32]; - // ...and replaced with... this! DivConfig systemFlags[32]; // song information @@ -432,7 +429,6 @@ struct DivSong { system[i]=DIV_SYSTEM_NULL; systemVol[i]=64; systemPan[i]=0; - systemFlagsOld[i]=0; } subsong.push_back(new DivSubSong); system[0]=DIV_SYSTEM_YM2612; diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 27c347145..82af63294 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -61,62 +61,81 @@ String DivEngine::getSongSystemLegacyName(DivSong& ds, bool isMultiSystemAccepta return "help! what's going on!"; case 1: if (ds.system[0]==DIV_SYSTEM_AY8910) { - switch (ds.systemFlagsOld[0]&0x3f) { - case 0: // AY-3-8910, 1.79MHz - case 1: // AY-3-8910, 1.77MHz - case 2: // AY-3-8910, 1.75MHz - return "ZX Spectrum"; - case 3: // AY-3-8910, 2MHz - return "Fujitsu Micro-7"; - case 4: // AY-3-8910, 1.5MHz - return "Vectrex"; - case 5: // AY-3-8910, 1MHz - return "Amstrad CPC"; - - case 0x10: // YM2149, 1.79MHz - return "MSX"; - case 0x13: // YM2149, 2MHz - return "Atari ST"; - case 0x26: // 5B NTSC - return "Sunsoft 5B standalone"; - case 0x28: // 5B PAL - return "Sunsoft 5B standalone (PAL)"; - - case 0x30: // AY-3-8914, 1.79MHz - return "Intellivision"; - case 0x33: // AY-3-8914, 2MHz - return "Intellivision (PAL)"; - - default: - if ((ds.systemFlagsOld[0]&0x30)==0x00) { - return "AY-3-8910"; - } else if ((ds.systemFlagsOld[0]&0x30)==0x10) { - return "Yamaha YM2149"; - } else if ((ds.systemFlagsOld[0]&0x30)==0x20) { - return "Overclocked Sunsoft 5B"; - } else if ((ds.systemFlagsOld[0]&0x30)==0x30) { - return "Intellivision"; + switch (ds.systemFlags[0].getInt("chipType",0)) { + case 0: // AY-3-8910 + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 0: // AY-3-8910, 1.79MHz + case 1: // AY-3-8910, 1.77MHz + case 2: // AY-3-8910, 1.75MHz + return "ZX Spectrum"; + case 3: // AY-3-8910, 2MHz + return "Fujitsu Micro-7"; + case 4: // AY-3-8910, 1.5MHz + return "Vectrex"; + case 5: // AY-3-8910, 1MHz + return "Amstrad CPC"; + default: + return "AY-3-8910"; } + break; + case 1: // YM2149 + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 0: // YM2149, 1.79MHz + return "MSX"; + case 3: // YM2149, 2MHz + return "Atari ST"; + default: + return "Yamaha YM2149"; + } + break; + case 2: // 5B + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 6: // 5B NTSC + return "Sunsoft 5B standalone"; + case 8: // 5B PAL + return "Sunsoft 5B standalone (PAL)"; + default: + return "Overclocked Sunsoft 5B"; + } + break; + case 3: // AY-3-8914 + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 0: // AY-3-8914, 1.79MHz + return "Intellivision"; + case 3: // AY-3-8914, 2MHz + return "Intellivision (PAL)"; + default: + return "Intellivision"; + } + break; } } else if (ds.system[0]==DIV_SYSTEM_SMS) { - switch (ds.systemFlagsOld[0]&0x0f) { - case 0: case 1: - return "Sega Master System"; - case 6: - return "BBC Micro"; + switch (ds.systemFlags[0].getInt("chipType",0)) { + case 0: + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 0: case 1: + return "Sega Master System"; + } + break; + case 1: + switch (ds.systemFlags[0].getInt("clockSel",0)) { + case 2: + return "BBC Micro"; + } + break; } } else if (ds.system[0]==DIV_SYSTEM_YM2612) { - switch (ds.systemFlagsOld[0]&3) { + switch (ds.systemFlags[0].getInt("clockSel",0)) { case 2: return "FM Towns"; } } else if (ds.system[0]==DIV_SYSTEM_YM2151) { - switch (ds.systemFlagsOld[0]&3) { + switch (ds.systemFlags[0].getInt("clockSel",0)) { case 2: return "Sharp X68000"; } } else if (ds.system[0]==DIV_SYSTEM_SAA1099) { - switch (ds.systemFlagsOld[0]&3) { + switch (ds.systemFlags[0].getInt("clockSel",0)) { case 0: return "SAM Coupé"; } diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index dd5e1f37a..182ca5a99 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -939,7 +939,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p if (!hasSN) { hasSN=disCont[i].dispatch->chipClock; willExport[i]=true; - switch ((song.systemFlagsOld[i]>>2)&3) { + switch (song.systemFlags[i].getInt("chipType",0)) { case 1: // real SN snNoiseConfig=3; snNoiseSize=15; @@ -1054,11 +1054,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p ayConfig=0x03; hasClockDivider=true; } else { - switch ((song.systemFlagsOld[i]>>4)&3) { - default: - case 0: // AY8910 - ayConfig=0x00; - break; + switch (song.systemFlags[i].getInt("chipType",0)) { case 1: // YM2149 ayConfig=0x10; hasClockDivider=true; @@ -1071,12 +1067,15 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p case 3: // AY8914 ayConfig=0x04; break; + default: // AY8910 + ayConfig=0x00; + break; } } - if (hasClockDivider && ((song.systemFlagsOld[i]>>7)&1)) { + if (hasClockDivider && song.systemFlags[i].getBool("halfClock",false)) { ayFlags|=0x10; } - if (hasStereo && ((song.systemFlagsOld[i]>>6)&1)) { + if (hasStereo && song.systemFlags[i].getBool("stereo",false)) { ayFlags|=0x80; } willExport[i]=true; @@ -1304,7 +1303,7 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p // chips even though the only difference is the output resolution // these system types are currently handled by reusing isSecond flag // also this system is not dual-able - if ((song.systemFlagsOld[i]>>4)==1) { + if (song.systemFlags[i].getInt("chipType",0)==1) { if (!hasRFC1) { hasRFC1=disCont[i].dispatch->chipClock; isSecond[i]=true; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 9ce08ab58..4c7850adf 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3438,7 +3438,7 @@ bool FurnaceGUI::loop() { if (ImGui::BeginMenu("configure chip...")) { for (int i=0; isong.systemLen; i++) { if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSP%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { - drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true); + drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true); ImGui::TreePop(); } } diff --git a/src/gui/gui.h b/src/gui/gui.h index c4b1005da..f0d305569 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1211,7 +1211,7 @@ class FurnaceGUI { String macroRelLabel; String emptyLabel; String emptyLabel2; - std::vector initialSys; + DivConfig initialSys; Settings(): mainFontSize(18), @@ -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, unsigned int& flags, bool modifyOnChange); + void 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/insEdit.cpp b/src/gui/insEdit.cpp index de770768e..8cf784bb7 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -1904,7 +1904,7 @@ void FurnaceGUI::drawInsEdit() { if (e->song.system[i]==DIV_SYSTEM_VRC7) { isPresent[3]=true; } else if (e->song.system[i]==DIV_SYSTEM_OPLL || e->song.system[i]==DIV_SYSTEM_OPLL_DRUMS) { - isPresent[(e->song.systemFlagsOld[i]>>4)&3]=true; + isPresent[(e->song.systemFlags[i].getInt("patchSet",0))&3]=true; } } if (!isPresent[0] && !isPresent[1] && !isPresent[2] && !isPresent[3]) { diff --git a/src/gui/newSong.cpp b/src/gui/newSong.cpp index c819ffd3a..eff8d4a0f 100644 --- a/src/gui/newSong.cpp +++ b/src/gui/newSong.cpp @@ -19,6 +19,7 @@ #include "gui.h" #include "misc/cpp/imgui_stdlib.h" +#include #include void FurnaceGUI::drawNewSong() { @@ -140,7 +141,16 @@ void FurnaceGUI::drawNewSong() { } if (accepted) { - e->createNew(nextDesc,nextDescName); + // TODO: remove after porting all presets to new format + String oldDescFormat; + for (const int* i=nextDesc; *i; i+=4) { + oldDescFormat+=fmt::sprintf("%d ",e->systemToFileFur((DivSystem)i[0])); + oldDescFormat+=fmt::sprintf("%d ",i[1]); + oldDescFormat+=fmt::sprintf("%d ",i[2]); + oldDescFormat+=fmt::sprintf("%d ",i[3]); + } + String oldDesc=e->decodeSysDesc(oldDescFormat.c_str()); + e->createNew(oldDesc.c_str(),nextDescName); undoHist.clear(); redoHist.clear(); curFileName=""; diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index b55a064c5..cbc8d64de 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -270,10 +270,10 @@ void FurnaceGUI::drawSettings() { if (ImGui::Button("Current system")) { settings.initialSys.clear(); for (int i=0; isong.systemLen; i++) { - settings.initialSys.push_back(e->song.system[i]); - settings.initialSys.push_back(e->song.systemVol[i]); - settings.initialSys.push_back(e->song.systemPan[i]); - settings.initialSys.push_back(e->song.systemFlagsOld[i]); + settings.initialSys.set(fmt::sprintf("id%d",i),e->getSystemDef(e->song.system[i])->id); + 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()); } settings.initialSysName=e->song.systemName; } @@ -285,19 +285,24 @@ void FurnaceGUI::drawSettings() { for (totalAvailSys=0; availableSystems[totalAvailSys]; totalAvailSys++); if (totalAvailSys>0) { for (int i=0; i wordPool[6]; + /* for (size_t i=0; igetSystemName((DivSystem)settings.initialSys[i*4]); @@ -321,18 +326,19 @@ 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.push_back(DIV_SYSTEM_YM2612); - settings.initialSys.push_back(64); - settings.initialSys.push_back(0); - settings.initialSys.push_back(0); - settings.initialSys.push_back(DIV_SYSTEM_SMS); - settings.initialSys.push_back(32); - settings.initialSys.push_back(0); - settings.initialSys.push_back(0); + settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id); + 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("vol1",64); + settings.initialSys.set("pan1",0); + settings.initialSys.set("flags1",""); settings.initialSysName="Sega Genesis/Mega Drive"; } @@ -341,18 +347,22 @@ void FurnaceGUI::drawSettings() { ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); ImGui::InputText("##InitSysName",&settings.initialSysName); - for (size_t i=0; isystemFromFileFur(settings.initialSys.getInt(fmt::sprintf("id%d",i),0)); + signed char sysVol=settings.initialSys.getInt(fmt::sprintf("vol%d",i),0); + signed char sysPan=settings.initialSys.getInt(fmt::sprintf("pan%d",i),0); + + //bool doRemove=false; + bool doInvert=sysVol&128; + signed char vol=sysVol&127; ImGui::PushID(i); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-ImGui::CalcTextSize("Invert").x-ImGui::GetFrameHeightWithSpacing()*2.0-ImGui::GetStyle().ItemSpacing.x); - if (ImGui::BeginCombo("##System",getSystemName((DivSystem)settings.initialSys[i]))) { + if (ImGui::BeginCombo("##System",getSystemName(sysID))) { for (int j=0; availableSystems[j]; j++) { - if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),settings.initialSys[i]==availableSystems[j])) { - settings.initialSys[i]=availableSystems[j]; - settings.initialSys[i+3]=0; + if (ImGui::Selectable(getSystemName((DivSystem)availableSystems[j]),sysID==availableSystems[j])) { + sysID=(DivSystem)availableSystems[j]; + settings.initialSys.set(fmt::sprintf("flags%d",i),""); } } ImGui::EndCombo(); @@ -360,39 +370,42 @@ void FurnaceGUI::drawSettings() { ImGui::SameLine(); if (ImGui::Checkbox("Invert",&doInvert)) { - settings.initialSys[i+1]^=128; + sysVol^=128; } ImGui::SameLine(); - ImGui::BeginDisabled(settings.initialSys.size()<=4); + //ImGui::BeginDisabled(settings.initialSys.size()<=4); if (ImGui::Button(ICON_FA_MINUS "##InitSysRemove")) { - doRemove=true; + //doRemove=true; } - ImGui::EndDisabled(); + //ImGui::EndDisabled(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); if (CWSliderScalar("Volume",ImGuiDataType_S8,&vol,&_ZERO,&_ONE_HUNDRED_TWENTY_SEVEN)) { - settings.initialSys[i+1]=(settings.initialSys[i+1]&128)|vol; + sysVol=(sysVol&128)|vol; } rightClickable ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x-(50.0f*dpiScale)); - CWSliderScalar("Panning",ImGuiDataType_S8,&settings.initialSys[i+2],&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); rightClickable + CWSliderScalar("Panning",ImGuiDataType_S8,&sysPan,&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); rightClickable // oh please MSVC don't cry if (ImGui::TreeNode("Configure")) { - drawSysConf(-1,(DivSystem)settings.initialSys[i],(unsigned int&)settings.initialSys[i+3],false); + String sysFlagsS=settings.initialSys.getString(fmt::sprintf("flags%d",i),""); + DivConfig sysFlags; + sysFlags.loadFromBase64(sysFlagsS.c_str()); + drawSysConf(-1,sysID,sysFlags,false); ImGui::TreePop(); } ImGui::PopID(); - if (doRemove && settings.initialSys.size()>=8) { + /*if (doRemove && settings.initialSys.size()>=8) { settings.initialSys.erase(settings.initialSys.begin()+i,settings.initialSys.begin()+i+4); i-=4; - } + }*/ } if (ImGui::Button(ICON_FA_PLUS "##InitSysAdd")) { - settings.initialSys.push_back(DIV_SYSTEM_YM2612); + /*settings.initialSys.push_back(DIV_SYSTEM_YM2612); settings.initialSys.push_back(64); settings.initialSys.push_back(0); - settings.initialSys.push_back(0); + settings.initialSys.push_back(0);*/ } ImGui::Separator(); @@ -2440,17 +2453,22 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.midiOutClock,0,1); clampSetting(settings.midiOutMode,0,2); - settings.initialSys=e->decodeSysDesc(e->getConfString("initialSys","")); - if (settings.initialSys.size()<4) { + String initialSys2=e->getConfString("initialSys2",""); + if (initialSys2.empty()) { + initialSys2=e->decodeSysDesc(e->getConfString("initialSys","")); + } + settings.initialSys.clear(); + settings.initialSys.loadFromBase64(initialSys2.c_str()); + if (settings.initialSys.getInt("id0",0)==0) { settings.initialSys.clear(); - settings.initialSys.push_back(DIV_SYSTEM_YM2612); - settings.initialSys.push_back(64); - settings.initialSys.push_back(0); - settings.initialSys.push_back(0); - settings.initialSys.push_back(DIV_SYSTEM_SMS); - settings.initialSys.push_back(32); - settings.initialSys.push_back(0); - settings.initialSys.push_back(0); + settings.initialSys.set("id0",e->getSystemDef(DIV_SYSTEM_YM2612)->id); + 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("vol1",64); + settings.initialSys.set("pan1",0); + settings.initialSys.set("flags1",""); } // keybinds @@ -2564,7 +2582,7 @@ void FurnaceGUI::commitSettings() { e->setConf("eventDelay",settings.eventDelay); e->setConf("moveWindowTitle",settings.moveWindowTitle); e->setConf("hiddenSystems",settings.hiddenSystems); - e->setConf("initialSys",e->encodeSysDesc(settings.initialSys)); + e->setConf("initialSys2",settings.initialSys.toBase64()); e->setConf("initialSysName",settings.initialSysName); e->setConf("horizontalDataView",settings.horizontalDataView); e->setConf("noMultiSystem",settings.noMultiSystem); diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index e032c447c..333c26ee0 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -19,7 +19,7 @@ #include "gui.h" -void FurnaceGUI::drawSysConf(int chan, DivSystem type, unsigned int& flags, bool modifyOnChange) { +void FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool modifyOnChange) { ImGui::Text("temporarily unavailable!"); return; /* diff --git a/src/gui/sysManager.cpp b/src/gui/sysManager.cpp index 5d7a59c73..386d26583 100644 --- a/src/gui/sysManager.cpp +++ b/src/gui/sysManager.cpp @@ -70,7 +70,7 @@ void FurnaceGUI::drawSysManager() { } ImGui::TableNextColumn(); if (ImGui::TreeNode(fmt::sprintf("%d. %s##_SYSM%d",i+1,getSystemName(e->song.system[i]),i).c_str())) { - drawSysConf(i,e->song.system[i],e->song.systemFlagsOld[i],true); + drawSysConf(i,e->song.system[i],e->song.systemFlags[i],true); ImGui::TreePop(); } ImGui::TableNextColumn();