From 3ba87562ea2d94e53d71a0414a7af057124670fe Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 26 Nov 2022 21:06:31 -0500 Subject: [PATCH 1/5] load .dmp Arcade inses as OPM --- src/engine/fileOpsIns.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/fileOpsIns.cpp b/src/engine/fileOpsIns.cpp index b83a6b48..42723c0d 100644 --- a/src/engine/fileOpsIns.cpp +++ b/src/engine/fileOpsIns.cpp @@ -147,7 +147,7 @@ void DivEngine::loadDMP(SafeReader& reader, std::vector& ret, St logD("instrument type is C64"); break; case 8: // Arcade - ins->type=DIV_INS_FM; + ins->type=DIV_INS_OPM; logD("instrument type is Arcade"); break; case 9: // Neo Geo From 3a9349d49a86e7e27aa833a3e666b6f1b17d686b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 26 Nov 2022 22:11:49 -0500 Subject: [PATCH 2/5] chip sample selection, part 3 --- src/engine/dispatch.h | 7 +++++++ src/engine/platform/abstract.cpp | 5 +++++ src/engine/platform/msm6258.cpp | 2 ++ src/engine/platform/msm6295.cpp | 2 ++ src/engine/platform/nes.cpp | 4 +++- src/engine/platform/opl.cpp | 2 ++ src/engine/platform/qsound.cpp | 2 ++ src/engine/platform/rf5c68.cpp | 2 ++ src/engine/platform/snes.cpp | 2 ++ src/engine/platform/su.cpp | 2 ++ src/engine/platform/x1_010.cpp | 2 ++ src/engine/platform/ym2608.cpp | 2 ++ src/engine/platform/ym2610shared.h | 8 ++++++-- src/engine/platform/ymz280b.cpp | 2 ++ src/gui/sampleEdit.cpp | 31 +++++++++++++++++++++++++++++- 15 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index da52342f..83c3f7ba 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -532,6 +532,13 @@ class DivDispatch { */ virtual size_t getSampleMemCapacity(int index = 0); + /** + * get sample memory name. + * @param index the memory index. + * @return a name, or NULL if it doesn't have any name in particular. + */ + virtual const char* getSampleMemName(int index=0); + /** * Get sample memory usage. * @param index the memory index. diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 9b5c377c..cc7663b8 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -152,11 +152,16 @@ size_t DivDispatch::getSampleMemCapacity(int index) { return 0; } +const char* DivDispatch::getSampleMemName(int index) { + return NULL; +} + size_t DivDispatch::getSampleMemUsage(int index) { return 0; } bool DivDispatch::isSampleLoaded(int index, int sample) { + printf("you are calling.\n"); return false; } diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index a5e0192f..0a84a2d0 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -370,6 +370,7 @@ bool DivPlatformMSM6258::isSampleLoaded(int index, int sample) { void DivPlatformMSM6258::renderSamples() { memset(adpcmMem,0,getSampleMemCapacity(0)); + memset(sampleLoaded,0,256*sizeof(bool)); // sample data size_t memPos=0; @@ -387,6 +388,7 @@ void DivPlatformMSM6258::renderSamples() { logW("out of ADPCM memory for sample %d!",i); } else { memcpy(adpcmMem+memPos,s->dataVOX,paddedLen); + sampleLoaded[i]=true; } memPos+=paddedLen; } diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 3c590e1b..67bf8dc5 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -346,6 +346,7 @@ void DivPlatformMSM6295::renderSamples() { memset(adpcmMem,0,getSampleMemCapacity(0)); memset(sampleOffVOX,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); // sample data size_t memPos=128*8; @@ -363,6 +364,7 @@ void DivPlatformMSM6295::renderSamples() { logW("out of ADPCM memory for sample %d!",i); } else { memcpy(adpcmMem+memPos,s->dataVOX,paddedLen); + sampleLoaded[i]=true; } sampleOffVOX[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index 4ed958f3..cafc16d8 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -728,7 +728,8 @@ bool DivPlatformNES::isSampleLoaded(int index, int sample) { } void DivPlatformNES::renderSamples() { - memset(dpcmMem,0,getSampleMemCapacity(0)); + memset(dpcmMem,0,getSampleMemCapacity(0));\ + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -750,6 +751,7 @@ void DivPlatformNES::renderSamples() { logW("out of DPCM memory for sample %d!",i); } else { memcpy(dpcmMem+memPos,s->dataDPCM,MIN(s->lengthDPCM,paddedLen)); + sampleLoaded[i]=true; } sampleOffDPCM[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index b4446657..01cadfa7 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1767,6 +1767,7 @@ void DivPlatformOPL::renderSamples() { if (adpcmChan<0) return; memset(adpcmBMem,0,getSampleMemCapacity(0)); memset(sampleOffB,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -1784,6 +1785,7 @@ void DivPlatformOPL::renderSamples() { logW("out of ADPCM memory for sample %d!",i); } else { memcpy(adpcmBMem+memPos,s->dataB,paddedLen); + sampleLoaded[i]=true; } sampleOffB[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 97cf3f39..afede642 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -653,6 +653,7 @@ bool DivPlatformQSound::isSampleLoaded(int index, int sample) { // TODO: ADPCM... come on... void DivPlatformQSound::renderSamples() { memset(sampleMem,0,getSampleMemCapacity()); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -677,6 +678,7 @@ void DivPlatformQSound::renderSamples() { for (int i=0; idata8[i]; } + sampleLoaded[i]=true; } offPCM[i]=memPos^0x8000; memPos+=length+16; diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index eec62f5b..cde6127d 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -394,6 +394,7 @@ bool DivPlatformRF5C68::isSampleLoaded(int index, int sample) { void DivPlatformRF5C68::renderSamples() { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOffRFC,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -418,6 +419,7 @@ void DivPlatformRF5C68::renderSamples() { } // align memPos to 256-byte boundary memPos=(memPos+0xff)&~0xff; + sampleLoaded[i]=true; } sampleMemLen=memPos; } diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 8ab24dda..cc37dfc5 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -806,6 +806,7 @@ bool DivPlatformSNES::isSampleLoaded(int index, int sample) { void DivPlatformSNES::renderSamples() { memset(copyOfSampleMem,0,getSampleMemCapacity()); memset(sampleOff,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); // skip past sample table and wavetable buffer size_t memPos=sampleTableBase+8*4+8*9*16; @@ -828,6 +829,7 @@ void DivPlatformSNES::renderSamples() { logW("out of BRR memory for sample %d!",i); break; } + sampleLoaded[i]=true; } sampleMemLen=memPos; memcpy(sampleMem,copyOfSampleMem,65536); diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 6833eac1..c1330cd2 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -556,6 +556,7 @@ bool DivPlatformSoundUnit::isSampleLoaded(int index, int sample) { void DivPlatformSoundUnit::renderSamples() { memset(su->pcm,0,getSampleMemCapacity(0)); memset(sampleOffSU,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -571,6 +572,7 @@ void DivPlatformSoundUnit::renderSamples() { logW("out of PCM memory for sample %d!",i); } else { memcpy(su->pcm+memPos,s->data8,paddedLen); + sampleLoaded[i]=true; } sampleOffSU[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index f017d6c3..ea4177a9 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -958,6 +958,7 @@ bool DivPlatformX1_010::isSampleLoaded(int index, int sample) { void DivPlatformX1_010::renderSamples() { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOffX1,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -981,6 +982,7 @@ void DivPlatformX1_010::renderSamples() { logW("out of X1-010 memory for sample %d!",i); } else { memcpy(sampleMem+memPos,s->data8,paddedLen); + sampleLoaded[i]=true; } sampleOffX1[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 2995c6da..09eb8ac3 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1345,6 +1345,7 @@ bool DivPlatformYM2608::isSampleLoaded(int index, int sample) { void DivPlatformYM2608::renderSamples() { memset(adpcmBMem,0,getSampleMemCapacity(0)); memset(sampleOffB,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -1362,6 +1363,7 @@ void DivPlatformYM2608::renderSamples() { logW("out of ADPCM memory for sample %d!",i); } else { memcpy(adpcmBMem+memPos,s->dataB,paddedLen); + sampleLoaded[i]=true; } sampleOffB[i]=memPos; memPos+=paddedLen; diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index 6dd3bbba..b9f939b4 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -206,6 +206,10 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { return index == 0 ? 16777216 : index == 1 ? 16777216 : 0; } + const char* getSampleMemName(int index=0) { + return index == 0 ? "ADPCM-A" : index == 1 ? "ADPCM-B" : NULL; + } + size_t getSampleMemUsage(int index) { return index == 0 ? adpcmAMemLen : index == 1 ? adpcmBMemLen : 0; } @@ -238,9 +242,9 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { logW("out of ADPCM-A memory for sample %d!",i); } else { memcpy(adpcmAMem+memPos,s->dataA,paddedLen); + sampleLoaded[0][i]=true; } sampleOffA[i]=memPos; - sampleLoaded[0][i]=true; memPos+=paddedLen; } adpcmAMemLen=memPos+256; @@ -263,9 +267,9 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { logW("out of ADPCM-B memory for sample %d!",i); } else { memcpy(adpcmBMem+memPos,s->dataB,paddedLen); + sampleLoaded[1][i]=true; } sampleOffB[i]=memPos; - sampleLoaded[1][i]=true; memPos+=paddedLen; } adpcmBMemLen=memPos+256; diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index 91d63e3b..c91512b5 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -429,6 +429,7 @@ bool DivPlatformYMZ280B::isSampleLoaded(int index, int sample) { void DivPlatformYMZ280B::renderSamples() { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOff,0,256*sizeof(unsigned int)); + memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { @@ -455,6 +456,7 @@ void DivPlatformYMZ280B::renderSamples() { logW("out of YMZ280B PCM memory for sample %d!",i); break; } + sampleLoaded[i]=true; } sampleMemLen=memPos; } diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 676481f6..99670c36 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -281,6 +281,7 @@ void FurnaceGUI::drawSampleEdit() { memset(isChipVisible,0,32*sizeof(bool)); memset(isTypeVisible,0,4*sizeof(bool)); memset(isMemVisible,0,32*4*sizeof(bool)); + memset(isMemWarning,0,32*4*sizeof(bool)); for (int i=0; isong.systemLen; i++) { DivDispatch* dispatch=e->getDispatch(i); if (dispatch==NULL) continue; @@ -300,7 +301,7 @@ void FurnaceGUI::drawSampleEdit() { if (selColumns<=1) { ImGui::Text("NO CHIPS LESS GOOO"); } else { - if (ImGui::BeginTable("SEChipSel",selColumns,ImGuiTableFlags_SizingFixedSame|ImGuiTableFlags_ScrollX)) { + if (ImGui::BeginTable("SEChipSel",selColumns,ImGuiTableFlags_SizingFixedSame)) { ImGui::TableNextRow(); ImGui::TableNextColumn(); for (int i=0; isong.systemLen; i++) { @@ -356,6 +357,34 @@ void FurnaceGUI::drawSampleEdit() { } ImGui::PopStyleColor(4); + + if (ImGui::IsItemHovered()) { + const char* memName=NULL; + size_t capacity=0; + size_t usage=0; + int totalFree=0; + DivDispatch* dispatch=e->getDispatch(j); + if (dispatch!=NULL) { + memName=dispatch->getSampleMemName(i); + capacity=dispatch->getSampleMemCapacity(i); + usage=dispatch->getSampleMemUsage(i); + if (usagegetSystemName(e->song.system[j]),totalFree); + } else { + toolText=fmt::sprintf("%s (%s)\n%d bytes free",e->getSystemName(e->song.system[j]),memName,totalFree); + } + + if (isMemWarning[i][j]) { + toolText+="\n\nnot enough memory for this sample!"; + } + + ImGui::SetTooltip("%s",toolText.c_str()); + } } } ImGui::EndTable(); From cf38680072fc18a6a216abf9e8fff495f6c34e17 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 26 Nov 2022 23:50:20 -0500 Subject: [PATCH 3/5] chip sample selection, part 4 partially works --- src/engine/dispatch.h | 3 ++- src/engine/engine.cpp | 2 +- src/engine/platform/abstract.cpp | 2 +- src/engine/platform/msm6258.cpp | 4 +++- src/engine/platform/msm6258.h | 2 +- src/engine/platform/msm6295.cpp | 7 ++++++- src/engine/platform/msm6295.h | 2 +- src/engine/platform/nes.cpp | 7 ++++++- src/engine/platform/nes.h | 2 +- src/engine/platform/opl.cpp | 7 ++++++- src/engine/platform/opl.h | 2 +- src/engine/platform/qsound.cpp | 7 ++++++- src/engine/platform/qsound.h | 2 +- src/engine/platform/rf5c68.cpp | 7 ++++++- src/engine/platform/rf5c68.h | 2 +- src/engine/platform/segapcm.cpp | 2 +- src/engine/platform/segapcm.h | 2 +- src/engine/platform/snes.cpp | 7 ++++++- src/engine/platform/snes.h | 2 +- src/engine/platform/su.cpp | 11 ++++++++--- src/engine/platform/su.h | 4 ++-- src/engine/platform/x1_010.cpp | 7 ++++++- src/engine/platform/x1_010.h | 2 +- src/engine/platform/ym2608.cpp | 7 ++++++- src/engine/platform/ym2608.h | 2 +- src/engine/platform/ym2610shared.h | 12 +++++++++++- src/engine/platform/ymz280b.cpp | 7 ++++++- src/engine/platform/ymz280b.h | 2 +- 28 files changed, 94 insertions(+), 31 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index 83c3f7ba..4ea92e10 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -557,8 +557,9 @@ class DivDispatch { /** * Render samples into sample memory. + * @param sysID the chip's index in the chip list. */ - virtual void renderSamples(); + virtual void renderSamples(int sysID); /** * initialize this DivDispatch. diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index d9e23601..da571eaa 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1315,7 +1315,7 @@ void DivEngine::renderSamples() { // step 2: render samples to dispatch for (int i=0; irenderSamples(); + disCont[i].dispatch->renderSamples(i); } } } diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index cc7663b8..33dd3c17 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -165,7 +165,7 @@ bool DivDispatch::isSampleLoaded(int index, int sample) { return false; } -void DivDispatch::renderSamples() { +void DivDispatch::renderSamples(int sysID) { } diff --git a/src/engine/platform/msm6258.cpp b/src/engine/platform/msm6258.cpp index 0a84a2d0..7111c84c 100644 --- a/src/engine/platform/msm6258.cpp +++ b/src/engine/platform/msm6258.cpp @@ -368,7 +368,7 @@ bool DivPlatformMSM6258::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformMSM6258::renderSamples() { +void DivPlatformMSM6258::renderSamples(int sysID) { memset(adpcmMem,0,getSampleMemCapacity(0)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -378,6 +378,8 @@ void DivPlatformMSM6258::renderSamples() { if (sampleCount>128) sampleCount=128; for (int i=0; isong.sample[i]; + if (!s->renderOn[0][sysID]) continue; + int paddedLen=s->lengthVOX; if (memPos>=getSampleMemCapacity(0)) { logW("out of ADPCM memory for sample %d!",i); diff --git a/src/engine/platform/msm6258.h b/src/engine/platform/msm6258.h index d4d10cf0..9a5cd7d7 100644 --- a/src/engine/platform/msm6258.h +++ b/src/engine/platform/msm6258.h @@ -115,7 +115,7 @@ class DivPlatformMSM6258: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); diff --git a/src/engine/platform/msm6295.cpp b/src/engine/platform/msm6295.cpp index 67bf8dc5..71b8d7cf 100644 --- a/src/engine/platform/msm6295.cpp +++ b/src/engine/platform/msm6295.cpp @@ -341,7 +341,7 @@ bool DivPlatformMSM6295::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformMSM6295::renderSamples() { +void DivPlatformMSM6295::renderSamples(int sysID) { unsigned int sampleOffVOX[256]; memset(adpcmMem,0,getSampleMemCapacity(0)); @@ -354,6 +354,11 @@ void DivPlatformMSM6295::renderSamples() { if (sampleCount>128) sampleCount=128; for (int i=0; isong.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffVOX[i]=0; + continue; + } + int paddedLen=s->lengthVOX; if (memPos>=getSampleMemCapacity(0)) { logW("out of ADPCM memory for sample %d!",i); diff --git a/src/engine/platform/msm6295.h b/src/engine/platform/msm6295.h index c9aecbb2..9d47824a 100644 --- a/src/engine/platform/msm6295.h +++ b/src/engine/platform/msm6295.h @@ -103,7 +103,7 @@ class DivPlatformMSM6295: public DivDispatch, public vgsound_emu_mem_intf { virtual size_t getSampleMemCapacity(int index) override; virtual size_t getSampleMemUsage(int index) override; virtual bool isSampleLoaded(int index, int sample) override; - virtual void renderSamples() override; + virtual void renderSamples(int chipID) override; virtual int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags) override; virtual void quit() override; diff --git a/src/engine/platform/nes.cpp b/src/engine/platform/nes.cpp index cafc16d8..c971d4bf 100644 --- a/src/engine/platform/nes.cpp +++ b/src/engine/platform/nes.cpp @@ -727,13 +727,18 @@ bool DivPlatformNES::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformNES::renderSamples() { +void DivPlatformNES::renderSamples(int sysID) { memset(dpcmMem,0,getSampleMemCapacity(0));\ memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffDPCM[i]=0; + continue; + } + unsigned int paddedLen=(s->lengthDPCM+63)&(~0x3f); logV("%d padded length: %d",i,paddedLen); if ((memPos&(~0x3fff))!=((memPos+paddedLen)&(~0x3fff))) { diff --git a/src/engine/platform/nes.h b/src/engine/platform/nes.h index d3965a1e..4dbfcec3 100644 --- a/src/engine/platform/nes.h +++ b/src/engine/platform/nes.h @@ -117,7 +117,7 @@ class DivPlatformNES: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformNES(); diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index 01cadfa7..5353fa6c 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -1763,7 +1763,7 @@ bool DivPlatformOPL::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformOPL::renderSamples() { +void DivPlatformOPL::renderSamples(int sysID) { if (adpcmChan<0) return; memset(adpcmBMem,0,getSampleMemCapacity(0)); memset(sampleOffB,0,256*sizeof(unsigned int)); @@ -1772,6 +1772,11 @@ void DivPlatformOPL::renderSamples() { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffB[i]=0; + continue; + } + int paddedLen=(s->lengthB+255)&(~0xff); if ((memPos&0xf00000)!=((memPos+paddedLen)&0xf00000)) { memPos=(memPos+0xfffff)&0xf00000; diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 3eb1da77..b8dee394 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -154,7 +154,7 @@ class DivPlatformOPL: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformOPL(); diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index afede642..fce9f783 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -651,13 +651,18 @@ bool DivPlatformQSound::isSampleLoaded(int index, int sample) { } // TODO: ADPCM... come on... -void DivPlatformQSound::renderSamples() { +void DivPlatformQSound::renderSamples(int sysID) { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleLoaded,0,256*sizeof(bool)); size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + offPCM[i]=0; + continue; + } + int length=s->length8; if (length>65536-16) { length=65536-16; diff --git a/src/engine/platform/qsound.h b/src/engine/platform/qsound.h index d092d4d9..1f911a83 100644 --- a/src/engine/platform/qsound.h +++ b/src/engine/platform/qsound.h @@ -105,7 +105,7 @@ class DivPlatformQSound: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); }; diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index cde6127d..e33cfbf3 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -391,7 +391,7 @@ bool DivPlatformRF5C68::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformRF5C68::renderSamples() { +void DivPlatformRF5C68::renderSamples(int sysID) { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOffRFC,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -399,6 +399,11 @@ void DivPlatformRF5C68::renderSamples() { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffRFC[i]=0; + continue; + } + int length=s->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT); int actualLength=MIN((int)(getSampleMemCapacity()-memPos)-31,length); if (actualLength>0) { diff --git a/src/engine/platform/rf5c68.h b/src/engine/platform/rf5c68.h index 84cb6867..5af36c03 100644 --- a/src/engine/platform/rf5c68.h +++ b/src/engine/platform/rf5c68.h @@ -101,7 +101,7 @@ class DivPlatformRF5C68: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); private: diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index fc389a81..860f9926 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -451,7 +451,7 @@ void DivPlatformSegaPCM::reset() { } } - void DivPlatformSegaPCM::renderSamples() { + void DivPlatformSegaPCM::renderSamples(int sysID) { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index 222f4bd9..2ed15eae 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -110,7 +110,7 @@ class DivPlatformSegaPCM: public DivDispatch { void tick(bool sysTick=true); void muteChannel(int ch, bool mute); void notifyInsChange(int ins); - void renderSamples(); + void renderSamples(int chipID); void setFlags(const DivConfig& flags); bool isStereo(); void poke(unsigned int addr, unsigned short val); diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index cc37dfc5..2dd64de3 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -803,7 +803,7 @@ bool DivPlatformSNES::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformSNES::renderSamples() { +void DivPlatformSNES::renderSamples(int sysID) { memset(copyOfSampleMem,0,getSampleMemCapacity()); memset(sampleOff,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -812,6 +812,11 @@ void DivPlatformSNES::renderSamples() { size_t memPos=sampleTableBase+8*4+8*9*16; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOff[i]=0; + continue; + } + int length=s->lengthBRR; int actualLength=MIN((int)(getSampleMemCapacity()-memPos)/9*9,length); if (actualLength>0) { diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index ad3b0ab2..ed8bfbf3 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -138,7 +138,7 @@ class DivPlatformSNES: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); private: diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index c1330cd2..116e0cde 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -524,7 +524,7 @@ void DivPlatformSoundUnit::setFlags(const DivConfig& flags) { sampleMemSize=flags.getInt("sampleMemSize",0); su->Init(sampleMemSize?65536:8192,flags.getBool("pdm",false)); - renderSamples(); + renderSamples(sysIDCache); } void DivPlatformSoundUnit::poke(unsigned int addr, unsigned short val) { @@ -553,7 +553,7 @@ bool DivPlatformSoundUnit::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformSoundUnit::renderSamples() { +void DivPlatformSoundUnit::renderSamples(int sysID) { memset(su->pcm,0,getSampleMemCapacity(0)); memset(sampleOffSU,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -562,6 +562,11 @@ void DivPlatformSoundUnit::renderSamples() { for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; if (s->data8==NULL) continue; + if (!s->renderOn[0][sysID]) { + sampleOffSU[i]=0; + continue; + } + int paddedLen=s->length8; if (memPos>=getSampleMemCapacity(0)) { logW("out of PCM memory for sample %d!",i); @@ -578,7 +583,7 @@ void DivPlatformSoundUnit::renderSamples() { memPos+=paddedLen; } sampleMemLen=memPos; - + sysIDCache=sysID; } int DivPlatformSoundUnit::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { diff --git a/src/engine/platform/su.h b/src/engine/platform/su.h index e7eff8d4..bacdbc01 100644 --- a/src/engine/platform/su.h +++ b/src/engine/platform/su.h @@ -104,7 +104,7 @@ class DivPlatformSoundUnit: public DivDispatch { unsigned int sampleOffSU[256]; bool sampleLoaded[256]; - int cycles, curChan, delay; + int cycles, curChan, delay, sysIDCache; short tempL; short tempR; unsigned char sampleBank, lfoMode, lfoSpeed; @@ -140,7 +140,7 @@ class DivPlatformSoundUnit: public DivDispatch { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); ~DivPlatformSoundUnit(); diff --git a/src/engine/platform/x1_010.cpp b/src/engine/platform/x1_010.cpp index ea4177a9..683b36a6 100644 --- a/src/engine/platform/x1_010.cpp +++ b/src/engine/platform/x1_010.cpp @@ -955,7 +955,7 @@ bool DivPlatformX1_010::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformX1_010::renderSamples() { +void DivPlatformX1_010::renderSamples(int sysID) { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOffX1,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -963,6 +963,11 @@ void DivPlatformX1_010::renderSamples() { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffX1[i]=0; + continue; + } + int paddedLen=(s->length8+4095)&(~0xfff); if (isBanked) { // fit sample bank size to 128KB for Seta 2 external bankswitching logic (not emulated yet!) diff --git a/src/engine/platform/x1_010.h b/src/engine/platform/x1_010.h index e54a3e89..d588d944 100644 --- a/src/engine/platform/x1_010.h +++ b/src/engine/platform/x1_010.h @@ -148,7 +148,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); const char** getRegisterSheet(); void setBanked(bool banked); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); diff --git a/src/engine/platform/ym2608.cpp b/src/engine/platform/ym2608.cpp index 09eb8ac3..63c84ad5 100644 --- a/src/engine/platform/ym2608.cpp +++ b/src/engine/platform/ym2608.cpp @@ -1342,7 +1342,7 @@ bool DivPlatformYM2608::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformYM2608::renderSamples() { +void DivPlatformYM2608::renderSamples(int sysID) { memset(adpcmBMem,0,getSampleMemCapacity(0)); memset(sampleOffB,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -1350,6 +1350,11 @@ void DivPlatformYM2608::renderSamples() { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffB[i]=0; + continue; + } + int paddedLen=(s->lengthB+255)&(~0xff); if ((memPos&0xf00000)!=((memPos+paddedLen)&0xf00000)) { memPos=(memPos+0xfffff)&0xf00000; diff --git a/src/engine/platform/ym2608.h b/src/engine/platform/ym2608.h index 81a6844d..ef63fe63 100644 --- a/src/engine/platform/ym2608.h +++ b/src/engine/platform/ym2608.h @@ -139,7 +139,7 @@ class DivPlatformYM2608: public DivPlatformOPN { size_t getSampleMemCapacity(int index); size_t getSampleMemUsage(int index); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); void setFlags(const DivConfig& flags); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); diff --git a/src/engine/platform/ym2610shared.h b/src/engine/platform/ym2610shared.h index b9f939b4..065eb5f3 100644 --- a/src/engine/platform/ym2610shared.h +++ b/src/engine/platform/ym2610shared.h @@ -220,7 +220,7 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { return sampleLoaded[index][sample]; } - void renderSamples() { + void renderSamples(int sysID) { memset(adpcmAMem,0,getSampleMemCapacity(0)); memset(sampleOffA,0,256*sizeof(unsigned int)); memset(sampleOffB,0,256*sizeof(unsigned int)); @@ -229,6 +229,11 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOffA[i]=0; + continue; + } + int paddedLen=(s->lengthA+255)&(~0xff); if ((memPos&0xf00000)!=((memPos+paddedLen)&0xf00000)) { memPos=(memPos+0xfffff)&0xf00000; @@ -254,6 +259,11 @@ template class DivPlatformYM2610Base: public DivPlatformOPN { memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[1][sysID]) { + sampleOffB[i]=0; + continue; + } + int paddedLen=(s->lengthB+255)&(~0xff); if ((memPos&0xf00000)!=((memPos+paddedLen)&0xf00000)) { memPos=(memPos+0xfffff)&0xf00000; diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index c91512b5..8a903ef0 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -426,7 +426,7 @@ bool DivPlatformYMZ280B::isSampleLoaded(int index, int sample) { return sampleLoaded[sample]; } -void DivPlatformYMZ280B::renderSamples() { +void DivPlatformYMZ280B::renderSamples(int sysID) { memset(sampleMem,0,getSampleMemCapacity()); memset(sampleOff,0,256*sizeof(unsigned int)); memset(sampleLoaded,0,256*sizeof(bool)); @@ -434,6 +434,11 @@ void DivPlatformYMZ280B::renderSamples() { size_t memPos=0; for (int i=0; isong.sampleLen; i++) { DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOff[i]=0; + continue; + } + int length=s->getCurBufLen(); unsigned char* src=(unsigned char*)s->getCurBuf(); int actualLength=MIN((int)(getSampleMemCapacity()-memPos),length); diff --git a/src/engine/platform/ymz280b.h b/src/engine/platform/ymz280b.h index 7e8ceb67..9477d003 100644 --- a/src/engine/platform/ymz280b.h +++ b/src/engine/platform/ymz280b.h @@ -101,7 +101,7 @@ class DivPlatformYMZ280B: public DivDispatch { size_t getSampleMemCapacity(int index = 0); size_t getSampleMemUsage(int index = 0); bool isSampleLoaded(int index, int sample); - void renderSamples(); + void renderSamples(int chipID); void setFlags(const DivConfig& flags); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); void quit(); From f088c9ec495e62eabe7496ef9921fb56df356668 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 27 Nov 2022 00:30:41 -0500 Subject: [PATCH 4/5] Uninitialized Trash --- TODO.md | 1 - src/engine/platform/su.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.md b/TODO.md index e8d551ab..89a31eec 100644 --- a/TODO.md +++ b/TODO.md @@ -5,5 +5,4 @@ - (maybe) YM2612 CSM (no DualPCM) - port presets to new format - bug fixes -- (maybe) ExtCh FM macros? - (maybe) advanced linear arpeggio? (run arp+slide simultaneously) diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 116e0cde..931225b4 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -595,6 +595,7 @@ int DivPlatformSoundUnit::init(DivEngine* p, int channels, int sugRate, const Di oscBuf[i]=new DivDispatchOscBuffer; } su=new SoundUnit(); + sysIDCache=0; setFlags(flags); reset(); return 8; From 0fce35fa88d8f1705997f88f99c5ee283f2d1a96 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 27 Nov 2022 00:31:39 -0500 Subject: [PATCH 5/5] kill this false positive --- src/gui/sampleEdit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 99670c36..fb50fd56 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -379,7 +379,7 @@ void FurnaceGUI::drawSampleEdit() { toolText=fmt::sprintf("%s (%s)\n%d bytes free",e->getSystemName(e->song.system[j]),memName,totalFree); } - if (isMemWarning[i][j]) { + if (isMemWarning[i][j] && sample->renderOn[i][j]) { toolText+="\n\nnot enough memory for this sample!"; }