diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index 59e97891a..a8d1ba770 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -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>12)&0xf; + // if (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; } diff --git a/src/engine/sample.h b/src/engine/sample.h index 988dcc317..dfd69b400 100644 --- a/src/engine/sample.h +++ b/src/engine/sample.h @@ -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