⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messages.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
/** * 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 + -