This branch predates CI on `main`. `cargo fmt --all` only; no behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
45 lines
1.6 KiB
Rust
45 lines
1.6 KiB
Rust
//! List a sound bank's streams and their declared rates.
|
|
//!
|
|
//! cargo run -p sylpheed-formats --example bank_streams -- <disc> BGM_102.slb …
|
|
use sylpheed_formats::media::{self, DirectorySource};
|
|
use sylpheed_formats::{hash::name_hash, slb};
|
|
|
|
fn main() {
|
|
let mut a = std::env::args().skip(1);
|
|
let disc = a.next().expect("usage: bank_streams <disc> NAME.slb…");
|
|
let src = DirectorySource::new(std::path::PathBuf::from(&disc));
|
|
for name in a {
|
|
let h = name_hash(&name);
|
|
match media::read_sound_bank(&src, h) {
|
|
Ok(bytes) => {
|
|
let riffs = slb::to_xma_riffs(&bytes);
|
|
println!(
|
|
"{name} (hash {h:08x}, {} B on disc) header {:?} -> {} stream(s)",
|
|
bytes.len(),
|
|
slb::bank_header_len(&bytes),
|
|
riffs.len()
|
|
);
|
|
for (i, r) in riffs.iter().enumerate() {
|
|
let rate = if r.len() >= 0x28 {
|
|
u32::from_le_bytes(r[0x20..0x24].try_into().unwrap())
|
|
} else {
|
|
0
|
|
};
|
|
let payload = r.len() - 60;
|
|
println!(
|
|
" stream {i}: payload {payload} B ({} packets) declared {rate} B/s \
|
|
=> {:.3} s",
|
|
payload / 2048,
|
|
if rate > 0 {
|
|
payload as f64 / rate as f64
|
|
} else {
|
|
0.0
|
|
}
|
|
);
|
|
}
|
|
}
|
|
Err(e) => println!("{name}: {e}"),
|
|
}
|
|
}
|
|
}
|