Add logging callback
							parent
							
								
									8ec8ec48e2
								
							
						
					
					
						commit
						a0e9f5b41b
					
				
							
								
								
									
										30
									
								
								src/core.rs
								
								
								
								
							
							
						
						
									
										30
									
								
								src/core.rs
								
								
								
								
							| 
						 | 
					@ -7,7 +7,7 @@ use std::borrow::Cow;
 | 
				
			||||||
use std::marker::PhantomData;
 | 
					use std::marker::PhantomData;
 | 
				
			||||||
use ffi;
 | 
					use ffi;
 | 
				
			||||||
use ::tools::{to_cstr, from_cstr, from_cstr_ref};
 | 
					use ::tools::{to_cstr, from_cstr, from_cstr_ref};
 | 
				
			||||||
use ::libc::c_void;
 | 
					use ::libc::{c_void, c_char, c_int};
 | 
				
			||||||
use ::enums::*;
 | 
					use ::enums::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Retrieve libvlc version. 
 | 
					/// Retrieve libvlc version. 
 | 
				
			||||||
| 
						 | 
					@ -93,6 +93,15 @@ impl Instance {
 | 
				
			||||||
            else { Some(ModuleDescriptionList{ptr: p}) }
 | 
					            else { Some(ModuleDescriptionList{ptr: p}) }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Set logging callback
 | 
				
			||||||
 | 
					    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));
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        unsafe{
 | 
				
			||||||
 | 
					            ffi::libvlc_log_set(self.ptr, logging_cb, Box::into_raw(cb) as *mut _);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Drop for Instance {
 | 
					impl Drop for Instance {
 | 
				
			||||||
| 
						 | 
					@ -103,6 +112,21 @@ impl Drop for Instance {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern "C" {
 | 
				
			||||||
 | 
					    fn vsnprintf(s: *mut c_char, n: usize, fmt: *const c_char, arg: ffi::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 ffi::libvlc_log_t, fmt: *const c_char, args: ffi::va_list) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let f: &Box<Fn(LogLevel, Log, Cow<str>) + 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    f(::std::mem::transmute(level), Log{ptr: ctx}, from_cstr_ref(buf.as_ptr()).unwrap());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// List of module description.
 | 
					/// List of module description.
 | 
				
			||||||
pub struct ModuleDescriptionList {
 | 
					pub struct ModuleDescriptionList {
 | 
				
			||||||
    ptr: *mut ffi::libvlc_module_description_t,
 | 
					    ptr: *mut ffi::libvlc_module_description_t,
 | 
				
			||||||
| 
						 | 
					@ -464,3 +488,7 @@ pub struct VLCObject {
 | 
				
			||||||
    _ptr: *mut c_void,
 | 
					    _ptr: *mut c_void,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct Log {
 | 
				
			||||||
 | 
					    pub ptr: *const ffi::libvlc_log_t
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,8 @@ pub enum libvlc_log_t {}
 | 
				
			||||||
pub enum vlc_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 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 LogLevel as libvlc_log_level;
 | 
					pub use LogLevel as libvlc_log_level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,7 +79,7 @@ extern "C" {
 | 
				
			||||||
        ctx: *const libvlc_log_t, name: *const *const c_char,
 | 
					        ctx: *const libvlc_log_t, name: *const *const c_char,
 | 
				
			||||||
        header: *const *const c_char, id: *mut uintptr_t);
 | 
					        header: *const *const c_char, id: *mut uintptr_t);
 | 
				
			||||||
    pub fn libvlc_log_unset(_: *mut libvlc_instance_t);
 | 
					    pub fn libvlc_log_unset(_: *mut libvlc_instance_t);
 | 
				
			||||||
    // pub fn libvlc_log_set
 | 
					    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_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_module_description_list_release(p_list: *mut libvlc_module_description_t);
 | 
				
			||||||
    pub fn libvlc_audio_filter_list_get(
 | 
					    pub fn libvlc_audio_filter_list_get(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue