NES: fix DPCM samples having wrong size
This commit is contained in:
parent
11836ad079
commit
7d8c1b6efc
|
@ -480,6 +480,7 @@ bool DivSample::saveRaw(const char* path) {
|
||||||
|
|
||||||
// 16-bit memory is padded to 512, to make things easier for ADPCM-A/B.
|
// 16-bit memory is padded to 512, to make things easier for ADPCM-A/B.
|
||||||
bool DivSample::initInternal(DivSampleDepth d, int count) {
|
bool DivSample::initInternal(DivSampleDepth d, int count) {
|
||||||
|
logV("initInternal(%d,%d)",(int)d,count);
|
||||||
switch (d) {
|
switch (d) {
|
||||||
case DIV_SAMPLE_DEPTH_1BIT: // 1-bit
|
case DIV_SAMPLE_DEPTH_1BIT: // 1-bit
|
||||||
if (data1!=NULL) delete[] data1;
|
if (data1!=NULL) delete[] data1;
|
||||||
|
@ -489,7 +490,7 @@ bool DivSample::initInternal(DivSampleDepth d, int count) {
|
||||||
break;
|
break;
|
||||||
case DIV_SAMPLE_DEPTH_1BIT_DPCM: // DPCM
|
case DIV_SAMPLE_DEPTH_1BIT_DPCM: // DPCM
|
||||||
if (dataDPCM!=NULL) delete[] dataDPCM;
|
if (dataDPCM!=NULL) delete[] dataDPCM;
|
||||||
lengthDPCM=1+((((count+7)/8)+15)&(~15));
|
lengthDPCM=1+((((count-1)/8)+15)&(~15));
|
||||||
dataDPCM=new unsigned char[lengthDPCM];
|
dataDPCM=new unsigned char[lengthDPCM];
|
||||||
memset(dataDPCM,0xaa,lengthDPCM);
|
memset(dataDPCM,0xaa,lengthDPCM);
|
||||||
break;
|
break;
|
||||||
|
@ -748,7 +749,11 @@ void DivSample::convert(DivSampleDepth newDepth) {
|
||||||
setSampleCount((samples+7)&(~7));
|
setSampleCount((samples+7)&(~7));
|
||||||
break;
|
break;
|
||||||
case DIV_SAMPLE_DEPTH_1BIT_DPCM:
|
case DIV_SAMPLE_DEPTH_1BIT_DPCM:
|
||||||
setSampleCount((1+((((samples+7)/8)+15)&(~15)))<<3);
|
if (samples) {
|
||||||
|
setSampleCount((1+((((samples-1)/8)+15)&(~15)))<<3);
|
||||||
|
} else {
|
||||||
|
setSampleCount(8);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DIV_SAMPLE_DEPTH_YMZ_ADPCM:
|
case DIV_SAMPLE_DEPTH_YMZ_ADPCM:
|
||||||
setSampleCount(((lengthZ+3)&(~0x03))*2);
|
setSampleCount(((lengthZ+3)&(~0x03))*2);
|
||||||
|
@ -1168,7 +1173,7 @@ void DivSample::render(unsigned int formatMask) {
|
||||||
if (!initInternal(DIV_SAMPLE_DEPTH_1BIT_DPCM,samples)) return;
|
if (!initInternal(DIV_SAMPLE_DEPTH_1BIT_DPCM,samples)) return;
|
||||||
int accum=63;
|
int accum=63;
|
||||||
int next=63;
|
int next=63;
|
||||||
for (unsigned int i=0; i<samples; i++) {
|
for (unsigned int i=0; (i<samples && (i>>3)<lengthDPCM); i++) {
|
||||||
next=((unsigned short)(data16[i]^0x8000))>>9;
|
next=((unsigned short)(data16[i]^0x8000))>>9;
|
||||||
if (next>accum) {
|
if (next>accum) {
|
||||||
dataDPCM[i>>3]|=1<<(i&7);
|
dataDPCM[i>>3]|=1<<(i&7);
|
||||||
|
|
Loading…
Reference in a new issue