diff --git a/src/engine/engine.h b/src/engine/engine.h index 2a7718c1d..a2e900c81 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -697,9 +697,8 @@ class DivEngine { // save as .fur. // if notPrimary is true then the song will not be altered SafeWriter* saveFur(bool notPrimary=false, bool newPatternFormat=true); - // build a ROM file (TODO). - // specify system to build ROM for. - std::vector buildROM(DivROMExportOptions sys); + // return a ROM exporter. + DivROMExport* buildROM(DivROMExportOptions sys); // dump to VGM. // set trailingTicks to: // - 0 to add one tick of trailing diff --git a/src/engine/export.cpp b/src/engine/export.cpp index 2ea35327f..68794069e 100644 --- a/src/engine/export.cpp +++ b/src/engine/export.cpp @@ -21,7 +21,7 @@ #include "export/amigaValidation.h" -std::vector DivEngine::buildROM(DivROMExportOptions sys) { +DivROMExport* DivEngine::buildROM(DivROMExportOptions sys) { DivROMExport* exporter=NULL; switch (sys) { case DIV_ROM_AMIGA_VALIDATION: @@ -31,7 +31,5 @@ std::vector DivEngine::buildROM(DivROMExportOptions sys) { exporter=new DivROMExport; break; } - std::vector ret=exporter->go(this); - delete exporter; - return ret; + return exporter; } diff --git a/src/engine/export.h b/src/engine/export.h index bfd1049c0..9f7ed8abd 100644 --- a/src/engine/export.h +++ b/src/engine/export.h @@ -51,13 +51,16 @@ struct DivROMExportProgress { }; class DivROMExport { - std::vector exportLog; - std::mutex logLock; - void logAppend(String what); + protected: + std::vector exportLog; + std::vector output; + std::mutex logLock; + void logAppend(String what); public: virtual bool go(DivEngine* eng); virtual void abort(); - virtual std::vector getResult(); + virtual void wait(); + std::vector& getResult(); virtual bool hasFailed(); virtual DivROMExportProgress getProgress(); virtual ~DivROMExport() {} diff --git a/src/engine/export/abstract.cpp b/src/engine/export/abstract.cpp index bd39e3aa0..a30fbecdd 100644 --- a/src/engine/export/abstract.cpp +++ b/src/engine/export/abstract.cpp @@ -20,7 +20,34 @@ #include "../export.h" #include "../../ta-log.h" -std::vector DivROMExport::go(DivEngine* e) { +bool DivROMExport::go(DivEngine* eng) { logW("what's this? the null ROM export?"); - return std::vector(); + return false; +} + +void DivROMExport::abort() { +} + +std::vector& DivROMExport::getResult() { + return output; +} + +bool DivROMExport::hasFailed() { + return true; +} + +DivROMExportProgress DivROMExport::getProgress() { + DivROMExportProgress ret; + ret.name="Test"; + ret.amount=0.0f; + return ret; +} + +void DivROMExport::logAppend(String what) { + logLock.lock(); + exportLog.push_back(what); + logLock.unlock(); +} + +void DivROMExport::wait() { } diff --git a/src/engine/export/amigaValidation.cpp b/src/engine/export/amigaValidation.cpp index a613ee422..3e2074bd0 100644 --- a/src/engine/export/amigaValidation.cpp +++ b/src/engine/export/amigaValidation.cpp @@ -40,8 +40,7 @@ struct SampleBookEntry { len(0) {} }; -std::vector DivExportAmigaValidation::go(DivEngine* e) { - std::vector ret; +void DivExportAmigaValidation::run() { std::vector waves; std::vector sampleBook; unsigned int wavesDataPtr=0; @@ -266,12 +265,16 @@ std::vector DivExportAmigaValidation::go(DivEngine* e) { } // finish - ret.reserve(5); - ret.push_back(DivROMExportOutput("sbook.bin",sbook)); - ret.push_back(DivROMExportOutput("wbook.bin",wbook)); - ret.push_back(DivROMExportOutput("sample.bin",sample)); - ret.push_back(DivROMExportOutput("wave.bin",wave)); - ret.push_back(DivROMExportOutput("seq.bin",seq)); - - return ret; + output.reserve(5); + output.push_back(DivROMExportOutput("sbook.bin",sbook)); + output.push_back(DivROMExportOutput("wbook.bin",wbook)); + output.push_back(DivROMExportOutput("sample.bin",sample)); + output.push_back(DivROMExportOutput("wave.bin",wave)); + output.push_back(DivROMExportOutput("seq.bin",seq)); +} + +bool DivExportAmigaValidation::go(DivEngine* eng) { + e=eng; + exportThread=new std::thread(&DivExportAmigaValidation::run,this); + return true; } diff --git a/src/engine/export/amigaValidation.h b/src/engine/export/amigaValidation.h index 11a4ecd48..46c693880 100644 --- a/src/engine/export/amigaValidation.h +++ b/src/engine/export/amigaValidation.h @@ -20,7 +20,10 @@ #include "../export.h" class DivExportAmigaValidation: public DivROMExport { + DivEngine* e; + std::thread* exportThread; + void run(); public: - std::vector go(DivEngine* e); + bool go(DivEngine* e); ~DivExportAmigaValidation() {} }; diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index 5527f5598..3eba0298c 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -619,41 +619,6 @@ void FurnaceGUI::drawMobileControls() { if (ImGui::Button(_("Switch to Desktop Mode"))) { toggleMobileUI(!mobileUI); } - - int numAmiga=0; - for (int i=0; isong.systemLen; i++) { - if (e->song.system[i]==DIV_SYSTEM_AMIGA) numAmiga++; - } - - if (numAmiga) { - ImGui::Text(_( - "this is NOT ROM export! only use for making sure the\n" - "Furnace Amiga emulator is working properly by\n" - "comparing it with real Amiga output." - )); - ImGui::AlignTextToFramePadding(); - ImGui::Text(_("Directory")); - ImGui::SameLine(); - ImGui::InputText("##AVDPath",&workingDirROMExport); - if (ImGui::Button(_("Bake Data"))) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); - } - i.data->finish(); - delete i.data; - } - showError(fmt::sprintf(_("Done! Baked %d files."),(int)out.size())); - } - } - break; } } diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index 19077c13c..4b4360839 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -329,21 +329,31 @@ void FurnaceGUI::drawExportAmigaVal(bool onWindow) { ImGui::SameLine(); } if (ImGui::Button(_("Bake Data"),ImVec2(200.0f*dpiScale,0))) { - std::vector out=e->buildROM(DIV_ROM_AMIGA_VALIDATION); - if (workingDirROMExport.size()>0) { - if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; - } - for (DivROMExportOutput& i: out) { - String path=workingDirROMExport+i.name; - FILE* outFile=ps_fopen(path.c_str(),"wb"); - if (outFile!=NULL) { - fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); - fclose(outFile); + DivROMExport* ex=e->buildROM(DIV_ROM_AMIGA_VALIDATION); + if (ex->go(e)) { + ex->wait(); + if (ex->hasFailed()) { + showError("error!"); + } else { + if (workingDirROMExport.size()>0) { + if (workingDirROMExport[workingDirROMExport.size()-1]!=DIR_SEPARATOR) workingDirROMExport+=DIR_SEPARATOR_STR; + } + for (DivROMExportOutput& i: ex->getResult()) { + String path=workingDirROMExport+i.name; + FILE* outFile=ps_fopen(path.c_str(),"wb"); + if (outFile!=NULL) { + fwrite(i.data->getFinalBuf(),1,i.data->size(),outFile); + fclose(outFile); + } + i.data->finish(); + delete i.data; + } + showError(fmt::sprintf(_("Done! Baked %d files."),(int)ex->getResult().size())); } - i.data->finish(); - delete i.data; + } else { + showError("error!"); } - showError(fmt::sprintf(_("Done! Baked %d files."),(int)out.size())); + delete ex; ImGui::CloseCurrentPopup(); } }