mirror of
https://github.com/doukutsu-rs/doukutsu-rs
synced 2025-12-08 05:05:40 +00:00
Fix music fading out too quickly
This commit is contained in:
parent
37aa3f36aa
commit
f4b5df3640
|
|
@ -3,6 +3,7 @@ use std::io::{BufRead, BufReader, Lines};
|
|||
use std::str::FromStr;
|
||||
use std::sync::mpsc;
|
||||
use std::sync::mpsc::{Receiver, Sender};
|
||||
use std::time::Instant;
|
||||
|
||||
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
||||
#[cfg(feature = "ogg-playback")]
|
||||
|
|
@ -34,6 +35,9 @@ mod stuff;
|
|||
mod wav;
|
||||
mod wave_bank;
|
||||
|
||||
/// Number of seconds to fade out the background music completely.
|
||||
const FADEOUT_DURATION: f32 = 5.0;
|
||||
|
||||
pub struct SoundManager {
|
||||
soundbank: Option<SoundBank>,
|
||||
tx: Sender<PlaybackMessage>,
|
||||
|
|
@ -628,6 +632,7 @@ where
|
|||
let mut bgm_vol_saved = 1.0_f32;
|
||||
let mut sfx_vol = 1.0_f32;
|
||||
let mut bgm_fadeout = false;
|
||||
let mut last_fadeout = Instant::now();
|
||||
pixtone.mix(&mut pxt_buf, sample_rate);
|
||||
|
||||
let err_fn = |err| eprintln!("an error occurred on stream: {}", err);
|
||||
|
|
@ -637,11 +642,17 @@ where
|
|||
move |data: &mut [T], _: &cpal::OutputCallbackInfo| {
|
||||
loop {
|
||||
if bgm_fadeout && bgm_vol > 0.0 {
|
||||
bgm_vol -= 0.02;
|
||||
}
|
||||
// Since this callback can be called at different time intervals,
|
||||
// we try to decrease the volume corresponding to the time elapsed since the last invocation.
|
||||
let elapsed = last_fadeout.elapsed().as_secs_f32();
|
||||
last_fadeout = Instant::now();
|
||||
|
||||
if bgm_vol < 0.0 {
|
||||
bgm_vol = 0.0;
|
||||
let step = bgm_vol_saved / FADEOUT_DURATION * elapsed;
|
||||
bgm_vol -= step;
|
||||
|
||||
if bgm_vol < 0.0 {
|
||||
bgm_vol = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
match rx.try_recv() {
|
||||
|
|
@ -749,6 +760,7 @@ where
|
|||
Ok(PlaybackMessage::FadeoutSong) => {
|
||||
bgm_fadeout = true;
|
||||
bgm_vol_saved = bgm_vol;
|
||||
last_fadeout = Instant::now();
|
||||
}
|
||||
Ok(PlaybackMessage::SaveState) => {
|
||||
saved_state = match state {
|
||||
|
|
|
|||
Loading…
Reference in a new issue