📄 messages.c
字号:
/** * Add a message to a queue * * This function provides basic functionnalities to other msg_* functions. * It adds a message to a queue (after having printed all stored messages if it * is full). If the message can't be converted to string in memory, it issues * a warning. */static void QueueMsg( vlc_object_t *p_this, int i_type, const char *psz_module, const char *psz_format, va_list _args ){ msg_bank_t * p_bank = &p_this->p_libvlc->msg_bank; /* message bank */ char * psz_str = NULL; /* formatted message string */ va_list args; msg_item_t * p_item = NULL; /* pointer to message */ msg_item_t item; /* message in case of a full queue */#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) int i_size = strlen(psz_format) + INTF_MAX_MSG_SIZE;#endif /* * Convert message to string */#if defined(HAVE_VASPRINTF) && !defined(SYS_DARWIN) && !defined( SYS_BEOS ) vlc_va_copy( args, _args ); vasprintf( &psz_str, psz_format, args ); va_end( args );#else psz_str = (char*) malloc( i_size * sizeof(char) );#endif if( psz_str == NULL ) { fprintf( stderr, "main warning: can't store message (%s): ", strerror(errno) ); vlc_va_copy( args, _args ); vfprintf( stderr, psz_format, args ); va_end( args ); fprintf( stderr, "\n" ); return; }#if !defined(HAVE_VASPRINTF) || defined(SYS_DARWIN) || defined(SYS_BEOS) vlc_va_copy( args, _args ); vsnprintf( psz_str, i_size, psz_format, args ); va_end( args ); psz_str[ i_size - 1 ] = 0; /* Just in case */#endif /* Put message in queue */ vlc_mutex_lock( &p_bank->lock ); /* Check there is room in the queue for our message */ if( p_bank->b_overflow ) { FlushMsg( p_bank ); if( ((p_bank->i_stop - p_bank->i_start + 1) % VLC_MSG_QSIZE) == 0 ) { /* Still in overflow mode, print from a dummy item */ p_item = &item; } else { /* Pheeew, at last, there is room in the queue! */ p_bank->b_overflow = VLC_FALSE; } } else if( ((p_bank->i_stop - p_bank->i_start + 2) % VLC_MSG_QSIZE) == 0 ) { FlushMsg( p_bank ); if( ((p_bank->i_stop - p_bank->i_start + 2) % VLC_MSG_QSIZE) == 0 ) { p_bank->b_overflow = VLC_TRUE; /* Put the overflow message in the queue */ p_item = p_bank->msg + p_bank->i_stop; p_bank->i_stop = (p_bank->i_stop + 1) % VLC_MSG_QSIZE; p_item->i_type = VLC_MSG_WARN; p_item->i_object_id = p_this->i_object_id; p_item->i_object_type = p_this->i_object_type; p_item->psz_module = strdup( "message" ); p_item->psz_msg = strdup( "message queue overflowed" ); PrintMsg( p_this, p_item ); /* We print from a dummy item */ p_item = &item; } } if( !p_bank->b_overflow ) { /* Put the message in the queue */ p_item = p_bank->msg + p_bank->i_stop; p_bank->i_stop = (p_bank->i_stop + 1) % VLC_MSG_QSIZE; } /* Fill message information fields */ p_item->i_type = i_type; p_item->i_object_id = p_this->i_object_id; p_item->i_object_type = p_this->i_object_type; p_item->psz_module = strdup( psz_module ); p_item->psz_msg = psz_str; PrintMsg( p_this, p_item ); if( p_bank->b_overflow ) { free( p_item->psz_module ); free( p_item->psz_msg ); } vlc_mutex_unlock( &p_bank->lock );}/* following functions are local *//***************************************************************************** * FlushMsg ***************************************************************************** * Print all messages remaining in queue. MESSAGE QUEUE MUST BE LOCKED, since * this function does not check the lock. *****************************************************************************/static void FlushMsg ( msg_bank_t *p_bank ){ int i_index, i_start, i_stop; /* Only flush the queue if it has been properly configured */ if( !p_bank->b_configured ) { return; } /* Get the maximum message index that can be freed */ i_stop = p_bank->i_stop; /* Check until which value we can free messages */ for( i_index = 0; i_index < p_bank->i_sub; i_index++ ) { i_start = p_bank->pp_sub[ i_index ]->i_start; /* If this subscriber is late, we don't free messages before * his i_start value, otherwise he'll miss messages */ if( ( i_start < i_stop && (p_bank->i_stop <= i_start || i_stop <= p_bank->i_stop) ) || ( i_stop < i_start && (i_stop <= p_bank->i_stop && p_bank->i_stop <= i_start) ) ) { i_stop = i_start; } } /* Free message data */ for( i_index = p_bank->i_start; i_index != i_stop; i_index = (i_index+1) % VLC_MSG_QSIZE ) { free( p_bank->msg[i_index].psz_msg ); free( p_bank->msg[i_index].psz_module ); } /* Update the new start value */ p_bank->i_start = i_index;}/***************************************************************************** * PrintMsg: output a message item to stderr ***************************************************************************** * Print a message to stderr, with colour formatting if needed. *****************************************************************************/static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item ){# define COL(x) "\033[" #x ";1m"# define RED COL(31)# define GREEN COL(32)# define YELLOW COL(33)# define WHITE COL(37)# define GRAY "\033[0m"#ifdef UNDER_CE int i_dummy;#endif static const char * ppsz_type[4] = { "", " error", " warning", " debug" }; static const char *ppsz_color[4] = { WHITE, RED, YELLOW, GRAY }; char *psz_object = "private"; int i_type = p_item->i_type; switch( i_type ) { case VLC_MSG_ERR: if( p_this->p_libvlc->i_verbose < 0 ) return; break; case VLC_MSG_INFO: if( p_this->p_libvlc->i_verbose < 0 ) return; break; case VLC_MSG_WARN: if( p_this->p_libvlc->i_verbose < 1 ) return; break; case VLC_MSG_DBG: if( p_this->p_libvlc->i_verbose < 2 ) return; break; } switch( p_item->i_object_type ) { case VLC_OBJECT_ROOT: psz_object = "root"; break; case VLC_OBJECT_VLC: psz_object = "vlc"; break; case VLC_OBJECT_MODULE: psz_object = "module"; break; case VLC_OBJECT_INTF: psz_object = "interface"; break; case VLC_OBJECT_PLAYLIST: psz_object = "playlist"; break; case VLC_OBJECT_ITEM: psz_object = "item"; break; case VLC_OBJECT_INPUT: psz_object = "input"; break; case VLC_OBJECT_DECODER: psz_object = "decoder"; break; case VLC_OBJECT_PACKETIZER: psz_object = "packetizer"; break; case VLC_OBJECT_ENCODER: psz_object = "encoder"; break; case VLC_OBJECT_VOUT: psz_object = "video output"; break; case VLC_OBJECT_AOUT: psz_object = "audio output"; break; case VLC_OBJECT_SOUT: psz_object = "stream output"; break; case VLC_OBJECT_HTTPD: psz_object = "http daemon"; break; case VLC_OBJECT_DIALOGS: psz_object = "dialogs provider"; break; case VLC_OBJECT_VLM: psz_object = "vlm"; break; case VLC_OBJECT_ANNOUNCE: psz_object = "announce handler"; break; case VLC_OBJECT_DEMUX: psz_object = "demuxer"; break; case VLC_OBJECT_ACCESS: psz_object = "access"; break; }#ifdef UNDER_CE# define CE_WRITE(str) WriteFile( p_this->p_libvlc->msg_bank.logfile, \ str, strlen(str), &i_dummy, NULL ); CE_WRITE( p_item->psz_module ); CE_WRITE( " " ); CE_WRITE( psz_object ); CE_WRITE( ppsz_type[i_type] ); CE_WRITE( ": " ); CE_WRITE( p_item->psz_msg ); CE_WRITE( "\r\n" ); FlushFileBuffers( p_this->p_libvlc->msg_bank.logfile );#else /* Send the message to stderr */ if( p_this->p_libvlc->b_color ) { fprintf( stderr, "[" GREEN "%.8i" GRAY "] %s %s%s: %s%s" GRAY "\n", p_item->i_object_id, p_item->psz_module, psz_object, ppsz_type[i_type], ppsz_color[i_type], p_item->psz_msg ); } else { fprintf( stderr, "[%.8i] %s %s%s: %s\n", p_item->i_object_id, p_item->psz_module, psz_object, ppsz_type[i_type], p_item->psz_msg ); }# if defined(WIN32) fflush( stderr );# endif#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -