From d8381a21ea45e6a547b54f9dd925807781292e8e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 03:02:55 -0500 Subject: [PATCH 01/12] SegaPCM: fix volume not being reset after macro --- src/engine/platform/segapcm.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index 9376bb0c..20032a1b 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -195,9 +195,6 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { chan[c.chan].pcm.sample=-1; rWrite(0x86+(c.chan<<3),3); chan[c.chan].macroInit(NULL); - if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { - chan[c.chan].outVol=chan[c.chan].vol; - } break; } if (c.value!=DIV_NOTE_NULL) { @@ -207,6 +204,16 @@ int DivPlatformSegaPCM::dispatch(DivCommand c) { } chan[c.chan].furnacePCM=true; chan[c.chan].macroInit(ins); + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + + if (parent->song.newSegaPCM) { + chan[c.chan].chVolL=(chan[c.chan].outVol*chan[c.chan].chPanL)/127; + chan[c.chan].chVolR=(chan[c.chan].outVol*chan[c.chan].chPanR)/127; + rWrite(2+(c.chan<<3),chan[c.chan].chVolL); + rWrite(3+(c.chan<<3),chan[c.chan].chVolR); + } + } chan[c.chan].active=true; chan[c.chan].keyOn=true; } else { From 3f668a59e5a321e4c42c59428e4cc664f0a7c0d6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 05:48:22 -0500 Subject: [PATCH 02/12] update credits --- src/gui/about.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/about.cpp b/src/gui/about.cpp index 2652f873..5dadfcf6 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -82,6 +82,7 @@ const char* aboutLine[]={ "Dippy", "djtuBIG-MaliceX", "dumbut", + "Eknous-P", "ElectricKeet", "EpicTyphlosion", "FΛDE", From c1ff3c38aad9be165265b02e78a6510a1c58645f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 14:40:14 -0500 Subject: [PATCH 03/12] Game Boy: fix memory leak --- src/engine/platform/gb.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 9b565cdc..16a63d7e 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -674,8 +674,6 @@ void DivPlatformGB::setFlags(const DivConfig& flags) { CHECK_CUSTOM_CLOCK; rate=chipClock/16; for (int i=0; i<4; i++) { - isMuted[i]=false; - oscBuf[i]=new DivDispatchOscBuffer; oscBuf[i]->rate=rate; } } @@ -686,6 +684,12 @@ int DivPlatformGB::init(DivEngine* p, int channels, int sugRate, const DivConfig skipRegisterWrites=false; model=GB_MODEL_DMG_B; gb=new GB_gameboy_t; + + for (int i=0; i<4; i++) { + isMuted[i]=false; + oscBuf[i]=new DivDispatchOscBuffer; + } + setFlags(flags); reset(); return 4; From 34502f218cc0def70f2418db09ebed46e4d67377 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 14:40:35 -0500 Subject: [PATCH 04/12] WonderSwan: fix custom clock setting issue #1211 --- src/engine/platform/swan.cpp | 18 ++++++++++++------ src/engine/platform/swan.h | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/engine/platform/swan.cpp b/src/engine/platform/swan.cpp index 209e2fc2..f2fc6d43 100644 --- a/src/engine/platform/swan.cpp +++ b/src/engine/platform/swan.cpp @@ -548,19 +548,25 @@ void DivPlatformSwan::poke(std::vector& wlist) { for (DivRegWrite& i: wlist) rWrite(i.addr,i.val); } -int DivPlatformSwan::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { - parent=p; - dumpWrites=false; - skipRegisterWrites=false; +void DivPlatformSwan::setFlags(const DivConfig& flags) { chipClock=3072000; CHECK_CUSTOM_CLOCK; rate=chipClock/16; // = 192000kHz, should be enough for (int i=0; i<4; i++) { - isMuted[i]=false; - oscBuf[i]=new DivDispatchOscBuffer; oscBuf[i]->rate=rate; } +} + +int DivPlatformSwan::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { + parent=p; + dumpWrites=false; + skipRegisterWrites=false; + for (int i=0; i<4; i++) { + isMuted[i]=false; + oscBuf[i]=new DivDispatchOscBuffer; + } ws=new WSwan(); + setFlags(flags); reset(); return 4; } diff --git a/src/engine/platform/swan.h b/src/engine/platform/swan.h index 148856c0..cff6cc62 100644 --- a/src/engine/platform/swan.h +++ b/src/engine/platform/swan.h @@ -68,6 +68,7 @@ class DivPlatformSwan: public DivDispatch { void forceIns(); void tick(bool sysTick=true); void muteChannel(int ch, bool mute); + void setFlags(const DivConfig& flags); void notifyWaveChange(int wave); void notifyInsDeletion(void* ins); int getOutputCount(); From 8be2f0adc80e9a4348e0170f2000f11095f66050 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 15:17:31 -0500 Subject: [PATCH 05/12] renderDX11: don't wrap textures --- extern/imgui_patched/backends/imgui_impl_dx11.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extern/imgui_patched/backends/imgui_impl_dx11.cpp b/extern/imgui_patched/backends/imgui_impl_dx11.cpp index 86276968..4977ba2d 100644 --- a/extern/imgui_patched/backends/imgui_impl_dx11.cpp +++ b/extern/imgui_patched/backends/imgui_impl_dx11.cpp @@ -361,9 +361,9 @@ static void ImGui_ImplDX11_CreateFontsTexture() D3D11_SAMPLER_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; desc.MipLODBias = 0.f; desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; desc.MinLOD = 0.f; From 2786b307e352588d89aef6ad9d1f3d1c6bbd5794 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 16:19:50 -0500 Subject: [PATCH 06/12] YM2612: fix DAC mute not respecting queue limits --- src/engine/platform/genesis.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/engine/platform/genesis.cpp b/src/engine/platform/genesis.cpp index e7f1fa15..53ad298c 100644 --- a/src/engine/platform/genesis.cpp +++ b/src/engine/platform/genesis.cpp @@ -123,7 +123,9 @@ void DivPlatformGenesis::processDAC(int iRate) { chan[5].dacReady=false; } } else { - urgentWrite(0x2a,0x80); + if (chan[5].dacReady && writes.size()<16) { + urgentWrite(0x2a,0x80); + } } chan[5].dacPos++; if (!chan[5].dacDirection && (s->isLoopable() && chan[5].dacPos>=(unsigned int)s->loopEnd)) { From 9d0a95e228595097b49b8ff506e00595ceef1aac Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 17:08:08 -0500 Subject: [PATCH 07/12] Game Boy: fix zombie mode on first note --- src/engine/platform/gb.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/engine/platform/gb.cpp b/src/engine/platform/gb.cpp index 16a63d7e..a475b7da 100644 --- a/src/engine/platform/gb.cpp +++ b/src/engine/platform/gb.cpp @@ -397,6 +397,14 @@ int DivPlatformGB::dispatch(DivCommand c) { chan[c.chan].vol=chan[c.chan].envVol; chan[c.chan].outVol=chan[c.chan].envVol; } + } else if (chan[c.chan].softEnv && c.chan!=2) { + if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { + chan[c.chan].outVol=chan[c.chan].vol; + chan[c.chan].envVol=chan[c.chan].outVol; + } + chan[c.chan].envLen=0; + chan[c.chan].envDir=1; + chan[c.chan].soundLen=64; } if (c.chan==2 && chan[c.chan].softEnv) { chan[c.chan].soundLen=64; From 3765294cd356e3c6d01a45feaf8fc9a3732fd60a Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 18:06:19 -0500 Subject: [PATCH 08/12] TODO: implement 30xx on ExtCh for pre7 --- src/engine/platform/fmshared_OPN.h | 5 +++-- src/engine/platform/genesisext.cpp | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/engine/platform/fmshared_OPN.h b/src/engine/platform/fmshared_OPN.h index e1b5eca7..8d3d059c 100644 --- a/src/engine/platform/fmshared_OPN.h +++ b/src/engine/platform/fmshared_OPN.h @@ -130,14 +130,15 @@ class DivPlatformOPN: public DivPlatformFMBase { unsigned char freqH, freqL; int portaPauseFreq; signed char konCycles; - bool mask; + bool mask, hardReset; OPNOpChannel(): SharedChannel(0), freqH(0), freqL(0), portaPauseFreq(0), konCycles(0), - mask(true) {} + mask(true), + hardReset(false) {} }; struct OPNOpChannelStereo: public OPNOpChannel { diff --git a/src/engine/platform/genesisext.cpp b/src/engine/platform/genesisext.cpp index 08b7a65c..e0a3e4a6 100644 --- a/src/engine/platform/genesisext.cpp +++ b/src/engine/platform/genesisext.cpp @@ -396,6 +396,9 @@ int DivPlatformGenesisExt::dispatch(DivCommand c) { } break; } + case DIV_CMD_FM_HARD_RESET: + opChan[ch].hardReset=c.value; + break; case DIV_CMD_GET_VOLMAX: return 127; break; From e1cf040b333926bcf005b5b2165a17ef36a26195 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 18:52:28 -0500 Subject: [PATCH 09/12] clarify profanity rating --- res/furnace.appdata.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/res/furnace.appdata.xml b/res/furnace.appdata.xml index 5271379a..5055d0df 100644 --- a/res/furnace.appdata.xml +++ b/res/furnace.appdata.xml @@ -18,6 +18,9 @@

it also offers DefleMask compatibility, allowing you to import your songs and even export them back for interoperability.

+

+ rationale for intense profanity: the tracker itself is clean, but a few demo songs and instruments contain a small amount of strong language. +

From 83219cefc7953508328481bdcd3bcc279769d00d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 20:02:05 -0500 Subject: [PATCH 10/12] GUI: implement chan osc volume label --- src/gui/chanOsc.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index e6306db2..65b54d2a 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -506,12 +506,26 @@ void FurnaceGUI::drawChanOsc() { text+=fmt::sprintf("%d",e->dispatchOfChan[ch]); break; } - case 'v': + case 'v': { + DivChannelState* chanState=e->getChanState(ch); + if (chanState==NULL) break; + text+=fmt::sprintf("%d",chanState->volume>>8); break; - case 'V': + } + case 'V': { + DivChannelState* chanState=e->getChanState(ch); + if (chanState==NULL) break; + int volMax=chanState->volMax>>8; + if (volMax<1) volMax=1; + text+=fmt::sprintf("%d%%",(chanState->volume>>8)/volMax); break; - case 'b': + } + case 'b': { + DivChannelState* chanState=e->getChanState(ch); + if (chanState==NULL) break; + text+=fmt::sprintf("%.2X",chanState->volume>>8); break; + } case '%': text+='%'; break; From a500dcda49698e08b56efc5c472253ab7541a60c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 20:07:33 -0500 Subject: [PATCH 11/12] release v0.6pre6 --- README.md | 26 +++++++++++++++++++----- TODO.md | 2 +- android/app/build.gradle | 4 ++-- android/app/src/main/AndroidManifest.xml | 4 ++-- extern/igfd/dirent/dirent.h | 16 +++++++++++++++ papers/format.md | 2 ++ res/Info.plist | 6 +++--- scripts/release-win32.sh | 2 +- src/engine/engine.h | 4 ++-- 9 files changed, 50 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 37371239..6ae675de 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,9 @@ the biggest multi-system chiptune tracker ever made! --- ## downloads -check out the [Releases](https://github.com/tildearrow/furnace/releases) page. available for Windows, macOS and Linux (AppImage). +check out the [Releases](https://github.com/tildearrow/furnace/releases) page. available for Windows, macOS and Linux. + +for other operating systems, you may [build the source](#developer-info). [see here](https://nightly.link/tildearrow/furnace/workflows/build/master) for the latest unstable build. @@ -79,6 +81,7 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - modern/fantasy: - Commander X16 VERA - tildearrow Sound Unit + - Generic PCM DAC - mix and match sound chips! - over 200 ready to use presets from computers, game consoles and arcade boards... - ...or create your own - up to 32 of them or a total of 128 channels! @@ -90,6 +93,7 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a - clean-room design (guesswork and ABX tests only, no decompilation involved) - some bug/quirk implementation for increased playback accuracy through compatibility flags - VGM export +- ZSM export for Commander X16 - modular layout that you may adapt to your needs - audio file export - entire song, per chip or per channel - quality emulation cores (Nuked, MAME, SameBoy, Mednafen PCE, NSFplay, puNES, reSID, Stella, SAASound, vgsound_emu and ymfm) @@ -120,11 +124,11 @@ check out the [Releases](https://github.com/tildearrow/furnace/releases) page. a # quick references - **discussion**: see the [Discussions](https://github.com/tildearrow/furnace/discussions) section, the [official Revolt](https://rvlt.gg/GRPS6tmc) or the [official Discord server](https://discord.gg/EfrwT2wq7z). -- **help**: check out the [documentation](doc/README.md). it's incomplete though. +- **help**: check out the [documentation](doc/README.md). it's about 80% complete. ## packages -[![Packaging status](https://repology.org/badge/tiny-repos/furnace.svg)](https://repology.org/project/furnace/versions) +[![Packaging status](https://repology.org/badge/vertical-allrepos/furnace.svg)](https://repology.org/project/furnace/versions) some people have provided packages for Unix/Unix-like distributions. here's a list. @@ -156,6 +160,7 @@ otherwise, you may also need the following: - libx11 - libasound - libGL +- any other libraries which may be used by SDL some Linux distributions (e.g. Ubuntu or openSUSE) will require you to install the `-dev` versions of these. @@ -255,6 +260,17 @@ Available options: | `WITH_INSTRUMENTS` | `ON` | Install demo instruments on `make install` | | `WITH_WAVETABLES` | `ON` | Install wavetables on `make install` | +## CMake Error + +if it says something about a missing subdirectory in `extern`, then either: + +1. you didn't set up submodules, or +2. you downloaded the source as a .zip or .tar.gz. don't do this. + +if 1, you may run `git submodule update --init --recursive`. this will initialize submodules. + +if 2, clone this repo. + ## console usage (note: if on Windows, type `furnace.exe` instead, or `Debug\furnace.exe` on MSVC) @@ -289,7 +305,7 @@ this is due to Apple's application signing policy. a workaround is to right clic > it says "Furnace" is damaged and can't be opened! **as of Monterey, this workaround no longer works (especially on ARM).** yeah, Apple has decided to be strict on the matter. -if you happen to be on that version, use this workaround instead (on a Terminal): +if you happen to be on that version (or later), use this workaround instead (on a Terminal): ``` xattr -d com.apple.quarantine /path/to/Furnace.app @@ -301,7 +317,7 @@ you may need to log out and/or reboot after doing this. > where's the manual? -see [doc/](doc/README.md). it's kind of incomplete though. +it is in [doc/](doc/README.md). > is there a tutorial? diff --git a/TODO.md b/TODO.md index 20c54eb9..c190afd1 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,4 @@ -# to-do for 0.6pre6 +# to-do for 0.6pre7 - tutorial? - ease-of-use improvements... ideas: diff --git a/android/app/build.gradle b/android/app/build.gradle index 3f3fc8bd..41d07937 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -15,8 +15,8 @@ android { } minSdkVersion 21 targetSdkVersion 26 - versionCode 158 - versionName "0.6pre5" + versionCode 161 + versionName "0.6pre6" externalNativeBuild { cmake { arguments "-DANDROID_APP_PLATFORM=android-21", "-DANDROID_STL=c++_static", "-DWARNINGS_ARE_ERRORS=ON" diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3deb416b..b8bde5ce 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ diff --git a/extern/igfd/dirent/dirent.h b/extern/igfd/dirent/dirent.h index 35d948a6..7d5c8abe 100644 --- a/extern/igfd/dirent/dirent.h +++ b/extern/igfd/dirent/dirent.h @@ -524,7 +524,15 @@ _wreaddir_r( entry->d_off = 0; entry->d_reclen = sizeof (struct _wdirent); +#ifdef _WIN64 entry->dwin_size = ((size_t)datap->nFileSizeHigh<<32) | datap->nFileSizeLow; +#else + if (datap->nFileSizeHigh) { + entry->dwin_size = 0xffffffff; + } else { + entry->dwin_size = datap->nFileSizeLow; + } +#endif entry->dwin_mtime = datap->ftLastWriteTime; /* Set result address */ @@ -817,7 +825,15 @@ readdir_r( entry->d_off = 0; entry->d_reclen = sizeof (struct dirent); +#ifdef _WIN64 entry->dwin_size = ((size_t)datap->nFileSizeHigh<<32) | datap->nFileSizeLow; +#else + if (datap->nFileSizeHigh) { + entry->dwin_size = 0xffffffff; + } else { + entry->dwin_size = datap->nFileSizeLow; + } +#endif entry->dwin_mtime = datap->ftLastWriteTime; } else { diff --git a/papers/format.md b/papers/format.md index bf0b929e..2df15fcf 100644 --- a/papers/format.md +++ b/papers/format.md @@ -32,6 +32,8 @@ these fields are 0 in format versions prior to 100 (0.6pre1). the format versions are: +- 161: Furnace 0.6pre6 +- 160: Furnace dev160 - 159: Furnace dev159 - 158: Furnace 0.6pre5 - 157: Furnace dev157 diff --git a/res/Info.plist b/res/Info.plist index 026051de..651e0837 100644 --- a/res/Info.plist +++ b/res/Info.plist @@ -15,17 +15,17 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 0.6pre5 + 0.6pre6 CFBundleName Furnace CFBundlePackageType APPL CFBundleShortVersionString - 0.6pre5 + 0.6pre6 CFBundleSignature ???? CFBundleVersion - 0.6pre5 + 0.6pre6 NSHumanReadableCopyright NSHighResolutionCapable diff --git a/scripts/release-win32.sh b/scripts/release-win32.sh index e0c0eec6..fdd0b4c6 100755 --- a/scripts/release-win32.sh +++ b/scripts/release-win32.sh @@ -15,7 +15,7 @@ fi cd win32build # TODO: potential Arch-ism? -i686-w64-mingw32-cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_FLAGS="-O2" -DCMAKE_CXX_FLAGS="-O2 -Wall -Wextra -Wno-unused-parameter -Wno-cast-function-type -Werror" -DBUILD_SHARED_LIBS=OFF -DSUPPORT_XP=ON .. || exit 1 +i686-w64-mingw32-cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_FLAGS="-O2" -DCMAKE_CXX_FLAGS="-O2 -Wall -Wextra -Wno-unused-parameter -Wno-cast-function-type -Werror" -DBUILD_SHARED_LIBS=OFF -DSUPPORT_XP=ON -DWITH_RENDER_DX11=OFF .. || exit 1 make -j8 || exit 1 cd .. diff --git a/src/engine/engine.h b/src/engine/engine.h index e4b3e56a..2f282157 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -54,8 +54,8 @@ #define EXTERN_BUSY_BEGIN_SOFT e->softLocked=true; e->isBusy.lock(); #define EXTERN_BUSY_END e->isBusy.unlock(); e->softLocked=false; -#define DIV_VERSION "dev160" -#define DIV_ENGINE_VERSION 160 +#define DIV_VERSION "0.6pre6" +#define DIV_ENGINE_VERSION 161 // for imports #define DIV_VERSION_MOD 0xff01 #define DIV_VERSION_FC 0xff02 From e600747152723b5c621f789bd8a7281871d5de0e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 8 Jul 2023 22:26:51 -0500 Subject: [PATCH 12/12] GUI: actually fall back to SDL_Renderer if other b ackend fails to start --- src/gui/gui.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 3e7ed027..ffecb3c9 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -6261,9 +6261,9 @@ bool FurnaceGUI::init() { logV("window size: %dx%d",scrW,scrH); if (!initRender()) { - if (settings.renderBackend!="SDL" && !settings.renderBackend.empty()) { - settings.renderBackend=""; - e->setConf("renderBackend",""); + if (settings.renderBackend!="SDL") { + settings.renderBackend="SDL"; + e->setConf("renderBackend","SDL"); e->saveConf(); lastError=fmt::sprintf("\r\nthe render backend has been set to a safe value. please restart Furnace."); } else { @@ -6362,9 +6362,9 @@ bool FurnaceGUI::init() { if (!rend->init(sdlWin)) { if (settings.renderBackend!="SDL") { settings.renderBackend="SDL"; - //e->setConf("renderBackend",""); - //e->saveConf(); - //lastError=fmt::sprintf("\r\nthe render backend has been set to a safe value. please restart Furnace."); + e->setConf("renderBackend",""); + e->saveConf(); + lastError=fmt::sprintf("\r\nthe render backend has been set to a safe value. please restart Furnace."); } else { lastError=fmt::sprintf("could not init renderer! %s",SDL_GetError()); if (!settings.renderDriver.empty()) {