Merge branch 'master' into vlm-broadcast

merge-requests/7/merge
Raniz 2019-11-25 11:40:28 +01:00
commit ab7c27e8cb
11 changed files with 86 additions and 85 deletions

View File

@ -8,6 +8,7 @@ keywords = ["libVLC", "bindings"]
repository = "https://github.com/garkimasera/vlc-rs" repository = "https://github.com/garkimasera/vlc-rs"
license = "MIT" license = "MIT"
readme = "README.md" readme = "README.md"
edition = "2018"
[lib] [lib]
name = "vlc" name = "vlc"

View File

@ -2,14 +2,14 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::MediaPlayer; use crate::MediaPlayer;
use ::TrackDescription; use crate::TrackDescription;
use ::tools::from_cstr; use crate::tools::from_cstr;
pub trait MediaPlayerAudioEx { pub trait MediaPlayerAudioEx {
fn get_mute(&self) -> Option<bool>; fn get_mute(&self) -> Option<bool>;
fn set_mute(&self, bool); fn set_mute(&self, muted: bool);
fn get_volume(&self) -> i32; fn get_volume(&self) -> i32;
fn set_volume(&self, volume: i32) -> Result<(), ()>; fn set_volume(&self, volume: i32) -> Result<(), ()>;
fn get_audio_track_description(&self) -> Option<Vec<TrackDescription>>; fn get_audio_track_description(&self) -> Option<Vec<TrackDescription>>;

View File

@ -7,12 +7,12 @@ use std::borrow::Cow;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::ffi::{CString, CStr}; use std::ffi::{CString, CStr};
use std::i32; use std::i32;
use sys; use libc::{c_void, c_char, c_int};
use ::tools::{to_cstr, from_cstr, from_cstr_ref}; use crate::sys;
use ::libc::{c_void, c_char, c_int}; use crate::tools::{to_cstr, from_cstr, from_cstr_ref};
use ::enums::*; use crate::enums::*;
/// Retrieve libvlc version. /// Retrieve libvlc version.
pub fn version() -> String { pub fn version() -> String {
unsafe{ unsafe{
from_cstr_ref(sys::libvlc_get_version()).unwrap().into_owned() from_cstr_ref(sys::libvlc_get_version()).unwrap().into_owned()
@ -47,7 +47,7 @@ impl Instance {
} else { } else {
args_c_ptr = Vec::new(); args_c_ptr = Vec::new();
} }
unsafe{ unsafe{
let p = if args_c_ptr.is_empty() { let p = if args_c_ptr.is_empty() {
@ -59,12 +59,12 @@ impl Instance {
if p.is_null() { if p.is_null() {
return None; return None;
} }
Some(Instance{ptr: p}) Some(Instance{ptr: p})
} }
} }
/// Create and initialize a libvlc instance. /// Create and initialize a libvlc instance.
pub fn new() -> Option<Instance> { pub fn new() -> Option<Instance> {
Instance::with_args(None) Instance::with_args(None)
} }
@ -132,8 +132,8 @@ impl Instance {
/// Set logging callback /// Set logging callback
pub fn set_log<F: Fn(LogLevel, Log, Cow<str>) + Send + 'static>(&self, f: F) { pub fn set_log<F: Fn(LogLevel, Log, Cow<str>) + Send + 'static>(&self, f: F) {
let cb: Box<Box<Fn(LogLevel, Log, Cow<str>) + Send + 'static>> = Box::new(Box::new(f)); let cb: Box<Box<dyn Fn(LogLevel, Log, Cow<str>) + Send + 'static>> = Box::new(Box::new(f));
unsafe{ unsafe{
sys::libvlc_log_set(self.ptr, logging_cb, Box::into_raw(cb) as *mut _); sys::libvlc_log_set(self.ptr, logging_cb, Box::into_raw(cb) as *mut _);
} }
@ -160,7 +160,7 @@ const BUF_SIZE: usize = 1024; // Write log message to the buffer by vsnprintf.
unsafe extern "C" fn logging_cb( unsafe extern "C" fn logging_cb(
data: *mut c_void, level: c_int, ctx: *const sys::libvlc_log_t, fmt: *const c_char, args: sys::va_list) { data: *mut c_void, level: c_int, ctx: *const sys::libvlc_log_t, fmt: *const c_char, args: sys::va_list) {
let f: &Box<Fn(LogLevel, Log, Cow<str>) + Send + 'static> = ::std::mem::transmute(data); let f: &Box<dyn Fn(LogLevel, Log, Cow<str>) + Send + 'static> = ::std::mem::transmute(data);
let mut buf: [c_char; BUF_SIZE] = [0; BUF_SIZE]; let mut buf: [c_char; BUF_SIZE] = [0; BUF_SIZE];
vsnprintf(buf.as_mut_ptr(), BUF_SIZE, fmt, args); vsnprintf(buf.as_mut_ptr(), BUF_SIZE, fmt, args);
@ -210,7 +210,7 @@ pub struct ModuleDescription {
pub help: Option<String>, pub help: Option<String>,
} }
/// Description of a module. /// Description of a module.
#[derive(Clone, PartialEq, Eq, Hash, Debug)] #[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub struct ModuleDescriptionRef<'a> { pub struct ModuleDescriptionRef<'a> {
pub name: Option<Cow<'a, str>>, pub name: Option<Cow<'a, str>>,
@ -268,7 +268,7 @@ pub enum Event {
MediaFreed, MediaFreed,
MediaStateChanged(State), MediaStateChanged(State),
MediaSubItemTreeAdded, MediaSubItemTreeAdded,
MediaPlayerMediaChanged, MediaPlayerMediaChanged,
MediaPlayerNothingSpecial, MediaPlayerNothingSpecial,
MediaPlayerOpening, MediaPlayerOpening,
@ -330,9 +330,9 @@ impl<'a> EventManager<'a> {
where F: Fn(Event, VLCObject) + Send + 'static where F: Fn(Event, VLCObject) + Send + 'static
{ {
// Explicit type annotation is needed // Explicit type annotation is needed
let callback: Box<Box<Fn(Event, VLCObject) + Send + 'static>> = let callback: Box<Box<dyn Fn(Event, VLCObject) + Send + 'static>> =
Box::new(Box::new(callback)); Box::new(Box::new(callback));
let result = unsafe{ let result = unsafe{
sys::libvlc_event_attach( sys::libvlc_event_attach(
self.ptr, event_type as i32, event_manager_callback, self.ptr, event_type as i32, event_manager_callback,
@ -353,7 +353,7 @@ impl<'a> EventManager<'a> {
} }
unsafe extern "C" fn event_manager_callback(pe: *const sys::libvlc_event_t, data: *mut c_void) { unsafe extern "C" fn event_manager_callback(pe: *const sys::libvlc_event_t, data: *mut c_void) {
let f: &Box<Fn(Event, VLCObject) + Send + 'static> = ::std::mem::transmute(data); let f: &Box<dyn Fn(Event, VLCObject) + Send + 'static> = ::std::mem::transmute(data);
f(conv_event(pe), VLCObject{ ptr: (*pe).p_obj }); f(conv_event(pe), VLCObject{ ptr: (*pe).p_obj });
} }
@ -361,7 +361,7 @@ unsafe extern "C" fn event_manager_callback(pe: *const sys::libvlc_event_t, data
// Convert c-style libvlc_event_t to Event // Convert c-style libvlc_event_t to Event
fn conv_event(pe: *const sys::libvlc_event_t) -> Event { fn conv_event(pe: *const sys::libvlc_event_t) -> Event {
let event_type: EventType = unsafe{ ::std::mem::transmute((*pe)._type) }; let event_type: EventType = unsafe{ ::std::mem::transmute((*pe)._type) };
match event_type { match event_type {
EventType::MediaMetaChanged => { EventType::MediaMetaChanged => {
unsafe{ unsafe{

View File

@ -17,12 +17,12 @@ mod video;
mod audio; mod audio;
mod vlm; mod vlm;
pub use enums::*; pub use crate::enums::*;
pub use core::*; pub use crate::core::*;
pub use media::*; pub use crate::media::*;
pub use media_player::*; pub use crate::media_player::*;
pub use media_list::*; pub use crate::media_list::*;
pub use media_library::*; pub use crate::media_library::*;
pub use video::*; pub use crate::video::*;
pub use audio::*; pub use crate::audio::*;
pub use vlm::*; pub use crate::vlm::*;

View File

@ -2,10 +2,10 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::{Instance, EventManager}; use crate::{Instance, EventManager};
use ::enums::{State, Meta, TrackType}; use crate::enums::{State, Meta, TrackType};
use ::tools::{to_cstr, from_cstr, path_to_cstr}; use crate::tools::{to_cstr, from_cstr, path_to_cstr};
use std::path::Path; use std::path::Path;
pub struct Media { pub struct Media {
@ -15,44 +15,44 @@ pub struct Media {
unsafe impl Send for Media {} unsafe impl Send for Media {}
impl Media { impl Media {
/// Create a media with a certain given media resource location, for instance a valid URL. /// Create a media with a certain given media resource location, for instance a valid URL.
pub fn new_location(instance: &Instance, mrl: &str) -> Option<Media> { pub fn new_location(instance: &Instance, mrl: &str) -> Option<Media> {
let cstr = to_cstr(mrl); let cstr = to_cstr(mrl);
unsafe{ unsafe{
let p = sys::libvlc_media_new_location(instance.ptr, cstr.as_ptr()); let p = sys::libvlc_media_new_location(instance.ptr, cstr.as_ptr());
if p.is_null() { if p.is_null() {
return None; return None;
} }
Some(Media{ptr: p}) Some(Media{ptr: p})
} }
} }
/// Create a media for a certain file path. /// Create a media for a certain file path.
pub fn new_path<T: AsRef<Path>>(instance: &Instance, path: T) -> Option<Media> { pub fn new_path<T: AsRef<Path>>(instance: &Instance, path: T) -> Option<Media> {
let cstr = match path_to_cstr(path.as_ref()) { let cstr = match path_to_cstr(path.as_ref()) {
Ok(s) => s, Ok(s) => s,
Err(_) => { return None; }, Err(_) => { return None; },
}; };
unsafe{ unsafe{
let p = sys::libvlc_media_new_path(instance.ptr, cstr.as_ptr()); let p = sys::libvlc_media_new_path(instance.ptr, cstr.as_ptr());
if p.is_null() { if p.is_null() {
return None; return None;
} }
Some(Media{ptr: p}) Some(Media{ptr: p})
} }
} }
pub fn new_fd(instance: &Instance, fd: i32) -> Option<Media> { pub fn new_fd(instance: &Instance, fd: i32) -> Option<Media> {
unsafe{ unsafe{
let p = sys::libvlc_media_new_fd(instance.ptr, fd); let p = sys::libvlc_media_new_fd(instance.ptr, fd);
if p.is_null() { if p.is_null() {
return None; return None;
} }
Some(Media{ptr: p}) Some(Media{ptr: p})
} }
} }
@ -86,7 +86,7 @@ impl Media {
} }
/// Set the meta of the media. /// Set the meta of the media.
/// (This function will not save the meta, call save_meta in order to save the meta) /// (This function will not save the meta, call save_meta in order to save the meta)
pub fn set_meta(&self, meta: Meta, value: &str) { pub fn set_meta(&self, meta: Meta, value: &str) {
unsafe{ unsafe{
sys::libvlc_media_set_meta(self.ptr, meta, to_cstr(value).as_ptr()); sys::libvlc_media_set_meta(self.ptr, meta, to_cstr(value).as_ptr());
@ -111,7 +111,7 @@ impl Media {
if time != -1 { Some(time) }else{ None } if time != -1 { Some(time) }else{ None }
} }
/// Parse a media. /// Parse a media.
pub fn parse(&self) { pub fn parse(&self) {
unsafe{ sys::libvlc_media_parse(self.ptr) }; unsafe{ sys::libvlc_media_parse(self.ptr) };
} }
@ -235,4 +235,4 @@ pub struct VideoTrack {
pub struct SubtitleTrack { pub struct SubtitleTrack {
pub encoding: Option<String>, pub encoding: Option<String>,
} }

View File

@ -2,8 +2,8 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::{Instance, MediaList}; use crate::{Instance, MediaList};
pub struct MediaLibrary { pub struct MediaLibrary {
pub(crate) ptr: *mut sys::libvlc_media_library_t, pub(crate) ptr: *mut sys::libvlc_media_library_t,

View File

@ -2,8 +2,8 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::{Instance, Media, EventManager}; use crate::{Instance, Media, EventManager};
pub struct MediaList { pub struct MediaList {
pub(crate) ptr: *mut sys::libvlc_media_list_t, pub(crate) ptr: *mut sys::libvlc_media_list_t,

View File

@ -2,12 +2,12 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::Instance; use crate::Instance;
use ::Media; use crate::Media;
use ::EventManager; use crate::EventManager;
use ::libc::{c_void, c_uint}; use libc::{c_void, c_uint};
use ::enums::{State, Position}; use crate::enums::{State, Position};
use std::mem::transmute; use std::mem::transmute;
/// A LibVLC media player plays one media (usually in a custom drawable). /// A LibVLC media player plays one media (usually in a custom drawable).
@ -90,17 +90,17 @@ impl MediaPlayer {
pub fn set_callbacks<F>( pub fn set_callbacks<F>(
&self, &self,
play: F, play: F,
pause: Option<Box<Fn(i64) + Send + 'static>>, pause: Option<Box<dyn Fn(i64) + Send + 'static>>,
resume: Option<Box<Fn(i64) + Send + 'static>>, resume: Option<Box<dyn Fn(i64) + Send + 'static>>,
flush: Option<Box<Fn(i64) + Send + 'static>>, flush: Option<Box<dyn Fn(i64) + Send + 'static>>,
drain: Option<Box<Fn() + Send + 'static>>) drain: Option<Box<dyn Fn() + Send + 'static>>)
where F: Fn(*const c_void, u32, i64) + Send + 'static, where F: Fn(*const c_void, u32, i64) + Send + 'static,
{ {
let flag_pause = pause.is_some(); let flag_pause = pause.is_some();
let flag_resume = resume.is_some(); let flag_resume = resume.is_some();
let flag_flush = flush.is_some(); let flag_flush = flush.is_some();
let flag_drain = drain.is_some(); let flag_drain = drain.is_some();
let data = AudioCallbacksData { let data = AudioCallbacksData {
play: Box::new(play), pause: pause, resume: resume, play: Box::new(play), pause: pause, resume: resume,
flush: flush, drain: drain, flush: flush, drain: drain,
@ -119,12 +119,12 @@ impl MediaPlayer {
} }
} }
/// Set the NSView handler where the media player should render its video output. /// Set the NSView handler where the media player should render its video output.
pub fn set_nsobject(&self, drawable: *mut c_void) { pub fn set_nsobject(&self, drawable: *mut c_void) {
unsafe{ sys::libvlc_media_player_set_nsobject(self.ptr, drawable) }; unsafe{ sys::libvlc_media_player_set_nsobject(self.ptr, drawable) };
} }
/// Get the NSView handler previously set with set_nsobject(). /// Get the NSView handler previously set with set_nsobject().
pub fn get_nsobject(&self) -> Option<*mut c_void> { pub fn get_nsobject(&self) -> Option<*mut c_void> {
let nso = unsafe{ sys::libvlc_media_player_get_nsobject(self.ptr) }; let nso = unsafe{ sys::libvlc_media_player_get_nsobject(self.ptr) };
if nso.is_null() { None }else{ Some(nso) } if nso.is_null() { None }else{ Some(nso) }
@ -135,7 +135,7 @@ impl MediaPlayer {
unsafe{ sys::libvlc_media_player_set_xwindow(self.ptr, drawable) }; unsafe{ sys::libvlc_media_player_set_xwindow(self.ptr, drawable) };
} }
/// Get the X Window System window identifier previously set with set_xwindow(). /// Get the X Window System window identifier previously set with set_xwindow().
pub fn get_xwindow(&self) -> Option<u32> { pub fn get_xwindow(&self) -> Option<u32> {
let id = unsafe{ sys::libvlc_media_player_get_xwindow(self.ptr) }; let id = unsafe{ sys::libvlc_media_player_get_xwindow(self.ptr) };
if id == 0 { None }else{ Some(id) } if id == 0 { None }else{ Some(id) }
@ -328,18 +328,18 @@ impl Drop for MediaPlayer {
// For audio_set_callbacks // For audio_set_callbacks
struct AudioCallbacksData { struct AudioCallbacksData {
play: Box<Fn(*const c_void, u32, i64) + Send + 'static>, play: Box<dyn Fn(*const c_void, u32, i64) + Send + 'static>,
pause: Option<Box<Fn(i64) + Send + 'static>>, pause: Option<Box<dyn Fn(i64) + Send + 'static>>,
resume: Option<Box<Fn(i64) + Send + 'static>>, resume: Option<Box<dyn Fn(i64) + Send + 'static>>,
flush: Option<Box<Fn(i64) + Send + 'static>>, flush: Option<Box<dyn Fn(i64) + Send + 'static>>,
drain: Option<Box<Fn() + Send + 'static>>, drain: Option<Box<dyn Fn() + Send + 'static>>,
} }
unsafe extern "C" fn audio_cb_play( unsafe extern "C" fn audio_cb_play(
data: *mut c_void, samples: *const c_void, count: c_uint, pts: i64) { data: *mut c_void, samples: *const c_void, count: c_uint, pts: i64) {
let data: &AudioCallbacksData = transmute(data as *mut AudioCallbacksData); let data: &AudioCallbacksData = transmute(data as *mut AudioCallbacksData);
(data.play)(samples, count, pts); (data.play)(samples, count, pts);
} }
unsafe extern "C" fn audio_cb_pause(data: *mut c_void, pts: i64) { unsafe extern "C" fn audio_cb_pause(data: *mut c_void, pts: i64) {

View File

@ -38,7 +38,7 @@ pub type libvlc_callback_t = unsafe extern "C" fn(*const libvlc_event_t, *mut c_
pub type va_list = *mut c_void; pub type va_list = *mut c_void;
pub type libvlc_log_cb = unsafe extern "C" fn(*mut c_void, c_int, *const libvlc_log_t, *const c_char, va_list); pub type libvlc_log_cb = unsafe extern "C" fn(*mut c_void, c_int, *const libvlc_log_t, *const c_char, va_list);
pub use LogLevel as libvlc_log_level; pub use crate::enums::LogLevel as libvlc_log_level;
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -99,13 +99,13 @@ pub unsafe fn libvlc_delay(pts: i64) -> i64 {
// From libvlc_media.h // From libvlc_media.h
pub enum libvlc_media_t {} pub enum libvlc_media_t {}
pub use Meta as libvlc_meta_t; pub use crate::enums::Meta as libvlc_meta_t;
pub use State as libvlc_state_t; pub use crate::enums::State as libvlc_state_t;
pub const libvlc_media_option_trusted: u32 = 0x2; pub const libvlc_media_option_trusted: u32 = 0x2;
pub const libvlc_media_option_unique: u32 = 0x100; pub const libvlc_media_option_unique: u32 = 0x100;
pub use TrackType as libvlc_track_type_t; pub use crate::enums::TrackType as libvlc_track_type_t;
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -335,8 +335,8 @@ pub enum libvlc_navigate_mode_t {
libvlc_navigate_right, libvlc_navigate_right,
} }
pub use Position as libvlc_position_t; pub use crate::enums::Position as libvlc_position_t;
pub use VideoAdjustOption as libvlc_video_adjust_option; pub use crate::enums::VideoAdjustOption as libvlc_video_adjust_option;
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]
@ -575,7 +575,7 @@ extern "C" {
} }
// From libvlc_events.h // From libvlc_events.h
pub use EventType as libvlc_event_e; pub use crate::enums::EventType as libvlc_event_e;
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy)] #[derive(Clone, Copy)]

View File

@ -37,7 +37,7 @@ pub unsafe fn from_cstr_ref<'a>(p: *const c_char) -> Option<Cow<'a, str>> {
// Create CString from &Path // Create CString from &Path
pub fn path_to_cstr(path: &Path) -> Result<CString, NulError> { pub fn path_to_cstr(path: &Path) -> Result<CString, NulError> {
let path = try!(CString::new(path.to_string_lossy().into_owned())); let path = CString::new(path.to_string_lossy().into_owned())?;
Ok(path) Ok(path)
} }

View File

@ -2,12 +2,12 @@
// This file is part of vlc-rs. // This file is part of vlc-rs.
// Licensed under the MIT license, see the LICENSE file. // Licensed under the MIT license, see the LICENSE file.
use sys; use crate::sys;
use ::MediaPlayer; use crate::MediaPlayer;
use ::TrackDescription; use crate::TrackDescription;
use ::enums::VideoAdjustOption; use crate::enums::VideoAdjustOption;
use ::tools::{to_cstr, from_cstr}; use crate::tools::{to_cstr, from_cstr};
use ::libc::c_void; use libc::c_void;
pub trait MediaPlayerVideoEx { pub trait MediaPlayerVideoEx {
fn toggle_fullscreen(&self); fn toggle_fullscreen(&self);