finish method

  1. @override
Blob finish()
override

Implementation

@override
web.Blob finish() {
  const headerSize = 44;
  const bitsPerSample = 16;
  const bytesPerSample = bitsPerSample ~/ 8;
  final byteRate = sampleRate * numChannels * bytesPerSample;
  final blockAlign = numChannels * bytesPerSample;

  final view = ByteData(headerSize);

  // RIFF chunk
  view.setString(0, 'RIFF');
  view.setUint32(4, headerSize + _audioDataLength - 8, Endian.little);
  view.setString(8, 'WAVE');

  view.setString(12, 'fmt ');
  view.setUint32(16, 16, Endian.little);
  view.setUint16(20, 1, Endian.little);
  view.setUint16(22, numChannels, Endian.little);
  view.setUint32(24, sampleRate, Endian.little);
  view.setUint32(28, byteRate, Endian.little);
  view.setUint16(32, blockAlign, Endian.little);
  view.setUint16(34, bitsPerSample, Endian.little);

  view.setString(36, 'data');
  view.setUint32(40, _audioDataLength, Endian.little);

  final blob = web.Blob(
    <JSUint8Array>[
      view.buffer.asUint8List().toJS,
      ..._chunks.map((c) => c.toJS),
    ].toJS,
    web.BlobPropertyBag(type: 'audio/wav'),
  );

  cleanup();

  return blob;
}