logo

hare-audio

commit: f2a782dac74ac44e051975b02722f53793235f90
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sat, 11 Feb 2023 19:33:58 +0100

Initial Commit

Diffstat:

Aformat/au/au.ha75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+), 0 deletions(-)

diff --git a/format/au/au.ha b/format/au/au.ha @@ -0,0 +1,75 @@ +use io; +use bufio; +use endian; +use bytes; + +export type encoding = enum u32 { + _8B_G711_ULAW = 1, + _8B_LPCM = 2, + _16B_LPCM = 3, + _24B_LPCM = 4, + _32B_LPCM = 5, + + _32B_FPCM = 6, + _64B_FPCM = 7, + + _4B_G721_ADPCM = 23, + + _3B_G723_ADPCM = 25, + + _8B_G711_ALAW = 27, +}; + +export type header = struct { + extra_offset: u32, + length: u32, + encoding: u32, + samplerate: u32, + channels: u32, +}; + +def magic: [4]u8 = ['.', 's', 'n', 'd']; + +export fn write_header(h: io::handle, au: *header) (void | io::error) = { + let buf: [4]u8 = [0...]; + const offset_base = 24u32; + + io::writeall(h, magic)?; + + endian::beputu32(buf, offset_base + au.extra_offset); + io::writeall(h, buf)?; + + endian::beputu32(buf, au.length); + io::writeall(h, buf)?; + + endian::beputu32(buf, au.encoding); + io::writeall(h, buf)?; + + endian::beputu32(buf, au.samplerate); + io::writeall(h, buf)?; + + endian::beputu32(buf, au.channels); + io::writeall(h, buf)?; +}; + +@test fn write_header() void = { + let header = header { + extra_offset = 0, + length = 0, + encoding = encoding::_8B_LPCM, + samplerate = 8000, + channels = 1, + }; + + let buf: [24]u8 = [0...]; + let iobuf = bufio::fixed(buf, io::mode::RDWR); + + write_header(&iobuf.stream, &header)!; + + assert(bytes::equal(buf[0..4], magic)); + assert(bytes::equal(buf[4..8], [0, 0, 0, 24])); // offset + assert(bytes::equal(buf[8..12], [0, 0, 0, 0])); // length + assert(bytes::equal(buf[12..16], [0, 0, 0, 0x02])); // encoding + assert(bytes::equal(buf[16..20], [0, 0, 0x1F, 0x40])); // samplerate + assert(bytes::equal(buf[20..24], [0, 0, 0, 1])); // channels +};