diff --git a/src/driver/tasks/events.rs b/src/driver/tasks/events.rs index 4446825..73b2edb 100644 --- a/src/driver/tasks/events.rs +++ b/src/driver/tasks/events.rs @@ -70,8 +70,8 @@ pub(crate) async fn runner(_interconnect: Interconnect, evt_rx: Receiver { let old = state.playing; state.playing = mode; - if old != mode && mode.is_done() { - global.fire_track_event(TrackEvent::End, i); + if old != mode { + global.fire_track_event(mode.as_track_event(), i); } }, Volume(vol) => { diff --git a/src/events/track.rs b/src/events/track.rs index 58d224e..c0b6be4 100644 --- a/src/events/track.rs +++ b/src/events/track.rs @@ -10,6 +10,14 @@ #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] #[non_exhaustive] pub enum TrackEvent { + /// The attached track has resumed playing. + /// + /// This event will not fire when a track first starts, + /// but will fire when a track changes from, e.g., paused to playing. + /// This is most relevant for queue users. + Play, + /// The attached track has been paused. + Pause, /// The attached track has ended. End, /// The attached track has looped. diff --git a/src/tracks/mode.rs b/src/tracks/mode.rs index 88a65e4..b54f6ae 100644 --- a/src/tracks/mode.rs +++ b/src/tracks/mode.rs @@ -1,3 +1,5 @@ +use crate::events::TrackEvent; + /// Playback status of a track. #[derive(Clone, Copy, Debug, Eq, PartialEq)] #[non_exhaustive] @@ -29,6 +31,15 @@ impl PlayMode { state => state, } } + + pub(crate) fn as_track_event(self) -> TrackEvent { + use PlayMode::*; + match self { + Play => TrackEvent::Play, + Pause => TrackEvent::Pause, + Stop | End => TrackEvent::End, + } + } } impl Default for PlayMode {