37 lines
887 B
Dart
37 lines
887 B
Dart
import 'dart:typed_data';
|
|
|
|
enum G711Type {
|
|
uLaw,
|
|
aLaw,
|
|
}
|
|
|
|
class G711Decoder {
|
|
Uint8List g711Decode(Uint8List g711Data, G711Type g711Type) {
|
|
List<int> pcmData = [];
|
|
int sign, exponent, mantissa, sample;
|
|
|
|
for (int i = 0; i < g711Data.length; i++) {
|
|
int value = g711Data[i];
|
|
|
|
if (g711Type == G711Type.uLaw) {
|
|
// μ-law decoding
|
|
value = ~value & 0xFF;
|
|
sign = (value & 0x80) == 0 ? 1 : -1;
|
|
exponent = (value & 0x70) >> 4;
|
|
mantissa = ((value & 0x0F) << 4) + 0x10;
|
|
sample = (mantissa << exponent) * sign;
|
|
} else {
|
|
// A-law decoding
|
|
sign = (value & 0x80) == 0 ? 1 : -1;
|
|
exponent = ((value & 0x70) >> 4) + 1;
|
|
mantissa = (value & 0x0F) + 0x10;
|
|
sample = (mantissa << exponent) * sign;
|
|
}
|
|
|
|
pcmData.add(sample);
|
|
}
|
|
|
|
return Uint8List.fromList(pcmData);
|
|
}
|
|
}
|