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:
parent
984299deb3
commit
23602bde73
|
@ -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)
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue