Better handling of anonymous sounds in wave banks
This commit is contained in:
parent
3dc24d58b5
commit
0c24fd0847
12
src/main.rs
12
src/main.rs
|
@ -9,7 +9,7 @@ use log::{debug, error, info, warn};
|
||||||
use brd::converter;
|
use brd::converter;
|
||||||
use brd::ddr::ssq::SSQ;
|
use brd::ddr::ssq::SSQ;
|
||||||
use brd::osu;
|
use brd::osu;
|
||||||
use brd::xact3::xwb::WaveBank;
|
use brd::xact3::xwb::{Sound as XWBSound, WaveBank};
|
||||||
|
|
||||||
#[derive(Clap)]
|
#[derive(Clap)]
|
||||||
#[clap()]
|
#[clap()]
|
||||||
|
@ -161,15 +161,17 @@ fn main() -> Result<()> {
|
||||||
|
|
||||||
let audio_data = if wave_bank.sounds.contains_key(sound_name) {
|
let audio_data = if wave_bank.sounds.contains_key(sound_name) {
|
||||||
wave_bank.sounds.get(sound_name).unwrap().to_wav()?
|
wave_bank.sounds.get(sound_name).unwrap().to_wav()?
|
||||||
} else if wave_bank.sounds.contains_key("1") {
|
} else if wave_bank.sounds.len() == 2 {
|
||||||
warn!(
|
warn!(
|
||||||
"Sound {} not found in wave bank, using second entry",
|
"Sound {} not found in wave bank, but it has two entries; assuming these are preview and full song",
|
||||||
sound_name
|
sound_name
|
||||||
);
|
);
|
||||||
wave_bank.sounds.get("1").unwrap().to_wav()?
|
let mut sounds = wave_bank.sounds.values().collect::<Vec<&XWBSound>>();
|
||||||
|
sounds.sort_unstable_by(|a, b| b.size.cmp(&a.size));
|
||||||
|
sounds[0].to_wav()?
|
||||||
} else {
|
} else {
|
||||||
return error(format!(
|
return error(format!(
|
||||||
"Could not find sound with chart name {} or second numbered entry in wave bank",
|
"Could not find matching sound in wave bank (searched for {})",
|
||||||
sound_name,
|
sound_name,
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
|
|
|
@ -199,7 +199,7 @@ impl WaveBank<'_> {
|
||||||
let entry_names = if segments[3].len() == info.entry_count as usize * 64 {
|
let entry_names = if segments[3].len() == info.entry_count as usize * 64 {
|
||||||
exec_nom_parser(count(take_str64, info.entry_count as usize), segments[3])?
|
exec_nom_parser(count(take_str64, info.entry_count as usize), segments[3])?
|
||||||
} else {
|
} else {
|
||||||
warn!("File does not have name entries");
|
warn!("Wave bank does not have name entries");
|
||||||
(0..info.entry_count).map(|x| x.to_string()).collect()
|
(0..info.entry_count).map(|x| x.to_string()).collect()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -216,6 +216,7 @@ impl WaveBank<'_> {
|
||||||
Sound {
|
Sound {
|
||||||
format: entry.format.clone(),
|
format: entry.format.clone(),
|
||||||
data: &segments[4][start..end],
|
data: &segments[4][start..end],
|
||||||
|
size: end - start,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -230,6 +231,7 @@ impl WaveBank<'_> {
|
||||||
pub struct Sound<'a> {
|
pub struct Sound<'a> {
|
||||||
format: Format,
|
format: Format,
|
||||||
data: &'a [u8],
|
data: &'a [u8],
|
||||||
|
pub size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Sound<'_> {
|
impl Sound<'_> {
|
||||||
|
|
Reference in a new issue