Compare commits
8 Commits
35aeb51b79
...
65cd433ac7
Author | SHA1 | Date |
---|---|---|
tildearrow | 65cd433ac7 | |
tildearrow | 5a9402abcd | |
tildearrow | fa7405090e | |
tildearrow | be38b992e3 | |
tildearrow | addbc986f0 | |
Eknous | 914855d751 | |
Eknous-P | 2a370dbb1f | |
tildearrow | b315b84e31 |
|
@ -21,6 +21,9 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "../ta-log.h"
|
#include "../ta-log.h"
|
||||||
#include "pa.h"
|
#include "pa.h"
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <pa_win_wasapi.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int taPAProcess(const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags flags, void* inst) {
|
int taPAProcess(const void* in, void* out, unsigned long nframes, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags flags, void* inst) {
|
||||||
TAAudioPA* instance=(TAAudioPA*)inst;
|
TAAudioPA* instance=(TAAudioPA*)inst;
|
||||||
|
@ -117,8 +120,18 @@ std::vector<String> TAAudioPA::listAudioDevices() {
|
||||||
if (devInfo==NULL) continue;
|
if (devInfo==NULL) continue;
|
||||||
if (devInfo->maxOutputChannels<1) continue;
|
if (devInfo->maxOutputChannels<1) continue;
|
||||||
|
|
||||||
|
String devName;
|
||||||
|
|
||||||
|
const PaHostApiInfo* driverInfo=Pa_GetHostApiInfo(devInfo->hostApi);
|
||||||
|
if (driverInfo==NULL) {
|
||||||
|
devName+="[???] ";
|
||||||
|
} else {
|
||||||
|
devName+=fmt::sprintf("[%s] ",driverInfo->name);
|
||||||
|
}
|
||||||
|
|
||||||
if (devInfo->name!=NULL) {
|
if (devInfo->name!=NULL) {
|
||||||
ret.push_back(String(devInfo->name));
|
devName+=devInfo->name;
|
||||||
|
ret.push_back(devName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,11 +159,15 @@ bool TAAudioPA::init(TAAudioDesc& request, TAAudioDesc& response) {
|
||||||
desc.outFormat=TA_AUDIO_FORMAT_F32;
|
desc.outFormat=TA_AUDIO_FORMAT_F32;
|
||||||
|
|
||||||
const PaDeviceInfo* devInfo=NULL;
|
const PaDeviceInfo* devInfo=NULL;
|
||||||
|
const PaHostApiInfo* driverInfo=NULL;
|
||||||
int outDeviceID=0;
|
int outDeviceID=0;
|
||||||
|
|
||||||
if (desc.deviceName.empty()) {
|
if (desc.deviceName.empty()) {
|
||||||
outDeviceID=Pa_GetDefaultOutputDevice();
|
outDeviceID=Pa_GetDefaultOutputDevice();
|
||||||
devInfo=Pa_GetDeviceInfo(outDeviceID);
|
devInfo=Pa_GetDeviceInfo(outDeviceID);
|
||||||
|
if (devInfo!=NULL) {
|
||||||
|
driverInfo=Pa_GetHostApiInfo(devInfo->hostApi);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int count=Pa_GetDeviceCount();
|
int count=Pa_GetDeviceCount();
|
||||||
bool found=false;
|
bool found=false;
|
||||||
|
@ -164,12 +181,25 @@ bool TAAudioPA::init(TAAudioDesc& request, TAAudioDesc& response) {
|
||||||
if (devInfo==NULL) continue;
|
if (devInfo==NULL) continue;
|
||||||
if (devInfo->maxOutputChannels<1) continue;
|
if (devInfo->maxOutputChannels<1) continue;
|
||||||
|
|
||||||
|
String devName;
|
||||||
|
|
||||||
|
driverInfo=Pa_GetHostApiInfo(devInfo->hostApi);
|
||||||
|
if (driverInfo==NULL) {
|
||||||
|
devName+="[???] ";
|
||||||
|
} else {
|
||||||
|
devName+=fmt::sprintf("[%s] ",driverInfo->name);
|
||||||
|
}
|
||||||
|
|
||||||
if (devInfo->name!=NULL) {
|
if (devInfo->name!=NULL) {
|
||||||
if (strcmp(devInfo->name,desc.deviceName.c_str())==0) {
|
devName+=devInfo->name;
|
||||||
outDeviceID=i;
|
} else {
|
||||||
found=true;
|
continue;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
if (devName==desc.deviceName) {
|
||||||
|
outDeviceID=i;
|
||||||
|
found=true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
|
@ -190,6 +220,29 @@ bool TAAudioPA::init(TAAudioDesc& request, TAAudioDesc& response) {
|
||||||
outParams.suggestedLatency=(double)(desc.bufsize*desc.fragments)/desc.rate;
|
outParams.suggestedLatency=(double)(desc.bufsize*desc.fragments)/desc.rate;
|
||||||
outParams.hostApiSpecificStreamInfo=NULL;
|
outParams.hostApiSpecificStreamInfo=NULL;
|
||||||
|
|
||||||
|
if (driverInfo!=NULL) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (driverInfo->type==paWASAPI) {
|
||||||
|
logV("setting WASAPI-specific flags");
|
||||||
|
PaWasapiStreamInfo* wasapiInfo=new PaWasapiStreamInfo;
|
||||||
|
memset(wasapiInfo,0,sizeof(PaWasapiStreamInfo));
|
||||||
|
wasapiInfo->size=sizeof(PaWasapiStreamInfo);
|
||||||
|
wasapiInfo->hostApiType=paWASAPI;
|
||||||
|
wasapiInfo->version=1;
|
||||||
|
wasapiInfo->flags=paWinWasapiThreadPriority;
|
||||||
|
wasapiInfo->threadPriority=eThreadPriorityProAudio;
|
||||||
|
wasapiInfo->streamCategory=eAudioCategoryMedia;
|
||||||
|
wasapiInfo->streamOption=eStreamOptionRaw;
|
||||||
|
|
||||||
|
if (desc.wasapiEx) {
|
||||||
|
wasapiInfo->flags|=paWinWasapiExclusive;
|
||||||
|
}
|
||||||
|
|
||||||
|
outParams.hostApiSpecificStreamInfo=wasapiInfo;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
logV("opening audio device...");
|
logV("opening audio device...");
|
||||||
status=Pa_OpenStream(
|
status=Pa_OpenStream(
|
||||||
&ac,
|
&ac,
|
||||||
|
|
|
@ -58,13 +58,16 @@ struct TAAudioDesc {
|
||||||
unsigned char inChans, outChans;
|
unsigned char inChans, outChans;
|
||||||
TAAudioFormat outFormat;
|
TAAudioFormat outFormat;
|
||||||
|
|
||||||
|
bool wasapiEx;
|
||||||
|
|
||||||
TAAudioDesc():
|
TAAudioDesc():
|
||||||
rate(0.0),
|
rate(0.0),
|
||||||
bufsize(0),
|
bufsize(0),
|
||||||
fragments(0),
|
fragments(0),
|
||||||
inChans(0),
|
inChans(0),
|
||||||
outChans(0),
|
outChans(0),
|
||||||
outFormat(TA_AUDIO_FORMAT_F32) {}
|
outFormat(TA_AUDIO_FORMAT_F32),
|
||||||
|
wasapiEx(false) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3370,6 +3370,7 @@ bool DivEngine::initAudioBackend() {
|
||||||
want.inChans=0;
|
want.inChans=0;
|
||||||
want.outChans=getConfInt("audioChans",2);
|
want.outChans=getConfInt("audioChans",2);
|
||||||
want.outFormat=TA_AUDIO_FORMAT_F32;
|
want.outFormat=TA_AUDIO_FORMAT_F32;
|
||||||
|
want.wasapiEx=getConfInt("wasapiEx",0);
|
||||||
want.name="Furnace";
|
want.name="Furnace";
|
||||||
|
|
||||||
if (want.outChans<1) want.outChans=1;
|
if (want.outChans<1) want.outChans=1;
|
||||||
|
|
|
@ -732,10 +732,8 @@ void DivPlatformGenesisExt::forceIns() {
|
||||||
if (i==2 && extMode) { // extended channel
|
if (i==2 && extMode) { // extended channel
|
||||||
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
||||||
rWrite(baseAddr+0x40,127);
|
rWrite(baseAddr+0x40,127);
|
||||||
} else if (KVS(i,j)) {
|
|
||||||
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
|
|
|
@ -627,10 +627,8 @@ void DivPlatformYM2203Ext::forceIns() {
|
||||||
if (i==2 && extMode) { // extended channel
|
if (i==2 && extMode) { // extended channel
|
||||||
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
||||||
rWrite(baseAddr+0x40,127);
|
rWrite(baseAddr+0x40,127);
|
||||||
} else if (KVS(i,j)) {
|
|
||||||
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMuted[i]) {
|
if (isMuted[i]) {
|
||||||
|
|
|
@ -676,10 +676,8 @@ void DivPlatformYM2608Ext::forceIns() {
|
||||||
if (i==2 && extMode) { // extended channel
|
if (i==2 && extMode) { // extended channel
|
||||||
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
||||||
rWrite(baseAddr+0x40,127);
|
rWrite(baseAddr+0x40,127);
|
||||||
} else if (KVS(i,j)) {
|
|
||||||
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMuted[i] || !op.enable) {
|
if (isMuted[i] || !op.enable) {
|
||||||
|
|
|
@ -671,10 +671,8 @@ void DivPlatformYM2610BExt::forceIns() {
|
||||||
if (i==extChanOffs && extMode) { // extended channel
|
if (i==extChanOffs && extMode) { // extended channel
|
||||||
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
||||||
rWrite(baseAddr+0x40,127);
|
rWrite(baseAddr+0x40,127);
|
||||||
} else if (KVS(i,j)) {
|
|
||||||
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMuted[i] || !op.enable) {
|
if (isMuted[i] || !op.enable) {
|
||||||
|
|
|
@ -671,10 +671,8 @@ void DivPlatformYM2610Ext::forceIns() {
|
||||||
if (i==extChanOffs && extMode) { // extended channel
|
if (i==extChanOffs && extMode) { // extended channel
|
||||||
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
if (isOpMuted[orderedOps[j]] || !op.enable) {
|
||||||
rWrite(baseAddr+0x40,127);
|
rWrite(baseAddr+0x40,127);
|
||||||
} else if (KVS(i,j)) {
|
|
||||||
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
|
||||||
} else {
|
} else {
|
||||||
rWrite(baseAddr+0x40,op.tl);
|
rWrite(baseAddr+0x40,127-VOL_SCALE_LOG_BROKEN(127-op.tl,opChan[orderedOps[j]].outVol&0x7f,127));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (isMuted[i] || !op.enable) {
|
if (isMuted[i] || !op.enable) {
|
||||||
|
|
|
@ -2080,8 +2080,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
|
||||||
}
|
}
|
||||||
|
|
||||||
//logD("attempts: %d",attempts);
|
//logD("attempts: %d",attempts);
|
||||||
if (attempts>=(int)size) {
|
if (attempts>=(int)(size+10)) {
|
||||||
logE("hang detected! stopping! at %d seconds %d micro",totalSeconds,totalTicks);
|
logE("hang detected! stopping! at %d seconds %d micro (%d>=%d)",totalSeconds,totalTicks,attempts,(int)size);
|
||||||
freelance=false;
|
freelance=false;
|
||||||
playing=false;
|
playing=false;
|
||||||
extValuePresent=false;
|
extValuePresent=false;
|
||||||
|
|
|
@ -1571,6 +1571,7 @@ class FurnaceGUI {
|
||||||
int centerPopup;
|
int centerPopup;
|
||||||
int insIconsStyle;
|
int insIconsStyle;
|
||||||
int classicChipOptions;
|
int classicChipOptions;
|
||||||
|
int wasapiEx;
|
||||||
unsigned int maxUndoSteps;
|
unsigned int maxUndoSteps;
|
||||||
String mainFontPath;
|
String mainFontPath;
|
||||||
String headFontPath;
|
String headFontPath;
|
||||||
|
@ -1745,6 +1746,7 @@ class FurnaceGUI {
|
||||||
centerPopup(1),
|
centerPopup(1),
|
||||||
insIconsStyle(1),
|
insIconsStyle(1),
|
||||||
classicChipOptions(0),
|
classicChipOptions(0),
|
||||||
|
wasapiEx(0),
|
||||||
maxUndoSteps(100),
|
maxUndoSteps(100),
|
||||||
mainFontPath(""),
|
mainFontPath(""),
|
||||||
headFontPath(""),
|
headFontPath(""),
|
||||||
|
|
|
@ -749,6 +749,7 @@ void FurnaceGUI::drawSettings() {
|
||||||
#endif
|
#endif
|
||||||
if (settings.audioEngine!=prevAudioEngine) {
|
if (settings.audioEngine!=prevAudioEngine) {
|
||||||
audioEngineChanged=true;
|
audioEngineChanged=true;
|
||||||
|
settings.audioDevice="";
|
||||||
if (!isProAudio[settings.audioEngine]) settings.audioChans=2;
|
if (!isProAudio[settings.audioEngine]) settings.audioChans=2;
|
||||||
}
|
}
|
||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
|
@ -871,11 +872,11 @@ void FurnaceGUI::drawSettings() {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool lowLatencyB=settings.lowLatency;
|
bool lowLatencyB=settings.lowLatency;
|
||||||
if (ImGui::Checkbox("Low-latency mode (experimental!)",&lowLatencyB)) {
|
if (ImGui::Checkbox("Low-latency mode",&lowLatencyB)) {
|
||||||
settings.lowLatency=lowLatencyB;
|
settings.lowLatency=lowLatencyB;
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip("reduces latency by running the engine faster than the tick rate.\nuseful for live playback/jam mode.\n\nwarning: experimental! may produce glitches.\nonly enable if your buffer size is small (10ms or less).");
|
ImGui::SetTooltip("reduces latency by running the engine faster than the tick rate.\nuseful for live playback/jam mode.\n\nwarning: nonly enable if your buffer size is small (10ms or less).");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool forceMonoB=settings.forceMono;
|
bool forceMonoB=settings.forceMono;
|
||||||
|
@ -883,6 +884,15 @@ void FurnaceGUI::drawSettings() {
|
||||||
settings.forceMono=forceMonoB;
|
settings.forceMono=forceMonoB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.audioEngine==DIV_AUDIO_PORTAUDIO) {
|
||||||
|
if (settings.audioDevice.find("[Windows WASAPI] ")==0) {
|
||||||
|
bool wasapiExB=settings.wasapiEx;
|
||||||
|
if (ImGui::Checkbox("Exclusive mode",&wasapiExB)) {
|
||||||
|
settings.wasapiEx=wasapiExB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TAAudioDesc& audioWant=e->getAudioDescWant();
|
TAAudioDesc& audioWant=e->getAudioDescWant();
|
||||||
TAAudioDesc& audioGot=e->getAudioDescGot();
|
TAAudioDesc& audioGot=e->getAudioDescGot();
|
||||||
|
|
||||||
|
@ -3251,6 +3261,7 @@ void FurnaceGUI::syncSettings() {
|
||||||
settings.centerPopup=e->getConfInt("centerPopup",1);
|
settings.centerPopup=e->getConfInt("centerPopup",1);
|
||||||
settings.insIconsStyle=e->getConfInt("insIconsStyle",1);
|
settings.insIconsStyle=e->getConfInt("insIconsStyle",1);
|
||||||
settings.classicChipOptions=e->getConfInt("classicChipOptions",0);
|
settings.classicChipOptions=e->getConfInt("classicChipOptions",0);
|
||||||
|
settings.wasapiEx=e->getConfInt("wasapiEx",0);
|
||||||
|
|
||||||
clampSetting(settings.mainFontSize,2,96);
|
clampSetting(settings.mainFontSize,2,96);
|
||||||
clampSetting(settings.headFontSize,2,96);
|
clampSetting(settings.headFontSize,2,96);
|
||||||
|
@ -3398,6 +3409,7 @@ void FurnaceGUI::syncSettings() {
|
||||||
clampSetting(settings.centerPopup,0,1);
|
clampSetting(settings.centerPopup,0,1);
|
||||||
clampSetting(settings.insIconsStyle,0,2);
|
clampSetting(settings.insIconsStyle,0,2);
|
||||||
clampSetting(settings.classicChipOptions,0,1);
|
clampSetting(settings.classicChipOptions,0,1);
|
||||||
|
clampSetting(settings.wasapiEx,0,1);
|
||||||
|
|
||||||
if (settings.exportLoops<0.0) settings.exportLoops=0.0;
|
if (settings.exportLoops<0.0) settings.exportLoops=0.0;
|
||||||
if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0;
|
if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0;
|
||||||
|
@ -3652,6 +3664,7 @@ void FurnaceGUI::commitSettings() {
|
||||||
e->setConf("centerPopup",settings.centerPopup);
|
e->setConf("centerPopup",settings.centerPopup);
|
||||||
e->setConf("insIconsStyle",settings.insIconsStyle);
|
e->setConf("insIconsStyle",settings.insIconsStyle);
|
||||||
e->setConf("classicChipOptions",settings.classicChipOptions);
|
e->setConf("classicChipOptions",settings.classicChipOptions);
|
||||||
|
e->setConf("wasapiEx",settings.wasapiEx);
|
||||||
|
|
||||||
// colors
|
// colors
|
||||||
for (int i=0; i<GUI_COLOR_MAX; i++) {
|
for (int i=0; i<GUI_COLOR_MAX; i++) {
|
||||||
|
|
|
@ -55,10 +55,10 @@ const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) {
|
||||||
return "2A03";
|
return "2A03";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_C64_6581:
|
case DIV_SYSTEM_C64_6581:
|
||||||
return "MOS 6581";
|
return "6581";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_C64_8580:
|
case DIV_SYSTEM_C64_8580:
|
||||||
return "MOS 8580";
|
return "8580";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_Y8950:
|
case DIV_SYSTEM_Y8950:
|
||||||
case DIV_SYSTEM_Y8950_DRUMS:
|
case DIV_SYSTEM_Y8950_DRUMS:
|
||||||
|
@ -137,8 +137,8 @@ const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) {
|
||||||
case DIV_SYSTEM_YM2608_EXT:
|
case DIV_SYSTEM_YM2608_EXT:
|
||||||
return "YM2608";
|
return "YM2608";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_OPL:
|
case DIV_SYSTEM_OPLL:
|
||||||
case DIV_SYSTEM_OPL_DRUMS:{
|
case DIV_SYSTEM_OPLL_DRUMS:{
|
||||||
int patchSet=flags.getInt("patchSet",0);
|
int patchSet=flags.getInt("patchSet",0);
|
||||||
if (patchSet==1) {
|
if (patchSet==1) {
|
||||||
return "YMF281";
|
return "YMF281";
|
||||||
|
@ -210,9 +210,9 @@ const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) {
|
||||||
case DIV_SYSTEM_YM2610_FULL_EXT:
|
case DIV_SYSTEM_YM2610_FULL_EXT:
|
||||||
return "YM2610";
|
return "YM2610";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_OPLL:
|
case DIV_SYSTEM_OPL:
|
||||||
case DIV_SYSTEM_OPLL_DRUMS:
|
case DIV_SYSTEM_OPL_DRUMS:
|
||||||
return "YM2413";
|
return "YM3526";
|
||||||
break;
|
break;
|
||||||
case DIV_SYSTEM_QSOUND:
|
case DIV_SYSTEM_QSOUND:
|
||||||
return "QSound";
|
return "QSound";
|
||||||
|
@ -274,6 +274,9 @@ const char* FurnaceGUI::getSystemPartNumber(DivSystem sys, DivConfig& flags) {
|
||||||
case DIV_SYSTEM_C140:
|
case DIV_SYSTEM_C140:
|
||||||
return "C140";
|
return "C140";
|
||||||
break;
|
break;
|
||||||
|
case DIV_SYSTEM_C219:
|
||||||
|
return "C219";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return FurnaceGUI::getSystemName(sys);
|
return FurnaceGUI::getSystemName(sys);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue