horizontal_mixer 0.1.3

horizontal mixer in Rust using Kira for audio playback
Documentation
#![doc = include_str!("../readme.md")]


use std::time::Duration;

use kira::{
    manager::{backend::DefaultBackend, AudioManager, AudioManagerSettings},
    modulator::tweener::{TweenerBuilder, TweenerHandle},
    sound::static_sound::{StaticSoundData, StaticSoundSettings},
    tween::{ModulatorMapping, Tween, Value},
    Volume,
};

pub struct HorizontalMixer {
    manager: AudioManager<DefaultBackend>,
    vol_tween: TweenerHandle,
    pub track_1: StaticSoundData,
    pub track_2: StaticSoundData,
    pub current_track: i8,
    fade_time: Duration
}

impl HorizontalMixer {
    pub fn new(path_1: &str, path_2: &str, fade_time: Duration, loop_mus: bool) -> Self {
        let mut manager =
            AudioManager::<DefaultBackend>::new(AudioManagerSettings::default()).unwrap();

        let vol_tween = manager
            .add_modulator(TweenerBuilder { initial_value: 0.0 })
            .unwrap();

        if loop_mus {
            let track_1 = StaticSoundData::from_file(
                path_1,
                StaticSoundSettings::new()
                    .volume(Value::from_modulator(
                        &vol_tween,
                        ModulatorMapping {
                            input_range: (0.0, 1.0),
                            output_range: (Volume::Amplitude(1.0), Volume::Amplitude(0.0)),
                            ..Default::default()
                        },
                    ))
                    .loop_region(0.0..),
            )
            .unwrap();

            let track_2 = StaticSoundData::from_file(
                path_2,
                StaticSoundSettings::new()
                    .volume(Value::from_modulator(
                        &vol_tween,
                        ModulatorMapping {
                            input_range: (0.0, 1.0),
                            output_range: (Volume::Amplitude(0.0), Volume::Amplitude(1.0)),
                            ..Default::default()
                        },
                    ))
                    .loop_region(0.0..),
            )
            .unwrap();

            return HorizontalMixer {
                manager,
                vol_tween,
                track_1,
                track_2,
                current_track: 0,
                fade_time,
            }
        }

        let track_1 = StaticSoundData::from_file(
            path_1,
            StaticSoundSettings::new().volume(Value::from_modulator(
                &vol_tween,
                ModulatorMapping {
                    input_range: (0.0, 1.0),
                    output_range: (Volume::Amplitude(1.0), Volume::Amplitude(0.0)),
                    ..Default::default()
                },
            )),
        )
        .unwrap();

        let track_2 = StaticSoundData::from_file(
            path_2,
            StaticSoundSettings::new().volume(Value::from_modulator(
                &vol_tween,
                ModulatorMapping {
                    input_range: (0.0, 1.0),
                    output_range: (Volume::Amplitude(0.0), Volume::Amplitude(1.0)),
                    ..Default::default()
                },
            )),
        )
        .unwrap();

        HorizontalMixer {
            manager,
            vol_tween,
            track_1,
            track_2,
            current_track: 0,
            fade_time,
        }
    }

    pub fn switch_track(&mut self, which_track: i8) {
        if which_track < 2 {
            self.current_track = which_track;
        } else {
            self.current_track = 0;
        }

        self.vol_tween.set(
            self.current_track as f64,
            Tween {
                duration: self.fade_time,
                ..Default::default()
            },
        ).unwrap();
    }

    pub fn toggle_track(&mut self) {
        self.switch_track(self.current_track + 1);
    }

    pub fn play(&mut self) {
        self.manager.play(self.track_1.clone()).unwrap();
        self.manager.play(self.track_2.clone()).unwrap();
    }
}