Implement getSampleMemOffset for further optimize VGM logging (specifically OPL4 PCM)

This commit is contained in:
cam900 2025-06-04 21:16:27 +09:00
parent 9d1c10fcea
commit a5148a3441
9 changed files with 60 additions and 25 deletions

View file

@ -2358,13 +2358,17 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
}
// PCM (OPL4)
if (writePCM_OPL4[i]!=NULL && writePCM_OPL4[i]->getSampleMemUsage(0)>0) {
size_t usage=writePCM_OPL4[i]->getSampleMemUsage(0)-writePCM_OPL4[i]->getSampleMemOffset(0);
unsigned char* mem=((unsigned char*)writePCM_OPL4[i]->getSampleMem(0))+writePCM_OPL4[i]->getSampleMemOffset(0);
w->writeC(0x67);
w->writeC(0x66);
w->writeC(0x84);
w->writeI((writePCM_OPL4[i]->getSampleMemUsage(0)+8)|(i*0x80000000));
w->writeC((writePCM_OPL4[i]->getSampleMemOffset(0)==0x200000)?0x87:0x84);
w->writeI((usage+8)|(i*0x80000000));
w->writeI(writePCM_OPL4[i]->getSampleMemCapacity(0));
w->writeI(0);
w->write(writePCM_OPL4[i]->getSampleMem(0),writePCM_OPL4[i]->getSampleMemUsage(0));
w->writeI(writePCM_OPL4[i]->getSampleMemOffset(0));
for (size_t i=0; i<usage; i++) {
w->writeC(mem[i]);
}
}
}
@ -2396,13 +2400,17 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
w->write(writeGA20[i]->getSampleMem(),writeGA20[i]->getSampleMemUsage());
}
if (writeK053260[i]!=NULL && writeK053260[i]->getSampleMemUsage()>0) {
size_t usage=writeK053260[i]->getSampleMemUsage()-writeK053260[i]->getSampleMemOffset();
unsigned char* mem=((unsigned char*)writeK053260[i]->getSampleMem())+writeK053260[i]->getSampleMemOffset();
w->writeC(0x67);
w->writeC(0x66);
w->writeC(0x8e);
w->writeI((writeK053260[i]->getSampleMemUsage()+8)|(i*0x80000000));
w->writeI((usage+8)|(i*0x80000000));
w->writeI(writeK053260[i]->getSampleMemCapacity());
w->writeI(0);
w->write(writeK053260[i]->getSampleMem(),writeK053260[i]->getSampleMemUsage());
w->writeI(writeK053260[i]->getSampleMemOffset());
for (size_t i=0; i<usage; i++) {
w->writeC(mem[i]);
}
}
if (writeNES[i]!=NULL && writeNES[i]->getSampleMemUsage()>0) {
if (dpcm07) {
@ -2447,17 +2455,18 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
for (int i=0; i<2; i++) {
if (writeES5506[i]!=NULL && writeES5506[i]->getSampleMemUsage()>0) {
// split sample data into 4 areas
unsigned short* mem=(unsigned short*)writeES5506[i]->getSampleMem();
int memOffs=(int)writeES5506[i]->getSampleMemOffset();
unsigned short* mem=((unsigned short*)writeES5506[i]->getSampleMem())+(memOffs>>1);
for (int b=0; b<4; b++) {
int offs=b<<22;
int memLen=CLAMP((int)writeES5506[i]->getSampleMemUsage()-offs,0,0x400000);
int memLen=CLAMP((int)writeES5506[i]->getSampleMemUsage()-memOffs-offs,0,0x400000-memOffs);
if (memLen>0) {
w->writeC(0x67);
w->writeC(0x66);
w->writeC(0x90);
w->writeI((memLen+8)|(i*0x80000000));
w->writeI(MIN(writeES5506[i]->getSampleMemCapacity(),0x400000));
w->writeI(b<<28);
w->writeI(memOffs+(b<<28));
for (int i=0; i<(memLen>>1); i++) {
w->writeS(mem[(offs>>1)+i]);
}