int MicroRecorder::ALawEncode(char *destBuf, const char *srcBuf, int srcSize)
{
srcSize /= 2;
short *pcmBuf = (short *)srcBuf;
short *pcmEndBuf = pcmBuf + srcSize;
for (; pcmBuf < pcmEndBuf; pcmBuf++, destBuf++)
*destBuf = ALawEncode(*pcmBuf);
return srcSize;
}
char MicroRecorder::ALawEncode(short pcm)
{
unsigned alaw;
if (pcm < 0)
{
pcm = ~pcm;
alaw = 0x00;
}
else
alaw = 0x80;
pcm >>= 4;
if (pcm >= 0x100)
{
pcm >>= 4;
alaw += 0x40;
}
if (pcm >= 0x40)
{
pcm >>= 2;
alaw += 0x20;
}
if (pcm >= 0x20)
{
pcm >>= 1;
alaw += 0x10;
}
alaw += pcm;
return alaw ^ 0x55;
}