From 8012676993fae040233a6b9f41790318fc7c5592 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 14 Mar 2022 17:16:43 -0500 Subject: [PATCH] MOD import: crash fix --- src/engine/engine.h | 3 +++ src/engine/fileOps.cpp | 12 +++++++----- src/gui/gui.cpp | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/engine/engine.h b/src/engine/engine.h index c2b6c443e..b4d5f7b6b 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -40,6 +40,9 @@ #define DIV_VERSION "dev66" #define DIV_ENGINE_VERSION 66 +// for imports +#define DIV_VERSION_MOD 0xff01 + enum DivStatusView { DIV_STATUS_NOTHING=0, DIV_STATUS_PATTERN, diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index c45a797e8..da4ca4e82 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -1241,6 +1241,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { try { DivSong ds; ds.tuning=436.0; + ds.version=DIV_VERSION_MOD; // check mod magic bytes if (!reader.seek(1080,SEEK_SET)) { @@ -1255,6 +1256,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { &&(magic[0]>='1' && magic[0]<='9' && magic[1]>='0' && magic[1]<='9')) { chCount=((magic[0]-'0')*10)+(magic[1]-'0'); } else { + // TODO: Soundtracker MOD? throw InvalidHeaderException(); } // song name @@ -1266,7 +1268,7 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { DivSample* sample=new DivSample; sample->depth=8; sample->name=reader.readString(22); - int slen=reader.readS_BE()*2; + int slen=((unsigned short)reader.readS_BE())*2; sampLens[i]=slen; if (slen==2) slen=0; signed char fineTune=reader.readC()&0x0f; @@ -1504,20 +1506,20 @@ bool DivEngine::loadMod(unsigned char* file, size_t len) { ds.hz=50; ds.customTempo=false; ds.systemLen=(chCount+3)/4; - for(int i=0;itype=DIV_INS_AMIGA; ins->amiga.initSample=i; diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index f431d1839..af3fe98eb 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3682,7 +3682,7 @@ void FurnaceGUI::doAction(int what) { } break; case GUI_ACTION_SAVE: - if (curFileName=="") { + if (curFileName=="" || e->song.version>=0xff00) { openFileDialog(GUI_FILE_SAVE); } else { if (save(curFileName,e->song.isDMF?e->song.version:0)>0) { @@ -5438,7 +5438,7 @@ bool FurnaceGUI::loop() { } ImGui::Separator(); if (ImGui::MenuItem("save",BIND_FOR(GUI_ACTION_SAVE))) { - if (curFileName=="") { + if (curFileName=="" || e->song.version>=0xff00) { openFileDialog(GUI_FILE_SAVE); } else { if (save(curFileName,e->song.isDMF?e->song.version:0)>0) {