📄 item-ext.c
字号:
} 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 + -