Merge pull request #1 from 0xpr03/feature_args

Implement Instance args
merge-requests/7/merge
T. Okubo 2018-10-31 23:12:33 +09:00 committed by GitHub
commit ea2f4c4080
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 30 additions and 5 deletions

View File

@ -2,9 +2,11 @@
// 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 std::ptr::null; use std::ptr;
use std::borrow::Cow; use std::borrow::Cow;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::ffi::CString;
use std::i32;
use sys; use sys;
use ::tools::{to_cstr, from_cstr, from_cstr_ref}; use ::tools::{to_cstr, from_cstr, from_cstr_ref};
use ::libc::{c_void, c_char, c_int}; use ::libc::{c_void, c_char, c_int};
@ -26,14 +28,32 @@ pub fn compiler() -> String {
pub struct Instance { pub struct Instance {
pub(crate) ptr: *mut sys::libvlc_instance_t, pub(crate) ptr: *mut sys::libvlc_instance_t,
} }
impl Instance { impl Instance {
/// Create and initialize a libvlc instance. /// Create and initialize a libvlc instance with specified args.
pub fn new() -> Option<Instance> { /// Note: args.len() has to be less or equal to i32::MAX
/// Note: libvlc discourages using arguments as these are not guaranteed to be stable between different versions of libvlc
pub fn with_args(args: Option<Vec<String>>) -> Option<Instance> {
let args_c_ptr: Vec<*const c_char> ;
let args_c: Vec<CString>;
if let Some(argv) = args {
args_c = argv.into_iter()
.map(|x| CString::new(x).expect("Error: Unexpected null byte")).collect();
args_c_ptr = args_c.iter().map(|x| x.as_ptr()).collect();
} else {
args_c_ptr = Vec::new();
}
unsafe{ unsafe{
let p = sys::libvlc_new(0, null()); let p = if args_c_ptr.is_empty() {
sys::libvlc_new(0, ptr::null())
} else {
sys::libvlc_new(args_c_ptr.len() as i32, args_c_ptr.as_ptr())
};
if p.is_null() { if p.is_null() {
return None; return None;
} }
@ -42,6 +62,11 @@ impl Instance {
} }
} }
/// Create and initialize a libvlc instance.
pub fn new() -> Option<Instance> {
Instance::with_args(None)
}
/// Try to start a user interface for the libvlc instance. /// Try to start a user interface for the libvlc instance.
pub fn add_intf(&self, name: &str) -> Result<(), ()> { pub fn add_intf(&self, name: &str) -> Result<(), ()> {
let cstr = to_cstr(name); let cstr = to_cstr(name);