From 3a9349d49a86e7e27aa833a3e666b6f1b17d686b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 26 Nov 2022 22:11:49 -0500 Subject: [PATCH] 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();