use mineral_model::SongId;
use mineral_stats::{Actor, BehaviorEvent, PauseAction};
use super::PlayerCore;
impl PlayerCore {
pub(crate) fn record_behavior(&self, actor: Actor, event: BehaviorEvent) {
self.inner
.stats
.event(mineral_stats::StatsEvent::Behavior { actor, event });
}
fn current_play(&self) -> Option<(SongId, i64)> {
let song = self.with_state(|st| st.current_song.clone())?;
let position = i64::try_from(self.inner.audio.snapshot().position_ms).unwrap_or(i64::MAX);
Some((song.id, position))
}
pub(crate) fn pause_playback(&self, actor: Actor) {
self.inner.audio.pause();
if let Some((song, at_ms)) = self.current_play() {
self.record_behavior(
actor,
BehaviorEvent::Pause {
song,
at_ms,
action: PauseAction::Pause,
},
);
}
}
pub(crate) fn resume_playback(&self, actor: Actor) {
self.inner.audio.resume();
if let Some((song, at_ms)) = self.current_play() {
self.record_behavior(
actor,
BehaviorEvent::Pause {
song,
at_ms,
action: PauseAction::Resume,
},
);
}
}
pub(crate) fn toggle_playback(&self, actor: Actor) {
if self.inner.audio.snapshot().playing {
self.pause_playback(actor);
} else {
self.resume_playback(actor);
}
}
pub(crate) fn seek_playback(&self, position_ms: u64, actor: Actor) {
let before = self.current_play();
self.inner.audio.seek(position_ms);
if let Some((song, from_ms)) = before {
self.record_behavior(
actor,
BehaviorEvent::Seek {
song,
from_ms,
to_ms: i64::try_from(position_ms).unwrap_or(i64::MAX),
},
);
}
}
pub(crate) fn set_playback_volume(&self, pct: u8, actor: Actor) {
let from = self.inner.audio.snapshot().volume_pct;
self.inner.audio.set_volume(pct);
self.record_behavior(
actor,
BehaviorEvent::VolumeChange {
from_pct: i64::from(from),
to_pct: i64::from(pct),
},
);
}
}