//! List a sound bank's streams and their declared rates. //! //! cargo run -p sylpheed-formats --example bank_streams -- 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 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}"), } } }