use crate::audio;
use crate::audio::player::AudioPlayerControls;
use crate::common::errors::MyError;
use crossbeam_channel::{select, Receiver};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
enum State {
Running,
Paused,
Stopped,
}
pub struct Runner {
audio_player: audio::player::AudioPlayer,
state: State,
rx_controls: Receiver<Control>,
}
#[derive(Debug, PartialEq)]
pub enum Control {
PauseContinue,
MuteUnmute,
Exit,
}
impl Runner {
pub fn new(audio_player: audio::player::AudioPlayer, rx_controls: Receiver<Control>) -> Self {
Self {
audio_player,
state: State::Running,
rx_controls,
}
}
pub fn run(&mut self, barrier: std::sync::Arc<std::sync::Barrier>) -> Result<(), MyError> {
barrier.wait();
self.audio_player.player.resume()?;
while self.state != State::Stopped {
select! {
recv(self.rx_controls) -> msg => {
match msg.unwrap() {
Control::PauseContinue => {
self.state = match self.state {
State::Running => State::Paused,
State::Paused => State::Running,
State::Stopped => State::Stopped,
};
self.audio_player.player.toggle_play()?;
},
Control::MuteUnmute => {
self.audio_player.player.toggle_mute()?;
},
Control::Exit => {
self.state = State::Stopped;
self.audio_player.player.stop()?;
},
}
},
}
}
Ok(())
}
}