// cmd/main/main.mbt
//
// 命令行入口:读 .opus 文件 → decode_opus_pcm → 输出 16-bit PCM WAV。
///|
/// 把 48 kHz 单声道 Float PCM 序列化为 16-bit PCM WAV 字节。
/// 样本超出 [-1,1] 时截断,再四舍五入到 16 位有符号整数。
fn wav_encode_pcm16(pcm : Array[Double], sample_rate : Int32) -> Bytes {
let frames = pcm.length()
let data_size = frames * 2
let buf = @buffer.Buffer()
// RIFF 头
buf.write_bytes(b"RIFF")
buf.write_uint_le((36 + data_size).reinterpret_as_uint())
buf.write_bytes(b"WAVE")
// fmt chunk
buf.write_bytes(b"fmt ")
buf.write_uint_le(16U)
buf.write_uint16_le((1).to_uint16()) // PCM
buf.write_uint16_le((1).to_uint16()) // 单声道
buf.write_uint_le(sample_rate.reinterpret_as_uint())
buf.write_uint_le((sample_rate * 2).reinterpret_as_uint()) // 字节率
buf.write_uint16_le((2).to_uint16()) // block align
buf.write_uint16_le((16).to_uint16()) // 位深
// data chunk
buf.write_bytes(b"data")
buf.write_uint_le(data_size.reinterpret_as_uint())
for f in 0.. [output.wav|.f32]")
return
}
let input = args[1]
let output = if args.length() >= 3 { args[2] } else { "\{input}.wav" }
try {
let data = @fs.read_file_to_bytes(input)
match @moonopus.decode_opus_pcm(data) {
Ok(pcm) => {
println("解码成功: \{pcm.length()} 个样本 @ 48 kHz 单声道")
let blob = if output.has_suffix(".f32") {
// 原始 f32le(逐样本 little-endian 32 位浮点),供逐样本差分复现
let buf = @buffer.Buffer()
for i in 0.. println("解码失败: \{e}")
}
} catch {
@fs.IOError::IOError(msg) => println("I/O 错误: \{msg}")
}
}