// RFC 9639 Appendix D.1, a complete independent one-sample stereo file.
// The input is deliberately fed one byte at a time.
///|
fn run() -> Unit raise @flac.FlacError {
let input = b"\x66\x4c\x61\x43\x80\x00\x00\x22\x10\x00\x10\x00\x00\x00\x0f\x00\x00\x0f\x0a\xc4\x42\xf0\x00\x00\x00\x01\x3e\x84\xb4\x18\x07\xdc\x69\x03\x07\x58\x6a\x3d\xad\x1a\x2e\x0f\xff\xf8\x69\x18\x00\x00\xbf\x03\x58\xfd\x03\x12\x8b\xaa\x9a"
let decoder = @flac.Decoder::new()
let mut cursor = 0
let mut samples = 0L
while true {
match decoder.next() {
MetadataReady(metadata) =>
println("sample rate: \{metadata.info.sample_rate}")
AudioFrame(frame) => {
samples += frame.block_size.to_int64()
println("left: \{frame.channels[0][0]}, right: \{frame.channels[1][0]}")
// Consume or copy the owned PCM here; retaining it is optional.
}
LinkEnd(integrity) => println("link complete: \{integrity}")
NeedInput =>
if cursor < input.length() {
let accepted = decoder.push(input[cursor:cursor + 1].to_owned())
cursor += accepted
} else {
decoder.finish()
}
Done(integrity) => {
println("samples: \{samples}; integrity: \{integrity}")
break
}
}
}
}
///|
fn main {
run() catch {
error => println("decoding failed: \{error}")
}
}