pub(crate) mod tables {
#![allow(
unused,
non_camel_case_types,
non_snake_case,
unreachable_patterns,
clippy::all,
clippy::pedantic,
clippy::nursery
)]
buffa::include_proto!("mlow.tables");
}
#[cfg(test)]
const GEN_ZLIB_LEVEL: u32 = 9;
const MAX_TABLE_BYTES: u64 = 4 * 1024 * 1024;
fn inflate(compressed: &[u8]) -> Vec<u8> {
wacore_binary::zlib_pool::decompress_zlib_pooled(compressed, MAX_TABLE_BYTES)
.expect("mlow table blob must zlib-inflate")
}
#[allow(clippy::disallowed_methods)]
pub(crate) fn load_blob_buffa<T: buffa::Message>(compressed: &[u8]) -> T {
let bytes = inflate(compressed);
T::decode_from_slice(bytes.as_slice()).expect("mlow table blob must protobuf-decode")
}
#[cfg(test)]
pub(crate) fn make_blob_raw(bytes: &[u8]) -> Vec<u8> {
use std::io::Write;
let mut enc =
flate2::write::ZlibEncoder::new(Vec::new(), flate2::Compression::new(GEN_ZLIB_LEVEL));
enc.write_all(bytes).expect("zlib write");
enc.finish().expect("zlib finish")
}
#[cfg(test)]
#[allow(clippy::disallowed_methods)]
mod generator {
use super::*;
use std::fs;
fn try_read_json(name: &str) -> Option<String> {
match fs::read_to_string(format!("src/voip/mlow/testdata/{name}")) {
Ok(s) => Some(s),
Err(_) => {
println!("skip {name}: JSON absent");
None
}
}
}
fn write_bin(name: &str, bytes: &[u8]) {
let path = format!("src/voip/mlow/testdata/{name}");
fs::write(&path, bytes).unwrap_or_else(|e| panic!("write {path}: {e}"));
println!("wrote {path} ({} bytes)", bytes.len());
}
#[test]
fn gen_runtime_tables() {
if std::env::var_os("VOIP_GEN_TABLES").is_none() {
println!("VOIP_GEN_TABLES not set; skipping table generation");
return;
}
if let Some(j) = try_read_json("lsf_seed.json") {
use buffa::Message;
let seed = super::super::smpl_lsf_seed::seed_from_json(&j);
write_bin("lsf_seed.bin", &make_blob_raw(&seed.encode_to_vec()));
}
if let Some(j) = try_read_json("pitch_seed.json") {
use buffa::Message;
let seed = super::super::smpl_pitch_seed::seed_from_json(&j);
write_bin("pitch_seed.bin", &make_blob_raw(&seed.encode_to_vec()));
}
if let Some(j) = try_read_json("cc_seed.json") {
use buffa::Message;
let seed = super::super::smpl_cc_tables::seed_from_json(&j);
write_bin("cc_seed.bin", &make_blob_raw(&seed.encode_to_vec()));
}
}
}