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

📄 item-ext.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    if( p_playlist->pp_all_items[i]->input.i_id == i_id )    {        return p_playlist->pp_all_items[i];    }    return NULL;}playlist_item_t *playlist_LockItemGetById( playlist_t *p_playlist, int i_id){    playlist_item_t *p_ret;    vlc_mutex_lock( &p_playlist->object_lock );    p_ret = playlist_ItemGetById( p_playlist, i_id );    vlc_mutex_unlock( &p_playlist->object_lock );    return p_ret;}/** * Search an item by its input_item_t * * \param p_playlist the playlist * \param p_item the input_item_t to find * \return the item, or NULL on failure */playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist ,                                           input_item_t *p_item ){    int i;    if( &p_playlist->status.p_item->input == p_item )    {        return p_playlist->status.p_item;    }    for( i =  0 ; i < p_playlist->i_size ; i++ )    {        if( &p_playlist->pp_items[i]->input == p_item )        {            return p_playlist->pp_items[i];        }    }    return NULL;}playlist_item_t *playlist_LockItemGetByInput( playlist_t *p_playlist,                                               input_item_t *p_item ){    playlist_item_t *p_ret;    vlc_mutex_lock( &p_playlist->object_lock );    p_ret = playlist_ItemGetByInput( p_playlist, p_item );    vlc_mutex_unlock( &p_playlist->object_lock );    return p_ret;}/*********************************************************************** * Misc functions ***********************************************************************//** * Transform an item to a node * * This function must be entered without the playlist lock * * \param p_playlist the playlist object * \param p_item the item to transform * \return nothing */int playlist_ItemToNode( playlist_t *p_playlist,playlist_item_t *p_item ){    int i = 0;    if( p_item->i_children == -1 )    {        p_item->i_children = 0;    }    /* Remove it from the array of available items */    for( i = 0 ; i < p_playlist->i_size ; i++ )    {        if( p_item == p_playlist->pp_items[i] )        {            REMOVE_ELEM( p_playlist->pp_items, p_playlist->i_size, i );        }    }    var_SetInteger( p_playlist, "item-change", p_item->input.i_id );    return VLC_SUCCESS;}int playlist_LockItemToNode( playlist_t *p_playlist, playlist_item_t *p_item ){    int i_ret;    vlc_mutex_lock( &p_playlist->object_lock );    i_ret = playlist_ItemToNode( p_playlist, p_item );    vlc_mutex_unlock( &p_playlist->object_lock );    return i_ret;}/** * Replaces an item with another one * This function must be entered without the playlist lock * * \see playlist_Replace */int playlist_LockReplace( playlist_t *p_playlist,                             playlist_item_t *p_olditem,                             input_item_t *p_new ){    int i_ret;    vlc_mutex_lock( &p_playlist->object_lock );    i_ret = playlist_Replace( p_playlist, p_olditem, p_new );    vlc_mutex_unlock( &p_playlist->object_lock );    return i_ret;}/** * Replaces an item with another one * This function must be entered with the playlist lock: * * \param p_playlist the playlist * \param p_olditem the item to replace * \param p_new the new input_item * \return VLC_SUCCESS or an error */int playlist_Replace( playlist_t *p_playlist, playlist_item_t *p_olditem,                       input_item_t *p_new ){    int i;    int j;    if( p_olditem->i_children != -1 )    {        msg_Err( p_playlist, "playlist_Replace can only be used on leafs");        return VLC_EGENERIC;    }    p_olditem->i_nb_played = 0;    memcpy( &p_olditem->input, p_new, sizeof( input_item_t ) );    p_olditem->i_nb_played = 0;    for( i = 0 ; i< p_olditem->i_parents ; i++ )    {        playlist_item_t *p_parent = p_olditem->pp_parents[i]->p_parent;        for( j = 0 ; j< p_parent->i_children ; i++ )        {            if( p_parent->pp_children[j] == p_olditem )            {                p_parent->i_serial++;            }        }    }    return VLC_SUCCESS;}/** * Deletes an item from a playlist. * * This function must be entered without the playlist lock * * \param p_playlist the playlist to remove from. * \param i_id the identifier of the item to delete * \return returns VLC_SUCCESS or an error */int playlist_Delete( playlist_t * p_playlist, int i_id ){    int i, i_top, i_bottom;    int i_pos;    vlc_bool_t b_flag = VLC_FALSE;    playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_id );    if( p_item == NULL )    {        return VLC_EGENERIC;    }    if( p_item->i_children > -1 )    {        return playlist_NodeDelete( p_playlist, p_item, VLC_TRUE, VLC_FALSE );    }    var_SetInteger( p_playlist, "item-deleted", i_id );    i_bottom = 0; i_top = p_playlist->i_all_size - 1;    i = i_top / 2;    while( p_playlist->pp_all_items[i]->input.i_id != i_id &&           i_top > i_bottom )    {        if( p_playlist->pp_all_items[i]->input.i_id < i_id )        {            i_bottom = i + 1;        }        else        {            i_top = i - 1;        }        i = i_bottom + ( i_top - i_bottom ) / 2;    }    if( p_playlist->pp_all_items[i]->input.i_id == i_id )    {        REMOVE_ELEM( p_playlist->pp_all_items, p_playlist->i_all_size, i );    }    /* Check if it is the current item */    if( p_playlist->status.p_item == p_item )    {        /* Hack we don't call playlist_Control for lock reasons */        p_playlist->status.i_status = PLAYLIST_STOPPED;        p_playlist->request.b_request = VLC_TRUE;        p_playlist->request.p_item = NULL;        msg_Info( p_playlist, "stopping playback" );        b_flag = VLC_TRUE;    }    /* Get position and update index if needed */    i_pos = playlist_GetPositionById( p_playlist, i_id );    if( i_pos >= 0 && i_pos <= p_playlist->i_index )    {        p_playlist->i_index--;    }    msg_Dbg( p_playlist, "deleting playlist item `%s'",                          p_item->input.psz_name );    /* Remove the item from all its parent nodes */    for ( i= 0 ; i < p_item->i_parents ; i++ )    {        playlist_NodeRemoveItem( p_playlist, p_item,                                 p_item->pp_parents[i]->p_parent );        if( p_item->pp_parents[i]->i_view == VIEW_ALL )        {            p_playlist->i_size--;        }    }    /* TODO : Update views */    if( b_flag == VLC_FALSE )        playlist_ItemDelete( p_item );    else        p_item->i_flags |= PLAYLIST_REMOVE_FLAG;    return VLC_SUCCESS;}int playlist_LockDelete( playlist_t * p_playlist, int i_id ){    int i_ret;    vlc_mutex_lock( &p_playlist->object_lock );    i_ret = playlist_Delete( p_playlist, i_id );    vlc_mutex_unlock( &p_playlist->object_lock );    return i_ret;}/** * Clear all playlist items * * \param p_playlist the playlist to be cleared. * \return returns 0 */int playlist_Clear( playlist_t * p_playlist ){    int i;    for( i = p_playlist->i_size; i > 0 ; i-- )    {        playlist_Delete( p_playlist, p_playlist->pp_items[0]->input.i_id );    }    for( i = 0 ; i< p_playlist->i_views; i++ )    {        playlist_ViewEmpty( p_playlist, i, VLC_TRUE );    }    return VLC_SUCCESS;}int playlist_LockClear( playlist_t *p_playlist ){    int i_ret;    vlc_mutex_lock( &p_playlist->object_lock );    i_ret = playlist_Clear( p_playlist );    vlc_mutex_unlock( &p_playlist->object_lock );    return i_ret;}/** * Disables a playlist item * * \param p_playlist the playlist to disable from. * \param i_pos the position of the item to disable * \return returns 0 */int playlist_Disable( playlist_t * p_playlist, playlist_item_t *p_item ){    if( !p_item ) return VLC_EGENERIC;    msg_Dbg( p_playlist, "disabling playlist item `%s'",                   p_item->input.psz_name );    if( p_item->i_flags & PLAYLIST_ENA_FLAG )    {        p_playlist->i_enabled--;    }    p_item->i_flags &= ~PLAYLIST_ENA_FLAG;    var_SetInteger( p_playlist, "item-change", p_item->input.i_id );    return VLC_SUCCESS;}/** * Enables a playlist item * * \param p_playlist the playlist to enable from. * \param i_pos the position of the item to enable * \return returns 0 */int playlist_Enable( playlist_t * p_playlist, playlist_item_t *p_item ){    if( !p_item ) return VLC_EGENERIC;    msg_Dbg( p_playlist, "enabling playlist item `%s'",                   p_item->input.psz_name );    if( p_item->i_flags & ~PLAYLIST_ENA_FLAG )    {        p_playlist->i_enabled++;    }    p_item->i_flags |= PLAYLIST_ENA_FLAG;    var_SetInteger( p_playlist, "item-change", p_item->input.i_id );    return VLC_SUCCESS;}/** * Move an item in a playlist * * This function must be entered without the playlist lock * * Move the item in the playlist with position i_pos before the current item * at position i_newpos. * \param p_playlist the playlist to move items in * \param i_pos the position of the item to move * \param i_newpos the position of the item that will be behind the moved item *        after the move * \return returns VLC_SUCCESS */int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos ){    vlc_value_t val;    vlc_mutex_lock( &p_playlist->object_lock );    /* take into account that our own row disappears. */    if( i_pos < i_newpos ) i_newpos--;    if( i_pos >= 0 && i_newpos >=0 && i_pos <= p_playlist->i_size &&        i_newpos <= p_playlist->i_size )    {        playlist_item_t * temp;        msg_Dbg( p_playlist, "moving playlist item `%s' (%i -> %i)",                 p_playlist->pp_items[i_pos]->input.psz_name, i_pos, i_newpos);        if( i_pos == p_playlist->i_index )        {            p_playlist->i_index = i_newpos;        }        else if( i_pos > p_playlist->i_index &&                 i_newpos <= p_playlist->i_index )        {            p_playlist->i_index++;        }        else if( i_pos < p_playlist->i_index &&                 i_newpos >= p_playlist->i_index )        {            p_playlist->i_index--;        }        if ( i_pos < i_newpos )        {            temp = p_playlist->pp_items[i_pos];            while ( i_pos < i_newpos )            {                p_playlist->pp_items[i_pos] = p_playlist->pp_items[i_pos+1];                i_pos++;            }            p_playlist->pp_items[i_newpos] = temp;        }        else if ( i_pos > i_newpos )        {            temp = p_playlist->pp_items[i_pos];            while ( i_pos > i_newpos )            {                p_playlist->pp_items[i_pos] = p_playlist->pp_items[i_pos-1];                i_pos--;            }            p_playlist->pp_items[i_newpos] = temp;        }    }    vlc_mutex_unlock( &p_playlist->object_lock );    val.b_bool = VLC_TRUE;    var_Set( p_playlist, "intf-change", val );    return VLC_SUCCESS;}/** * Moves an item * * \param p_playlist the playlist * \param p_item the item to move * \param p_node the new parent of the item * \param i_newpos the new position under this new parent * \param i_view the view in which the move must be done or ALL_VIEWS * \return VLC_SUCCESS or an error */int playlist_TreeMove( playlist_t * p_playlist, playlist_item_t *p_item,                       playlist_item_t *p_node, int i_newpos, int i_view ){    int i;    playlist_item_t *p_detach = NULL;#if 0    if( i_view == ALL_VIEWS )    {        for( i = 0 ; i < p_playlist->i_views; i++ )        {            playlist_TreeMove( p_playlist, p_item, p_node, i_newpos,                               p_playlist->pp_views[i] );        }    }#endif    /* Find the parent */    for( i = 0 ; i< p_item->i_parents; i++ )    {        if( p_item->pp_parents[i]->i_view == i_view )        {            p_detach = p_item->pp_parents[i]->p_parent;            break;        }    }    if( p_detach == NULL )    {        msg_Err( p_playlist, "item not found in view %i", i_view );        return VLC_EGENERIC;    }    /* Detach from the parent *///    playlist_NodeDetach( p_detach, p_item );    /* Attach to new parent */    return VLC_SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -