From 0417f9e2e83ec7d30f95464b9fc7d71666d7706c Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 21 Nov 2019 20:00:26 +0900 Subject: [PATCH 01/17] Add libvlc-sys crate --- .gitignore | 1 + libvlc-sys/Cargo.toml | 14 ++++++++++++++ libvlc-sys/build.rs | 24 ++++++++++++++++++++++++ libvlc-sys/src/lib.rs | 6 ++++++ libvlc-sys/wrapper.h | 1 + 5 files changed, 46 insertions(+) create mode 100644 libvlc-sys/Cargo.toml create mode 100644 libvlc-sys/build.rs create mode 100644 libvlc-sys/src/lib.rs create mode 100644 libvlc-sys/wrapper.h diff --git a/.gitignore b/.gitignore index 94408df..2ad8632 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ # Generated by Cargo /target/ +/libvlc-sys/target Cargo.lock diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml new file mode 100644 index 0000000..e855636 --- /dev/null +++ b/libvlc-sys/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "libvlc-sys" +version = "0.1.0" +authors = ["T. Okubo "] +edition = "2018" +build = "build.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +libc = "0.2" + +[build-dependencies] +bindgen = "0.52" \ No newline at end of file diff --git a/libvlc-sys/build.rs b/libvlc-sys/build.rs new file mode 100644 index 0000000..e62ec93 --- /dev/null +++ b/libvlc-sys/build.rs @@ -0,0 +1,24 @@ +use bindgen; + +use std::env; +use std::path::PathBuf; + +fn main() { + println!("cargo:rustc-link-lib=libvlc"); + println!("cargo:rerun-if-changed=wrapper.h"); + + let bindings = bindgen::Builder::default() + .header("wrapper.h") + // For no_std + .use_core() + // Use libc + .ctypes_prefix("libc") + .parse_callbacks(Box::new(bindgen::CargoCallbacks)) + .generate() + .expect("Unable to generate bindings"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("bindings.rs")) + .expect("Couldn't write bindings!"); +} diff --git a/libvlc-sys/src/lib.rs b/libvlc-sys/src/lib.rs new file mode 100644 index 0000000..da4a48d --- /dev/null +++ b/libvlc-sys/src/lib.rs @@ -0,0 +1,6 @@ +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![no_std] + +include!(concat!(env!("OUT_DIR"), "/bindings.rs")); diff --git a/libvlc-sys/wrapper.h b/libvlc-sys/wrapper.h new file mode 100644 index 0000000..6fd7ccc --- /dev/null +++ b/libvlc-sys/wrapper.h @@ -0,0 +1 @@ +#include From 73e8e21637bf231b55d3a1ba291fb70602b07eab Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 23 Nov 2019 20:12:56 +0900 Subject: [PATCH 02/17] Add libvlc-sys to dependencies --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index faf9be5..3f10934 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ crate-type = ["rlib"] [dependencies] libc = "0.2" +libvlc-sys = { path = "libvlc-sys" } From 28fafc02f57f1e004ddd983812d023a662e14f8d Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 23 Nov 2019 20:13:41 +0900 Subject: [PATCH 03/17] Fix link lib --- libvlc-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libvlc-sys/build.rs b/libvlc-sys/build.rs index e62ec93..c8489cc 100644 --- a/libvlc-sys/build.rs +++ b/libvlc-sys/build.rs @@ -4,7 +4,7 @@ use std::env; use std::path::PathBuf; fn main() { - println!("cargo:rustc-link-lib=libvlc"); + println!("cargo:rustc-link-lib=vlc"); println!("cargo:rerun-if-changed=wrapper.h"); let bindings = bindgen::Builder::default() From c52205075c85852b787ff11c16cef6a01178d4b0 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 23 Nov 2019 20:14:44 +0900 Subject: [PATCH 04/17] Rewrite enums to use libvlc-sys symbols --- src/core.rs | 4 +- src/enums.rs | 304 ++++++++++++++++++++++++++------------------------- 2 files changed, 160 insertions(+), 148 deletions(-) diff --git a/src/core.rs b/src/core.rs index 003ad11..2cab1b6 100644 --- a/src/core.rs +++ b/src/core.rs @@ -154,7 +154,7 @@ unsafe extern "C" fn logging_cb( vsnprintf(buf.as_mut_ptr(), BUF_SIZE, fmt, args); - f(::std::mem::transmute(level), Log{ptr: ctx}, from_cstr_ref(buf.as_ptr()).unwrap()); + f((level as u32).into(), Log{ptr: ctx}, from_cstr_ref(buf.as_ptr()).unwrap()); } /// List of module description. @@ -349,7 +349,7 @@ unsafe extern "C" fn event_manager_callback(pe: *const sys::libvlc_event_t, data // Convert c-style libvlc_event_t to 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{ (*pe)._type } as u32).into(); match event_type { EventType::MediaMetaChanged => { diff --git a/src/enums.rs b/src/enums.rs index c957b60..1522532 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -2,158 +2,170 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum LogLevel { - Debug = 0, - Notice = 2, - Warning = 3, - Error = 4, +use libvlc_sys as sys; + +macro_rules! define_enum { + ($enum_name:ident, $original_type:ident; $($value:ident = $c_value:ident,)*) => { + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] + #[repr(C)] + pub enum $enum_name { + $( + $value = sys::$c_value as isize, + )* + } + + impl From for $enum_name { + fn from(a: sys::$original_type) -> Self { + match a { + $( + sys::$c_value => Self::$value, + )* + _ => unreachable!(), + } + } + } + } } -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum Meta { - Title, - Artist, - Genre, - Copyright, - Album, - TrackNumber, - Description, - Rating, - Date, - Setting, - URL, - Language, - NowPlaying, - Publisher, - EncodedBy, - ArtworkURL, - TrackID, - TrackTotal, - Director, - Season, - Episode, - ShowName, - Actors -} +define_enum!( + LogLevel, libvlc_log_level; + Debug = libvlc_log_level_LIBVLC_DEBUG, + Dotice = libvlc_log_level_LIBVLC_NOTICE, + Warning = libvlc_log_level_LIBVLC_WARNING, + Error = libvlc_log_level_LIBVLC_ERROR, +); -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum State { - NothingSpecial = 0, - Opening, - Buffering, - Playing, - Paused, - Stopped, - Ended, - Error -} +define_enum!( + Meta, libvlc_meta_t; + Title = libvlc_meta_t_libvlc_meta_Title, + Artist = libvlc_meta_t_libvlc_meta_Artist, + Genre = libvlc_meta_t_libvlc_meta_Genre, + Copyright = libvlc_meta_t_libvlc_meta_Copyright, + Album = libvlc_meta_t_libvlc_meta_Album, + TrackNumber = libvlc_meta_t_libvlc_meta_TrackNumber, + Description = libvlc_meta_t_libvlc_meta_Description, + Rating = libvlc_meta_t_libvlc_meta_Rating, + Date = libvlc_meta_t_libvlc_meta_Date, + Setting = libvlc_meta_t_libvlc_meta_Setting, + URL = libvlc_meta_t_libvlc_meta_URL, + Language = libvlc_meta_t_libvlc_meta_Language, + NowPlaying = libvlc_meta_t_libvlc_meta_NowPlaying, + Publisher = libvlc_meta_t_libvlc_meta_Publisher, + EncodedBy = libvlc_meta_t_libvlc_meta_EncodedBy, + ArtworkURL = libvlc_meta_t_libvlc_meta_ArtworkURL, + TrackID = libvlc_meta_t_libvlc_meta_TrackID, + TrackTotal = libvlc_meta_t_libvlc_meta_TrackTotal, + Director = libvlc_meta_t_libvlc_meta_Director, + Season = libvlc_meta_t_libvlc_meta_Season, + Episode = libvlc_meta_t_libvlc_meta_Episode, + ShowName = libvlc_meta_t_libvlc_meta_ShowName, + Actors = libvlc_meta_t_libvlc_meta_Actors, +); -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum TrackType { - Unknown = -1, - Audio = 0, - Video = 1, - Text = 2 -} +define_enum!( + State, libvlc_state_t; + NothingSpecial = libvlc_state_t_libvlc_NothingSpecial, + Opening = libvlc_state_t_libvlc_Opening, + Buffering = libvlc_state_t_libvlc_Buffering, + Playing = libvlc_state_t_libvlc_Playing, + Paused = libvlc_state_t_libvlc_Paused, + Stopped = libvlc_state_t_libvlc_Stopped, + Ended = libvlc_state_t_libvlc_Ended, + Error = libvlc_state_t_libvlc_Error, +); -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum Position { - Disable = -1, - Center, - Left, - Right, - Top, - TopLeft, - TopRight, - Bottom, - BottomLeft, - BottomRight, -} +define_enum!( + TrackType, libvlc_track_type_t; + Unknown = libvlc_track_type_t_libvlc_track_unknown, + Audio = libvlc_track_type_t_libvlc_track_audio, + Video = libvlc_track_type_t_libvlc_track_video, + Text = libvlc_track_type_t_libvlc_track_text, +); -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum VideoAdjustOption { - Enable = 0, - Contrast, - Brightness, - Hue, - Saturation, - Gamma -} +define_enum!( + Position, libvlc_position_t; + Disable = libvlc_position_t_libvlc_position_disable, + Center = libvlc_position_t_libvlc_position_center, + Left = libvlc_position_t_libvlc_position_left, + Right = libvlc_position_t_libvlc_position_right, + Top = libvlc_position_t_libvlc_position_top, + TopLeft = libvlc_position_t_libvlc_position_top_left, + TopRight = libvlc_position_t_libvlc_position_top_right, + Bottom = libvlc_position_t_libvlc_position_bottom, + BottomLeft = libvlc_position_t_libvlc_position_bottom_left, + BottomRight = libvlc_position_t_libvlc_position_bottom_right, +); -// #[repr(C)] -// #[derive(Clone, Copy, PartialEq, Eq, Debug)] -// pub enum ParseFlag { -// ParseLocal, -// ParseNetwork, -// FetchLocal, -// FetchNetwork, -// } +define_enum!( + VideoAdjustOption, libvlc_video_adjust_option_t; + Enable = libvlc_video_adjust_option_t_libvlc_adjust_Enable, + Contrast = libvlc_video_adjust_option_t_libvlc_adjust_Contrast, + Brightness = libvlc_video_adjust_option_t_libvlc_adjust_Brightness, + Hue = libvlc_video_adjust_option_t_libvlc_adjust_Hue, + Saturation = libvlc_video_adjust_option_t_libvlc_adjust_Saturation, + Gamma = libvlc_video_adjust_option_t_libvlc_adjust_Gamma, +); -#[repr(C)] -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] -pub enum EventType { - MediaMetaChanged = 0, - MediaSubItemAdded, - MediaDurationChanged, - MediaParsedChanged, - MediaFreed, - MediaStateChanged, - MediaSubItemTreeAdded, +define_enum!( + ParseFlag, libvlc_media_parse_flag_t; + DoInteract = libvlc_media_parse_flag_t_libvlc_media_do_interact, + FetchLocal = libvlc_media_parse_flag_t_libvlc_media_fetch_local, + FetchNetwork = libvlc_media_parse_flag_t_libvlc_media_fetch_network, + ParseLocal = libvlc_media_parse_flag_t_libvlc_media_parse_local, + ParseNetwork = libvlc_media_parse_flag_t_libvlc_media_parse_network, +); - MediaPlayerMediaChanged = 0x100, - MediaPlayerNothingSpecial, - MediaPlayerOpening, - MediaPlayerBuffering, - MediaPlayerPlaying, - MediaPlayerPaused, - MediaPlayerStopped, - MediaPlayerForward, - MediaPlayerBackward, - MediaPlayerEndReached, - MediaPlayerEncounteredError, - MediaPlayerTimeChanged, - MediaPlayerPositionChanged, - MediaPlayerSeekableChanged, - MediaPlayerPausableChanged, - MediaPlayerTitleChanged, - MediaPlayerSnapshotTaken, - MediaPlayerLengthChanged, - MediaPlayerVout, - MediaPlayerScrambledChanged, - - MediaListItemAdded = 0x200, - MediaListWillAddItem, - MediaListItemDeleted, - MediaListWillDeleteItem, - - MediaListViewItemAdded = 0x300, - MediaListViewWillAddItem, - MediaListViewItemDeleted, - MediaListViewWillDeleteItem, - - MediaListPlayerPlayed = 0x400, - MediaListPlayerNextItemSet, - MediaListPlayerStopped, - - MediaDiscovererStarted = 0x500, - MediaDiscovererEnded, - - VlmMediaAdded = 0x600, - VlmMediaRemoved, - VlmMediaChanged, - VlmMediaInstanceStarted, - VlmMediaInstanceStopped, - VlmMediaInstanceStatusInit, - VlmMediaInstanceStatusOpening, - VlmMediaInstanceStatusPlaying, - VlmMediaInstanceStatusPause, - VlmMediaInstanceStatusEnd, - VlmMediaInstanceStatusError -} +define_enum!( + EventType, libvlc_event_e; + MediaMetaChanged = libvlc_event_e_libvlc_MediaMetaChanged, + MediaSubItemAdded = libvlc_event_e_libvlc_MediaSubItemAdded, + MediaDurationChanged = libvlc_event_e_libvlc_MediaDurationChanged, + MediaParsedChanged = libvlc_event_e_libvlc_MediaParsedChanged, + MediaFreed = libvlc_event_e_libvlc_MediaFreed, + MediaStateChanged = libvlc_event_e_libvlc_MediaStateChanged, + MediaSubItemTreeAdded = libvlc_event_e_libvlc_MediaSubItemTreeAdded, + MediaPlayerMediaChanged = libvlc_event_e_libvlc_MediaPlayerMediaChanged, + MediaPlayerNothingSpecial = libvlc_event_e_libvlc_MediaPlayerNothingSpecial, + MediaPlayerOpening = libvlc_event_e_libvlc_MediaPlayerOpening, + MediaPlayerBuffering = libvlc_event_e_libvlc_MediaPlayerBuffering, + MediaPlayerPlaying = libvlc_event_e_libvlc_MediaPlayerPlaying, + MediaPlayerPaused = libvlc_event_e_libvlc_MediaPlayerPaused, + MediaPlayerStopped = libvlc_event_e_libvlc_MediaPlayerStopped, + MediaPlayerForward = libvlc_event_e_libvlc_MediaPlayerForward, + MediaPlayerBackward = libvlc_event_e_libvlc_MediaPlayerBackward, + MediaPlayerEndReached = libvlc_event_e_libvlc_MediaPlayerEndReached, + MediaPlayerEncounteredError = libvlc_event_e_libvlc_MediaPlayerEncounteredError, + MediaPlayerTimeChanged = libvlc_event_e_libvlc_MediaPlayerTimeChanged, + MediaPlayerPositionChanged = libvlc_event_e_libvlc_MediaPlayerPositionChanged, + MediaPlayerSeekableChanged = libvlc_event_e_libvlc_MediaPlayerSeekableChanged, + MediaPlayerPausableChanged = libvlc_event_e_libvlc_MediaPlayerPausableChanged, + MediaPlayerTitleChanged = libvlc_event_e_libvlc_MediaPlayerTitleChanged, + MediaPlayerSnapshotTaken = libvlc_event_e_libvlc_MediaPlayerSnapshotTaken, + MediaPlayerLengthChanged = libvlc_event_e_libvlc_MediaPlayerLengthChanged, + MediaPlayerVout = libvlc_event_e_libvlc_MediaPlayerVout, + MediaPlayerScrambledChanged = libvlc_event_e_libvlc_MediaPlayerScrambledChanged, + MediaListItemAdded = libvlc_event_e_libvlc_MediaListItemAdded, + MediaListWillAddItem = libvlc_event_e_libvlc_MediaListWillAddItem, + MediaListItemDeleted = libvlc_event_e_libvlc_MediaListItemDeleted, + MediaListWillDeleteItem = libvlc_event_e_libvlc_MediaListWillDeleteItem, + MediaListViewItemAdded = libvlc_event_e_libvlc_MediaListViewItemAdded, + MediaListViewWillAddItem = libvlc_event_e_libvlc_MediaListViewWillAddItem, + MediaListViewItemDeleted = libvlc_event_e_libvlc_MediaListViewItemDeleted, + MediaListViewWillDeleteItem = libvlc_event_e_libvlc_MediaListViewWillDeleteItem, + MediaListPlayerPlayed = libvlc_event_e_libvlc_MediaListPlayerPlayed, + MediaListPlayerNextItemSet = libvlc_event_e_libvlc_MediaListPlayerNextItemSet, + MediaListPlayerStopped = libvlc_event_e_libvlc_MediaListPlayerStopped, + MediaDiscovererStarted = libvlc_event_e_libvlc_MediaDiscovererStarted, + MediaDiscovererEnded = libvlc_event_e_libvlc_MediaDiscovererEnded, + VlmMediaAdded = libvlc_event_e_libvlc_VlmMediaAdded, + VlmMediaRemoved = libvlc_event_e_libvlc_VlmMediaRemoved, + VlmMediaChanged = libvlc_event_e_libvlc_VlmMediaChanged, + VlmMediaInstanceStarted = libvlc_event_e_libvlc_VlmMediaInstanceStarted, + VlmMediaInstanceStopped = libvlc_event_e_libvlc_VlmMediaInstanceStopped, + VlmMediaInstanceStatusInit = libvlc_event_e_libvlc_VlmMediaInstanceStatusInit, + VlmMediaInstanceStatusOpening = libvlc_event_e_libvlc_VlmMediaInstanceStatusOpening, + VlmMediaInstanceStatusPlaying = libvlc_event_e_libvlc_VlmMediaInstanceStatusPlaying, + VlmMediaInstanceStatusPause = libvlc_event_e_libvlc_VlmMediaInstanceStatusPause, + VlmMediaInstanceStatusEnd = libvlc_event_e_libvlc_VlmMediaInstanceStatusEnd, + VlmMediaInstanceStatusError = libvlc_event_e_libvlc_VlmMediaInstanceStatusError, +); From b5b053dad2ebfaa8cca298d582a465edf3a00967 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 23 Nov 2019 20:20:52 +0900 Subject: [PATCH 05/17] Add lib section to Cargo.toml --- libvlc-sys/Cargo.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml index e855636..896f131 100644 --- a/libvlc-sys/Cargo.toml +++ b/libvlc-sys/Cargo.toml @@ -5,7 +5,9 @@ authors = ["T. Okubo "] edition = "2018" build = "build.rs" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "libvlc_sys" +crate-type = ["rlib"] [dependencies] libc = "0.2" From 1cc3be26dd027afb5f4b61078931c70516418e2e Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 23 Nov 2019 20:21:35 +0900 Subject: [PATCH 06/17] Add whitelist for bindgen --- libvlc-sys/build.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libvlc-sys/build.rs b/libvlc-sys/build.rs index c8489cc..b37b8e2 100644 --- a/libvlc-sys/build.rs +++ b/libvlc-sys/build.rs @@ -13,6 +13,11 @@ fn main() { .use_core() // Use libc .ctypes_prefix("libc") + // Whitelist + .whitelist_type(".*vlc.*") + .whitelist_function(".*vlc.*") + .whitelist_var(".*vlc.*") + .whitelist_function("vsnprintf") .parse_callbacks(Box::new(bindgen::CargoCallbacks)) .generate() .expect("Unable to generate bindings"); From 2ce884fc5c1d99fa4fff0b6873d46db48b686c9b Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Mon, 25 Nov 2019 20:10:17 +0900 Subject: [PATCH 07/17] Fix to use libvlc-sys --- libvlc-sys/Cargo.toml | 2 +- src/audio.rs | 2 +- src/core.rs | 21 ++++++++++----------- src/enums.rs | 2 +- src/media.rs | 19 ++++++++++--------- src/media_library.rs | 2 +- src/media_list.rs | 2 +- src/media_player.rs | 6 +++--- src/video.rs | 2 +- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml index 896f131..ae445ea 100644 --- a/libvlc-sys/Cargo.toml +++ b/libvlc-sys/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" build = "build.rs" [lib] -name = "libvlc_sys" +name = "vlc_sys" crate-type = ["rlib"] [dependencies] diff --git a/src/audio.rs b/src/audio.rs index 697e1c6..c39891c 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::MediaPlayer; use crate::TrackDescription; use crate::tools::from_cstr; diff --git a/src/core.rs b/src/core.rs index 2cab1b6..433dbd6 100644 --- a/src/core.rs +++ b/src/core.rs @@ -7,8 +7,9 @@ use std::borrow::Cow; use std::marker::PhantomData; use std::ffi::CString; use std::i32; +use std::convert::TryInto; use libc::{c_void, c_char, c_int}; -use crate::sys; +use vlc_sys as sys; use crate::tools::{to_cstr, from_cstr, from_cstr_ref}; use crate::enums::*; @@ -124,7 +125,7 @@ impl Instance { let cb: Box) + Send + 'static>> = Box::new(Box::new(f)); unsafe{ - sys::libvlc_log_set(self.ptr, logging_cb, Box::into_raw(cb) as *mut _); + sys::libvlc_log_set(self.ptr, Some(logging_cb), Box::into_raw(cb) as *mut _); } } @@ -142,17 +143,14 @@ impl Drop for Instance { } } -extern "C" { - fn vsnprintf(s: *mut c_char, n: usize, fmt: *const c_char, arg: sys::va_list); -} const BUF_SIZE: usize = 1024; // Write log message to the buffer by vsnprintf. 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: *mut sys::__va_list_tag) { let f: &Box) + Send + 'static> = ::std::mem::transmute(data); let mut buf: [c_char; BUF_SIZE] = [0; BUF_SIZE]; - vsnprintf(buf.as_mut_ptr(), BUF_SIZE, fmt, args); + sys::vsnprintf(buf.as_mut_ptr(), BUF_SIZE.try_into().unwrap(), fmt, args); f((level as u32).into(), Log{ptr: ctx}, from_cstr_ref(buf.as_ptr()).unwrap()); } @@ -324,7 +322,7 @@ impl<'a> EventManager<'a> { let result = unsafe{ sys::libvlc_event_attach( - self.ptr, event_type as i32, event_manager_callback, + self.ptr, event_type as i32, Some(event_manager_callback), Box::into_raw(callback) as *mut c_void) }; @@ -349,12 +347,12 @@ unsafe extern "C" fn event_manager_callback(pe: *const sys::libvlc_event_t, data // Convert c-style libvlc_event_t to Event fn conv_event(pe: *const sys::libvlc_event_t) -> Event { - let event_type: EventType = (unsafe{ (*pe)._type } as u32).into(); + let event_type: EventType = (unsafe{ (*pe).type_ } as u32).into(); match event_type { EventType::MediaMetaChanged => { unsafe{ - Event::MediaMetaChanged((*pe).u.media_meta_changed.meta_type) + Event::MediaMetaChanged((*pe).u.media_meta_changed.meta_type.into()) } }, EventType::MediaSubItemAdded => { @@ -375,7 +373,8 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { }, EventType::MediaStateChanged => { unsafe{ - Event::MediaStateChanged((*pe).u.media_state_changed.new_state) + let new_state: sys::libvlc_state_t = (*pe).u.media_state_changed.new_state.try_into().unwrap(); + Event::MediaStateChanged(new_state.into()) } }, EventType::MediaSubItemTreeAdded => { diff --git a/src/enums.rs b/src/enums.rs index 1522532..93675f7 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use libvlc_sys as sys; +use vlc_sys as sys; macro_rules! define_enum { ($enum_name:ident, $original_type:ident; $($value:ident = $c_value:ident,)*) => { diff --git a/src/media.rs b/src/media.rs index 4c4a44f..1805d8c 100644 --- a/src/media.rs +++ b/src/media.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::{Instance, EventManager}; use crate::enums::{State, Meta, TrackType}; use crate::tools::{to_cstr, from_cstr, path_to_cstr}; @@ -76,7 +76,7 @@ impl Media { /// If the media has not yet been parsed this will return None. pub fn get_meta(&self, meta: Meta) -> Option { unsafe{ - let p_str = sys::libvlc_media_get_meta(self.ptr, meta); + let p_str = sys::libvlc_media_get_meta(self.ptr, meta as u32); let s = from_cstr(p_str); sys::libvlc_free(p_str as *mut ::libc::c_void); s @@ -87,7 +87,7 @@ impl Media { /// (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) { unsafe{ - sys::libvlc_media_set_meta(self.ptr, meta, to_cstr(value).as_ptr()); + sys::libvlc_media_set_meta(self.ptr, meta as u32, to_cstr(value).as_ptr()); } } @@ -98,7 +98,7 @@ impl Media { /// Get current state of media descriptor object. pub fn state(&self) -> State { - unsafe{ sys::libvlc_media_get_state(self.ptr) } + unsafe{ sys::libvlc_media_get_state(self.ptr).into() } } /// Get duration (in ms) of media descriptor object item. @@ -136,16 +136,17 @@ impl Media { for i in 0..n { let p = p_track.offset(i as isize); - let type_specific_data = match (**p).i_type { + let i_type: TrackType = (**p).i_type.into(); + let type_specific_data = match i_type { TrackType::Audio => { - let audio = (**p).audio(); + let audio = (**p).__bindgen_anon_1.audio; MediaTrackUnion::Audio(AudioTrack{ channels: (*audio).i_channels, rate: (*audio).i_rate, }) }, TrackType::Video => { - let video = (**p).video(); + let video = (**p).__bindgen_anon_1.video; MediaTrackUnion::Video(VideoTrack{ height: (*video).i_height, width: (*video).i_width, @@ -156,7 +157,7 @@ impl Media { }) }, TrackType::Text => { - let subtitle = (**p).subtitle(); + let subtitle = (**p).__bindgen_anon_1.subtitle; MediaTrackUnion::Subtitle(SubtitleTrack{ encoding: from_cstr((*subtitle).psz_encoding) }) @@ -167,7 +168,7 @@ impl Media { codec: (**p).i_codec, original_fourcc: (**p).i_original_fourcc, id: (**p).i_id, - track_type: (**p).i_type, + track_type: (**p).i_type.into(), profile: (**p).i_profile, level: (**p).i_level, bitrate: (**p).i_bitrate, diff --git a/src/media_library.rs b/src/media_library.rs index e8e5551..3abf357 100644 --- a/src/media_library.rs +++ b/src/media_library.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::{Instance, MediaList}; pub struct MediaLibrary { diff --git a/src/media_list.rs b/src/media_list.rs index c6e2f5b..048d821 100644 --- a/src/media_list.rs +++ b/src/media_list.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::{Instance, Media, EventManager}; pub struct MediaList { diff --git a/src/media_player.rs b/src/media_player.rs index 8bbcc6f..0f9e5fd 100644 --- a/src/media_player.rs +++ b/src/media_player.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::Instance; use crate::Media; use crate::EventManager; @@ -265,7 +265,7 @@ impl MediaPlayer { /// Get current movie state. pub fn state(&self) -> State { - unsafe{ sys::libvlc_media_player_get_state(self.ptr) } + unsafe{ sys::libvlc_media_player_get_state(self.ptr) }.into() } /// How many video outputs does this media player have? @@ -309,7 +309,7 @@ impl MediaPlayer { /// 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{ sys::libvlc_media_player_set_video_title_display(self.ptr, position, timeout); } + unsafe{ sys::libvlc_media_player_set_video_title_display(self.ptr, position as i32, timeout); } } /// Returns raw pointer diff --git a/src/video.rs b/src/video.rs index a71bd82..e9ca4fc 100644 --- a/src/video.rs +++ b/src/video.rs @@ -2,7 +2,7 @@ // This file is part of vlc-rs. // Licensed under the MIT license, see the LICENSE file. -use crate::sys; +use vlc_sys as sys; use crate::MediaPlayer; use crate::TrackDescription; use crate::enums::VideoAdjustOption; From 469c81dd8ea078278f0d8834a28e371132dccffb Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 19:42:33 +0900 Subject: [PATCH 08/17] Use vlc_sys in vlm --- src/vlm.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vlm.rs b/src/vlm.rs index 9ad7283..0f03cab 100644 --- a/src/vlm.rs +++ b/src/vlm.rs @@ -2,7 +2,8 @@ use std::ffi::CString; use std::os::raw::c_char; use std::ptr; -use crate::{Instance, sys}; +use vlc_sys as sys; +use crate::Instance; use crate::tools::{from_cstr, to_cstr}; pub trait Vlm { From b82a40571af8ea0fc1a41523c187d21013dbf659 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 20:01:56 +0900 Subject: [PATCH 09/17] Fix warning --- src/core.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.rs b/src/core.rs index 9d217f2..8ba4ce2 100644 --- a/src/core.rs +++ b/src/core.rs @@ -5,7 +5,7 @@ use std::ptr; use std::borrow::Cow; use std::marker::PhantomData; -use std::ffi::{CString, CStr}; +use std::ffi::CString; use std::i32; use std::convert::TryInto; use libc::{c_void, c_char, c_int}; From 48683a905fa6ffde10c1a8cc3a07ddde055377ff Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 20:15:56 +0900 Subject: [PATCH 10/17] Add feature v3_00 --- Cargo.toml | 4 ++++ src/enums.rs | 1 + 2 files changed, 5 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 3f10934..61c3203 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,3 +17,7 @@ crate-type = ["rlib"] [dependencies] libc = "0.2" libvlc-sys = { path = "libvlc-sys" } + +[features] +default = [] +v3_00 = [] diff --git a/src/enums.rs b/src/enums.rs index 93675f7..8d73157 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -106,6 +106,7 @@ define_enum!( Gamma = libvlc_video_adjust_option_t_libvlc_adjust_Gamma, ); +#[cfg(feature = "v3_00")] define_enum!( ParseFlag, libvlc_media_parse_flag_t; DoInteract = libvlc_media_parse_flag_t_libvlc_media_do_interact, From aa188aa0f0c4084aaffc36d0df34f62feed4359e Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 20:19:54 +0900 Subject: [PATCH 11/17] Remove old hand-written sys --- src/lib.rs | 2 - src/sys.rs | 853 ----------------------------------------------------- 2 files changed, 855 deletions(-) delete mode 100644 src/sys.rs diff --git a/src/lib.rs b/src/lib.rs index db9d611..5fdb4f8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,8 +4,6 @@ extern crate libc; -pub mod sys; - mod tools; mod core; mod media; diff --git a/src/sys.rs b/src/sys.rs deleted file mode 100644 index 7221369..0000000 --- a/src/sys.rs +++ /dev/null @@ -1,853 +0,0 @@ -// Copyright (c) 2015 T. Okubo -// This file is part of vlc-rs. -// Licensed under the MIT license, see the LICENSE file. - -#![allow(non_camel_case_types, non_upper_case_globals)] - -#[link(name = "vlc")] -extern "C" {} - -use libc::{c_void, c_int, c_uint, c_char, c_float, uintptr_t, FILE}; - -pub type c_bool = u8; - -pub type libvlc_event_type_t = c_int; - -// From libvlc_structures.h -pub enum libvlc_instance_t {} -pub enum libvlc_log_iterator_t {} - -pub type libvlc_time_t = i64; - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_log_message_t { - pub i_severity: c_int, - pub psz_type: *const c_char, - pub psz_name: *const c_char, - pub psz_header: *const c_char, - pub psz_message: *const c_char, -} - -// From libvlc.h -pub enum libvlc_event_manager_t {} -pub enum libvlc_log_t {} -pub enum vlc_log_t {} - -pub type libvlc_callback_t = unsafe extern "C" fn(*const libvlc_event_t, *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 use crate::enums::LogLevel as libvlc_log_level; - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_module_description_t -{ - pub psz_name: *const c_char, - pub psz_shortname: *const c_char, - pub psz_longname: *const c_char, - pub psz_help: *const c_char, - pub p_next: *mut libvlc_module_description_t, -} - -extern "C" { - pub fn libvlc_errmsg() -> *const c_char; - pub fn libvlc_clearerr(); - pub fn libvlc_new(argc: c_int, argv: *const *const c_char) -> *mut libvlc_instance_t; - pub fn libvlc_release(p_instance: *mut libvlc_instance_t); - pub fn libvlc_retain(p_instance: *mut libvlc_instance_t); - pub fn libvlc_add_intf(p_instance: *mut libvlc_instance_t, name: *const c_char) -> c_int; - pub fn libvlc_set_exit_handler( - p_instance: *mut libvlc_instance_t, - cb: extern "C" fn(*mut c_void), opaque: *mut c_void); - pub fn libvlc_wait(p_instance: *mut libvlc_instance_t); - pub fn libvlc_set_user_agent( - p_instance: *mut libvlc_instance_t, name: *const c_char, http: *const c_char); - pub fn libvlc_set_app_id( - p_instance: *mut libvlc_instance_t, id: *const c_char, version: *const c_char, - icon: *const c_char); - pub fn libvlc_get_version() -> *const c_char; - pub fn libvlc_get_compiler() -> *const c_char; - pub fn libvlc_get_changeset() -> *const c_char; - pub fn libvlc_free(ptr: *mut c_void); - pub fn libvlc_event_attach( - p_event_manager: *mut libvlc_event_manager_t, i_event_type: libvlc_event_type_t, - f_callback: libvlc_callback_t, user_data: *mut c_void) -> c_int; - pub fn libvlc_event_type_name(event_type: libvlc_event_type_t) -> *const c_char; - pub fn libvlc_log_get_context( - ctx: *const libvlc_log_t, module: *const *const c_char, file: *const *const c_char, - line: *mut c_uint); - pub fn libvlc_log_get_object( - ctx: *const libvlc_log_t, name: *const *const c_char, - header: *const *const c_char, id: *mut uintptr_t); - pub fn libvlc_log_unset(_: *mut libvlc_instance_t); - pub fn libvlc_log_set(instance: *mut libvlc_instance_t, cb: libvlc_log_cb, data: *mut c_void); - pub fn libvlc_log_set_file(_: *mut libvlc_instance_t, stream: *mut FILE); - pub fn libvlc_module_description_list_release(p_list: *mut libvlc_module_description_t); - pub fn libvlc_audio_filter_list_get( - p_instance: *mut libvlc_instance_t) -> *mut libvlc_module_description_t; - pub fn libvlc_video_filter_list_get( - p_instance: *mut libvlc_instance_t) -> *mut libvlc_module_description_t; - pub fn libvlc_clock() -> i64; -} - -pub unsafe fn libvlc_delay(pts: i64) -> i64 { - pts - libvlc_clock() -} - -// From libvlc_media.h -pub enum libvlc_media_t {} - -pub use crate::enums::Meta as libvlc_meta_t; -pub use crate::enums::State as libvlc_state_t; - -pub const libvlc_media_option_trusted: u32 = 0x2; -pub const libvlc_media_option_unique: u32 = 0x100; - -pub use crate::enums::TrackType as libvlc_track_type_t; - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_media_stats_t { - /* Input */ - pub i_read_bytes: c_int, - pub f_input_bitrate: c_float, - /* Demux */ - pub i_demux_read_bytes: c_int, - pub f_demux_bitrate: c_float, - pub i_demux_corrupted: c_int, - pub i_demux_discontinuity: c_int, - /* Decoders */ - pub i_decoded_video: c_int, - pub i_decoded_audio: c_int, - /* Video Output */ - pub i_displayed_pictures: c_int, - pub i_lost_pictures: c_int, - /* Audio output */ - pub i_played_abuffers: c_int, - pub i_lost_abuffers: c_int, - /* Stream output */ - pub i_sent_packets: c_int, - pub i_sent_bytes: c_int, - pub f_send_bitrate: c_float, -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_media_track_info_t { - /* Codec fourcc */ - pub i_codec: u32, - pub i_id: c_int, - pub i_type: libvlc_track_type_t, - /* Codec specific */ - pub i_profile: c_int, - pub i_level: c_int, - - pub u: libvlc_media_track_info_t_types::u, -} - -pub mod libvlc_media_track_info_t_types { - use libc::c_uint; - #[repr(C)] - #[derive(Clone, Copy)] - pub union u { - pub audio: audio, - pub video: video, - } - - #[repr(C)] - #[derive(Clone, Copy)] - pub struct audio { - pub i_channels: c_uint, - pub i_rate: c_uint, - } - - #[repr(C)] - #[derive(Clone, Copy)] - pub struct video { - pub i_height: c_uint, - pub i_width: c_uint, - } -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_audio_track_t -{ - pub i_channels: c_uint, - pub i_rate: c_uint, -} - -#[derive(Clone, Copy)] -#[repr(C)] -pub struct libvlc_video_track_t -{ - pub i_height: c_uint, - pub i_width: c_uint, - pub i_sar_num: c_uint, - pub i_sar_den: c_uint, - pub i_frame_rate_num: c_uint, - pub i_frame_rate_den: c_uint, -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_subtitle_track_t { - pub psz_encoding: *const c_char, -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_media_track_t { - pub i_codec: u32, - pub i_original_fourcc: u32, - pub i_id: c_int, - pub i_type: libvlc_track_type_t, - pub i_profile: c_int, - pub i_level: c_int, - pub u: libvlc_media_track_t_types::u, - pub i_bitrate: c_uint, - pub psz_language: *mut c_char, - pub psz_description: *mut c_char, -} - -pub mod libvlc_media_track_t_types { - use super::*; - #[repr(C)] - #[derive(Clone, Copy)] - pub union u { - pub audio: *mut libvlc_audio_track_t, - pub video: *mut libvlc_video_track_t, - pub subtitle: *mut libvlc_subtitle_track_t, - } -} - -impl libvlc_media_track_t { - pub unsafe fn audio(&self) -> *mut libvlc_audio_track_t { - self.u.audio - } - pub unsafe fn video(&self) -> *mut libvlc_video_track_t { - self.u.video - } - pub unsafe fn subtitle(&self) -> *mut libvlc_subtitle_track_t { - self.u.subtitle - } -} - -extern "C" { - pub fn libvlc_media_new_location(p_instance: *mut libvlc_instance_t, psz_mrl: *const c_char) - -> *mut libvlc_media_t; - pub fn libvlc_media_new_path(p_instance: *mut libvlc_instance_t, path: *const c_char) - -> *mut libvlc_media_t; - pub fn libvlc_media_new_fd(p_instance: *mut libvlc_instance_t, fd: c_int) - -> *mut libvlc_media_t; - pub fn libvlc_media_as_node(p_instance: *mut libvlc_instance_t, psz_name: *const c_char) - -> *mut libvlc_media_t; - pub fn libvlc_media_add_option(p_md: *mut libvlc_media_t, psz_options: *const c_char); - pub fn libvlc_media_add_option_flag( - p_md: *mut libvlc_media_t, psz_options: *const c_char, i_flags: c_uint); - pub fn libvlc_media_retain(p_md: *mut libvlc_media_t); - pub fn libvlc_media_release(p_md: *mut libvlc_media_t); - pub fn libvlc_media_get_mrl(p_md: *mut libvlc_media_t) -> *mut c_char; - pub fn libvlc_media_duplicate(p_md: *mut libvlc_media_t) -> *mut libvlc_media_t; - pub fn libvlc_media_get_meta(p_md: *mut libvlc_media_t, e_meta: libvlc_meta_t) -> *mut c_char; - pub fn libvlc_media_set_meta(p_md: *mut libvlc_media_t, e_meta: libvlc_meta_t, - psz_value: *const c_char); - pub fn libvlc_media_save_meta(p_md: *mut libvlc_media_t) -> c_int; - pub fn libvlc_media_get_state(p_md: *mut libvlc_media_t) -> libvlc_state_t; - pub fn libvlc_media_get_stats(p_md: *mut libvlc_media_t, p_stats: *mut libvlc_media_stats_t) - -> c_int; - pub fn libvlc_media_subitems(p_md: *mut libvlc_media_t) - -> *mut libvlc_media_list_t; - pub fn libvlc_media_event_manager(p_md: *mut libvlc_media_t) - -> *mut libvlc_event_manager_t; - pub fn libvlc_media_get_duration(p_md: *mut libvlc_media_t) - -> libvlc_time_t; - pub fn libvlc_media_parse(p_md: *mut libvlc_media_t); - pub fn libvlc_media_parse_async(p_md: *mut libvlc_media_t); - pub fn libvlc_media_is_parsed(p_md: *mut libvlc_media_t) -> c_int; - pub fn libvlc_media_set_user_data(p_md: *mut libvlc_media_t, - p_new_user_data: *mut c_void); - pub fn libvlc_media_get_user_data(p_md: *mut libvlc_media_t) -> *mut c_void; - pub fn libvlc_media_tracks_get(p_md: *mut libvlc_media_t, - tracks: *mut *mut *mut libvlc_media_track_t) -> c_uint; - pub fn libvlc_media_tracks_release(p_tracks: *mut *mut libvlc_media_track_t, i_count: c_uint); -} - -// From libvlc_media_player.h - -pub enum libvlc_media_player_t {} -pub enum libvlc_equalizer_t {} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct libvlc_track_description_t { - pub i_id: c_int, - pub psz_name: *mut c_char, - pub p_next: *mut libvlc_track_description_t, -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_audio_output_t { - pub psz_name: *mut c_char, - pub psz_description: *mut c_char, - pub p_next: *mut libvlc_audio_output_t, -} - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_audio_output_device_t { - pub p_next: *mut libvlc_audio_output_device_t, - pub psz_device: *mut c_char, - pub psz_description: *mut c_char, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub struct libvlc_rectangle_t { - pub top: c_int, pub left: c_int, pub bottom: c_int, pub right: c_int, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_video_marquee_option_t { - libvlc_marquee_Enable = 0, - libvlc_marquee_Text, - libvlc_marquee_Color, - libvlc_marquee_Opacity, - libvlc_marquee_Position, - libvlc_marquee_Refresh, - libvlc_marquee_Size, - libvlc_marquee_Timeout, - libvlc_marquee_X, - libvlc_marquee_Y, -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_navigate_mode_t { - libvlc_navigate_activate = 0, - libvlc_navigate_up, - libvlc_navigate_down, - libvlc_navigate_left, - libvlc_navigate_right, -} - -pub use crate::enums::Position as libvlc_position_t; -pub use crate::enums::VideoAdjustOption as libvlc_video_adjust_option; - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_video_logo_option_t { - libvlc_logo_enable, - libvlc_logo_file, - libvlc_logo_x, - libvlc_logo_y, - libvlc_logo_delay, - libvlc_logo_repeat, - libvlc_logo_opacity, - libvlc_logo_position -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_audio_output_device_types_t { - libvlc_AudioOutputDevice_Error = -1, - libvlc_AudioOutputDevice_Mono = 1, - libvlc_AudioOutputDevice_Stereo = 2, - libvlc_AudioOutputDevice_2F2R = 4, - libvlc_AudioOutputDevice_3F2R = 5, - libvlc_AudioOutputDevice_5_1 = 6, - libvlc_AudioOutputDevice_6_1 = 7, - libvlc_AudioOutputDevice_7_1 = 8, - libvlc_AudioOutputDevice_SPDIF = 10 -} - -#[repr(C)] -#[derive(Clone, Copy, Debug)] -pub enum libvlc_audio_output_channel_t { - libvlc_AudioChannel_Error = -1, - libvlc_AudioChannel_Stereo = 1, - libvlc_AudioChannel_RStereo = 2, - libvlc_AudioChannel_Left = 3, - libvlc_AudioChannel_Right = 4, - libvlc_AudioChannel_Dolbys = 5 -} - -pub type libvlc_video_lock_cb = Option *mut c_void>; -pub type libvlc_video_unlock_cb = Option; -pub type libvlc_video_display_cb = Option; -pub type libvlc_video_format_cb = Option; -pub type libvlc_video_cleanup_cb = Option; -pub type libvlc_audio_play_cb = Option; -pub type libvlc_audio_pause_cb = Option; -pub type libvlc_audio_resume_cb = Option; -pub type libvlc_audio_flush_cb = Option; -pub type libvlc_audio_drain_cb = Option; -pub type libvlc_audio_set_volume_cb = Option; -pub type libvlc_audio_setup_cb = Option; -pub type libvlc_audio_cleanup_cb = Option; - -extern "C" { - pub fn libvlc_media_player_new(p_libvlc_instance: *mut libvlc_instance_t) - -> *mut libvlc_media_player_t; - pub fn libvlc_media_player_new_from_media(p_md: *mut libvlc_media_t) - -> *mut libvlc_media_player_t; - pub fn libvlc_media_player_release(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_media_player_retain(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_media_player_set_media(p_mi: *mut libvlc_media_player_t, - p_md: *mut libvlc_media_t); - pub fn libvlc_media_player_get_media(p_mi: *mut libvlc_media_player_t) -> *mut libvlc_media_t; - pub fn libvlc_media_player_event_manager(p_mi: *mut libvlc_media_player_t) - -> *mut libvlc_event_manager_t; - pub fn libvlc_media_player_is_playing(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_media_player_play(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_media_player_set_pause(mp: *mut libvlc_media_player_t, do_pause: c_int); - pub fn libvlc_media_player_pause(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_media_player_stop(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_video_set_callbacks( - mp: *mut libvlc_media_player_t, lock: libvlc_video_lock_cb, - unlock: libvlc_video_unlock_cb, display: libvlc_video_display_cb, - opaque: *mut c_void); - pub fn libvlc_video_set_format( - mp: *mut libvlc_media_player_t, chroma: *const c_char, width: c_uint, height: c_uint, - pitch: c_uint); - pub fn libvlc_video_set_format_callbacks( - mp: *mut libvlc_media_player_t, setup: libvlc_video_format_cb, - cleanup: libvlc_video_cleanup_cb); - pub fn libvlc_media_player_set_nsobject( - p_mi: *mut libvlc_media_player_t, drawable: *mut c_void); - pub fn libvlc_media_player_get_nsobject(p_mi: *mut libvlc_media_player_t) -> *mut c_void; - pub fn libvlc_media_player_set_xwindow( - p_mi: *mut libvlc_media_player_t, drawable: u32); - pub fn libvlc_media_player_get_xwindow(p_mi: *mut libvlc_media_player_t) -> u32; - pub fn libvlc_media_player_set_hwnd( - p_mi: *mut libvlc_media_player_t, drawable: *mut c_void); - pub fn libvlc_media_player_get_hwnd(p_mi: *mut libvlc_media_player_t) -> *mut c_void; - pub fn libvlc_audio_set_callbacks( - mp: *mut libvlc_media_player_t, play: libvlc_audio_play_cb, pause: libvlc_audio_pause_cb, - resume: libvlc_audio_resume_cb, flush: libvlc_audio_flush_cb, - drain: libvlc_audio_drain_cb, opaque: *mut c_void); - pub fn libvlc_audio_set_volume_callback( - mp: *mut libvlc_media_player_t, set_volume: libvlc_audio_set_volume_cb); - pub fn libvlc_audio_set_format_callbacks( - mp: *mut libvlc_media_player_t, setup: libvlc_audio_setup_cb, - cleanup: libvlc_audio_cleanup_cb); - pub fn libvlc_audio_set_format( - mp: *mut libvlc_media_player_t, format: *const c_char, rate: c_uint, channels: c_uint); - pub fn libvlc_media_player_get_length(p_mi: *mut libvlc_media_player_t) -> libvlc_time_t; - pub fn libvlc_media_player_get_time(p_mi: *mut libvlc_media_player_t) -> libvlc_time_t; - pub fn libvlc_media_player_set_time( - p_mi: *mut libvlc_media_player_t, i_time: libvlc_time_t); - pub fn libvlc_media_player_get_position(p_mi: *mut libvlc_media_player_t) -> c_float; - pub fn libvlc_media_player_set_position(p_mi: *mut libvlc_media_player_t, f_pos: c_float); - 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); - pub fn libvlc_media_player_next_chapter(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_media_player_get_rate(p_mi: *mut libvlc_media_player_t) -> c_float; - pub fn libvlc_media_player_set_rate(p_mi: *mut libvlc_media_player_t, rate: c_float) -> c_int; - pub fn libvlc_media_player_get_state(p_mi: *mut libvlc_media_player_t) -> libvlc_state_t; - pub fn libvlc_media_player_get_fps(p_mi: *mut libvlc_media_player_t) -> c_float; - pub fn libvlc_media_player_has_vout(p_mi: *mut libvlc_media_player_t) -> c_uint; - pub fn libvlc_media_player_is_seekable(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_media_player_can_pause(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_media_player_program_scrambled(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_media_player_next_frame(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_media_player_navigate(p_mi: *mut libvlc_media_player_t, navigate: c_uint); - pub fn libvlc_media_player_set_video_title_display( - p_mi: *mut libvlc_media_player_t, position: libvlc_position_t, timeout: c_uint); - pub fn libvlc_track_description_list_release(p_track_description: *mut libvlc_track_description_t); - pub fn libvlc_toggle_fullscreen(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_set_fullscreen(p_mi: *mut libvlc_media_player_t, b_fullscreen: c_int); - pub fn libvlc_get_fullscreen(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_set_key_input(p_mi: *mut libvlc_media_player_t, on: c_uint); - pub fn libvlc_video_set_mouse_input(p_mi: *mut libvlc_media_player_t, on: c_uint); - pub fn libvlc_video_get_size( - p_mi: *mut libvlc_media_player_t, num: c_uint, px: *mut c_uint, py: *mut c_uint) -> c_int; - pub fn libvlc_video_get_cursor( - p_mi: *mut libvlc_media_player_t, num: c_uint, px: *mut c_int, py: *mut c_int) -> c_int; - pub fn libvlc_video_get_scale(p_mi: *mut libvlc_media_player_t) -> c_float; - pub fn libvlc_video_set_scale(p_mi: *mut libvlc_media_player_t, f_factor: c_float); - pub fn libvlc_video_get_aspect_ratio(p_mi: *mut libvlc_media_player_t) -> *mut c_char; - pub fn libvlc_video_set_aspect_ratio(p_mi: *mut libvlc_media_player_t, psz_aspect: *const c_char); - pub fn libvlc_video_get_spu(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_get_spu_count(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_get_spu_description(p_mi: *mut libvlc_media_player_t) - -> *mut libvlc_track_description_t; - pub fn libvlc_video_set_spu(p_mi: *mut libvlc_media_player_t, i_spu: c_int) -> c_int; - pub fn libvlc_video_set_subtitle_file( - p_mi: *mut libvlc_media_player_t, psz_subtitle: *const c_char) -> c_int; - pub fn libvlc_video_get_spu_delay(p_mi: *mut libvlc_media_player_t) -> i64; - pub fn libvlc_video_set_spu_delay( - p_mi: *mut libvlc_media_player_t, i_delay: i64) -> c_int; - pub fn libvlc_video_get_title_description( - p_mi: *mut libvlc_media_player_t) -> *mut libvlc_track_description_t; - pub fn libvlc_video_get_chapter_description( - p_mi: *mut libvlc_media_player_t, i_title: c_int) -> *mut libvlc_track_description_t; - pub fn libvlc_video_get_crop_geometry(p_mi: *mut libvlc_media_player_t) -> *mut c_char; - pub fn libvlc_video_set_crop_geometry( - p_mi: *mut libvlc_media_player_t, psz_geometry: *const c_char); - pub fn libvlc_video_get_teletext(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_set_teletext(p_mi: *mut libvlc_media_player_t, i_page: c_int); - pub fn libvlc_toggle_teletext(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_video_get_track_count(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_get_track_description( - p_mi: *mut libvlc_media_player_t) -> *mut libvlc_track_description_t; - pub fn libvlc_video_get_track(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_video_set_track(p_mi: *mut libvlc_media_player_t, i_track: c_int) -> c_int; - pub fn libvlc_video_take_snapshot( - p_mi: *mut libvlc_media_player_t, num: c_uint, psz_filepath: *const c_char, - i_width: c_uint, i_height: c_uint) -> c_int; - pub fn libvlc_video_set_deinterlace(p_mi: *mut libvlc_media_player_t, psz_mode: *const c_char); - pub fn libvlc_video_get_marquee_int(p_mi: *mut libvlc_media_player_t, option: c_uint) -> c_int; - pub fn libvlc_video_get_marquee_string( - p_mi: *mut libvlc_media_player_t, option: c_uint) -> *mut c_char; - pub fn libvlc_video_set_marquee_int( - p_mi: *mut libvlc_media_player_t, option: c_uint, i_val: c_int); - pub fn libvlc_video_set_marquee_string( - p_mi: *mut libvlc_media_player_t, option: c_uint, psz_text: *const c_char); - pub fn libvlc_video_get_logo_int(p_mi: *mut libvlc_media_player_t, option: c_uint) -> c_int; - pub fn libvlc_video_set_logo_int(p_mi: *mut libvlc_media_player_t, option: c_uint, value: c_int); - pub fn libvlc_video_set_logo_string( - p_mi: *mut libvlc_media_player_t, option: c_uint, psz_value: *const c_char); - pub fn libvlc_video_get_adjust_int( - p_mi: *mut libvlc_media_player_t, option: c_uint) -> c_int; - pub fn libvlc_video_set_adjust_int( - p_mi: *mut libvlc_media_player_t, option: c_uint, value: c_int); - pub fn libvlc_video_get_adjust_float( - p_mi: *mut libvlc_media_player_t, option: c_uint) -> c_float; - pub fn libvlc_video_set_adjust_float( - p_mi: *mut libvlc_media_player_t, option: c_uint, value: c_float); - pub fn libvlc_audio_output_list_get(p_instance: *mut libvlc_instance_t) - -> *mut libvlc_audio_output_t; - pub fn libvlc_audio_output_list_release(p_list: *mut libvlc_audio_output_t); - pub fn libvlc_audio_output_set(p_mi: *mut libvlc_media_player_t, psz_name: *const c_char) -> c_int; - pub fn libvlc_audio_output_device_enum( - mp: *mut libvlc_media_player_t) -> *mut libvlc_audio_output_device_t; - pub fn libvlc_audio_output_device_list_get( - p_instance: *mut libvlc_instance_t, aout: *const c_char) -> *mut libvlc_audio_output_device_t; - pub fn libvlc_audio_output_device_list_release(p_list: *mut libvlc_audio_output_device_t); - pub fn libvlc_audio_output_device_set( - mp: *mut libvlc_media_player_t, module: *const c_char, device_id: *const c_char); - pub fn libvlc_audio_toggle_mute(p_mi: *mut libvlc_media_player_t); - pub fn libvlc_audio_get_mute(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_audio_set_mute(p_mi: *mut libvlc_media_player_t, status: c_int); - pub fn libvlc_audio_get_volume(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_audio_set_volume(p_mi: *mut libvlc_media_player_t, i_volume: c_int) -> c_int; - pub fn libvlc_audio_get_track_count(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_audio_get_track_description( - p_mi: *mut libvlc_media_player_t) -> *mut libvlc_track_description_t; - pub fn libvlc_audio_get_track(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_audio_set_track(p_mi: *mut libvlc_media_player_t, i_track: c_int) -> c_int; - pub fn libvlc_audio_get_channel(p_mi: *mut libvlc_media_player_t) -> c_int; - pub fn libvlc_audio_set_channel(p_mi: *mut libvlc_media_player_t, channel: c_int) -> c_int; - pub fn libvlc_audio_get_delay(p_mi: *mut libvlc_media_player_t) -> i64; - pub fn libvlc_audio_set_delay(p_mi: *mut libvlc_media_player_t, i_delay: i64) -> c_int; - pub fn libvlc_audio_equalizer_get_preset_count() -> c_uint; - pub fn libvlc_audio_equalizer_get_preset_name(u_index: c_uint) -> *const c_char; - pub fn libvlc_audio_equalizer_get_band_count() -> c_uint; - pub fn libvlc_audio_equalizer_get_band_frequency(u_index: c_uint) -> c_float; - pub fn libvlc_audio_equalizer_new() -> *mut libvlc_equalizer_t; - pub fn libvlc_audio_equalizer_new_from_preset(u_index: c_uint) -> *mut libvlc_equalizer_t; - pub fn libvlc_audio_equalizer_release(p_equalizer: *mut libvlc_equalizer_t); - pub fn libvlc_audio_equalizer_set_preamp( - p_equalizer: *mut libvlc_equalizer_t, f_preamp: c_float) -> c_int; - pub fn libvlc_audio_equalizer_get_preamp(p_equalizer: *mut libvlc_equalizer_t) -> c_float; - pub fn libvlc_audio_equalizer_set_amp_at_index( - p_equalizer: *mut libvlc_equalizer_t, f_amp: c_float, u_band: c_uint) -> c_int; - pub fn libvlc_audio_equalizer_get_amp_at_index( - p_equalizer: *mut libvlc_equalizer_t, u_band: c_uint) -> c_float; - pub fn libvlc_media_player_set_equalizer( - p_mi: *mut libvlc_media_player_t, p_equalizer: *mut libvlc_equalizer_t) -> c_int; -} - -// From libvlc_events.h -pub use crate::enums::EventType as libvlc_event_e; - -#[repr(C)] -#[derive(Clone, Copy)] -pub struct libvlc_event_t { - pub _type: c_int, - pub p_obj: *mut c_void, - pub u: libvlc_event_t_types::u, -} - -pub mod libvlc_event_t_types { - use super::*; - use libc::{c_int, c_char, c_float}; - #[repr(C)] - #[derive(Clone, Copy)] - pub union u { - pub media_meta_changed: media_meta_changed, - pub media_subitem_added: media_subitem_added, - pub media_duration_changed: media_duration_changed, - pub media_parsed_changed: media_parsed_changed, - pub media_freed: media_freed, - pub media_state_changed: media_state_changed, - pub media_subitemtree_added: media_subitemtree_added, - pub media_player_buffering: media_player_buffering, - pub media_player_position_changed: media_player_position_changed, - pub media_player_time_changed: media_player_time_changed, - pub media_player_title_changed: media_player_title_changed, - pub media_player_seekable_changed: media_player_seekable_changed, - pub media_player_pausable_changed: media_player_pausable_changed, - pub media_player_scrambled_changed: media_player_scrambled_changed, - pub media_player_vout: media_player_vout, - pub media_list_item_added: media_list_item_added, - pub media_list_will_add_item: media_list_will_add_item, - pub media_list_item_deleted: media_list_item_deleted, - pub media_list_will_delete_item: media_list_will_delete_item, - pub media_list_player_next_item_set: media_list_player_next_item_set, - pub media_player_snapshot_taken: media_player_snapshot_taken, - pub media_player_length_changed: media_player_length_changed, - pub vlm_media_event: vlm_media_event, - pub media_player_media_changed: media_player_media_changed, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_meta_changed { - pub meta_type: libvlc_meta_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_subitem_added { - pub new_child: *mut libvlc_media_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_duration_changed { - pub new_duration: i64, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_parsed_changed { - pub new_status: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_freed { - pub md: *mut libvlc_media_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_state_changed { - pub new_state: libvlc_state_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_subitemtree_added { - pub item: *mut libvlc_media_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_buffering { - pub new_cache: c_float, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_position_changed { - pub new_position: c_float, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_time_changed { - pub new_time: libvlc_time_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_title_changed { - pub new_titie: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_seekable_changed { - pub new_seekable: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_pausable_changed { - pub new_pausable: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_scrambled_changed { - pub new_scrambled: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_vout { - pub new_count: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_list_item_added { - pub item: *mut libvlc_media_t, - pub index: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_list_will_add_item { - pub item: *mut libvlc_media_t, - pub index: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_list_item_deleted { - pub item: *mut libvlc_media_t, - pub index: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_list_will_delete_item { - pub item: *mut libvlc_media_t, - pub index: c_int, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_list_player_next_item_set { - pub item: *mut libvlc_media_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_snapshot_taken { - pub psz_filename: *mut c_char, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_length_changed { - pub new_length: libvlc_time_t, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct vlm_media_event { - pub psz_media_name: *mut c_char, - pub psz_instance_name: *mut c_char, - } - #[repr(C)] - #[derive(Clone, Copy)] - pub struct media_player_media_changed { - pub new_media: *mut libvlc_media_t, - } -} - -// From libvlc_media_list.h - -pub enum libvlc_media_list_t {} - -extern "C" { - pub fn libvlc_media_list_new(p_instance: *mut libvlc_instance_t) -> *mut libvlc_media_list_t; - pub fn libvlc_media_list_release(p_ml: *mut libvlc_media_list_t); - pub fn libvlc_media_list_retain(p_ml: *mut libvlc_media_list_t); - pub fn libvlc_media_list_set_media(p_ml: *mut libvlc_media_list_t, p_md: *mut libvlc_media_t); - pub fn libvlc_media_list_media(p_ml: *mut libvlc_media_list_t) -> *mut libvlc_media_t; - pub fn libvlc_media_list_add_media( - p_ml: *mut libvlc_media_list_t, p_md: *mut libvlc_media_t) -> c_int; - pub fn libvlc_media_list_insert_media( - p_ml: *mut libvlc_media_list_t, p_md: *mut libvlc_media_t, i_pos: c_int) -> c_int; - pub fn libvlc_media_list_remove_index(p_ml: *mut libvlc_media_list_t, i_pos: c_int) -> c_int; - pub fn libvlc_media_list_count(p_ml: *mut libvlc_media_list_t) -> c_int; - pub fn libvlc_media_list_item_at_index( - p_ml: *mut libvlc_media_list_t, i_pos: c_int) -> *mut libvlc_media_t; - pub fn libvlc_media_list_index_of_item( - p_ml: *mut libvlc_media_list_t, p_md: *mut libvlc_media_t) -> c_int; - pub fn libvlc_media_list_is_readonly(p_ml: *mut libvlc_media_list_t) -> c_int; - pub fn libvlc_media_list_lock(p_ml: *mut libvlc_media_list_t); - pub fn libvlc_media_list_unlock(p_ml: *mut libvlc_media_list_t); - pub fn libvlc_media_list_event_manager( - p_ml: *mut libvlc_media_list_t) -> *mut libvlc_event_manager_t; -} - -// From libvlc_media_library.h - -pub enum libvlc_media_library_t {} - -extern "C" { - pub fn libvlc_media_library_new(p_instance: *mut libvlc_instance_t) -> *mut libvlc_media_library_t; - pub fn libvlc_media_library_release(p_mlib: *mut libvlc_media_library_t); - pub fn libvlc_media_library_retain(p_mlib: *mut libvlc_media_library_t); - pub fn libvlc_media_library_load(p_mlib: *mut libvlc_media_library_t) -> c_int; - pub fn libvlc_media_library_media_list( - p_mlib: *mut libvlc_media_library_t) -> *mut libvlc_media_list_t; -} - -// From libvlc_media_discoverer.h - -pub enum libvlc_media_discoverer_t {} - -extern "C" { - pub fn libvlc_media_discoverer_new_from_name( - p_inst: *mut libvlc_instance_t, psz_name: *const c_char) -> *mut libvlc_media_discoverer_t; - pub fn libvlc_media_discoverer_release(p_mdis: *mut libvlc_media_discoverer_t); - pub fn libvlc_media_discoverer_localized_name( - p_mdis: *mut libvlc_media_discoverer_t) -> *mut c_char; - pub fn libvlc_media_discoverer_media_list( - p_mdis: *mut libvlc_media_discoverer_t) -> *mut libvlc_media_list_t; - pub fn libvlc_media_discoverer_event_manager( - p_mdis: *mut libvlc_media_discoverer_t) -> *mut libvlc_event_manager_t; - pub fn libvlc_media_discoverer_is_running(p_mdis: *mut libvlc_media_discoverer_t) -> c_int; -} - -// From libvlc_vlm.h - -extern "C" { - pub fn libvlc_vlm_release(p_instance: *mut libvlc_instance_t); - pub fn libvlc_vlm_add_broadcast( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_input: *const c_char, - psz_output: *const c_char, i_options: c_int, ppsz_options: *const *const c_char, - b_enabled: c_int, b_loop: c_int) -> c_int; - pub fn libvlc_vlm_add_vod( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_input: *const c_char, - i_options: c_int, ppsz_options: *const *const c_char, b_enabled: c_int, - psz_mux: *const c_char) -> c_int; - pub fn libvlc_vlm_del_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char) -> c_int; - pub fn libvlc_vlm_set_enabled( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, b_enabled: c_int) -> c_int; - pub fn libvlc_vlm_set_output( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_output: *const c_char) -> c_int; - pub fn libvlc_vlm_set_input( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_input: *const c_char) -> c_int; - pub fn libvlc_vlm_add_input( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_input: *const c_char) -> c_int; - pub fn libvlc_vlm_set_loop( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, b_loop: c_int) -> c_int; - pub fn libvlc_vlm_set_mux( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_mux: *const c_char) -> c_int; - pub fn libvlc_vlm_change_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, psz_input: *const c_char, - psz_output: *const c_char, i_options: c_int, ppsz_options: *const *const c_char, - b_enabled: c_int, b_loop: c_int) -> c_int; - pub fn libvlc_vlm_play_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char) -> c_int; - pub fn libvlc_vlm_stop_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char) -> c_int; - pub fn libvlc_vlm_pause_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char) -> c_int; - pub fn libvlc_vlm_seek_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, f_percentage: c_float) -> c_int; - pub fn libvlc_vlm_show_media( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char) -> *const c_char; - pub fn libvlc_vlm_get_media_instance_position( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, i_instance: c_int) -> c_float; - pub fn libvlc_vlm_get_media_instance_time( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, i_instance: c_int) -> c_int; - pub fn libvlc_vlm_get_media_instance_length( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, i_instance: c_int) -> c_int; - pub fn libvlc_vlm_get_media_instance_rate( - p_instance: *mut libvlc_instance_t, psz_name: *const c_char, i_instance: c_int) -> c_int; - pub fn libvlc_vlm_get_event_manager( - p_instance: *mut libvlc_instance_t) -> *mut libvlc_event_manager_t; -} From a79003543f835d022ecf56807c1054cc1f031cb9 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 21:02:59 +0900 Subject: [PATCH 12/17] Add some infomation to libvlc-sys/Carto.toml --- libvlc-sys/Cargo.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml index ae445ea..42d548d 100644 --- a/libvlc-sys/Cargo.toml +++ b/libvlc-sys/Cargo.toml @@ -2,6 +2,12 @@ name = "libvlc-sys" version = "0.1.0" authors = ["T. Okubo "] + +description = "libVLC C API" +keywords = ["libVLC", "bindings"] +categories = ["external-ffi-bindings", "multimedia"] +repository = "https://github.com/garkimasera/vlc-rs" +license = "MIT" edition = "2018" build = "build.rs" @@ -13,4 +19,4 @@ crate-type = ["rlib"] libc = "0.2" [build-dependencies] -bindgen = "0.52" \ No newline at end of file +bindgen = "0.52" From cef535cc22111baad274f211139d67e9bba6a75b Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Thu, 28 Nov 2019 21:07:29 +0900 Subject: [PATCH 13/17] Use libvlc-sys on crates.io --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 61c3203..d4c9076 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ crate-type = ["rlib"] [dependencies] libc = "0.2" -libvlc-sys = { path = "libvlc-sys" } +libvlc-sys = "0.1" [features] default = [] From 2b54b72054352453919e36acef18af2293eb3f00 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sat, 30 Nov 2019 19:37:07 +0900 Subject: [PATCH 14/17] Add some information to Cargo.toml --- Cargo.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d4c9076..b97a98a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,9 @@ version = "0.3.0" authors = ["T. Okubo "] description = "Rust bindings for libVLC media framework." -keywords = ["libVLC", "bindings"] +keywords = ["libVLC", "bindings", "multimedia"] +categories = ["external-ffi-bindings", "multimedia"] +documentation = "https://docs.rs/vlc-rs" repository = "https://github.com/garkimasera/vlc-rs" license = "MIT" readme = "README.md" From 0444f7bd642c832c880dd893e311acd1731b1f6c Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sun, 15 Dec 2019 14:22:50 +0900 Subject: [PATCH 15/17] Use pkg-config --- libvlc-sys/Cargo.toml | 1 + libvlc-sys/build.rs | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml index 42d548d..f8843ee 100644 --- a/libvlc-sys/Cargo.toml +++ b/libvlc-sys/Cargo.toml @@ -20,3 +20,4 @@ libc = "0.2" [build-dependencies] bindgen = "0.52" +pkg-config = "0.3" diff --git a/libvlc-sys/build.rs b/libvlc-sys/build.rs index b37b8e2..153727f 100644 --- a/libvlc-sys/build.rs +++ b/libvlc-sys/build.rs @@ -4,10 +4,9 @@ use std::env; use std::path::PathBuf; fn main() { - println!("cargo:rustc-link-lib=vlc"); println!("cargo:rerun-if-changed=wrapper.h"); - let bindings = bindgen::Builder::default() + let mut bindings = bindgen::Builder::default() .header("wrapper.h") // For no_std .use_core() @@ -18,9 +17,15 @@ fn main() { .whitelist_function(".*vlc.*") .whitelist_var(".*vlc.*") .whitelist_function("vsnprintf") - .parse_callbacks(Box::new(bindgen::CargoCallbacks)) - .generate() - .expect("Unable to generate bindings"); + .parse_callbacks(Box::new(bindgen::CargoCallbacks)); + + // Set header include paths + let pkg_config_library = pkg_config::Config::new().probe("libvlc").unwrap(); + for include_path in &pkg_config_library.include_paths { + bindings = bindings.clang_arg(format!("-I{}", include_path.display())); + } + + let bindings = bindings.generate().expect("Unable to generate bindings"); let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings From 70c717ba62411fc0ceda932ff7f637835dad2dc2 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sun, 15 Dec 2019 14:26:06 +0900 Subject: [PATCH 16/17] libvlc-sys 0.2 --- Cargo.toml | 2 +- libvlc-sys/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b97a98a..5be309b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ crate-type = ["rlib"] [dependencies] libc = "0.2" -libvlc-sys = "0.1" +libvlc-sys = "0.2" [features] default = [] diff --git a/libvlc-sys/Cargo.toml b/libvlc-sys/Cargo.toml index f8843ee..06bb3b7 100644 --- a/libvlc-sys/Cargo.toml +++ b/libvlc-sys/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libvlc-sys" -version = "0.1.0" +version = "0.2.0" authors = ["T. Okubo "] description = "libVLC C API" From 74a22d74143f1bd51c3a61251289ccab2f0430a7 Mon Sep 17 00:00:00 2001 From: "T. Okubo" Date: Sun, 15 Dec 2019 14:40:00 +0900 Subject: [PATCH 17/17] Comment out features for libvlc 3.0 --- Cargo.toml | 3 --- src/enums.rs | 18 +++++++++--------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5be309b..b35e2e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,3 @@ crate-type = ["rlib"] libc = "0.2" libvlc-sys = "0.2" -[features] -default = [] -v3_00 = [] diff --git a/src/enums.rs b/src/enums.rs index 8d73157..2b90e38 100644 --- a/src/enums.rs +++ b/src/enums.rs @@ -106,15 +106,15 @@ define_enum!( Gamma = libvlc_video_adjust_option_t_libvlc_adjust_Gamma, ); -#[cfg(feature = "v3_00")] -define_enum!( - ParseFlag, libvlc_media_parse_flag_t; - DoInteract = libvlc_media_parse_flag_t_libvlc_media_do_interact, - FetchLocal = libvlc_media_parse_flag_t_libvlc_media_fetch_local, - FetchNetwork = libvlc_media_parse_flag_t_libvlc_media_fetch_network, - ParseLocal = libvlc_media_parse_flag_t_libvlc_media_parse_local, - ParseNetwork = libvlc_media_parse_flag_t_libvlc_media_parse_network, -); +// libvlc 3.0 +// define_enum!( +// ParseFlag, libvlc_media_parse_flag_t; +// DoInteract = libvlc_media_parse_flag_t_libvlc_media_do_interact, +// FetchLocal = libvlc_media_parse_flag_t_libvlc_media_fetch_local, +// FetchNetwork = libvlc_media_parse_flag_t_libvlc_media_fetch_network, +// ParseLocal = libvlc_media_parse_flag_t_libvlc_media_parse_local, +// ParseNetwork = libvlc_media_parse_flag_t_libvlc_media_parse_network, +// ); define_enum!( EventType, libvlc_event_e;