media_list_path.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:9k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * media_list_path.h : Some inlined function that allows media_list_path
  3.  * manipulation. This is internal and used only by media_list_player.
  4.  *****************************************************************************
  5.  * Copyright (C) 2005 the VideoLAN team
  6.  * $Id $
  7.  *
  8.  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifndef _LIBVLC_MEDIA_LIST_PATH_H
  25. #define _LIBVLC_MEDIA_LIST_PATH_H 1
  26. typedef int * libvlc_media_list_path_t; /* (Media List Player Internal) */
  27. /**************************************************************************
  28.  *       path_dump (Media List Player Internal)
  29.  **************************************************************************/
  30. static inline void libvlc_media_list_path_dump( const libvlc_media_list_path_t path )
  31. {
  32.     if(!path)
  33.     {
  34.         printf("NULL pathn");
  35.         return;
  36.     }
  37.     int i;
  38.     for(i = 0; path[i] != -1; i++)
  39.         printf("%s%d", i > 0 ? "/" : "", path[i]);
  40.     printf("n");
  41. }
  42. /**************************************************************************
  43.  *       path_empty (Media List Player Internal)
  44.  **************************************************************************/
  45. static inline libvlc_media_list_path_t libvlc_media_list_path_empty( void )
  46. {
  47.     libvlc_media_list_path_t ret = malloc(sizeof(int));
  48.     ret[0] = -1;
  49.     return ret;
  50. }
  51. /**************************************************************************
  52.  *       path_with_root_index (Media List Player Internal)
  53.  **************************************************************************/
  54. static inline libvlc_media_list_path_t libvlc_media_list_path_with_root_index( int index )
  55. {
  56.     libvlc_media_list_path_t ret = malloc(sizeof(int)*2);
  57.     ret[0] = index;
  58.     ret[1] = -1;
  59.     return ret;
  60. }
  61. /**************************************************************************
  62.  *       path_deepth (Media List Player Internal)
  63.  **************************************************************************/
  64. static inline int libvlc_media_list_path_depth( const libvlc_media_list_path_t path )
  65. {
  66.     int i;
  67.     for( i = 0; path[i] != -1; i++ );
  68.     return i;
  69. }
  70. /**************************************************************************
  71.  *       path_append (Media List Player Internal)
  72.  **************************************************************************/
  73. static inline void libvlc_media_list_path_append( libvlc_media_list_path_t * p_path, int index )
  74. {
  75.     int old_deepth = libvlc_media_list_path_depth( *p_path );
  76.     *p_path = realloc( *p_path, sizeof(int)*(old_deepth+2));
  77.     *p_path[old_deepth] = index;
  78.     *p_path[old_deepth+1] = -1;
  79. }
  80. /**************************************************************************
  81.  *       path_copy_by_appending (Media List Player Internal)
  82.  **************************************************************************/
  83. static inline libvlc_media_list_path_t libvlc_media_list_path_copy_by_appending( const libvlc_media_list_path_t path, int index )
  84. {
  85.     libvlc_media_list_path_t ret;
  86.     int old_depth = libvlc_media_list_path_depth( path );
  87.     ret = malloc( sizeof(int) * (old_depth + 2) );
  88.     memcpy( ret, path, sizeof(int) * old_depth );
  89.     ret[old_depth] = index;
  90.     ret[old_depth+1] = -1;
  91.     return ret;
  92. }
  93. /**************************************************************************
  94.  *       path_copy (Media List Player Internal)
  95.  **************************************************************************/
  96. static inline libvlc_media_list_path_t libvlc_media_list_path_copy( const libvlc_media_list_path_t path )
  97. {
  98.     libvlc_media_list_path_t ret;
  99.     int depth = libvlc_media_list_path_depth( path );
  100.     ret = malloc( sizeof(int)*(depth+1) );
  101.     memcpy( ret, path, sizeof(int)*(depth+1) );
  102.     return ret;
  103. }
  104. /**************************************************************************
  105.  *       get_path_rec (Media List Player Internal)
  106.  **************************************************************************/
  107. static libvlc_media_list_path_t
  108. get_path_rec( const libvlc_media_list_path_t path, libvlc_media_list_t * p_current_mlist, libvlc_media_t * p_searched_md )
  109. {
  110.     int i, count;
  111.     count = libvlc_media_list_count( p_current_mlist, NULL );
  112.     for( i = 0; i < count; i++ )
  113.     {
  114.         libvlc_media_t * p_md = libvlc_media_list_item_at_index( p_current_mlist, i, NULL );
  115.         if( p_md == p_searched_md )
  116.             return libvlc_media_list_path_copy_by_appending( path, i ); /* Found! */
  117.         libvlc_media_list_t * p_subitems = libvlc_media_subitems( p_md, NULL );
  118.         libvlc_media_release( p_md );
  119.         if( p_subitems )
  120.         {
  121.             libvlc_media_list_path_t new_path = libvlc_media_list_path_copy_by_appending( path, i );
  122.             libvlc_media_list_lock( p_subitems );
  123.             libvlc_media_list_path_t ret = get_path_rec( new_path, p_subitems, p_searched_md );
  124.             libvlc_media_list_unlock( p_subitems );
  125.             free( new_path );
  126.             libvlc_media_list_release( p_subitems );
  127.             if( ret )
  128.                 return ret; /* Found in sublist! */
  129.         }
  130.     }
  131.     return NULL;
  132. }
  133. /**************************************************************************
  134.  *       path_of_item (Media List Player Internal)
  135.  **************************************************************************/
  136. static inline libvlc_media_list_path_t libvlc_media_list_path_of_item( libvlc_media_list_t * p_mlist, libvlc_media_t * p_md )
  137. {
  138.     libvlc_media_list_path_t path = libvlc_media_list_path_empty();
  139.     libvlc_media_list_path_t ret;
  140.     ret = get_path_rec( path, p_mlist, p_md );
  141.     free( path );
  142.     return ret;
  143. }
  144. /**************************************************************************
  145.  *       item_at_path (Media List Player Internal)
  146.  **************************************************************************/
  147. static libvlc_media_t *
  148. libvlc_media_list_item_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
  149. {
  150.     libvlc_media_list_t * p_current_mlist = p_mlist;
  151.     libvlc_media_t * p_md = NULL;
  152.     int i;
  153.     for( i = 0; path[i] != -1; i++ )
  154.     {
  155.         p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
  156.         if( p_current_mlist != p_mlist )
  157.             libvlc_media_list_release( p_current_mlist );
  158.         if( path[i+1] == -1 )
  159.             return p_md;
  160.         p_current_mlist = libvlc_media_subitems( p_md, NULL );
  161.         libvlc_media_release( p_md );
  162.  
  163.         if( !p_current_mlist )
  164.             return NULL;
  165.         /* Fetch next one */
  166.     }
  167.     /* Not found, shouldn't happen if the p_path is not empty */
  168.     if( p_current_mlist != p_mlist )
  169.         libvlc_media_list_release( p_current_mlist );
  170.     return NULL;
  171. }
  172. /**************************************************************************
  173.  *       parentlist_at_path (Media List Player Internal)
  174.  **************************************************************************/
  175. static libvlc_media_list_t *
  176. libvlc_media_list_parentlist_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
  177. {
  178.     libvlc_media_list_t * p_current_mlist = p_mlist;
  179.     libvlc_media_t * p_md = NULL;
  180.     int i;
  181.     for( i = 0; path[i] != -1; i++ )
  182.     {
  183.         if( p_current_mlist != p_mlist )
  184.             libvlc_media_list_release( p_current_mlist );
  185.         if( path[i+1] == -1 )
  186.             return p_current_mlist;
  187.         p_md = libvlc_media_list_item_at_index( p_current_mlist, path[i], NULL );
  188.         p_current_mlist = libvlc_media_subitems( p_md, NULL );
  189.         libvlc_media_release( p_md );
  190.  
  191.         if( !p_current_mlist )
  192.             return NULL;
  193.         /* Fetch next one */
  194.     }
  195.     /* Not found, shouldn't happen if the p_path is not empty */
  196.     if( p_current_mlist != p_mlist )
  197.         libvlc_media_list_release( p_current_mlist );
  198.     return NULL;
  199. }
  200. /**************************************************************************
  201.  *       sublist_at_path (Media List Player Internal)
  202.  **************************************************************************/
  203. static libvlc_media_list_t *
  204. libvlc_media_list_sublist_at_path( libvlc_media_list_t * p_mlist, const libvlc_media_list_path_t path )
  205. {
  206.     libvlc_media_list_t * ret;
  207.     libvlc_media_t * p_md = libvlc_media_list_item_at_path( p_mlist, path );
  208.     if( !p_md )
  209.         return NULL;
  210.  
  211.     ret = libvlc_media_subitems( p_md, NULL );
  212.     libvlc_media_release( p_md );
  213.  
  214.     return ret;
  215. }
  216. #endif