import 'dart:typed_data'; enum G711Type { uLaw, aLaw, } class G711Decoder { Uint8List g711Decode(Uint8List g711Data, G711Type g711Type) { List 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); } }