diff --git a/src/core.rs b/src/core.rs index 958f2bb..92cfb12 100644 --- a/src/core.rs +++ b/src/core.rs @@ -312,8 +312,7 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { match event_type { EventType::MediaMetaChanged => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_meta_changed(pe); - Event::MediaMetaChanged((*p).meta_type) + Event::MediaMetaChanged((*pe).u.media_meta_changed.meta_type) } }, EventType::MediaSubItemAdded => { @@ -321,14 +320,12 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { }, EventType::MediaDurationChanged => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_duration_changed(pe); - Event::MediaDurationChanged((*p).new_duration) + Event::MediaDurationChanged((*pe).u.media_duration_changed.new_duration) } }, EventType::MediaParsedChanged => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_parsed_changed(pe); - Event::MediaParsedChanged((*p).new_status) + Event::MediaParsedChanged((*pe).u.media_parsed_changed.new_status) } }, EventType::MediaFreed => { @@ -336,8 +333,7 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { }, EventType::MediaStateChanged => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_state_changed(pe); - Event::MediaStateChanged((*p).new_state) + Event::MediaStateChanged((*pe).u.media_state_changed.new_state) } }, EventType::MediaSubItemTreeAdded => { @@ -354,8 +350,7 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { }, EventType::MediaPlayerBuffering => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_player_buffering(pe); - Event::MediaPlayerBuffering((*p).new_cache) + Event::MediaPlayerBuffering((*pe).u.media_player_buffering.new_cache) } }, EventType::MediaPlayerPlaying => { @@ -384,8 +379,7 @@ fn conv_event(pe: *const sys::libvlc_event_t) -> Event { }, EventType::MediaPlayerPositionChanged => { unsafe{ - let p = sys::libvlc_event_t_union::get_media_player_position_changed(pe); - Event::MediaPlayerPositionChanged((*p).new_position) + Event::MediaPlayerPositionChanged((*pe).u.media_player_position_changed.new_position) } }, EventType::MediaPlayerSeekableChanged => { diff --git a/src/sys.rs b/src/sys.rs index c98d6d3..36efb92 100644 --- a/src/sys.rs +++ b/src/sys.rs @@ -8,7 +8,6 @@ extern "C" {} use libc::{c_void, c_int, c_uint, c_char, c_float, uintptr_t, FILE}; -use std::mem::transmute; pub type c_bool = u8; @@ -142,22 +141,31 @@ pub struct libvlc_media_track_info_t { /* Codec specific */ pub i_profile: c_int, pub i_level: c_int, - - pub _union0: [c_uint; 2] + + pub u: libvlc_media_track_info_t_types::u, } -impl libvlc_media_track_info_t { - pub fn audio_i_channnels(&self) -> c_uint { - self._union0[0] +pub mod libvlc_media_track_info_t_types { + use libc::c_uint; + #[derive(Clone, Copy)] + #[repr(C)] + pub union u { + pub audio: audio, + pub video: video, } - pub fn audio_i_rate(&self) -> c_uint { - self._union0[1] + + #[derive(Clone, Copy)] + #[repr(C)] + pub struct audio { + pub i_channels: c_uint, + pub i_rate: c_uint, } - pub fn video_i_height(&self) -> c_uint { - self._union0[0] - } - pub fn video_i_width(&self) -> c_uint { - self._union0[1] + + #[derive(Clone, Copy)] + #[repr(C)] + pub struct video { + pub i_height: c_uint, + pub i_width: c_uint, } } @@ -169,6 +177,7 @@ pub struct libvlc_audio_track_t pub i_rate: c_uint, } +#[repr(C)] #[derive(Clone, Copy)] pub struct libvlc_video_track_t { @@ -180,6 +189,8 @@ pub struct libvlc_video_track_t pub i_frame_rate_den: c_uint, } +#[repr(C)] +#[derive(Clone, Copy)] pub struct libvlc_subtitle_track_t { pub psz_encoding: *const c_char, } @@ -192,21 +203,31 @@ pub struct libvlc_media_track_t { pub i_type: libvlc_track_type_t, pub i_profile: c_int, pub i_level: c_int, - pub _union0: *mut c_void, + 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)] + 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(&mut self) -> *mut libvlc_audio_track_t { - transmute(self._union0) + pub unsafe fn audio(&self) -> *mut libvlc_audio_track_t { + self.u.audio } - pub unsafe fn video(&mut self) -> *mut libvlc_video_track_t { - transmute(self._union0) + pub unsafe fn video(&self) -> *mut libvlc_video_track_t { + self.u.video } - pub unsafe fn subtitle(&mut self) -> *mut libvlc_subtitle_track_t { - transmute(self._union0) + pub unsafe fn subtitle(&self) -> *mut libvlc_subtitle_track_t { + self.u.subtitle } } @@ -553,148 +574,164 @@ pub use EventType as libvlc_event_e; pub struct libvlc_event_t { pub _type: c_int, pub p_obj: *mut c_void, - pub data: [u64; 2], + pub u: libvlc_event_t_types::u, } -pub mod libvlc_event_t_union { +pub mod libvlc_event_t_types { use super::*; use libc::{c_int, c_char, c_float}; #[repr(C)] + 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, + } + #[derive(Clone, Copy)] + #[repr(C)] pub struct media_meta_changed { pub meta_type: libvlc_meta_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_subitem_added { pub new_child: *mut libvlc_media_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_duration_changed { pub new_duration: i64, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_parsed_changed { pub new_status: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_freed { pub md: *mut libvlc_media_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_state_changed { pub new_state: libvlc_state_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_subitemtree_added { pub item: *mut libvlc_media_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_buffering { pub new_cache: c_float, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_position_changed { pub new_position: c_float, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_time_changed { pub new_time: libvlc_time_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_title_changed { pub new_titie: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_seekable_changed { pub new_seekable: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_pausable_changed { pub new_pausable: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_scrambled_changed { pub new_scrambled: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_vout { pub new_count: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_list_item_added { pub item: *mut libvlc_media_t, pub index: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_list_will_add_item { pub item: *mut libvlc_media_t, pub index: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_list_item_deleted { pub item: *mut libvlc_media_t, pub index: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_list_will_delete_item { pub item: *mut libvlc_media_t, pub index: c_int, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_list_player_next_item_set { pub item: *mut libvlc_media_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_snapshot_taken { pub psz_filename: *mut c_char, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_length_changed { pub new_length: libvlc_time_t, } + #[derive(Clone, Copy)] #[repr(C)] pub struct vlm_media_event { pub psz_media_name: *mut c_char, pub psz_instance_name: *mut c_char, } + #[derive(Clone, Copy)] #[repr(C)] pub struct media_player_media_changed { pub new_media: *mut libvlc_media_t, } - - macro_rules! union_func { - ($name:ident, $ty:ty) => { - pub unsafe fn $name(p: *const libvlc_event_t) -> *const $ty { - let p: *const _ = &((*p).data); - p as *const $ty - } - } - } - - union_func!(get_media_meta_changed, media_meta_changed); - union_func!(get_media_subitem_added, media_subitem_added); - union_func!(get_media_duration_changed, media_duration_changed); - union_func!(get_media_parsed_changed, media_parsed_changed); - union_func!(get_media_freed, media_freed); - union_func!(get_media_state_changed, media_state_changed); - union_func!(get_media_subitemtree_added, media_subitemtree_added); - union_func!(get_media_player_buffering, media_player_buffering); - union_func!(get_media_player_position_changed, media_player_position_changed); - union_func!(get_media_player_time_changed, media_player_time_changed); - union_func!(get_media_player_title_changed, media_player_title_changed); - union_func!(get_media_player_seekable_changed, media_player_seekable_changed); - union_func!(get_media_player_pausable_changed, media_player_pausable_changed); - union_func!(get_media_player_scrambled_changed, media_player_scrambled_changed); - union_func!(get_media_player_vout, media_player_vout); - union_func!(get_media_list_item_added, media_list_item_added); - union_func!(get_media_list_will_add_item, media_list_will_add_item); - union_func!(get_media_list_item_deleted, media_list_item_deleted); - union_func!(get_media_list_will_delete_item, media_list_will_delete_item); - union_func!(get_media_list_player_next_item_set, media_list_player_next_item_set); - union_func!(get_media_player_snapshot_taken, media_player_snapshot_taken); - union_func!(get_media_player_length_changed, media_player_length_changed); - union_func!(get_vlm_media_event, vlm_media_event); - union_func!(get_media_player_media_changed, media_player_media_changed); - } // From libvlc_media_list.h