glintReadWav function

GlintDecodedAudio glintReadWav(
  1. Uint8List data
)

Read a WAV buffer (PCM 8/16/24/32, IEEE float 32/64, A-law, mu-law, EXTENSIBLE) into interleaved float PCM. Throws StateError on malformed or unsupported input.

Implementation

GlintDecodedAudio glintReadWav(Uint8List data) {
  if (data.isEmpty) throw StateError('empty WAV');
  final lib = _loadLibrary();
  final fn = lib.lookupFunction<_WavReadNative, _WavRead>('glint_wav_read');
  final free = lib.lookupFunction<_FreeNative, _Free>('glint_free');
  final inPtr = calloc<Uint8>(data.length);
  inPtr.asTypedList(data.length).setAll(0, data);
  final sr = calloc<Int32>();
  final ch = calloc<Int32>();
  final fr = calloc<Int32>();
  try {
    final ptr = fn(inPtr, data.length, sr, ch, fr);
    if (ptr == nullptr || ch.value <= 0) {
      throw StateError('WAV read failed (unsupported format?)');
    }
    final total = fr.value * ch.value;
    final pcm = Float32List.fromList(ptr.asTypedList(total));
    free(ptr.cast<Void>());
    return GlintDecodedAudio(pcm, sr.value, ch.value);
  } finally {
    calloc.free(inPtr);
    calloc.free(sr);
    calloc.free(ch);
    calloc.free(fr);
  }
}