media_list_path.h
资源名称:vlc-1.0.5.zip [点击查看]
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:9k
源码类别:
midi
开发平台:
Unix_Linux
- /*****************************************************************************
- * media_list_path.h : Some inlined function that allows media_list_path
- * manipulation. This is internal and used only by media_list_player.
- *****************************************************************************
- * Copyright (C) 2005 the VideoLAN team
- * $Id $
- *
- * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
- *
- * 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.
- *****************************************************************************/
- #ifndef _LIBVLC_MEDIA_LIST_PATH_H
- #define _LIBVLC_MEDIA_LIST_PATH_H 1
- typedef int * libvlc_media_list_path_t; /* (Media List Player Internal) */
- /**************************************************************************
- * path_dump (Media List Player Internal)
- **************************************************************************/
- static inline void libvlc_media_list_path_dump( const libvlc_media_list_path_t path )
- {
- if(!path)
- {
- printf("NULL pathn");
- return;
- }
- int i;
- for(i = 0; path[i] != -1; i++)
- printf("%s%d", i > 0 ? "/" : "", path[i]);
- printf("n");
- }
- /**************************************************************************
- * path_empty (Media List Player Internal)
- **************************************************************************/
- static inline libvlc_media_list_path_t libvlc_media_list_path_empty( void )
- {
- libvlc_media_list_path_t ret = malloc(sizeof(int));
- ret[0] = -1;
- return ret;
- }
- /**************************************************************************
- * path_with_root_index (Media List Player Internal)
- **************************************************************************/
- static inline libvlc_media_list_path_t libvlc_media_list_path_with_root_index( int index )
- {
- libvlc_media_list_path_t ret = malloc(sizeof(int)*2);
- ret[0] = index;
- ret[1] = -1;
- return ret;
- }
- /**************************************************************************
- * path_deepth (Media List Player Internal)
- **************************************************************************/
- static inline int libvlc_media_list_path_depth( const libvlc_media_list_path_t path )
- {
- int i;
- for( i = 0; path[i] != -1; i++ );
- return i;
- }
- /**************************************************************************
- * path_append (Media List Player Internal)
- **************************************************************************/
- static inline void libvlc_media_list_path_append( libvlc_media_list_path_t * p_path, int index )
- {
- int old_deepth = libvlc_media_list_path_depth( *p_path );
- *p_path = realloc( *p_path, sizeof(int)*(old_deepth+2));
- *p_path[old_deepth] = index;
- *p_path[old_deepth+1] = -1;
- }
- /**************************************************************************
- * path_copy_by_appending (Media List Player Internal)
- **************************************************************************/
- static inline libvlc_media_list_path_t libvlc_media_list_path_copy_by_appending( const libvlc_media_list_path_t path, int index )
- {
- libvlc_media_list_path_t ret;
- int old_depth = libvlc_media_list_path_depth( path );
- ret = malloc( sizeof(int) * (old_depth + 2) );
- memcpy( ret, path, sizeof(int) * old_depth );
- ret[old_depth] = index;
- ret[old_depth+1] = -1;
- return ret;
- }
- /**************************************************************************
- * path_copy (Media List Player Internal)
- **************************************************************************/
- static inline libvlc_media_list_path_t libvlc_media_list_path_copy( const libvlc_media_list_path_t path )
- {
- libvlc_media_list_path_t ret;
- int depth = libvlc_media_list_path_depth( path );
- ret = malloc( sizeof(int)*(depth+1) );
- memcpy( ret, path, sizeof(int)*(depth+1) );
- return ret;
- }
- /**************************************************************************
- * get_path_rec (Media List Player Internal)
- **************************************************************************/
- static libvlc_media_list_path_t
- get_path_rec( const libvlc_media_list_path_t path, libvlc_media_list_t * p_current_mlist, libvlc_media_t * p_searched_md )
- {
- int i, count;
- count = libvlc_media_list_count( p_current_mlist, NULL );
- for( i = 0; i < count; i++ )
- {
- libvlc_media_t * p_md = libvlc_media_list_item_at_index( p_current_mlist, i, NULL );
- if( p_md == p_searched_md )
- return libvlc_media_list_path_copy_by_appending( path, i ); /* Found! */
- libvlc_media_list_t * p_subitems = libvlc_media_subitems( p_md, NULL );
- libvlc_media_release( p_md );
- if( p_subitems )
- {
- libvlc_media_list_path_t new_path = libvlc_media_list_path_copy_by_appending( path, i );
- libvlc_media_list_lock( p_subitems );
- libvlc_media_list_path_t ret = get_path_rec( new_path, p_subitems, p_searched_md );
- libvlc_media_list_unlock( p_subitems );
- free( new_path );
- libvlc_media_list_release( p_subitems );
- if( ret )
- return ret; /* Found in sublist! */
- }
- }
- return NULL;
- }
- /**************************************************************************
- * path_of_item (Media List Player Internal)
- **************************************************************************/
- static inline libvlc_media_list_path_t libvlc_media_list_path_of_item( libvlc_media_list_t * p_mlist, libvlc_media_t * p_md )
- {
- libvlc_media_list_path_t path = libvlc_media_list_path_empty();
- libvlc_media_list_path_t ret;
- ret = get_path_rec( path, p_mlist, p_md );
- free( path );
- return ret;
- }
- /**************************************************************************
- * item_at_path (Media List Player Internal)
- **************************************************************************/
- static libvlc_media_t *
- libvlc_media_list_item_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
- {
- libvlc_media_list_t * p_current_mlist = p_mlist;
- libvlc_media_t * p_md = NULL;
- int i;
- for( i = 0; path[i] != -1; i++ )
- {
- p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
- if( p_current_mlist != p_mlist )
- libvlc_media_list_release( p_current_mlist );
- if( path[i+1] == -1 )
- return p_md;
- p_current_mlist = libvlc_media_subitems( p_md, NULL );
- libvlc_media_release( p_md );
- if( !p_current_mlist )
- return NULL;
- /* Fetch next one */
- }
- /* Not found, shouldn't happen if the p_path is not empty */
- if( p_current_mlist != p_mlist )
- libvlc_media_list_release( p_current_mlist );
- return NULL;
- }
- /**************************************************************************
- * parentlist_at_path (Media List Player Internal)
- **************************************************************************/
- static libvlc_media_list_t *
- libvlc_media_list_parentlist_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
- {
- libvlc_media_list_t * p_current_mlist = p_mlist;
- libvlc_media_t * p_md = NULL;
- int i;
- for( i = 0; path[i] != -1; i++ )
- {
- if( p_current_mlist != p_mlist )
- libvlc_media_list_release( p_current_mlist );
- if( path[i+1] == -1 )
- return p_current_mlist;
- p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
- p_current_mlist = libvlc_media_subitems( p_md, NULL );
- libvlc_media_release( p_md );
- if( !p_current_mlist )
- return NULL;
- /* Fetch next one */
- }
- /* Not found, shouldn't happen if the p_path is not empty */
- if( p_current_mlist != p_mlist )
- libvlc_media_list_release( p_current_mlist );
- return NULL;
- }
- /**************************************************************************
- * sublist_at_path (Media List Player Internal)
- **************************************************************************/
- static libvlc_media_list_t *
- libvlc_media_list_sublist_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
- {
- libvlc_media_list_t * ret;
- libvlc_media_t * p_md = libvlc_media_list_item_at_path( p_mlist, path );
- if( !p_md )
- return NULL;
- ret = libvlc_media_subitems( p_md, NULL );
- libvlc_media_release( p_md );
- return ret;
- }
- #endif