add 4 bit pcm depth
This commit is contained in:
parent
3032e78a47
commit
bcf4f5f508
|
@ -291,6 +291,8 @@ int DivSample::getSampleOffset(int offset, int length, DivSampleDepth depth) {
|
|||
case DIV_SAMPLE_DEPTH_16BIT:
|
||||
off=offset*2;
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
off=(offset+1)/2;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -355,6 +357,10 @@ int DivSample::getSampleOffset(int offset, int length, DivSampleDepth depth) {
|
|||
off=((offset*3)+1)/2;
|
||||
len=((length*3)+1)/2;
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
off=(offset+1)/2;
|
||||
len=(length+1)/2;
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_16BIT:
|
||||
off=offset*2;
|
||||
len=length*2;
|
||||
|
@ -419,6 +425,9 @@ int DivSample::getEndPosition(DivSampleDepth depth) {
|
|||
case DIV_SAMPLE_DEPTH_12BIT:
|
||||
off=length12;
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
off=length4;
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_16BIT:
|
||||
off=length16;
|
||||
break;
|
||||
|
@ -622,6 +631,12 @@ bool DivSample::initInternal(DivSampleDepth d, int count) {
|
|||
data12=new unsigned char[length12+8];
|
||||
memset(data12,0,length12+8);
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
if (data4!=NULL) delete[] data4;
|
||||
length4=count;
|
||||
data4=new unsigned char[length4];
|
||||
memset(data4,0,length4);
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_16BIT: // 16-bit
|
||||
if (data16!=NULL) delete[] data16;
|
||||
length16=count*2;
|
||||
|
@ -860,6 +875,8 @@ void DivSample::convert(DivSampleDepth newDepth, unsigned int formatMask) {
|
|||
case DIV_SAMPLE_DEPTH_VOX: // VOX
|
||||
setSampleCount((samples+1)&(~1));
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
setSampleCount((samples+1)&(~1));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1317,6 +1334,11 @@ void DivSample::render(unsigned int formatMask) {
|
|||
}
|
||||
}
|
||||
break;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
for (unsigned int i=0; i<samples; i++) {
|
||||
data16[i]=data4[i]<<12;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
@ -1518,6 +1540,15 @@ void DivSample::render(unsigned int formatMask) {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (NOT_IN_FORMAT(DIV_SAMPLE_DEPTH_4BIT)) {
|
||||
if (!initInternal(DIV_SAMPLE_DEPTH_4BIT,samples)) return;
|
||||
for (unsigned int i=0; i<samples; i++) {
|
||||
data4[i]=(data16[i]>>12)&0xf;
|
||||
// if (i+1<samples) {
|
||||
// data4[i/2]|=(data16[i+1]>>12);
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void* DivSample::getCurBuf() {
|
||||
|
@ -1550,6 +1581,8 @@ void* DivSample::getCurBuf() {
|
|||
return dataIMA;
|
||||
case DIV_SAMPLE_DEPTH_12BIT:
|
||||
return data12;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
return data4;
|
||||
case DIV_SAMPLE_DEPTH_16BIT:
|
||||
return data16;
|
||||
default:
|
||||
|
@ -1588,6 +1621,8 @@ unsigned int DivSample::getCurBufLen() {
|
|||
return lengthIMA;
|
||||
case DIV_SAMPLE_DEPTH_12BIT:
|
||||
return length12;
|
||||
case DIV_SAMPLE_DEPTH_4BIT:
|
||||
return length4;
|
||||
case DIV_SAMPLE_DEPTH_16BIT:
|
||||
return length16;
|
||||
default:
|
||||
|
@ -1703,4 +1738,5 @@ DivSample::~DivSample() {
|
|||
if (dataC219) delete[] dataC219;
|
||||
if (dataIMA) delete[] dataIMA;
|
||||
if (data12) delete[] data12;
|
||||
if (data4) delete[] data4;
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ enum DivSampleDepth: unsigned char {
|
|||
DIV_SAMPLE_DEPTH_C219=12,
|
||||
DIV_SAMPLE_DEPTH_IMA_ADPCM=13,
|
||||
DIV_SAMPLE_DEPTH_12BIT=14,
|
||||
DIV_SAMPLE_DEPTH_4BIT=15,
|
||||
DIV_SAMPLE_DEPTH_16BIT=16,
|
||||
DIV_SAMPLE_DEPTH_MAX // boundary for sample depth
|
||||
};
|
||||
|
@ -147,8 +148,9 @@ struct DivSample {
|
|||
unsigned char* dataC219; // 12
|
||||
unsigned char* dataIMA; // 13
|
||||
unsigned char* data12; // 14
|
||||
unsigned char* data4; // 15
|
||||
|
||||
unsigned int length8, length16, length1, lengthDPCM, lengthZ, lengthQSoundA, lengthA, lengthB, lengthK, lengthBRR, lengthVOX, lengthMuLaw, lengthC219, lengthIMA, length12;
|
||||
unsigned int length8, length16, length1, lengthDPCM, lengthZ, lengthQSoundA, lengthA, lengthB, lengthK, lengthBRR, lengthVOX, lengthMuLaw, lengthC219, lengthIMA, length12, length4;
|
||||
|
||||
unsigned int samples;
|
||||
|
||||
|
@ -360,6 +362,7 @@ struct DivSample {
|
|||
dataC219(NULL),
|
||||
dataIMA(NULL),
|
||||
data12(NULL),
|
||||
data4(NULL),
|
||||
length8(0),
|
||||
length16(0),
|
||||
length1(0),
|
||||
|
@ -375,6 +378,7 @@ struct DivSample {
|
|||
lengthC219(0),
|
||||
lengthIMA(0),
|
||||
length12(0),
|
||||
length4(0),
|
||||
samples(0) {
|
||||
for (int i=0; i<DIV_MAX_CHIPS; i++) {
|
||||
for (int j=0; j<DIV_MAX_SAMPLE_TYPE; j++) {
|
||||
|
|
|
@ -212,7 +212,7 @@ const char* sampleDepths[DIV_SAMPLE_DEPTH_MAX]={
|
|||
"C219 PCM",
|
||||
"IMA ADPCM",
|
||||
"12-bit PCM",
|
||||
NULL,
|
||||
"4-bit PCM",
|
||||
"16-bit PCM"
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue