1
0
Fork 0
mirror of https://github.com/doukutsu-rs/doukutsu-rs synced 2025-03-24 02:49:21 +00:00

nuke saved bgm state if it was previously stopped

This commit is contained in:
Alula 2020-11-05 23:10:15 +01:00
parent 984299deb3
commit 23602bde73
No known key found for this signature in database
GPG key ID: 3E00485503A1D8BA

View file

@ -189,20 +189,19 @@ fn run<T>(rx: Receiver<PlaybackMessage>, bank: SoundBank,
let mut state = PlaybackState::Stopped;
let mut saved_state: Option<SavedPlaybackState> = None;
let mut speed = 1.0;
let mut engine = PlaybackEngine::new(Song::empty(), &bank);
let mut org_engine = PlaybackEngine::new(Song::empty(), &bank);
let mut pixtone = PixTonePlayback::new();
pixtone.create_samples();
log::info!("Audio format: {} {}", sample_rate, channels);
engine.set_sample_rate(sample_rate as usize);
engine.loops = usize::MAX;
org_engine.set_sample_rate(sample_rate as usize);
org_engine.loops = usize::MAX;
let mut org_buf = vec![0x8080; 441];
let mut bgm_buf = vec![0x8080; 441];
let mut pxt_buf = vec![0x8000; 441];
let mut org_index = 0;
let mut bgm_index = 0;
let mut pxt_index = 0;
let mut frames = engine.render_to(&mut org_buf);
let mut frames = org_engine.render_to(&mut bgm_buf);
pixtone.mix(&mut pxt_buf, sample_rate);
let err_fn = |err| eprintln!("an error occurred on stream: {}", err);
@ -213,11 +212,15 @@ fn run<T>(rx: Receiver<PlaybackMessage>, bank: SoundBank,
loop {
match rx.try_recv() {
Ok(PlaybackMessage::PlaySong(song)) => {
engine.start_song(*song, &bank);
if state == PlaybackState::Stopped {
saved_state = None;
}
for i in &mut org_buf[0..frames] { *i = 0x8080 };
frames = engine.render_to(&mut org_buf);
org_index = 0;
org_engine.start_song(*song, &bank);
for i in &mut bgm_buf[0..frames] { *i = 0x8080 };
frames = org_engine.render_to(&mut bgm_buf);
bgm_index = 0;
state = PlaybackState::Playing;
}
@ -225,28 +228,32 @@ fn run<T>(rx: Receiver<PlaybackMessage>, bank: SoundBank,
pixtone.play_sfx(id);
}
Ok(PlaybackMessage::Stop) => {
if state == PlaybackState::Stopped {
saved_state = None;
}
state = PlaybackState::Stopped;
}
Ok(PlaybackMessage::SetSpeed(new_speed)) => {
assert!(new_speed > 0.0);
speed = new_speed;
engine.set_sample_rate((sample_rate / new_speed) as usize);
org_engine.set_sample_rate((sample_rate / new_speed) as usize);
}
Ok(PlaybackMessage::SaveState) => {
saved_state = Some(engine.get_state());
saved_state = Some(org_engine.get_state());
}
Ok(PlaybackMessage::RestoreState) => {
if saved_state.is_some() {
engine.set_state(saved_state.clone().unwrap(), &bank);
org_engine.set_state(saved_state.clone().unwrap(), &bank);
saved_state = None;
if state == PlaybackState::Stopped {
engine.set_position(0);
org_engine.set_position(0);
}
for i in &mut org_buf[0..frames] { *i = 0x8080 };
frames = engine.render_to(&mut org_buf);
org_index = 0;
for i in &mut bgm_buf[0..frames] { *i = 0x8080 };
frames = org_engine.render_to(&mut bgm_buf);
bgm_index = 0;
state = PlaybackState::Playing;
}
@ -259,15 +266,15 @@ fn run<T>(rx: Receiver<PlaybackMessage>, bank: SoundBank,
let (org_sample_l, org_sample_r): (u16, u16) = {
if state == PlaybackState::Stopped {
(0x8000, 0x8000)
} else if org_index < frames {
let sample = org_buf[org_index];
org_index += 1;
} else if bgm_index < frames {
let sample = bgm_buf[bgm_index];
bgm_index += 1;
((sample & 0xff) << 8, sample & 0xff00)
} else {
for i in &mut org_buf[0..frames] { *i = 0x8080 };
frames = engine.render_to(&mut org_buf);
org_index = 0;
let sample = org_buf[0];
for i in &mut bgm_buf[0..frames] { *i = 0x8080 };
frames = org_engine.render_to(&mut bgm_buf);
bgm_index = 0;
let sample = bgm_buf[0];
((sample & 0xff) << 8, sample & 0xff00)
}
};