decode method
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);
}