use crate::{AudioFrame, AudioTurnDetector, TurnError, TurnPrediction, TurnState};
pub struct TurnController<T: AudioTurnDetector> {
inner: T,
last_state: Option<TurnState>,
}
impl<T: AudioTurnDetector> TurnController<T> {
pub fn new(inner: T) -> Self {
Self {
inner,
last_state: None,
}
}
pub fn push_audio(&mut self, frame: &AudioFrame) {
self.inner.push_audio(frame);
}
pub fn predict(&mut self) -> Result<TurnPrediction, TurnError> {
let result = self.inner.predict()?;
self.last_state = Some(result.state);
Ok(result)
}
pub fn reset(&mut self) {
self.inner.reset();
self.last_state = None;
}
pub fn reset_if_finished(&mut self) -> bool {
match self.last_state {
Some(TurnState::Unfinished) => false,
_ => {
self.reset();
true
}
}
}
pub fn last_state(&self) -> Option<TurnState> {
self.last_state
}
pub fn inner_mut(&mut self) -> &mut T {
&mut self.inner
}
pub fn into_inner(self) -> T {
self.inner
}
}