diff --git a/src/engine/engine.h b/src/engine/engine.h index 8d8588d12..77132ee4c 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -726,7 +726,7 @@ class DivEngine { // - x to add x+1 ticks of trailing // - -1 to auto-determine trailing // - -2 to add a whole loop of trailing - SafeWriter* saveVGM(bool* sysToExport=NULL, bool loop=true, int version=0x171, bool patternHints=false, bool directStream=false, int trailingTicks=-1); + SafeWriter* saveVGM(bool* sysToExport=NULL, bool loop=true, int version=0x171, bool patternHints=false, bool directStream=false, int trailingTicks=-1, bool dpcm07=false); // dump to TIunA. SafeWriter* saveTiuna(const bool* sysToExport, const char* baseLabel, int firstBankSize, int otherBankSize); // dump command stream. diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index fb3a82b62..ec389d112 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -1215,7 +1215,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write chipVol.push_back((_id)|(0x80000100)|(((unsigned int)_vol)<<16)); \ } -SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool patternHints, bool directStream, int trailingTicks) { +SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool patternHints, bool directStream, int trailingTicks, bool dpcm07) { if (version<0x150) { lastError="VGM version is too low"; return NULL; diff --git a/src/gui/exportOptions.cpp b/src/gui/exportOptions.cpp index e71d376c6..46ad0a957 100644 --- a/src/gui/exportOptions.cpp +++ b/src/gui/exportOptions.cpp @@ -202,8 +202,10 @@ void FurnaceGUI::drawExportVGM(bool onWindow) { } ImGui::Text(_("chips to export:")); bool hasOneAtLeast=false; + bool hasNES=false; for (int i=0; isong.systemLen; i++) { int minVersion=e->minVGMVersion(e->song.system[i]); + if (e->song.system[i]==DIV_SYSTEM_NES) hasNES=true; ImGui::BeginDisabled(minVersion>vgmExportVersion || minVersion==0); ImGui::Checkbox(fmt::sprintf("%d. %s##_SYSV%d",i+1,getSystemName(e->song.system[i]),i).c_str(),&willExport[i]); ImGui::EndDisabled(); @@ -220,6 +222,17 @@ void FurnaceGUI::drawExportVGM(bool onWindow) { } } ImGui::Text(_("select the chip you wish to export, but only up to %d of each type."),(vgmExportVersion>=0x151)?2:1); + + if (hasNES) { + ImGui::Text(_("NES DPCM bank switch method:")); + if (ImGui::RadioButton(_("data blocks"),!vgmExportDPCM07)) { + vgmExportDPCM07=false; + } + if (ImGui::RadioButton(_("RAM write commands"),vgmExportDPCM07)) { + vgmExportDPCM07=true; + } + } + if (hasOneAtLeast) { if (onWindow) { ImGui::Separator(); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index fb51ce908..6a37cf62d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -5645,7 +5645,7 @@ bool FurnaceGUI::loop() { break; } case GUI_FILE_EXPORT_VGM: { - SafeWriter* w=e->saveVGM(willExport,vgmExportLoop,vgmExportVersion,vgmExportPatternHints,vgmExportDirectStream,vgmExportTrailingTicks); + SafeWriter* w=e->saveVGM(willExport,vgmExportLoop,vgmExportVersion,vgmExportPatternHints,vgmExportDirectStream,vgmExportTrailingTicks,vgmExportDPCM07); if (w!=NULL) { FILE* f=ps_fopen(copyOfName.c_str(),"wb"); if (f!=NULL) { @@ -8427,6 +8427,7 @@ FurnaceGUI::FurnaceGUI(): displayExporting(false), vgmExportLoop(true), vgmExportPatternHints(false), + vgmExportDPCM07(false), vgmExportDirectStream(false), displayInsTypeList(false), portrait(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index ffd6288f6..6f9692c6e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1668,7 +1668,7 @@ class FurnaceGUI { std::vector availRenderDrivers; std::vector availAudioDrivers; - bool quit, warnQuit, willCommit, edit, editClone, isPatUnique, modified, displayError, displayExporting, vgmExportLoop, vgmExportPatternHints; + bool quit, warnQuit, willCommit, edit, editClone, isPatUnique, modified, displayError, displayExporting, vgmExportLoop, vgmExportPatternHints, vgmExportDPCM07; bool vgmExportDirectStream, displayInsTypeList, displayWaveSizeList; bool portrait, injectBackUp, mobileMenuOpen, warnColorPushed; bool wantCaptureKeyboard, oldWantCaptureKeyboard, displayMacroMenu;