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