[an error occurred while processing this directive]
|
Немного упростил свой, чтоб понятней было, убрал всякую работу с буферами и указателями. Переведешь на АСМ и будет совсем быстро работать.
//------uLaw--------------------------
//
//
const unsigned char NumBits[256]={
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
};
unsigned char Sign, Exponent, Mantissa,uLawData;
signed int PCMData;
void Compress () // ulaw compressing
{
Sign=0;
if (PCMData<0) PCMData=-PCMData;
else Sign=0x80;
PCMData+=132;
if (PCMData<0) PCMData=32767;
Exponent=NumBits[(PCMData>>7)]-1;
Mantissa=(PCMData>>(Exponent+3))&0x0f;
CSound=~(Sign|(Exponent<<4)|Mantissa);
}
void Decompress()
{
uLawData=0x80;
Exponent=(uLawData>>4)&0x07;
Mantissa=(uLawData&0x0f)+16;
PCMData=(Mantissa<<(Exponent+3))-132;
if (!(uLawData&0x80)) PCMData=-PCMData;
}
E-mail: info@telesys.ru