Merge pull request #2551 from tildearrow/getSampleMemOffset
Implement getSampleMemOffset
This commit is contained in:
commit
84c1baa3f5
|
@ -982,6 +982,13 @@ class DivDispatch {
|
||||||
*/
|
*/
|
||||||
virtual const char* getSampleMemName(int index=0);
|
virtual const char* getSampleMemName(int index=0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get sample memory start offset.
|
||||||
|
* @param index the memory index.
|
||||||
|
* @return memory start offset in bytes.
|
||||||
|
*/
|
||||||
|
virtual size_t getSampleMemOffset(int index = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get sample memory usage.
|
* Get sample memory usage.
|
||||||
* @param index the memory index.
|
* @param index the memory index.
|
||||||
|
|
|
@ -213,6 +213,10 @@ size_t DivDispatch::getSampleMemUsage(int index) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t DivDispatch::getSampleMemOffset(int index) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const DivMemoryComposition* DivDispatch::getMemCompo(int index) {
|
const DivMemoryComposition* DivDispatch::getMemCompo(int index) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1433,6 +1433,10 @@ size_t DivPlatformES5506::getSampleMemUsage(int index) {
|
||||||
return index == 0 ? sampleMemLen : 0;
|
return index == 0 ? sampleMemLen : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t DivPlatformES5506::getSampleMemOffset(int index) {
|
||||||
|
return index == 0 ? 128 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool DivPlatformES5506::isSampleLoaded(int index, int sample) {
|
bool DivPlatformES5506::isSampleLoaded(int index, int sample) {
|
||||||
if (index!=0) return false;
|
if (index!=0) return false;
|
||||||
if (sample<0 || sample>32767) return false;
|
if (sample<0 || sample>32767) return false;
|
||||||
|
@ -1452,7 +1456,7 @@ void DivPlatformES5506::renderSamples(int sysID) {
|
||||||
memCompo=DivMemoryComposition();
|
memCompo=DivMemoryComposition();
|
||||||
memCompo.name="Sample Memory";
|
memCompo.name="Sample Memory";
|
||||||
|
|
||||||
size_t memPos=128; // add silent at begin and end of each bank for reverse playback and add 1 for loop
|
size_t memPos=getSampleMemOffset(); // add silent at begin and end of each bank for reverse playback and add 1 for loop
|
||||||
for (int i=0; i<parent->song.sampleLen; i++) {
|
for (int i=0; i<parent->song.sampleLen; i++) {
|
||||||
DivSample* s=parent->song.sample[i];
|
DivSample* s=parent->song.sample[i];
|
||||||
if (!s->renderOn[0][sysID]) {
|
if (!s->renderOn[0][sysID]) {
|
||||||
|
@ -1462,18 +1466,18 @@ void DivPlatformES5506::renderSamples(int sysID) {
|
||||||
|
|
||||||
unsigned int length=s->length16;
|
unsigned int length=s->length16;
|
||||||
// fit sample size to single bank size
|
// fit sample size to single bank size
|
||||||
if (length>(4194304-128)) {
|
if (length>(4194304-getSampleMemOffset())) {
|
||||||
length=4194304-128;
|
length=4194304-getSampleMemOffset();
|
||||||
}
|
}
|
||||||
if ((memPos&0xc00000)!=((memPos+length+128)&0xc00000)) {
|
if ((memPos&0xc00000)!=((memPos+length+getSampleMemOffset())&0xc00000)) {
|
||||||
memPos=((memPos+0x3fffff)&0xffc00000)+128;
|
memPos=((memPos+0x3fffff)&0xffc00000)+getSampleMemOffset();
|
||||||
}
|
}
|
||||||
if (memPos>=(getSampleMemCapacity()-128)) {
|
if (memPos>=(getSampleMemCapacity()-getSampleMemOffset())) {
|
||||||
logW("out of ES5506 memory for sample %d!",i);
|
logW("out of ES5506 memory for sample %d!",i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (memPos+length>=(getSampleMemCapacity()-128)) {
|
if (memPos+length>=(getSampleMemCapacity()-getSampleMemOffset())) {
|
||||||
memcpy(sampleMem+(memPos/sizeof(short)),s->data16,(getSampleMemCapacity()-128)-memPos);
|
memcpy(sampleMem+(memPos/sizeof(short)),s->data16,(getSampleMemCapacity()-getSampleMemOffset())-memPos);
|
||||||
logW("out of ES5506 memory for sample %d!",i);
|
logW("out of ES5506 memory for sample %d!",i);
|
||||||
} else {
|
} else {
|
||||||
memcpy(sampleMem+(memPos/sizeof(short)),s->data16,length);
|
memcpy(sampleMem+(memPos/sizeof(short)),s->data16,length);
|
||||||
|
|
|
@ -317,6 +317,7 @@ class DivPlatformES5506: public DivDispatch, public es550x_intf {
|
||||||
virtual const void* getSampleMem(int index = 0) override;
|
virtual const void* getSampleMem(int index = 0) override;
|
||||||
virtual size_t getSampleMemCapacity(int index = 0) override;
|
virtual size_t getSampleMemCapacity(int index = 0) override;
|
||||||
virtual size_t getSampleMemUsage(int index = 0) override;
|
virtual size_t getSampleMemUsage(int index = 0) override;
|
||||||
|
virtual size_t getSampleMemOffset(int index = 0) override;
|
||||||
virtual bool isSampleLoaded(int index, int sample) override;
|
virtual bool isSampleLoaded(int index, int sample) override;
|
||||||
virtual const DivMemoryComposition* getMemCompo(int index) override;
|
virtual const DivMemoryComposition* getMemCompo(int index) override;
|
||||||
virtual void renderSamples(int sysID) override;
|
virtual void renderSamples(int sysID) override;
|
||||||
|
|
|
@ -468,6 +468,10 @@ size_t DivPlatformK053260::getSampleMemUsage(int index) {
|
||||||
return index == 0 ? sampleMemLen : 0;
|
return index == 0 ? sampleMemLen : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t DivPlatformK053260::getSampleMemOffset(int index) {
|
||||||
|
return index == 0 ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
bool DivPlatformK053260::isSampleLoaded(int index, int sample) {
|
bool DivPlatformK053260::isSampleLoaded(int index, int sample) {
|
||||||
if (index!=0) return false;
|
if (index!=0) return false;
|
||||||
if (sample<0 || sample>32767) return false;
|
if (sample<0 || sample>32767) return false;
|
||||||
|
@ -487,7 +491,7 @@ void DivPlatformK053260::renderSamples(int sysID) {
|
||||||
memCompo=DivMemoryComposition();
|
memCompo=DivMemoryComposition();
|
||||||
memCompo.name="Sample ROM";
|
memCompo.name="Sample ROM";
|
||||||
|
|
||||||
size_t memPos=1; // for avoid silence
|
size_t memPos=getSampleMemOffset(); // for avoid silence
|
||||||
for (int i=0; i<parent->song.sampleLen; i++) {
|
for (int i=0; i<parent->song.sampleLen; i++) {
|
||||||
DivSample* s=parent->song.sample[i];
|
DivSample* s=parent->song.sample[i];
|
||||||
if (!s->renderOn[0][sysID]) {
|
if (!s->renderOn[0][sysID]) {
|
||||||
|
@ -499,10 +503,10 @@ void DivPlatformK053260::renderSamples(int sysID) {
|
||||||
|
|
||||||
if (s->depth==DIV_SAMPLE_DEPTH_ADPCM_K) {
|
if (s->depth==DIV_SAMPLE_DEPTH_ADPCM_K) {
|
||||||
length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_ADPCM_K));
|
length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_ADPCM_K));
|
||||||
actualLength=MIN((int)(getSampleMemCapacity()-memPos-1),length);
|
actualLength=MIN((int)(getSampleMemCapacity()-memPos-getSampleMemOffset()),length);
|
||||||
if (actualLength>0) {
|
if (actualLength>0) {
|
||||||
sampleOff[i]=memPos-1;
|
sampleOff[i]=memPos-getSampleMemOffset();
|
||||||
memCompo.entries.push_back(DivMemoryEntry(DIV_MEMORY_SAMPLE,"Sample",i,memPos,memPos+actualLength+1));
|
memCompo.entries.push_back(DivMemoryEntry(DIV_MEMORY_SAMPLE,"Sample",i,memPos,memPos+actualLength+getSampleMemOffset()));
|
||||||
for (int j=0; j<actualLength; j++) {
|
for (int j=0; j<actualLength; j++) {
|
||||||
sampleMem[memPos++]=s->dataK[j];
|
sampleMem[memPos++]=s->dataK[j];
|
||||||
}
|
}
|
||||||
|
@ -510,10 +514,10 @@ void DivPlatformK053260::renderSamples(int sysID) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_8BIT));
|
length=MIN(65535,s->getEndPosition(DIV_SAMPLE_DEPTH_8BIT));
|
||||||
actualLength=MIN((int)(getSampleMemCapacity()-memPos-1),length);
|
actualLength=MIN((int)(getSampleMemCapacity()-memPos-getSampleMemOffset()),length);
|
||||||
if (actualLength>0) {
|
if (actualLength>0) {
|
||||||
sampleOff[i]=memPos-1;
|
sampleOff[i]=memPos-getSampleMemOffset();
|
||||||
memCompo.entries.push_back(DivMemoryEntry(DIV_MEMORY_SAMPLE,"Sample",i,memPos,memPos+actualLength+1));
|
memCompo.entries.push_back(DivMemoryEntry(DIV_MEMORY_SAMPLE,"Sample",i,memPos,memPos+actualLength+getSampleMemOffset()));
|
||||||
for (int j=0; j<actualLength; j++) {
|
for (int j=0; j<actualLength; j++) {
|
||||||
sampleMem[memPos++]=s->data8[j];
|
sampleMem[memPos++]=s->data8[j];
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,6 +84,7 @@ class DivPlatformK053260: public DivDispatch, public k053260_intf {
|
||||||
virtual const void* getSampleMem(int index = 0) override;
|
virtual const void* getSampleMem(int index = 0) override;
|
||||||
virtual size_t getSampleMemCapacity(int index = 0) override;
|
virtual size_t getSampleMemCapacity(int index = 0) override;
|
||||||
virtual size_t getSampleMemUsage(int index = 0) override;
|
virtual size_t getSampleMemUsage(int index = 0) override;
|
||||||
|
virtual size_t getSampleMemOffset(int index = 0) override;
|
||||||
virtual bool isSampleLoaded(int index, int sample) override;
|
virtual bool isSampleLoaded(int index, int sample) override;
|
||||||
virtual const DivMemoryComposition* getMemCompo(int index) override;
|
virtual const DivMemoryComposition* getMemCompo(int index) override;
|
||||||
virtual void renderSamples(int chipID) override;
|
virtual void renderSamples(int chipID) override;
|
||||||
|
|
|
@ -3244,6 +3244,10 @@ size_t DivPlatformOPL::getSampleMemUsage(int index) {
|
||||||
(index==0 && adpcmChan>=0)?adpcmBMemLen:0;
|
(index==0 && adpcmChan>=0)?adpcmBMemLen:0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t DivPlatformOPL::getSampleMemOffset(int index) {
|
||||||
|
return (index==0 && pcmChanOffs>=0 && ramSize<=0x200000)?0x200000:0;
|
||||||
|
}
|
||||||
|
|
||||||
bool DivPlatformOPL::isSampleLoaded(int index, int sample) {
|
bool DivPlatformOPL::isSampleLoaded(int index, int sample) {
|
||||||
if (index!=0) return false;
|
if (index!=0) return false;
|
||||||
if (sample<0 || sample>32767) return false;
|
if (sample<0 || sample>32767) return false;
|
||||||
|
|
|
@ -218,6 +218,7 @@ class DivPlatformOPL: public DivDispatch {
|
||||||
const void* getSampleMem(int index);
|
const void* getSampleMem(int index);
|
||||||
size_t getSampleMemCapacity(int index);
|
size_t getSampleMemCapacity(int index);
|
||||||
size_t getSampleMemUsage(int index);
|
size_t getSampleMemUsage(int index);
|
||||||
|
size_t getSampleMemOffset(int index);
|
||||||
bool isSampleLoaded(int index, int sample);
|
bool isSampleLoaded(int index, int sample);
|
||||||
const DivMemoryComposition* getMemCompo(int index);
|
const DivMemoryComposition* getMemCompo(int index);
|
||||||
void renderSamples(int chipID);
|
void renderSamples(int chipID);
|
||||||
|
|
|
@ -2369,13 +2369,17 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
||||||
}
|
}
|
||||||
// PCM (OPL4)
|
// PCM (OPL4)
|
||||||
if (writePCM_OPL4[i]!=NULL && writePCM_OPL4[i]->getSampleMemUsage(0)>0) {
|
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(0x67);
|
||||||
w->writeC(0x66);
|
w->writeC(0x66);
|
||||||
w->writeC(0x84);
|
w->writeC(0x84);
|
||||||
w->writeI((writePCM_OPL4[i]->getSampleMemUsage(0)+8)|(i*0x80000000));
|
w->writeI((usage+8)|(i*0x80000000));
|
||||||
w->writeI(writePCM_OPL4[i]->getSampleMemCapacity(0));
|
w->writeI(writePCM_OPL4[i]->getSampleMemCapacity(0));
|
||||||
w->writeI(0);
|
w->writeI(writePCM_OPL4[i]->getSampleMemOffset(0));
|
||||||
w->write(writePCM_OPL4[i]->getSampleMem(0),writePCM_OPL4[i]->getSampleMemUsage(0));
|
for (size_t i=0; i<usage; i++) {
|
||||||
|
w->writeC(mem[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2407,13 +2411,17 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
||||||
w->write(writeGA20[i]->getSampleMem(),writeGA20[i]->getSampleMemUsage());
|
w->write(writeGA20[i]->getSampleMem(),writeGA20[i]->getSampleMemUsage());
|
||||||
}
|
}
|
||||||
if (writeK053260[i]!=NULL && writeK053260[i]->getSampleMemUsage()>0) {
|
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(0x67);
|
||||||
w->writeC(0x66);
|
w->writeC(0x66);
|
||||||
w->writeC(0x8e);
|
w->writeC(0x8e);
|
||||||
w->writeI((writeK053260[i]->getSampleMemUsage()+8)|(i*0x80000000));
|
w->writeI((usage+8)|(i*0x80000000));
|
||||||
w->writeI(writeK053260[i]->getSampleMemCapacity());
|
w->writeI(writeK053260[i]->getSampleMemCapacity());
|
||||||
w->writeI(0);
|
w->writeI(writeK053260[i]->getSampleMemOffset());
|
||||||
w->write(writeK053260[i]->getSampleMem(),writeK053260[i]->getSampleMemUsage());
|
for (size_t i=0; i<usage; i++) {
|
||||||
|
w->writeC(mem[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (writeNES[i]!=NULL && writeNES[i]->getSampleMemUsage()>0) {
|
if (writeNES[i]!=NULL && writeNES[i]->getSampleMemUsage()>0) {
|
||||||
if (dpcm07) {
|
if (dpcm07) {
|
||||||
|
@ -2458,17 +2466,18 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p
|
||||||
for (int i=0; i<2; i++) {
|
for (int i=0; i<2; i++) {
|
||||||
if (writeES5506[i]!=NULL && writeES5506[i]->getSampleMemUsage()>0) {
|
if (writeES5506[i]!=NULL && writeES5506[i]->getSampleMemUsage()>0) {
|
||||||
// split sample data into 4 areas
|
// 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++) {
|
for (int b=0; b<4; b++) {
|
||||||
int offs=b<<22;
|
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) {
|
if (memLen>0) {
|
||||||
w->writeC(0x67);
|
w->writeC(0x67);
|
||||||
w->writeC(0x66);
|
w->writeC(0x66);
|
||||||
w->writeC(0x90);
|
w->writeC(0x90);
|
||||||
w->writeI((memLen+8)|(i*0x80000000));
|
w->writeI((memLen+8)|(i*0x80000000));
|
||||||
w->writeI(MIN(writeES5506[i]->getSampleMemCapacity(),0x400000));
|
w->writeI(MIN(writeES5506[i]->getSampleMemCapacity(),0x400000));
|
||||||
w->writeI(b<<28);
|
w->writeI(memOffs+(b<<28));
|
||||||
for (int i=0; i<(memLen>>1); i++) {
|
for (int i=0; i<(memLen>>1); i++) {
|
||||||
w->writeS(mem[(offs>>1)+i]);
|
w->writeS(mem[(offs>>1)+i]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue