add AICA and YMZ ADPCM formats

This commit is contained in:
tildearrow 2022-05-14 16:59:07 -05:00
parent a2ae7dbb3d
commit ce253230ce
4 changed files with 52 additions and 4 deletions

View File

@ -744,6 +744,8 @@ size | description
1 | depth 1 | depth
| - 0: ZX Spectrum overlay drum (1-bit) | - 0: ZX Spectrum overlay drum (1-bit)
| - 1: 1-bit NES DPCM (1-bit) | - 1: 1-bit NES DPCM (1-bit)
| - 2: AICA ADPCM
| - 3: YMZ ADPCM
| - 4: QSound ADPCM | - 4: QSound ADPCM
| - 5: ADPCM-A | - 5: ADPCM-A
| - 6: ADPCM-B | - 6: ADPCM-B

View File

@ -93,6 +93,18 @@ bool DivSample::initInternal(unsigned char d, int count) {
dataDPCM=new unsigned char[lengthDPCM]; dataDPCM=new unsigned char[lengthDPCM];
memset(dataDPCM,0,lengthDPCM); memset(dataDPCM,0,lengthDPCM);
break; break;
case 2: // AICA ADPCM
if (dataAICA!=NULL) delete[] dataAICA;
lengthAICA=(count+1)/2;
dataAICA=new unsigned char[(lengthAICA+255)&(~0xff)];
memset(dataAICA,0,(lengthAICA+255)&(~0xff));
break;
case 3: // YMZ ADPCM
if (dataZ!=NULL) delete[] dataZ;
lengthZ=(count+1)/2;
dataZ=new unsigned char[(lengthZ+255)&(~0xff)];
memset(dataZ,0,(lengthZ+255)&(~0xff));
break;
case 4: // QSound ADPCM case 4: // QSound ADPCM
if (dataQSoundA!=NULL) delete[] dataQSoundA; if (dataQSoundA!=NULL) delete[] dataQSoundA;
lengthQSoundA=(count+1)/2; lengthQSoundA=(count+1)/2;
@ -657,6 +669,12 @@ void DivSample::render() {
} }
break; break;
} }
case 2: // AICA ADPCM
aica_decode(dataAICA,data16,samples);
break;
case 3: // YMZ ADPCM
ymz_decode(dataZ,data16,samples);
break;
case 4: // QSound ADPCM case 4: // QSound ADPCM
bs_decode(dataQSoundA,data16,samples); bs_decode(dataQSoundA,data16,samples);
break; break;
@ -709,6 +727,14 @@ void DivSample::render() {
if (accum>127) accum=127; if (accum>127) accum=127;
} }
} }
if (depth!=2) { // AICA ADPCM
if (!initInternal(2,samples)) return;
aica_encode(data16,dataAICA,(samples+511)&(~0x1ff));
}
if (depth!=3) { // YMZ ADPCM
if (!initInternal(3,samples)) return;
ymz_encode(data16,dataZ,(samples+511)&(~0x1ff));
}
if (depth!=4) { // QSound ADPCM if (depth!=4) { // QSound ADPCM
if (!initInternal(4,samples)) return; if (!initInternal(4,samples)) return;
bs_encode(data16,dataQSoundA,samples); bs_encode(data16,dataQSoundA,samples);
@ -745,6 +771,10 @@ void* DivSample::getCurBuf() {
return data1; return data1;
case 1: case 1:
return dataDPCM; return dataDPCM;
case 2:
return dataAICA;
case 3:
return dataZ;
case 4: case 4:
return dataQSoundA; return dataQSoundA;
case 5: case 5:
@ -771,6 +801,10 @@ unsigned int DivSample::getCurBufLen() {
return length1; return length1;
case 1: case 1:
return lengthDPCM; return lengthDPCM;
case 2:
return lengthAICA;
case 3:
return lengthZ;
case 4: case 4:
return lengthQSoundA; return lengthQSoundA;
case 5: case 5:
@ -881,6 +915,8 @@ DivSample::~DivSample() {
if (data16) delete[] data16; if (data16) delete[] data16;
if (data1) delete[] data1; if (data1) delete[] data1;
if (dataDPCM) delete[] dataDPCM; if (dataDPCM) delete[] dataDPCM;
if (dataAICA) delete[] dataAICA;
if (dataZ) delete[] dataZ;
if (dataQSoundA) delete[] dataQSoundA; if (dataQSoundA) delete[] dataQSoundA;
if (dataA) delete[] dataA; if (dataA) delete[] dataA;
if (dataB) delete[] dataB; if (dataB) delete[] dataB;

View File

@ -62,6 +62,8 @@ struct DivSample {
// valid values are: // valid values are:
// - 0: ZX Spectrum overlay drum (1-bit) // - 0: ZX Spectrum overlay drum (1-bit)
// - 1: 1-bit NES DPCM (1-bit) // - 1: 1-bit NES DPCM (1-bit)
// - 2: AICA ADPCM
// - 3: YMZ ADPCM
// - 4: QSound ADPCM // - 4: QSound ADPCM
// - 5: ADPCM-A // - 5: ADPCM-A
// - 6: ADPCM-B // - 6: ADPCM-B
@ -77,6 +79,8 @@ struct DivSample {
short* data16; // 16 short* data16; // 16
unsigned char* data1; // 0 unsigned char* data1; // 0
unsigned char* dataDPCM; // 1 unsigned char* dataDPCM; // 1
unsigned char* dataAICA; // 2
unsigned char* dataZ; // 3
unsigned char* dataQSoundA; // 4 unsigned char* dataQSoundA; // 4
unsigned char* dataA; // 5 unsigned char* dataA; // 5
unsigned char* dataB; // 6 unsigned char* dataB; // 6
@ -84,8 +88,8 @@ struct DivSample {
unsigned char* dataBRR; // 9 unsigned char* dataBRR; // 9
unsigned char* dataVOX; // 10 unsigned char* dataVOX; // 10
unsigned int length8, length16, length1, lengthDPCM, lengthQSoundA, lengthA, lengthB, lengthX68, lengthBRR, lengthVOX; unsigned int length8, length16, length1, lengthDPCM, lengthAICA, lengthZ, lengthQSoundA, lengthA, lengthB, lengthX68, lengthBRR, lengthVOX;
unsigned int off8, off16, off1, offDPCM, offQSoundA, offA, offB, offX68, offBRR, offVOX; unsigned int off8, off16, off1, offDPCM, offAICA, offZ, offQSoundA, offA, offB, offX68, offBRR, offVOX;
unsigned int offSegaPCM, offQSound, offX1_010, offSU; unsigned int offSegaPCM, offQSound, offX1_010, offSU;
unsigned int samples; unsigned int samples;
@ -218,6 +222,8 @@ struct DivSample {
data16(NULL), data16(NULL),
data1(NULL), data1(NULL),
dataDPCM(NULL), dataDPCM(NULL),
dataAICA(NULL),
dataZ(NULL),
dataQSoundA(NULL), dataQSoundA(NULL),
dataA(NULL), dataA(NULL),
dataB(NULL), dataB(NULL),
@ -228,6 +234,8 @@ struct DivSample {
length16(0), length16(0),
length1(0), length1(0),
lengthDPCM(0), lengthDPCM(0),
lengthAICA(0),
lengthZ(0),
lengthQSoundA(0), lengthQSoundA(0),
lengthA(0), lengthA(0),
lengthB(0), lengthB(0),
@ -238,6 +246,8 @@ struct DivSample {
off16(0), off16(0),
off1(0), off1(0),
offDPCM(0), offDPCM(0),
offAICA(0),
offZ(0),
offQSoundA(0), offQSoundA(0),
offA(0), offA(0),
offB(0), offB(0),

View File

@ -116,8 +116,8 @@ const char* insTypes[DIV_INS_MAX]={
const char* sampleDepths[17]={ const char* sampleDepths[17]={
"1-bit PCM", "1-bit PCM",
"1-bit DPCM", "1-bit DPCM",
NULL, "Yamaha AICA",
NULL, "YMZ/YMU ADPCM",
"QSound ADPCM", "QSound ADPCM",
"ADPCM-A", "ADPCM-A",
"ADPCM-B", "ADPCM-B",