Implement getSampleMemOffset for further optimize VGM logging (specifically OPL4 PCM)
This commit is contained in:
parent
9d1c10fcea
commit
a5148a3441
9 changed files with 60 additions and 25 deletions
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue