riff-handle v1.0.1
riff-handle
An parser for the RIFF specification.
Instead of parsing the whole file at once, it reads from a file handle. This allows for the determination of, for example, meta information about an audio file without having to load any sample data into memory.
For an example use-case, check out ponychopper.
Usage
getWaveMeta
Returns a WaveMeta
object, which contains info about sample length, duration, cue points, etc.
import fs from "fs/promises"
const handle = await.open(...)
try {
const size = (await handle.stat()).size
const meta = await getWaveMeta(handle, size)
} catch(e) {
console.error(e)
} finally {
await handle.close()
}
getWaveSampleRange
Allows to get a specific range of samples from a wav
file. For example usage, see the tests.
RIFFReader
The RIFFReader
class allows you to collect meta and read data chunks from a generic RIFF-formatted file.
Here's a basic usage to obtain meta:
import fs from "fs/promises"
const handle = await fs.open(...)
try {
const size = (await handle.stat()).size
const reader = new RIFFReader(handle, size)
// file_type: WAVE
// file_size: 152948
const { file_size, file_type } = await reader.init()
} catch(e) {
console.error(e)
} finally {
await handle.close()
}
Here, the init
function reads the meta block and sets up the reader to read more chunks. Checkout the implementation of getWaveMeta
for an example usage.
The BufferHandle
type
The exposed API accepts a BufferHandle
type, which is an abstraction of Node.js' fs.FileHandle
. This is to allow maximum use-cases (such as any generic buffer). It is implemented as follows:
export interface BufferHandle {
read(buffer: Buffer, offset?: number | null, length?: number | null, position?: number | null): Promise<{bytesRead: number}>;
}