From f3c6bbcc0afde6731ea31f123e44844365720cfd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Stenac?= Date: Sat, 8 Jul 2006 17:28:51 +0000 Subject: [PATCH] Some infrastructure work for playlist autoload/autosave --- include/vlc_playlist.h | 2 +- include/vlc_symbols.h | 8 +++++- modules/control/rc.c | 2 ++ modules/demux/playlist/xspf.c | 4 +-- src/playlist/item.c | 5 ++++ src/playlist/loadsave.c | 48 +++++++++++++++-------------------- src/playlist/search.c | 5 ++-- 7 files changed, 41 insertions(+), 33 deletions(-) diff --git a/include/vlc_playlist.h b/include/vlc_playlist.h index faf1e0550b..3cdf4eb9bc 100644 --- a/include/vlc_playlist.h +++ b/include/vlc_playlist.h @@ -352,7 +352,7 @@ VLC_EXPORT( int, playlist_NodeSort, ( playlist_t *, playlist_item_t *,int, int VLC_EXPORT( int, playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) ); /* Load/Save */ -VLC_EXPORT( int, playlist_Import, ( playlist_t *, const char * ) ); +VLC_EXPORT( int, playlist_Import, ( playlist_t *, const char *, playlist_item_t *, vlc_bool_t ) ); VLC_EXPORT( int, playlist_Export, ( playlist_t *, const char *, playlist_item_t *, const char * ) ); /*********************************************************************** diff --git a/include/vlc_symbols.h b/include/vlc_symbols.h index aee4c5685c..219053bcd9 100644 --- a/include/vlc_symbols.h +++ b/include/vlc_symbols.h @@ -312,7 +312,7 @@ struct module_symbols_t int (*playlist_NodeGroup_inner) (playlist_t *, playlist_item_t *,playlist_item_t **,int, int, int); int (*playlist_NodeSort_inner) (playlist_t *, playlist_item_t *,int, int); int (*playlist_RecursiveNodeSort_inner) (playlist_t *, playlist_item_t *,int, int); - int (*playlist_Import_inner) (playlist_t *, const char *); + int (*playlist_Import_inner) (playlist_t *, const char *, playlist_item_t *, vlc_bool_t); int (*playlist_Export_inner) (playlist_t *, const char *, playlist_item_t *, const char *); spu_t * (*__spu_Create_inner) (vlc_object_t *); int (*spu_Init_inner) (spu_t *); @@ -517,6 +517,8 @@ struct module_symbols_t void *stats_TimerClean_deprecated; void *stats_TimersClean_deprecated; void (*__stats_TimersClean_inner) (vlc_object_t *); + void (*__intf_IntfProgressUpdate_inner) (vlc_object_t*, int, const char*, float); + int (*__intf_IntfProgress_inner) (vlc_object_t*, const char*, float); }; # if defined (__PLUGIN__) # define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner @@ -984,6 +986,8 @@ struct module_symbols_t # define input_AddSubtitles (p_symbols)->input_AddSubtitles_inner # define __stats_CounterCreate (p_symbols)->__stats_CounterCreate_inner # define __stats_TimersClean (p_symbols)->__stats_TimersClean_inner +# define __intf_IntfProgressUpdate (p_symbols)->__intf_IntfProgressUpdate_inner +# define __intf_IntfProgress (p_symbols)->__intf_IntfProgress_inner # elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__) /****************************************************************** * STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access. @@ -1454,6 +1458,8 @@ struct module_symbols_t ((p_symbols)->input_AddSubtitles_inner) = input_AddSubtitles; \ ((p_symbols)->__stats_CounterCreate_inner) = __stats_CounterCreate; \ ((p_symbols)->__stats_TimersClean_inner) = __stats_TimersClean; \ + ((p_symbols)->__intf_IntfProgressUpdate_inner) = __intf_IntfProgressUpdate; \ + ((p_symbols)->__intf_IntfProgress_inner) = __intf_IntfProgress; \ (p_symbols)->net_ConvertIPv4_deprecated = NULL; \ (p_symbols)->__playlist_ItemCopy_deprecated = NULL; \ (p_symbols)->playlist_ItemAddParent_deprecated = NULL; \ diff --git a/modules/control/rc.c b/modules/control/rc.c index 832c1ae7a7..a28070a51e 100644 --- a/modules/control/rc.c +++ b/modules/control/rc.c @@ -1280,6 +1280,8 @@ static int Playlist( vlc_object_t *p_this, char const *psz_cmd, } else if( !strcmp( psz_cmd, "playlist" ) ) { + playlist_Import( p_playlist, "/home/zorglub/vlc-trunk/foo.xspf", + p_playlist->p_ml_category, VLC_FALSE ); playlist_NodeDump( p_playlist, p_playlist->p_root_category, 0 ); playlist_NodeDump( p_playlist, p_playlist->p_root_onelevel, 0 ); } diff --git a/modules/demux/playlist/xspf.c b/modules/demux/playlist/xspf.c index 0cff609f3a..172d2c5ae5 100644 --- a/modules/demux/playlist/xspf.c +++ b/modules/demux/playlist/xspf.c @@ -486,10 +486,10 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE { FREE_ATT(); /* Add it */ - /*playlist_AddWhereverNeeded( p_playlist, p_new_input, + playlist_AddWhereverNeeded( p_playlist, p_new_input, p_item, p_demux->p_sys->p_item_in_category, (p_demux->p_sys->i_parent_id >0 ) ? VLC_TRUE: - VLC_FALSE, PLAYLIST_APPEND );*/ + VLC_FALSE, PLAYLIST_APPEND ); if( p_demux->p_sys->i_identifier < p_demux->p_sys->i_tracklist_entries ) { diff --git a/src/playlist/item.c b/src/playlist/item.c index a1f164dd03..591123984e 100644 --- a/src/playlist/item.c +++ b/src/playlist/item.c @@ -277,6 +277,7 @@ int playlist_BothAddInput( playlist_t *p_playlist, AddItem( p_playlist, p_item_cat, p_direct_parent, i_pos ); /* Add to onelevel */ + /** \todo make a faster case for ml import */ p_item_one = playlist_ItemNewFromInput( p_playlist, p_input ); if( p_item_one == NULL ) return VLC_EGENERIC; @@ -389,6 +390,10 @@ playlist_item_t *playlist_ItemToNode( playlist_t *p_playlist, * useful for later BothAddInput ) */ + /* Fast track the media library, no time to loose */ + if( p_item == p_playlist->p_ml_category ) + return p_item; + /** \todo First look if we don't already have it */ playlist_item_t *p_item_in_category = playlist_ItemFindFromInputAndRoot( p_playlist, p_item->p_input->i_id, diff --git a/src/playlist/loadsave.c b/src/playlist/loadsave.c index 3d02454e7d..9c86a1e36c 100644 --- a/src/playlist/loadsave.c +++ b/src/playlist/loadsave.c @@ -36,42 +36,36 @@ #define PLAYLIST_FILE_HEADER "# vlc playlist file version 0.5" /** - * Import a certain playlist file into the library - * This file will get inserted as a new category - * - * XXX: TODO + * Import a playlist file at a given point of a given view * \param p_playlist the playlist to which the new items will be added * \param psz_filename the name of the playlistfile to import * \return VLC_SUCCESS on success */ -int playlist_Import( playlist_t * p_playlist, const char *psz_filename ) +int playlist_Import( playlist_t * p_playlist, const char *psz_filename, + playlist_item_t *p_root, vlc_bool_t b_only_there ) { - playlist_item_t *p_item; - char *psz_uri; - int i_id; - - msg_Info( p_playlist, "clearing playlist"); - playlist_Clear( p_playlist ); - - - psz_uri = (char *)malloc(sizeof(char)*strlen(psz_filename) + 17 ); - sprintf( psz_uri, "file/playlist://%s", psz_filename); - - i_id = playlist_PlaylistAdd( p_playlist, psz_uri, psz_uri, - PLAYLIST_INSERT , PLAYLIST_END); - - vlc_mutex_lock( &p_playlist->object_lock ); - p_item = playlist_ItemGetById( p_playlist, i_id ); - vlc_mutex_unlock( &p_playlist->object_lock ); - - playlist_Play(p_playlist); - + char *psz_uri, *psz_opt; + input_item_t *p_input; + + asprintf( &psz_uri, "file/playlist://%s", psz_filename ); + p_input = input_ItemNewExt( p_playlist, psz_uri, "playlist", 0, NULL, -1 ); + if( b_only_there ) + { + asprintf( &psz_opt, "parent-item=%i", p_root->i_id ); + vlc_input_item_AddOption( p_input, psz_opt ); + free( psz_opt ); + } + if( p_root == p_playlist->p_ml_category ) + p_input->i_id = p_playlist->p_ml_category->p_input->i_id; + input_Read( p_playlist, p_input, VLC_TRUE ); + free( psz_uri ); + return VLC_SUCCESS; } /** - * Load a certain playlist file into the playlist - * This file will replace the contents of the "current" view + * Load a playlist file to the playlist. It will create a new node in + * category * * \param p_playlist the playlist to which the new items will be added * \param psz_filename the name of the playlistfile to import diff --git a/src/playlist/search.c b/src/playlist/search.c index 41d2d26515..6a7f636d1a 100644 --- a/src/playlist/search.c +++ b/src/playlist/search.c @@ -68,14 +68,15 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist , input_item_t *p_item ) { int i; - if( p_playlist->status.p_item && p_playlist->status.p_item->p_input == p_item ) + if( p_playlist->status.p_item && + p_playlist->status.p_item->p_input == p_item ) { return p_playlist->status.p_item; } for( i = 0 ; i < p_playlist->i_all_size; i++ ) { - if( p_playlist->pp_all_items[i]->p_input == p_item ) + if( p_playlist->pp_all_items[i]->p_input->i_id == p_item->i_id ) { return p_playlist->pp_all_items[i]; } -- 2.39.2