@echogarden/wave-codec
Version:
A fully-featured WAVE format encoder and decoder. Written in pure TypeScript.
79 lines • 3.15 kB
JavaScript
/////////////////////////////////////////////////////////////////////////////////////////////
// Encode 16-bit linear PCM samples into 8-bit a-Law samples.
/////////////////////////////////////////////////////////////////////////////////////////////
export function encodeAlaw(pcmSamples) {
const aLawSamples = new Uint8Array(pcmSamples.length);
for (let i = 0; i < pcmSamples.length; i++) {
aLawSamples[i] = pcmToAlawSample(pcmSamples[i]);
}
return aLawSamples;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Decode 8-bit a-Law samples into 16-bit PCM samples.
/////////////////////////////////////////////////////////////////////////////////////////////
export function decodeAlaw(aLawSamples) {
const pcmSamples = new Int16Array(aLawSamples.length);
for (let i = 0; i < aLawSamples.length; i++) {
pcmSamples[i] = alawToPcmSample(aLawSamples[i]);
}
return pcmSamples;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Encode a 16-bit linear PCM sample as 8-bit A-Law.
/////////////////////////////////////////////////////////////////////////////////////////////
export function pcmToAlawSample(pcmSample) {
if (pcmSample === -32768) {
pcmSample = -32767;
}
const sign = ((~pcmSample) >> 8) & 0x80;
if (sign === 0) {
pcmSample = -pcmSample;
}
if (pcmSample > 32635) {
pcmSample = 32635;
}
let compandedValue;
if (pcmSample >= 256) {
const exponent = logTable[(pcmSample >> 8) & 0x7f];
const mantissa = (pcmSample >> (exponent + 3)) & 0x0f;
compandedValue = (exponent << 4) | mantissa;
}
else {
compandedValue = pcmSample >> 4;
}
const aLawSample = compandedValue ^ (sign ^ 0x55);
return aLawSample;
}
/////////////////////////////////////////////////////////////////////////////////////////////
// Decode a 8-bit A-Law sample as 16-bit PCM.
/////////////////////////////////////////////////////////////////////////////////////////////
export function alawToPcmSample(aLawSample) {
let sign = 0;
aLawSample ^= 0x55;
if (aLawSample & 0x80) {
aLawSample &= ~(1 << 7);
sign = -1;
}
const position = ((aLawSample & 0xf0) >> 4) + 4;
let decoded = 0;
if (position !== 4) {
decoded = (1 << position) |
((aLawSample & 0x0f) << (position - 4)) |
(1 << (position - 5));
}
else {
decoded = (aLawSample << 1) | 1;
}
if (sign !== 0) {
decoded = -decoded;
}
const pcmSample = decoded * -8;
return pcmSample;
}
const logTable = new Uint8Array([
1, 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
]);
//# sourceMappingURL=Alaw.js.map