@@ -21,6 +21,13 @@ pub enum LoggerType {
2121 /// Use the info! and error! macro from the [log crate](https://crates.io/crates/log).
2222 #[ cfg( feature = "log" ) ]
2323 Log ,
24+ /// Use custom functions to handle logging.
25+ Custom {
26+ /// The function to call for info messages. Must not panic.
27+ info : unsafe extern "C" fn ( * const :: libc:: c_char ) ,
28+ /// The function to call for error messages. Must not panic.
29+ error : unsafe extern "C" fn ( * const :: libc:: c_char ) ,
30+ } ,
2431}
2532
2633impl Default for LoggerType {
@@ -45,20 +52,23 @@ pub fn set_logger(logger: LoggerType) {
4552}
4653
4754fn set_logger_impl ( logger : LoggerType ) {
48- match logger {
49- LoggerType :: None => unsafe {
50- jack_sys:: jack_set_error_function ( Some ( silent_handler) ) ;
51- jack_sys:: jack_set_info_function ( Some ( silent_handler) ) ;
52- } ,
53- LoggerType :: Stdio => unsafe {
54- jack_sys:: jack_set_error_function ( Some ( stderr_handler) ) ;
55- jack_sys:: jack_set_info_function ( Some ( stdout_handler) ) ;
56- } ,
55+ let info_fn = match logger {
56+ LoggerType :: None => silent_handler,
57+ LoggerType :: Stdio => stdout_handler,
5758 #[ cfg( feature = "log" ) ]
58- LoggerType :: Log => unsafe {
59- jack_sys:: jack_set_error_function ( Some ( error_handler) ) ;
60- jack_sys:: jack_set_info_function ( Some ( info_handler) ) ;
61- } ,
59+ LoggerType :: Log => info_handler,
60+ LoggerType :: Custom { info, .. } => info,
61+ } ;
62+ let error_fn = match logger {
63+ LoggerType :: None => silent_handler,
64+ LoggerType :: Stdio => stderr_handler,
65+ #[ cfg( feature = "log" ) ]
66+ LoggerType :: Log => error_handler,
67+ LoggerType :: Custom { error, .. } => error,
68+ } ;
69+ unsafe {
70+ jack_sys:: jack_set_error_function ( Some ( error_fn) ) ;
71+ jack_sys:: jack_set_info_function ( Some ( info_fn) ) ;
6272 }
6373}
6474
0 commit comments