Merge pull request #1368 from Eknous-P/multicore
Options for separate emulation cores for real-time playback and exporting
This commit is contained in:
commit
77fd6d6cd7
|
@ -219,7 +219,7 @@ void DivDispatchContainer::clear() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) {
|
void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags, bool isRender) {
|
||||||
// quit if we already initialized
|
// quit if we already initialized
|
||||||
if (dispatch!=NULL) return;
|
if (dispatch!=NULL) return;
|
||||||
|
|
||||||
|
@ -231,33 +231,57 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2612:
|
case DIV_SYSTEM_YM2612:
|
||||||
dispatch=new DivPlatformGenesis;
|
dispatch=new DivPlatformGenesis;
|
||||||
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
||||||
|
}
|
||||||
((DivPlatformGenesis*)dispatch)->setSoftPCM(false);
|
((DivPlatformGenesis*)dispatch)->setSoftPCM(false);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2612_EXT:
|
case DIV_SYSTEM_YM2612_EXT:
|
||||||
dispatch=new DivPlatformGenesisExt;
|
dispatch=new DivPlatformGenesisExt;
|
||||||
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
||||||
|
}
|
||||||
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(false);
|
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(false);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2612_CSM:
|
case DIV_SYSTEM_YM2612_CSM:
|
||||||
dispatch=new DivPlatformGenesisExt;
|
dispatch=new DivPlatformGenesisExt;
|
||||||
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
||||||
|
}
|
||||||
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(false);
|
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(false);
|
||||||
((DivPlatformGenesisExt*)dispatch)->setCSMChannel(6);
|
((DivPlatformGenesisExt*)dispatch)->setCSMChannel(6);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2612_DUALPCM:
|
case DIV_SYSTEM_YM2612_DUALPCM:
|
||||||
dispatch=new DivPlatformGenesis;
|
dispatch=new DivPlatformGenesis;
|
||||||
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformGenesis*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
||||||
|
}
|
||||||
((DivPlatformGenesis*)dispatch)->setSoftPCM(true);
|
((DivPlatformGenesis*)dispatch)->setSoftPCM(true);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2612_DUALPCM_EXT:
|
case DIV_SYSTEM_YM2612_DUALPCM_EXT:
|
||||||
dispatch=new DivPlatformGenesisExt;
|
dispatch=new DivPlatformGenesisExt;
|
||||||
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformGenesisExt*)dispatch)->setYMFM(eng->getConfInt("ym2612Core",0));
|
||||||
|
}
|
||||||
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(true);
|
((DivPlatformGenesisExt*)dispatch)->setSoftPCM(true);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_SMS:
|
case DIV_SYSTEM_SMS:
|
||||||
dispatch=new DivPlatformSMS;
|
dispatch=new DivPlatformSMS;
|
||||||
((DivPlatformSMS*)dispatch)->setNuked(eng->getConfInt("snCore",0));
|
if (isRender) {
|
||||||
|
((DivPlatformSMS*)dispatch)->setNuked(eng->getConfInt("snCoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformSMS*)dispatch)->setNuked(eng->getConfInt("snCore",0));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_GB:
|
case DIV_SYSTEM_GB:
|
||||||
dispatch=new DivPlatformGB;
|
dispatch=new DivPlatformGB;
|
||||||
|
@ -267,39 +291,71 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_NES:
|
case DIV_SYSTEM_NES:
|
||||||
dispatch=new DivPlatformNES;
|
dispatch=new DivPlatformNES;
|
||||||
((DivPlatformNES*)dispatch)->setNSFPlay(eng->getConfInt("nesCore",0)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformNES*)dispatch)->setNSFPlay(eng->getConfInt("nesCoreRender",0)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformNES*)dispatch)->setNSFPlay(eng->getConfInt("nesCore",0)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_C64_6581:
|
case DIV_SYSTEM_C64_6581:
|
||||||
dispatch=new DivPlatformC64;
|
dispatch=new DivPlatformC64;
|
||||||
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64Core",0));
|
||||||
|
}
|
||||||
((DivPlatformC64*)dispatch)->setChipModel(true);
|
((DivPlatformC64*)dispatch)->setChipModel(true);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_C64_8580:
|
case DIV_SYSTEM_C64_8580:
|
||||||
dispatch=new DivPlatformC64;
|
dispatch=new DivPlatformC64;
|
||||||
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64Core",0));
|
if (isRender) {
|
||||||
|
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64CoreRender",0));
|
||||||
|
} else {
|
||||||
|
((DivPlatformC64*)dispatch)->setCore(eng->getConfInt("c64Core",0));
|
||||||
|
}
|
||||||
((DivPlatformC64*)dispatch)->setChipModel(false);
|
((DivPlatformC64*)dispatch)->setChipModel(false);
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2151:
|
case DIV_SYSTEM_YM2151:
|
||||||
dispatch=new DivPlatformArcade;
|
dispatch=new DivPlatformArcade;
|
||||||
((DivPlatformArcade*)dispatch)->setYMFM(eng->getConfInt("arcadeCore",0)==0);
|
if (isRender) {
|
||||||
|
((DivPlatformArcade*)dispatch)->setYMFM(eng->getConfInt("arcadeCoreRender",0)==0);
|
||||||
|
} else {
|
||||||
|
((DivPlatformArcade*)dispatch)->setYMFM(eng->getConfInt("arcadeCore",0)==0);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2610:
|
case DIV_SYSTEM_YM2610:
|
||||||
case DIV_SYSTEM_YM2610_FULL:
|
case DIV_SYSTEM_YM2610_FULL:
|
||||||
dispatch=new DivPlatformYM2610;
|
dispatch=new DivPlatformYM2610;
|
||||||
((DivPlatformYM2610*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2610*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2610*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2610_EXT:
|
case DIV_SYSTEM_YM2610_EXT:
|
||||||
case DIV_SYSTEM_YM2610_FULL_EXT:
|
case DIV_SYSTEM_YM2610_FULL_EXT:
|
||||||
dispatch=new DivPlatformYM2610Ext;
|
dispatch=new DivPlatformYM2610Ext;
|
||||||
((DivPlatformYM2610Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2610Ext*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2610Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2610B:
|
case DIV_SYSTEM_YM2610B:
|
||||||
dispatch=new DivPlatformYM2610B;
|
dispatch=new DivPlatformYM2610B;
|
||||||
((DivPlatformYM2610B*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2610B*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2610B*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2610B_EXT:
|
case DIV_SYSTEM_YM2610B_EXT:
|
||||||
dispatch=new DivPlatformYM2610BExt;
|
dispatch=new DivPlatformYM2610BExt;
|
||||||
((DivPlatformYM2610BExt*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2610BExt*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2610BExt*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_AMIGA:
|
case DIV_SYSTEM_AMIGA:
|
||||||
dispatch=new DivPlatformAmiga;
|
dispatch=new DivPlatformAmiga;
|
||||||
|
@ -312,26 +368,46 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_FDS:
|
case DIV_SYSTEM_FDS:
|
||||||
dispatch=new DivPlatformFDS;
|
dispatch=new DivPlatformFDS;
|
||||||
((DivPlatformFDS*)dispatch)->setNSFPlay(eng->getConfInt("fdsCore",0)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformFDS*)dispatch)->setNSFPlay(eng->getConfInt("fdsCoreRender",0)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformFDS*)dispatch)->setNSFPlay(eng->getConfInt("fdsCore",0)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_TIA:
|
case DIV_SYSTEM_TIA:
|
||||||
dispatch=new DivPlatformTIA;
|
dispatch=new DivPlatformTIA;
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2203:
|
case DIV_SYSTEM_YM2203:
|
||||||
dispatch=new DivPlatformYM2203;
|
dispatch=new DivPlatformYM2203;
|
||||||
((DivPlatformYM2203*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2203*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2203*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2203_EXT:
|
case DIV_SYSTEM_YM2203_EXT:
|
||||||
dispatch=new DivPlatformYM2203Ext;
|
dispatch=new DivPlatformYM2203Ext;
|
||||||
((DivPlatformYM2203Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2203Ext*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2203Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2608:
|
case DIV_SYSTEM_YM2608:
|
||||||
dispatch=new DivPlatformYM2608;
|
dispatch=new DivPlatformYM2608;
|
||||||
((DivPlatformYM2608*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2608*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2608*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_YM2608_EXT:
|
case DIV_SYSTEM_YM2608_EXT:
|
||||||
dispatch=new DivPlatformYM2608Ext;
|
dispatch=new DivPlatformYM2608Ext;
|
||||||
((DivPlatformYM2608Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformYM2608Ext*)dispatch)->setCombo(eng->getConfInt("opnCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformYM2608Ext*)dispatch)->setCombo(eng->getConfInt("opnCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_OPLL:
|
case DIV_SYSTEM_OPLL:
|
||||||
case DIV_SYSTEM_OPLL_DRUMS:
|
case DIV_SYSTEM_OPLL_DRUMS:
|
||||||
|
@ -396,7 +472,11 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_POKEY:
|
case DIV_SYSTEM_POKEY:
|
||||||
dispatch=new DivPlatformPOKEY;
|
dispatch=new DivPlatformPOKEY;
|
||||||
((DivPlatformPOKEY*)dispatch)->setAltASAP(eng->getConfInt("pokeyCore",1)==1);
|
if (isRender) {
|
||||||
|
((DivPlatformPOKEY*)dispatch)->setAltASAP(eng->getConfInt("pokeyCoreRender",1)==1);
|
||||||
|
} else {
|
||||||
|
((DivPlatformPOKEY*)dispatch)->setAltASAP(eng->getConfInt("pokeyCore",1)==1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_QSOUND:
|
case DIV_SYSTEM_QSOUND:
|
||||||
dispatch=new DivPlatformQSound;
|
dispatch=new DivPlatformQSound;
|
||||||
|
|
|
@ -821,6 +821,10 @@ void DivEngine::runExportThread() {
|
||||||
size_t fadeOutSamples=got.rate*exportFadeOut;
|
size_t fadeOutSamples=got.rate*exportFadeOut;
|
||||||
size_t curFadeOutSample=0;
|
size_t curFadeOutSample=0;
|
||||||
bool isFadingOut=false;
|
bool isFadingOut=false;
|
||||||
|
|
||||||
|
quitDispatch();
|
||||||
|
initDispatch(true);
|
||||||
|
|
||||||
switch (exportMode) {
|
switch (exportMode) {
|
||||||
case DIV_EXPORT_MODE_ONE: {
|
case DIV_EXPORT_MODE_ONE: {
|
||||||
SNDFILE* sf;
|
SNDFILE* sf;
|
||||||
|
@ -1144,6 +1148,9 @@ void DivEngine::runExportThread() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quitDispatch();
|
||||||
|
initDispatch(false);
|
||||||
stopExport=false;
|
stopExport=false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -4566,10 +4573,11 @@ void DivEngine::rescanAudioDevices() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivEngine::initDispatch() {
|
void DivEngine::initDispatch(bool isRender) {
|
||||||
BUSY_BEGIN;
|
BUSY_BEGIN;
|
||||||
|
if (isRender) logI("render cores set");
|
||||||
for (int i=0; i<song.systemLen; i++) {
|
for (int i=0; i<song.systemLen; i++) {
|
||||||
disCont[i].init(song.system[i],this,getChannelCount(song.system[i]),got.rate,song.systemFlags[i]);
|
disCont[i].init(song.system[i],this,getChannelCount(song.system[i]),got.rate,song.systemFlags[i],isRender);
|
||||||
disCont[i].setRates(got.rate);
|
disCont[i].setRates(got.rate);
|
||||||
disCont[i].setQuality(lowQuality);
|
disCont[i].setQuality(lowQuality);
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct DivDispatchContainer {
|
||||||
void flush(size_t count);
|
void flush(size_t count);
|
||||||
void fillBuf(size_t runtotal, size_t offset, size_t size);
|
void fillBuf(size_t runtotal, size_t offset, size_t size);
|
||||||
void clear();
|
void clear();
|
||||||
void init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags);
|
void init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags, bool isRender=false);
|
||||||
void quit();
|
void quit();
|
||||||
DivDispatchContainer():
|
DivDispatchContainer():
|
||||||
dispatch(NULL),
|
dispatch(NULL),
|
||||||
|
@ -1132,7 +1132,7 @@ class DivEngine {
|
||||||
TAAudioDesc& getAudioDescGot();
|
TAAudioDesc& getAudioDescGot();
|
||||||
|
|
||||||
// init dispatch
|
// init dispatch
|
||||||
void initDispatch();
|
void initDispatch(bool isRender=false);
|
||||||
|
|
||||||
// quit dispatch
|
// quit dispatch
|
||||||
void quitDispatch();
|
void quitDispatch();
|
||||||
|
|
|
@ -1419,6 +1419,14 @@ class FurnaceGUI {
|
||||||
int c64Core;
|
int c64Core;
|
||||||
int pokeyCore;
|
int pokeyCore;
|
||||||
int opnCore;
|
int opnCore;
|
||||||
|
int arcadeCoreRender;
|
||||||
|
int ym2612CoreRender;
|
||||||
|
int snCoreRender;
|
||||||
|
int nesCoreRender;
|
||||||
|
int fdsCoreRender;
|
||||||
|
int c64CoreRender;
|
||||||
|
int pokeyCoreRender;
|
||||||
|
int opnCoreRender;
|
||||||
int pcSpeakerOutMethod;
|
int pcSpeakerOutMethod;
|
||||||
String yrw801Path;
|
String yrw801Path;
|
||||||
String tg100Path;
|
String tg100Path;
|
||||||
|
|
|
@ -1189,46 +1189,116 @@ void FurnaceGUI::drawSettings() {
|
||||||
CONFIG_SECTION("Emulation") {
|
CONFIG_SECTION("Emulation") {
|
||||||
// SUBSECTION LAYOUT
|
// SUBSECTION LAYOUT
|
||||||
CONFIG_SUBSECTION("Cores");
|
CONFIG_SUBSECTION("Cores");
|
||||||
ImGui::AlignTextToFramePadding();
|
if (ImGui::BeginTable("##Cores",3)) {
|
||||||
ImGui::Text("Arcade/YM2151 core");
|
ImGui::TableSetupColumn("##System",ImGuiTableColumnFlags_WidthFixed);
|
||||||
ImGui::SameLine();
|
ImGui::TableSetupColumn("##PlaybackCores",ImGuiTableColumnFlags_WidthStretch);
|
||||||
ImGui::Combo("##ArcadeCore",&settings.arcadeCore,arcadeCores,2);
|
ImGui::TableSetupColumn("##RenderCores",ImGuiTableColumnFlags_WidthStretch);
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text("System");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text("Playback Core(s)");
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
ImGui::SetTooltip("playback cores are used in real-time, when the program's running");
|
||||||
|
}
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text("Render Core(s)");
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
ImGui::SetTooltip("render cores are used for audio exporting");
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("Genesis/YM2612 core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##YM2612Core",&settings.ym2612Core,ym2612Cores,2);
|
ImGui::Text("Arcade/YM2151");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##ArcadeCore",&settings.arcadeCore,arcadeCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##ArcadeCoreRender",&settings.arcadeCoreRender,arcadeCores,2);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("SN76489 core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##SNCore",&settings.snCore,snCores,2);
|
ImGui::Text("Genesis/YM2612");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##YM2612Core",&settings.ym2612Core,ym2612Cores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##YM2612CoreRender",&settings.ym2612CoreRender,ym2612Cores,2);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("NES core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##NESCore",&settings.nesCore,nesCores,2);
|
ImGui::Text("SN76489");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##SNCore",&settings.snCore,snCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##SNCoreRender",&settings.snCoreRender,snCores,2);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("FDS core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##FDSCore",&settings.fdsCore,nesCores,2);
|
ImGui::Text("NES");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##NESCore",&settings.nesCore,nesCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##NESCoreRender",&settings.nesCoreRender,nesCores,2);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("SID core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##C64Core",&settings.c64Core,c64Cores,3);
|
ImGui::Text("FDS");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##FDSCore",&settings.fdsCore,nesCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##FDSCoreRender",&settings.fdsCoreRender,nesCores,2);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("POKEY core");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##POKEYCore",&settings.pokeyCore,pokeyCores,2);
|
ImGui::Text("SID");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##C64Core",&settings.c64Core,c64Cores,3);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##C64CoreRender",&settings.c64CoreRender,c64Cores,3);
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::TableNextRow();
|
||||||
ImGui::Text("OPN/OPNA/OPNB cores");
|
ImGui::TableNextColumn();
|
||||||
ImGui::SameLine();
|
ImGui::AlignTextToFramePadding();
|
||||||
ImGui::Combo("##OPNCore",&settings.opnCore,opnCores,2);
|
ImGui::Text("POKEY");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##POKEYCore",&settings.pokeyCore,pokeyCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##POKEYCoreRender",&settings.pokeyCoreRender,pokeyCores,2);
|
||||||
|
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::AlignTextToFramePadding();
|
||||||
|
ImGui::Text("OPN/OPNA/OPNB");
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##OPNCore",&settings.opnCore,opnCores,2);
|
||||||
|
ImGui::TableNextColumn();
|
||||||
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x);
|
||||||
|
ImGui::Combo("##OPNCoreRender",&settings.opnCoreRender,opnCores,2);
|
||||||
|
ImGui::EndTable();
|
||||||
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
ImGui::AlignTextToFramePadding();
|
ImGui::AlignTextToFramePadding();
|
||||||
|
@ -2938,6 +3008,14 @@ void FurnaceGUI::syncSettings() {
|
||||||
settings.c64Core=e->getConfInt("c64Core",0);
|
settings.c64Core=e->getConfInt("c64Core",0);
|
||||||
settings.pokeyCore=e->getConfInt("pokeyCore",1);
|
settings.pokeyCore=e->getConfInt("pokeyCore",1);
|
||||||
settings.opnCore=e->getConfInt("opnCore",1);
|
settings.opnCore=e->getConfInt("opnCore",1);
|
||||||
|
settings.arcadeCoreRender=e->getConfInt("arcadeCoreRender",0);
|
||||||
|
settings.ym2612CoreRender=e->getConfInt("ym2612CoreRender",0);
|
||||||
|
settings.snCoreRender=e->getConfInt("snCoreRender",0);
|
||||||
|
settings.nesCoreRender=e->getConfInt("nesCoreRender",0);
|
||||||
|
settings.fdsCoreRender=e->getConfInt("fdsCoreRender",0);
|
||||||
|
settings.c64CoreRender=e->getConfInt("c64CoreRender",0);
|
||||||
|
settings.pokeyCoreRender=e->getConfInt("pokeyCoreRender",1);
|
||||||
|
settings.opnCoreRender=e->getConfInt("opnCoreRender",1);
|
||||||
settings.pcSpeakerOutMethod=e->getConfInt("pcSpeakerOutMethod",0);
|
settings.pcSpeakerOutMethod=e->getConfInt("pcSpeakerOutMethod",0);
|
||||||
settings.yrw801Path=e->getConfString("yrw801Path","");
|
settings.yrw801Path=e->getConfString("yrw801Path","");
|
||||||
settings.tg100Path=e->getConfString("tg100Path","");
|
settings.tg100Path=e->getConfString("tg100Path","");
|
||||||
|
@ -3098,6 +3176,14 @@ void FurnaceGUI::syncSettings() {
|
||||||
clampSetting(settings.c64Core,0,2);
|
clampSetting(settings.c64Core,0,2);
|
||||||
clampSetting(settings.pokeyCore,0,1);
|
clampSetting(settings.pokeyCore,0,1);
|
||||||
clampSetting(settings.opnCore,0,1);
|
clampSetting(settings.opnCore,0,1);
|
||||||
|
clampSetting(settings.arcadeCoreRender,0,1);
|
||||||
|
clampSetting(settings.ym2612CoreRender,0,1);
|
||||||
|
clampSetting(settings.snCoreRender,0,1);
|
||||||
|
clampSetting(settings.nesCoreRender,0,1);
|
||||||
|
clampSetting(settings.fdsCoreRender,0,1);
|
||||||
|
clampSetting(settings.c64CoreRender,0,2);
|
||||||
|
clampSetting(settings.pokeyCoreRender,0,1);
|
||||||
|
clampSetting(settings.opnCoreRender,0,1);
|
||||||
clampSetting(settings.pcSpeakerOutMethod,0,4);
|
clampSetting(settings.pcSpeakerOutMethod,0,4);
|
||||||
clampSetting(settings.mainFont,0,6);
|
clampSetting(settings.mainFont,0,6);
|
||||||
clampSetting(settings.patFont,0,6);
|
clampSetting(settings.patFont,0,6);
|
||||||
|
@ -3287,7 +3373,15 @@ void FurnaceGUI::commitSettings() {
|
||||||
settings.fdsCore!=e->getConfInt("fdsCore",0) ||
|
settings.fdsCore!=e->getConfInt("fdsCore",0) ||
|
||||||
settings.c64Core!=e->getConfInt("c64Core",0) ||
|
settings.c64Core!=e->getConfInt("c64Core",0) ||
|
||||||
settings.pokeyCore!=e->getConfInt("pokeyCore",1) ||
|
settings.pokeyCore!=e->getConfInt("pokeyCore",1) ||
|
||||||
settings.opnCore!=e->getConfInt("opnCore",1)
|
settings.opnCore!=e->getConfInt("opnCore",1) ||
|
||||||
|
settings.arcadeCoreRender!=e->getConfInt("arcadeCoreRender",0) ||
|
||||||
|
settings.ym2612CoreRender!=e->getConfInt("ym2612CoreRender",0) ||
|
||||||
|
settings.snCoreRender!=e->getConfInt("snCoreRender",0) ||
|
||||||
|
settings.nesCoreRender!=e->getConfInt("nesCoreRender",0) ||
|
||||||
|
settings.fdsCoreRender!=e->getConfInt("fdsCoreRender",0) ||
|
||||||
|
settings.c64CoreRender!=e->getConfInt("c64CoreRender",0) ||
|
||||||
|
settings.pokeyCoreRender!=e->getConfInt("pokeyCoreRender",1) ||
|
||||||
|
settings.opnCoreRender!=e->getConfInt("opnCoreRender",1)
|
||||||
);
|
);
|
||||||
|
|
||||||
e->setConf("mainFontSize",settings.mainFontSize);
|
e->setConf("mainFontSize",settings.mainFontSize);
|
||||||
|
@ -3312,6 +3406,14 @@ void FurnaceGUI::commitSettings() {
|
||||||
e->setConf("c64Core",settings.c64Core);
|
e->setConf("c64Core",settings.c64Core);
|
||||||
e->setConf("pokeyCore",settings.pokeyCore);
|
e->setConf("pokeyCore",settings.pokeyCore);
|
||||||
e->setConf("opnCore",settings.opnCore);
|
e->setConf("opnCore",settings.opnCore);
|
||||||
|
e->setConf("arcadeCoreRender",settings.arcadeCoreRender);
|
||||||
|
e->setConf("ym2612CoreRender",settings.ym2612CoreRender);
|
||||||
|
e->setConf("snCoreRender",settings.snCoreRender);
|
||||||
|
e->setConf("nesCoreRender",settings.nesCoreRender);
|
||||||
|
e->setConf("fdsCoreRender",settings.fdsCoreRender);
|
||||||
|
e->setConf("c64CoreRender",settings.c64CoreRender);
|
||||||
|
e->setConf("pokeyCoreRender",settings.pokeyCoreRender);
|
||||||
|
e->setConf("opnCoreRender",settings.opnCoreRender);
|
||||||
e->setConf("pcSpeakerOutMethod",settings.pcSpeakerOutMethod);
|
e->setConf("pcSpeakerOutMethod",settings.pcSpeakerOutMethod);
|
||||||
e->setConf("yrw801Path",settings.yrw801Path);
|
e->setConf("yrw801Path",settings.yrw801Path);
|
||||||
e->setConf("tg100Path",settings.tg100Path);
|
e->setConf("tg100Path",settings.tg100Path);
|
||||||
|
|
Loading…
Reference in a new issue