decode method

Float32List decode(
  1. Uint8List data
)
inherited

Decode a whole stream (walks frames, skips ID3v2). Returns interleaved float PCM.

Implementation

Float32List decode(Uint8List data) {
  _checkNotDisposed();
  var off = 0;
  if (data.length > 10 &&
      data[0] == 0x49 &&
      data[1] == 0x44 &&
      data[2] == 0x33) {
    final sz = ((data[6] & 0x7F) << 21) |
        ((data[7] & 0x7F) << 14) |
        ((data[8] & 0x7F) << 7) |
        (data[9] & 0x7F);
    off = 10 + sz;
  }
  final inPtr = calloc<Uint8>(data.length);
  inPtr.asTypedList(data.length).setAll(0, data);
  final outPtr = calloc<Float>(2 * 1152);
  final fi = calloc<GlintDecFrameInfo>();
  final acc = <double>[];
  try {
    while (off + 7 <= data.length) {
      if (_frameInfo((inPtr + off), data.length - off, fi) < 0) {
        off++;
        continue;
      }
      final fb = fi.ref.frameBytes;
      if (fb == 0 || off + fb > data.length) break;
      final n =
          _decode(_handle, (inPtr + off), data.length - off, outPtr, fi);
      if (n > 0) {
        final ch = fi.ref.channels == 0 ? 1 : fi.ref.channels;
        acc.addAll(outPtr.asTypedList(n * ch));
      }
      off += fb;
    }
  } finally {
    calloc.free(inPtr);
    calloc.free(outPtr);
    calloc.free(fi);
  }
  return Float32List.fromList(acc);
}