function wavFile
wavFile(): Coder<WavFile>

Creates a coder for complete WAV files.

Encodes and decodes WAV files laid out as exactly three chunks in this order:

  • RIFF header chunk
  • Format chunk
  • Data chunk with audio samples

Files carrying additional chunks (fact, LIST) or a different chunk order are not handled; compose factChunk and listChunk manually for those.

Examples

Complete WAV file encoding and decoding

import { assertEquals } from "@std/assert";
import { wavFile } from "@binstruct/wav";

const wavCoder = wavFile();
const testWav = {
  riff: {
    chunkId: "RIFF" as const,
    chunkSize: 1038, // total file size minus the 8-byte RIFF header
    format: "WAVE" as const
  },
  fmt: {
    chunkId: "fmt " as const,
    chunkSize: 18, // 16 PCM fields plus the 2-byte cbSize
    audioFormat: 1, // PCM
    numChannels: 1, // Mono
    sampleRate: 44100,
    byteRate: 88200,
    blockAlign: 2,
    bitsPerSample: 16,
    cbSize: 0
  },
  data: {
    chunkId: "data" as const,
    chunkSize: 1000,
    audioData: new Array(1000).fill(0)
  }
};

const buffer = new Uint8Array(2048);
const bytesWritten = wavCoder.encode(testWav, buffer);
const [decoded, bytesRead] = wavCoder.decode(buffer);

assertEquals(bytesRead, bytesWritten);
assertEquals(bytesWritten, 1046); // 12 (RIFF) + 26 (fmt) + 1008 (data)
assertEquals(decoded.riff.chunkId, "RIFF");
assertEquals(decoded.riff.format, "WAVE");
assertEquals(decoded.fmt.audioFormat, 1);
assertEquals(decoded.fmt.numChannels, 1);
assertEquals(decoded.fmt.sampleRate, 44100);
assertEquals(decoded.data.audioData.length, 1000);

Return Type

Coder<WavFile>

A coder that can encode/decode WavFile objects

Usage

import { wavFile } from ".";