pub trait MediaPlayer: Send {
Show 14 methods
// Required methods
fn open(&mut self, req: OpenRequest) -> Result<(), PlayerError>;
fn play(&mut self) -> Result<(), PlayerError>;
fn pause(&mut self) -> Result<(), PlayerError>;
fn close(&mut self) -> Result<(), PlayerError>;
fn seek(&mut self, to: Duration) -> Result<(), PlayerError>;
fn set_volume(&mut self, volume: f32) -> Result<(), PlayerError>;
fn set_muted(&mut self, muted: bool) -> Result<(), PlayerError>;
fn set_rate(&mut self, rate: f64) -> Result<(), PlayerError>;
fn select_audio_track(
&mut self,
index: Option<i32>,
) -> Result<(), PlayerError>;
fn select_subtitle_track(
&mut self,
index: Option<i32>,
) -> Result<(), PlayerError>;
fn snapshot(&self) -> PlaybackSnapshot;
fn capabilities(&self) -> Capabilities;
// Provided methods
fn set_audio_settings(
&mut self,
_settings: &AudioSettings,
) -> Result<(), PlayerError> { ... }
fn audio_settings(&self) -> AudioSettings { ... }
}Expand description
Anything that can present media.
Implementations: MpvPlayer (Linux/Windows), ExoPlayerPlayer (Android),
WebviewPlayer (HTML5 element), and FakePlayer for tests. Every one of
them must pass [super::conformance].
Required Methods§
Sourcefn open(&mut self, req: OpenRequest) -> Result<(), PlayerError>
fn open(&mut self, req: OpenRequest) -> Result<(), PlayerError>
Present req.selection, beginning at req.start.
One operation, deliberately. An engine that cannot start at an offset
natively absorbs that internally — by deferring until loaded, or by
re-opening — because it is the only layer that knows when it can.
Callers must never follow open with a seek to achieve a start
position; that is the bug this signature exists to prevent.
fn play(&mut self) -> Result<(), PlayerError>
fn pause(&mut self) -> Result<(), PlayerError>
Sourcefn close(&mut self) -> Result<(), PlayerError>
fn close(&mut self) -> Result<(), PlayerError>
Stop and release the current item.
Must be idempotent and must leave the engine silent. “Stopped” and “producing no audio” were not the same thing in the previous design, and the gap between them is audible.
Sourcefn seek(&mut self, to: Duration) -> Result<(), PlayerError>
fn seek(&mut self, to: Duration) -> Result<(), PlayerError>
Seek to an absolute position on the item’s own timeline.
Whether that is an in-place seek or a re-open of the stream is the engine’s business: hls.js seeks within a VOD playlist, mpv’s HLS demuxer cannot make a server transcode from a new offset. Callers state the destination and nothing else.
fn set_volume(&mut self, volume: f32) -> Result<(), PlayerError>
fn set_muted(&mut self, muted: bool) -> Result<(), PlayerError>
fn set_rate(&mut self, rate: f64) -> Result<(), PlayerError>
fn select_audio_track(&mut self, index: Option<i32>) -> Result<(), PlayerError>
fn select_subtitle_track( &mut self, index: Option<i32>, ) -> Result<(), PlayerError>
Sourcefn snapshot(&self) -> PlaybackSnapshot
fn snapshot(&self) -> PlaybackSnapshot
One coherent read of the engine’s state.
fn capabilities(&self) -> Capabilities
Provided Methods§
Sourcefn set_audio_settings(
&mut self,
_settings: &AudioSettings,
) -> Result<(), PlayerError>
fn set_audio_settings( &mut self, _settings: &AudioSettings, ) -> Result<(), PlayerError>
Apply EQ, normalisation and gapless settings.
Provided rather than required: engines that cannot honour them say so
through Capabilities::audio_settings and inherit this no-op, instead
of every implementation carrying an Ok(()) it does not mean.