From 3b08997e1f01bc11f18214a9c0e8bfd0d35734e6 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Mon, 30 Nov 2015 21:54:31 +0900 Subject: [PATCH] Add several methods to MediaPlayer --- src/enums.rs | 15 ++++ src/ffi.rs | 18 ++--- src/media_player.rs | 162 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 14 deletions(-) diff --git a/src/enums.rs b/src/enums.rs index f1deac0..80c6b5f 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -61,6 +61,21 @@ pub enum TrackType { Text = 2 } +#[repr(C)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] +pub enum Position { + Disable = -1, + Center, + Left, + Right, + Top, + TopLeft, + TopRight, + Bottom, + BottomLeft, + BottomRight, +} + // #[repr(C)] // #[derive(Clone, Copy, PartialEq, Eq, Debug)] // pub enum ParseFlag { diff --git a/src/ffi.rs b/src/ffi.rs index e5dc223..3780167 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -304,20 +304,7 @@ pub enum libvlc_navigate_mode_t { libvlc_navigate_right, } -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_position_t { - libvlc_position_disable = -1, - libvlc_position_center, - libvlc_position_left, - libvlc_position_right, - libvlc_position_top, - libvlc_position_top_left, - libvlc_position_top_right, - libvlc_position_bottom, - libvlc_position_bottom_left, - libvlc_position_bottom_right, -} +pub use Position as libvlc_position_t; #[repr(C)] #[derive(Clone, Copy, Debug)] @@ -442,7 +429,10 @@ extern "C" { pub fn libvlc_media_player_set_chapter(p_mi: *mut libvlc_media_player_t, i_chapter: c_int); pub fn libvlc_media_player_get_chapter(p_mi: *mut libvlc_media_player_t) -> c_int; pub fn libvlc_media_player_get_chapter_count(p_mi: *mut libvlc_media_player_t) -> c_int; + pub fn libvlc_media_player_will_play(p_mi: *mut libvlc_media_player_t) -> c_int; pub fn libvlc_media_player_set_title(p_mi: *mut libvlc_media_player_t, i_title: c_int); + pub fn libvlc_media_player_get_chapter_count_for_title( + p_mi: *mut libvlc_media_player_t, i_title: c_int) -> c_int; pub fn libvlc_media_player_get_title(p_mi: *mut libvlc_media_player_t) -> c_int; pub fn libvlc_media_player_get_title_count(p_mi: *mut libvlc_media_player_t) -> c_int; pub fn libvlc_media_player_previous_chapter(p_mi: *mut libvlc_media_player_t); diff --git a/src/media_player.rs b/src/media_player.rs index 6c980db..200581a 100644 --- a/src/media_player.rs +++ b/src/media_player.rs @@ -7,6 +7,7 @@ use ::Instance; use ::Media; use ::EventManager; use ::libc::{c_void, c_uint}; +use ::enums::{State, Position}; use std::mem::transmute; /// A LibVLC media player plays one media (usually in a custom drawable). @@ -149,6 +150,167 @@ impl MediaPlayer { let hwnd = unsafe{ ffi::libvlc_media_player_get_hwnd(self.ptr) }; if hwnd.is_null() { None }else{ Some(hwnd) } } + + /// Get the current movie time (in ms). + pub fn get_time(&self) -> Option { + unsafe{ + let t = ffi::libvlc_media_player_get_time(self.ptr); + if t == -1 { None }else{ Some(t) } + } + } + + /// Set the movie time (in ms). + /// This has no effect if no media is being played. Not all formats and protocols support this. + pub fn set_time(&self, time: i64) { + unsafe{ ffi::libvlc_media_player_set_time(self.ptr, time); } + } + + /// Get movie position as percentage between 0.0 and 1.0. + pub fn get_position(&self) -> Option { + unsafe{ + let pos = ffi::libvlc_media_player_get_position(self.ptr); + if pos == -1f32 { None }else{ Some(pos) } + } + } + + /// Set movie position as percentage between 0.0 and 1.0. + /// This has no effect if playback is not enabled. This might not work depending on the underlying input format and protocol. + pub fn set_position(&self, pos: f32) { + unsafe{ ffi::libvlc_media_player_set_position(self.ptr, pos); } + } + + /// Set movie chapter (if applicable). + pub fn set_chapter(&self, chapter: i32) { + unsafe{ ffi::libvlc_media_player_set_chapter(self.ptr, chapter); } + } + + /// Get movie chapter. + pub fn get_chapter(&self) -> Option { + unsafe{ + let c = ffi::libvlc_media_player_get_chapter(self.ptr); + if c == -1 { None }else{ Some(c) } + } + } + + /// Get movie chapter count. + pub fn chapter_count(&self) -> Option { + unsafe{ + let c = ffi::libvlc_media_player_get_chapter_count(self.ptr); + if c == -1 { None }else{ Some(c) } + } + } + + /// Is the player able to play. + pub fn will_play(&self) -> bool { + unsafe{ + let b = ffi::libvlc_media_player_will_play(self.ptr); + if b == 0 { false }else{ true } + } + } + + /// Get title chapter count. + pub fn chapter_count_for_title(&self, title: i32) -> Option { + unsafe{ + let c = ffi::libvlc_media_player_get_chapter_count_for_title(self.ptr, title); + if c == -1 { None }else{ Some(c) } + } + } + + /// Set movie title. + pub fn set_title(&self, title: i32) { + unsafe{ ffi::libvlc_media_player_set_title(self.ptr, title); } + } + + /// Get movie title. + pub fn get_title(&self) -> Option { + unsafe{ + let t = ffi::libvlc_media_player_get_title(self.ptr); + if t == -1 { None }else{ Some(t) } + } + } + + /// Get movie title count. + pub fn title_count(&self) -> Option { + unsafe{ + let t = ffi::libvlc_media_player_get_title_count(self.ptr); + if t == -1 { Some(t) } else { None } + } + } + + /// Set previous chapter (if applicable) + pub fn previous_chapter(&self) { + unsafe{ ffi::libvlc_media_player_previous_chapter(self.ptr); } + } + + /// Set next chapter (if applicable) + pub fn next_chapter(&self) { + unsafe{ ffi::libvlc_media_player_next_chapter(self.ptr); } + } + + /// Get the requested movie play rate. + pub fn get_rate(&self) -> f32 { + unsafe{ ffi::libvlc_media_player_get_rate(self.ptr) } + } + + /// Set movie play rate. + pub fn set_rate(&self, rate: f32) -> Result<(),()> { + unsafe{ + if ffi::libvlc_media_player_set_rate(self.ptr, rate) == -1 { + Err(()) + }else{ + Ok(()) + } + } + } + + /// Get current movie state. + pub fn state(&self) -> State { + unsafe{ ffi::libvlc_media_player_get_state(self.ptr) } + } + + /// How many video outputs does this media player have? + pub fn has_vout(&self) -> u32 { + unsafe{ ffi::libvlc_media_player_has_vout(self.ptr) } + } + + /// Is this media player seekable? + pub fn is_seekable(&self) -> bool { + unsafe{ + let b = ffi::libvlc_media_player_is_seekable(self.ptr); + if b == 0 { false }else{ true } + } + } + + /// Can this media player be paused? + pub fn can_pause(&self) -> bool { + unsafe{ + let b = ffi::libvlc_media_player_can_pause(self.ptr); + if b == 0 { false }else{ true } + } + } + + /// Check if the current program is scrambled. + pub fn program_scrambled(&self) -> bool { + unsafe{ + let b = ffi::libvlc_media_player_program_scrambled(self.ptr); + if b == 0 { false }else{ true } + } + } + + /// Display the next frame (if supported) + pub fn next_frame(&self) { + unsafe{ ffi::libvlc_media_player_next_frame(self.ptr); } + } + + /// Navigate through DVD Menu. + pub fn navigate(&self, navigate: u32) { + unsafe{ ffi::libvlc_media_player_navigate(self.ptr, navigate); } + } + + /// Set if, and how, the video title will be shown when media is played. + pub fn set_video_title_display(&self, position: Position, timeout: u32) { + unsafe{ ffi::libvlc_media_player_set_video_title_display(self.ptr, position, timeout); } + } } impl Drop for MediaPlayer {