From: Damien Fouilleul Date: Fri, 27 Oct 2006 16:07:01 +0000 (+0000) Subject: - added public log apis to access message log X-Git-Tag: 0.9.0-test0~9776 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=54ca1c9a1568a34251a0c4082e74b6c7919a6725;p=vlc - added public log apis to access message log --- diff --git a/include/vlc/libvlc.h b/include/vlc/libvlc.h index 5ac03fe3d3..9e3a6e36a1 100644 --- a/include/vlc/libvlc.h +++ b/include/vlc/libvlc.h @@ -73,7 +73,7 @@ int libvlc_exception_raised( libvlc_exception_t *p_exception ); * \param p_exception the exception to raise * \param psz_message the exception message */ -void libvlc_exception_raise( libvlc_exception_t *p_exception, char *psz_format, ... ); +void libvlc_exception_raise( libvlc_exception_t *p_exception, const char *psz_format, ... ); /** * Clear an exception object so it can be reused. @@ -344,7 +344,7 @@ int libvlc_video_destroy( libvlc_input_t *, libvlc_exception_t *); /** - * Resize the video output window + * Resize the current video output window * \param p_instance libvlc instance * \param width new width for video output window * \param height new height for video output window @@ -362,7 +362,7 @@ void libvlc_video_resize( libvlc_input_t *, int, int, libvlc_exception_t *); typedef int libvlc_drawable_t; /** - * change the video output parent + * change the parent for the current the video output * \param p_instance libvlc instance * \param drawable the new parent window (Drawable on X11, CGrafPort on MacOSX, HWND on Win32) * \param p_exception an initialized exception @@ -371,7 +371,8 @@ typedef int libvlc_drawable_t; int libvlc_video_reparent( libvlc_input_t *, libvlc_drawable_t, libvlc_exception_t * ); /** - * Set the video output parent + * Set the default video output parent + * this settings will be used as default for all video outputs * \param p_instance libvlc instance * \param drawable the new parent window (Drawable on X11, CGrafPort on MacOSX, HWND on Win32) * \param p_exception an initialized exception @@ -379,7 +380,8 @@ int libvlc_video_reparent( libvlc_input_t *, libvlc_drawable_t, libvlc_exception void libvlc_video_set_parent( libvlc_instance_t *, libvlc_drawable_t, libvlc_exception_t * ); /** - * Set the video output size + * Set the default video output size + * this settings will be used as default for all video outputs * \param p_instance libvlc instance * \param width new width for video drawable * \param height new height for video drawable @@ -401,7 +403,8 @@ typedef struct libvlc_rectangle_t; /** - * Set the video output viewport for a windowless video output (MacOS X only) + * Set the default video output viewport for a windowless video output (MacOS X only) + * this settings will be used as default for all video outputs * \param p_instance libvlc instance * \param view coordinates within video drawable * \param clip coordinates within video drawable @@ -615,6 +618,107 @@ LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0); /** @} */ /** @} */ +/***************************************************************************** + * Message log handling + *****************************************************************************/ + +/** defgroup libvlc_log Log + * \ingroup libvlc + * LibVLC Message Logging + * @{ + */ + +/** This structure is opaque. It represents a libvlc log instance */ +typedef struct libvlc_log_t libvlc_log_t; + +/** This structure is opaque. It represents a libvlc log iterator */ +typedef struct libvlc_log_iterator_t libvlc_log_iterator_t; + +typedef struct libvlc_log_message_t +{ + unsigned sizeof_msg; /* sizeof() of message structure, must be filled in by user */ + int i_severity; /* 0=INFO, 1=ERR, 2=WARN, 3=DBG */ + const char *psz_type; /* module type */ + const char *psz_name; /* module name */ + const char *psz_header; /* optional header */ + const char *psz_message; /* message */ +} libvlc_log_message_t; +/** + * Returns the VLC messaging verbosity level + * \param p_instance libvlc instance + * \param exception an initialized exception pointer + */ +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance, libvlc_exception_t *p_e ); + +/** + * Set the VLC messaging verbosity level + * \param p_log libvlc log instance + * \param exception an initialized exception pointer + */ +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level, libvlc_exception_t *p_e ); + +/** + * Open an instance to VLC message log + * \param p_instance libvlc instance + * \param exception an initialized exception pointer + */ +libvlc_log_t *libvlc_log_open( const libvlc_instance_t *, libvlc_exception_t *); + +/** + * Close an instance of VLC message log + * \param p_log libvlc log instance + * \param exception an initialized exception pointer + */ +void libvlc_log_close( libvlc_log_t *, libvlc_exception_t *); + +/** + * Returns the number of messages in log + * \param p_log libvlc log instance + * \param exception an initialized exception pointer + */ +unsigned libvlc_log_count( const libvlc_log_t *, libvlc_exception_t *); + +/** + * Clear all messages in log + * the log should be cleared on a regular basis to avoid clogging + * \param p_log libvlc log instance + * \param exception an initialized exception pointer + */ +void libvlc_log_clear( libvlc_log_t *, libvlc_exception_t *); + +/** + * Allocate and returns a new iterator to messages in log + * \param p_log libvlc log instance + * \param exception an initialized exception pointer + */ +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *, libvlc_exception_t *); + +/** + * Releases a previoulsy allocated iterator + * \param p_log libvlc log iterator + * \param exception an initialized exception pointer + */ +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter, libvlc_exception_t *p_e ); + +/** + * Returns whether log iterator has more messages + * \param p_log libvlc log iterator + * \param exception an initialized exception pointer + */ +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter, libvlc_exception_t *p_e ); + +/** + * Returns next log message + * the content of message must not be freed + * \param p_log libvlc log iterator + * \param exception an initialized exception pointer + */ +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + struct libvlc_log_message_t *buffer, + libvlc_exception_t *p_e ); + +/** @} */ + # ifdef __cplusplus } # endif diff --git a/src/Makefile.am b/src/Makefile.am index 93ced6b515..75ce9ee7f9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -332,6 +332,7 @@ SOURCES_libvlc_common = \ misc/devices.c \ extras/libc.c \ control/core.c \ + control/log.c \ control/playlist.c \ control/vlm.c \ control/input.c \ diff --git a/src/control/log.c b/src/control/log.c new file mode 100644 index 0000000000..93d000c62c --- /dev/null +++ b/src/control/log.c @@ -0,0 +1,182 @@ +/***************************************************************************** + * log.c: libvlc new API log functions + ***************************************************************************** + * Copyright (C) 2005 the VideoLAN team + * + * $Id: core.c 14187 2006-02-07 16:37:40Z courmisch $ + * + * Authors: Damien Fouilleul + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#include +#include + +struct libvlc_log_t +{ + const libvlc_instance_t *p_instance; + msg_subscription_t *p_messages; +}; + +struct libvlc_log_iterator_t +{ + msg_subscription_t *p_messages; + int i_start; + int i_pos; + int i_end; +}; + +unsigned libvlc_get_log_verbosity( const libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) +{ + if( p_instance ) + { + return p_instance->p_libvlc_int->i_verbose; + } + RAISEZERO("Invalid VLC instance!"); +} + +void libvlc_set_log_verbosity( libvlc_instance_t *p_instance, unsigned level, libvlc_exception_t *p_e ) +{ + if( p_instance ) + { + p_instance->p_libvlc_int->i_verbose = level; + } + else + RAISEVOID("Invalid VLC instance!"); +} + +libvlc_log_t *libvlc_log_open( const libvlc_instance_t *p_instance, libvlc_exception_t *p_e ) +{ + + struct libvlc_log_t *p_log = + (struct libvlc_log_t *)malloc(sizeof(struct libvlc_log_t)); + + if( !p_log ) RAISENULL( "Out of memory" ); + + p_log->p_instance = p_instance; + p_log->p_messages = msg_Subscribe(p_instance->p_libvlc_int, MSG_QUEUE_NORMAL); + + if( !p_log->p_messages ) RAISENULL( "Out of memory" ); + + return p_log; +} + +void libvlc_log_close( libvlc_log_t *p_log, libvlc_exception_t *p_e ) +{ + if( p_log && p_log->p_messages ) + { + msg_Unsubscribe(p_log->p_instance->p_libvlc_int, p_log->p_messages); + free(p_log); + } + else + RAISEVOID("Invalid log object!"); +} + +unsigned libvlc_log_count( const libvlc_log_t *p_log, libvlc_exception_t *p_e ) +{ + if( p_log && p_log->p_messages ) + { + int i_start = p_log->p_messages->i_start; + int i_stop = *(p_log->p_messages->pi_stop); + + return i_stop - i_start % VLC_MSG_QSIZE; + } + RAISEZERO("Invalid log object!"); +} + +void libvlc_log_clear( libvlc_log_t *p_log, libvlc_exception_t *p_e ) +{ + if( p_log && p_log->p_messages ) + { + vlc_mutex_lock(p_log->p_messages->p_lock); + p_log->p_messages->i_start = *(p_log->p_messages->pi_stop); + vlc_mutex_unlock(p_log->p_messages->p_lock); + } + else + RAISEVOID("Invalid log object!"); +} + +libvlc_log_iterator_t *libvlc_log_get_iterator( const libvlc_log_t *p_log, libvlc_exception_t *p_e ) +{ + if( p_log && p_log->p_messages ) + { + struct libvlc_log_iterator_t *p_iter = + (struct libvlc_log_iterator_t *)malloc(sizeof(struct libvlc_log_iterator_t)); + + if( !p_iter ) RAISENULL( "Out of memory" ); + + vlc_mutex_lock(p_log->p_messages->p_lock); + p_iter->p_messages = p_log->p_messages; + p_iter->i_start = p_log->p_messages->i_start; + p_iter->i_pos = p_log->p_messages->i_start; + p_iter->i_end = *(p_log->p_messages->pi_stop); + vlc_mutex_unlock(p_log->p_messages->p_lock); + + return p_iter; + } + RAISENULL("Invalid log object!"); +} + +void libvlc_log_iterator_free( libvlc_log_iterator_t *p_iter, libvlc_exception_t *p_e ) +{ + if( p_iter ) + { + free(p_iter); + } + else + RAISEVOID("Invalid log iterator!"); +} + +int libvlc_log_iterator_has_next( const libvlc_log_iterator_t *p_iter, libvlc_exception_t *p_e ) +{ + if( p_iter ) + { + return p_iter->i_pos != p_iter->i_end; + } + RAISEZERO("Invalid log iterator!"); +} + +libvlc_log_message_t *libvlc_log_iterator_next( libvlc_log_iterator_t *p_iter, + struct libvlc_log_message_t *buffer, + libvlc_exception_t *p_e ) +{ + if( p_iter ) + { + if( buffer && (sizeof(struct libvlc_log_message_t) == buffer->sizeof_msg) ) + { + int i_pos = p_iter->i_pos; + if( i_pos != p_iter->i_end ) + { + msg_item_t *msg; + vlc_mutex_lock(p_iter->p_messages->p_lock); + msg = p_iter->p_messages->p_msg+i_pos; + buffer->i_severity = msg->i_type; + buffer->psz_type = msg_GetObjectTypeName(msg->i_object_type); + buffer->psz_name = msg->psz_module; + buffer->psz_header = msg->psz_header; + buffer->psz_message = msg->psz_msg; + p_iter->i_pos = ++i_pos % VLC_MSG_QSIZE; + vlc_mutex_unlock(p_iter->p_messages->p_lock); + + return buffer; + } + RAISENULL("No more messages"); + } + RAISENULL("Invalid message buffer!"); + } + RAISENULL("Invalid log iterator!"); +} +