commit: f2a782dac74ac44e051975b02722f53793235f90
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Sat, 11 Feb 2023 19:33:58 +0100
Initial Commit
Diffstat:
A | format/au/au.ha | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
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
+};