X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fplaylist%2Fplaylist.c;h=1e5d2f2c38ee163a8b44f800230591e27368a156;hb=3aafe2626fd415b36479de2a246e7b002991772a;hp=a160e721086ed2cd8d27b9318c33650cc7da4c9b;hpb=f388eb55e12254f8b040b4af8cfc5d3bbd4ba7ad;p=vlc diff --git a/src/playlist/playlist.c b/src/playlist/playlist.c index a160e72108..1e5d2f2c38 100644 --- a/src/playlist/playlist.c +++ b/src/playlist/playlist.c @@ -1,8 +1,8 @@ /***************************************************************************** * playlist.c : Playlist management functions ***************************************************************************** - * Copyright (C) 1999-2001 VideoLAN - * $Id: playlist.c,v 1.46 2003/08/23 12:59:31 hartman Exp $ + * Copyright (C) 1999-2004 VideoLAN + * $Id: playlist.c,v 1.82 2004/02/23 21:57:56 gbazin Exp $ * * Authors: Samuel Hocevar * @@ -25,6 +25,9 @@ #include /* strerror() */ #include +#include +#include +#include #include "stream_control.h" #include "input_ext-intf.h" @@ -40,8 +43,6 @@ static void RunThread ( playlist_t * ); static void SkipItem ( playlist_t *, int ); static void PlayItem ( playlist_t * ); -static void Poubellize ( playlist_t *, input_thread_t * ); - /** * Create playlist * @@ -66,18 +67,44 @@ playlist_t * __playlist_Create ( vlc_object_t *p_parent ) val.b_bool = VLC_TRUE; var_Set( p_playlist, "intf-change", val ); - var_Create( p_playlist, "intf-popupmenu", VLC_VAR_VOID ); + var_Create( p_playlist, "item-change", VLC_VAR_INTEGER ); + val.i_int = -1; + var_Set( p_playlist, "item-change", val ); + + var_Create( p_playlist, "playlist-current", VLC_VAR_INTEGER ); + val.i_int = -1; + var_Set( p_playlist, "playlist-current", val ); + + var_Create( p_playlist, "intf-popupmenu", VLC_VAR_BOOL ); var_Create( p_playlist, "intf-show", VLC_VAR_BOOL ); val.b_bool = VLC_TRUE; var_Set( p_playlist, "intf-show", val ); + + var_Create( p_playlist, "prevent-skip", VLC_VAR_BOOL ); + val.b_bool = VLC_FALSE; + var_Set( p_playlist, "prevent-skip", val ); + + var_Create( p_playlist, "random", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + var_Create( p_playlist, "repeat", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + var_Create( p_playlist, "loop", VLC_VAR_BOOL | VLC_VAR_DOINHERIT ); + p_playlist->p_input = NULL; p_playlist->i_status = PLAYLIST_STOPPED; p_playlist->i_index = -1; p_playlist->i_size = 0; p_playlist->pp_items = NULL; + p_playlist->i_groups = 0; + p_playlist->pp_groups = NULL; + p_playlist->i_last_group = 0; + p_playlist->i_last_id = 0; + p_playlist->i_sort = SORT_ID; + p_playlist->i_order = ORDER_NORMAL; + + playlist_CreateGroup( p_playlist, _("Normal") ); + if( vlc_thread_create( p_playlist, "playlist", RunThread, VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) ) { @@ -105,332 +132,28 @@ void playlist_Destroy( playlist_t * p_playlist ) vlc_thread_join( p_playlist ); var_Destroy( p_playlist, "intf-change" ); - - vlc_object_destroy( p_playlist ); -} - -/** - * Add an MRL to the playlist. This is a simplified version of - * playlist_AddExt inculded for convenince. It equals calling playlist_AddExt - * with psz_name == psz_target and i_duration == -1 - */ - -int playlist_Add( playlist_t *p_playlist, const char *psz_target, - const char **ppsz_options, int i_options, - int i_mode, int i_pos ) -{ - return playlist_AddExt( p_playlist, psz_target, psz_target, -1, - ppsz_options, i_options, i_mode, i_pos ); -} - -/** - * Add a MRL into the playlist. - * - * \param p_playlist the playlist to add into - * \param psz_uri the mrl to add to the playlist - * \param psz_name a text giving a name or description of this item - * \param i_duration a hint about the duration of this item, in miliseconds, or - * -1 if unknown. - * \param ppsz_options array of options - * \param i_options number of items in ppsz_options - * \param i_mode the mode used when adding - * \param i_pos the position in the playlist where to add. If this is - * PLAYLIST_END the item will be added at the end of the playlist - * regardless of it's size - * \return always returns 0 -*/ -int playlist_AddExt( playlist_t *p_playlist, const char * psz_uri, - const char * psz_name, mtime_t i_duration, - const char **ppsz_options, int i_options, int i_mode, - int i_pos ) -{ - playlist_item_t * p_item; - - p_item = malloc( sizeof( playlist_item_t ) ); - if( p_item == NULL ) - { - msg_Err( p_playlist, "out of memory" ); - } - - p_item->psz_name = strdup( psz_name ); - p_item->psz_uri = strdup( psz_uri ); - p_item->i_duration = i_duration; - p_item->i_type = 0; - p_item->i_status = 0; - p_item->b_autodeletion = VLC_FALSE; - - p_item->ppsz_options = NULL; - p_item->i_options = i_options; - - if( i_options ) - { - int i; - - p_item->ppsz_options = (char **)malloc( i_options * sizeof(char *) ); - for( i = 0; i < i_options; i++ ) - p_item->ppsz_options[i] = strdup( ppsz_options[i] ); - - } - - return playlist_AddItem( p_playlist, p_item, i_mode, i_pos ); -} - -/** - * Add a playlist item into a playlist - * - * \param p_playlist the playlist to insert into - * \param p_item the playlist item to insert - * \param i_mode the mode used when adding - * \param i_pos the possition in the playlist where to add. If this is - * PLAYLIST_END the item will be added at the end of the playlist - * regardless of it's size - * \return always returns 0 -*/ -int playlist_AddItem( playlist_t *p_playlist, playlist_item_t * p_item, - int i_mode, int i_pos) -{ - vlc_value_t val; - - vlc_mutex_lock( &p_playlist->object_lock ); - - /* - * CHECK_INSERT : checks if the item is already enqued before - * enqueing it - */ - if ( i_mode & PLAYLIST_CHECK_INSERT ) - { - int j; - - if ( p_playlist->pp_items ) - { - for ( j = 0; j < p_playlist->i_size; j++ ) - { - if ( !strcmp( p_playlist->pp_items[j]->psz_uri, p_item->psz_uri ) ) - { - if( p_item->psz_name ) - { - free( p_item->psz_name ); - } - if( p_item->psz_uri ) - { - free( p_item->psz_uri ); - } - free( p_item ); - vlc_mutex_unlock( &p_playlist->object_lock ); - return 0; - } - } - } - i_mode &= ~PLAYLIST_CHECK_INSERT; - i_mode |= PLAYLIST_APPEND; - } - - - msg_Dbg( p_playlist, "adding playlist item « %s » ( %s )", p_item->psz_name, p_item->psz_uri); - - /* Create the new playlist item */ - - - /* Do a few boundary checks and allocate space for the item */ - if( i_pos == PLAYLIST_END ) - { - if( i_mode & PLAYLIST_INSERT ) - { - i_mode &= ~PLAYLIST_INSERT; - i_mode |= PLAYLIST_APPEND; - } - - i_pos = p_playlist->i_size - 1; - } - - if( !(i_mode & PLAYLIST_REPLACE) - || i_pos < 0 || i_pos >= p_playlist->i_size ) - { - /* Additional boundary checks */ - if( i_mode & PLAYLIST_APPEND ) - { - i_pos++; - } - - if( i_pos < 0 ) - { - i_pos = 0; - } - else if( i_pos > p_playlist->i_size ) - { - i_pos = p_playlist->i_size; - } - - INSERT_ELEM( p_playlist->pp_items, - p_playlist->i_size, - i_pos, - p_item ); - - if( p_playlist->i_index >= i_pos ) - { - p_playlist->i_index++; - } - } - else - { - /* i_mode == PLAYLIST_REPLACE and 0 <= i_pos < p_playlist->i_size */ - if( p_playlist->pp_items[i_pos]->psz_name ) - { - free( p_playlist->pp_items[i_pos]->psz_name ); - } - if( p_playlist->pp_items[i_pos]->psz_uri ) - { - free( p_playlist->pp_items[i_pos]->psz_uri ); - } - /* XXX: what if the item is still in use? */ - free( p_playlist->pp_items[i_pos] ); - p_playlist->pp_items[i_pos] = p_item; - } - - if( i_mode & PLAYLIST_GO ) + var_Destroy( p_playlist, "item-change" ); + var_Destroy( p_playlist, "playlist-current" ); + var_Destroy( p_playlist, "intf-popmenu" ); + var_Destroy( p_playlist, "intf-show" ); + var_Destroy( p_playlist, "prevent-skip" ); + var_Destroy( p_playlist, "random" ); + var_Destroy( p_playlist, "repeat" ); + var_Destroy( p_playlist, "loop" ); + + while( p_playlist->i_groups > 0 ) { - p_playlist->i_index = i_pos; - if( p_playlist->p_input ) - { - input_StopThread( p_playlist->p_input ); - } - p_playlist->i_status = PLAYLIST_RUNNING; + playlist_DeleteGroup( p_playlist, p_playlist->pp_groups[0]->i_id ); } - vlc_mutex_unlock( &p_playlist->object_lock ); - - val.b_bool = VLC_TRUE; - var_Set( p_playlist, "intf-change", val ); - - return 0; -} - -/** - * delete an item from a playlist. - * - * \param p_playlist the playlist to remove from. - * \param i_pos the position of the item to remove - * \return returns 0 - */ -int playlist_Delete( playlist_t * p_playlist, int i_pos ) -{ - vlc_value_t val; - vlc_mutex_lock( &p_playlist->object_lock ); - - if( i_pos >= 0 && i_pos < p_playlist->i_size ) + while( p_playlist->i_size > 0 ) { - msg_Dbg( p_playlist, "deleting playlist item « %s »", - p_playlist->pp_items[i_pos]->psz_name ); - - if( p_playlist->pp_items[i_pos]->psz_name ) - { - free( p_playlist->pp_items[i_pos]->psz_name ); - } - if( p_playlist->pp_items[i_pos]->psz_uri ) - { - free( p_playlist->pp_items[i_pos]->psz_uri ); - } - if( p_playlist->pp_items[i_pos]->i_options ) - { - int i; - - for( i = 0; i < p_playlist->pp_items[i_pos]->i_options; i++ ) - free( p_playlist->pp_items[i_pos]->ppsz_options[i] ); - - free( p_playlist->pp_items[i_pos]->ppsz_options ); - } - - /* XXX: what if the item is still in use? */ - free( p_playlist->pp_items[i_pos] ); - - if( i_pos <= p_playlist->i_index ) - { - p_playlist->i_index--; - } - - /* Renumber the playlist */ - REMOVE_ELEM( p_playlist->pp_items, - p_playlist->i_size, - i_pos ); + playlist_Delete( p_playlist, 0 ); } - vlc_mutex_unlock( &p_playlist->object_lock ); - - val.b_bool = VLC_TRUE; - var_Set( p_playlist, "intf-change", val ); - - return 0; + vlc_object_destroy( p_playlist ); } -/** - * Move an item in a playlist - * - * 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 0 - */ -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 »", - p_playlist->pp_items[i_pos]->psz_name ); - - 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 0; -} /** * Do a playlist action @@ -439,9 +162,11 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos) * \param i_command the command to do * \param i_arg the argument to the command. See playlist_command_t for details */ - void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command, +void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command, int i_arg ) { + vlc_value_t val; + vlc_mutex_lock( &p_playlist->object_lock ); switch( i_command ) @@ -451,31 +176,55 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos) if( p_playlist->p_input ) { input_StopThread( p_playlist->p_input ); + val.i_int = p_playlist->i_index; + var_Set( p_playlist, "item-change",val ); } break; case PLAYLIST_PLAY: p_playlist->i_status = PLAYLIST_RUNNING; - if( !p_playlist->p_input ) + if( !p_playlist->p_input && p_playlist->i_enabled != 0 ) { PlayItem( p_playlist ); } if( p_playlist->p_input ) { - input_SetStatus( p_playlist->p_input, INPUT_STATUS_PLAY ); + val.i_int = PLAYING_S; + var_Set( p_playlist->p_input, "state", val ); } break; case PLAYLIST_PAUSE: - p_playlist->i_status = PLAYLIST_PAUSED; + val.i_int = 0; if( p_playlist->p_input ) + var_Get( p_playlist->p_input, "state", &val ); + + if( val.i_int == PAUSE_S ) { - input_SetStatus( p_playlist->p_input, INPUT_STATUS_PAUSE ); + p_playlist->i_status = PLAYLIST_RUNNING; + if( p_playlist->p_input ) + { + val.i_int = PLAYING_S; + var_Set( p_playlist->p_input, "state", val ); + } + } + else + { + p_playlist->i_status = PLAYLIST_PAUSED; + if( p_playlist->p_input ) + { + val.i_int = PAUSE_S; + var_Set( p_playlist->p_input, "state", val ); + } } break; case PLAYLIST_SKIP: p_playlist->i_status = PLAYLIST_STOPPED; + if( p_playlist->i_enabled == 0) + { + break; + } SkipItem( p_playlist, i_arg ); if( p_playlist->p_input ) { @@ -485,13 +234,16 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos) break; case PLAYLIST_GOTO: - if( i_arg >= 0 && i_arg < p_playlist->i_size ) + if( i_arg >= 0 && i_arg < p_playlist->i_size && + p_playlist->i_enabled != 0 ) { p_playlist->i_index = i_arg; if( p_playlist->p_input ) { input_StopThread( p_playlist->p_input ); } + val.b_bool = VLC_TRUE; + var_Set( p_playlist, "prevent-skip", val ); p_playlist->i_status = PLAYLIST_RUNNING; } break; @@ -502,16 +254,64 @@ int playlist_Move( playlist_t * p_playlist, int i_pos, int i_newpos) } vlc_mutex_unlock( &p_playlist->object_lock ); - +#if 0 + val.b_bool = VLC_TRUE; + var_Set( p_playlist, "intf-change", val ); +#endif return; } -/* Following functions are local */ + + +static mtime_t ObjectGarbageCollector( playlist_t *p_playlist, int i_type, + mtime_t destroy_date ) +{ + vlc_object_t *p_obj; + + if( destroy_date > mdate() ) return destroy_date; + + if( destroy_date == 0 ) + { + /* give a little time */ + return mdate() + I64C(1000000); + } + else + { + while( ( p_obj = vlc_object_find( p_playlist, i_type, FIND_CHILD ) ) ) + { + if( p_obj->p_parent != (vlc_object_t*)p_playlist ) + { + /* only first child (ie unused) */ + vlc_object_release( p_obj ); + break; + } + if( i_type == VLC_OBJECT_VOUT ) + { + msg_Dbg( p_playlist, "garbage collector destroying 1 vout" ); + vlc_object_detach( p_obj ); + vlc_object_release( p_obj ); + vout_Destroy( (vout_thread_t *)p_obj ); + } + else if( i_type == VLC_OBJECT_SOUT ) + { + vlc_object_release( p_obj ); + sout_DeleteInstance( (sout_instance_t*)p_obj ); + } + } + return 0; + } +} /***************************************************************************** * RunThread: main playlist thread *****************************************************************************/ static void RunThread ( playlist_t *p_playlist ) { + vlc_object_t *p_obj; + vlc_value_t val; + + mtime_t i_vout_destroyed_date = 0; + mtime_t i_sout_destroyed_date = 0; + /* Tell above that we're ready */ vlc_thread_ready( p_playlist ); @@ -527,10 +327,8 @@ static void RunThread ( playlist_t *p_playlist ) { input_thread_t *p_input; - /* Unlink current input */ p_input = p_playlist->p_input; p_playlist->p_input = NULL; - vlc_object_detach( p_input ); /* Release the playlist lock, because we may get stuck * in input_DestroyThread() for some time. */ @@ -538,7 +336,16 @@ static void RunThread ( playlist_t *p_playlist ) /* Destroy input */ input_DestroyThread( p_input ); + + /* Unlink current input + * (_after_ input_DestroyThread for vout garbage collector) */ + vlc_object_detach( p_input ); + + /* Destroy object */ vlc_object_destroy( p_input ); + + i_vout_destroyed_date = 0; + i_sout_destroyed_date = 0; continue; } /* This input is dying, let him do */ @@ -555,25 +362,50 @@ static void RunThread ( playlist_t *p_playlist ) { vlc_mutex_unlock( &p_playlist->object_lock ); playlist_Delete( p_playlist, p_playlist->i_index ); - vlc_mutex_lock( &p_playlist->object_lock ); + p_playlist->i_index++; + p_playlist->i_status = PLAYLIST_RUNNING; + } + else + { + /* Select the next playlist item */ + SkipItem( p_playlist, 1 ); + input_StopThread( p_playlist->p_input ); + vlc_mutex_unlock( &p_playlist->object_lock ); } - - /* Select the next playlist item */ - SkipItem( p_playlist, 1 ); - - /* Release the playlist lock, because we may get stuck - * in input_StopThread() for some time. */ - vlc_mutex_unlock( &p_playlist->object_lock ); - input_StopThread( p_playlist->p_input ); continue; } + else if( p_playlist->p_input->stream.control.i_status != INIT_S ) + { + vlc_mutex_unlock( &p_playlist->object_lock ); + i_vout_destroyed_date = + ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, + i_vout_destroyed_date ); + i_sout_destroyed_date = + ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, + i_sout_destroyed_date ); + vlc_mutex_lock( &p_playlist->object_lock ); + } } else if( p_playlist->i_status != PLAYLIST_STOPPED ) { - SkipItem( p_playlist, 0 ); + var_Get( p_playlist, "prevent-skip", &val); + if( val.b_bool == VLC_FALSE) + { + SkipItem( p_playlist, 0 ); + } + val.b_bool = VLC_TRUE; + var_Set( p_playlist, "prevent-skip", val); PlayItem( p_playlist ); } - + else if( p_playlist->i_status == PLAYLIST_STOPPED ) + { + vlc_mutex_unlock( &p_playlist->object_lock ); + i_sout_destroyed_date = + ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, mdate() ); + i_vout_destroyed_date = + ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, mdate() ); + vlc_mutex_lock( &p_playlist->object_lock ); + } vlc_mutex_unlock( &p_playlist->object_lock ); msleep( INTF_IDLE_SLEEP ); @@ -597,11 +429,15 @@ static void RunThread ( playlist_t *p_playlist ) /* Unlink current input */ p_input = p_playlist->p_input; p_playlist->p_input = NULL; - vlc_object_detach( p_input ); vlc_mutex_unlock( &p_playlist->object_lock ); /* Destroy input */ input_DestroyThread( p_input ); + /* Unlink current input (_after_ input_DestroyThread for vout + * garbage collector)*/ + vlc_object_detach( p_input ); + + /* Destroy object */ vlc_object_destroy( p_input ); continue; } @@ -612,8 +448,8 @@ static void RunThread ( playlist_t *p_playlist ) } else if( p_playlist->p_input->b_error || p_playlist->p_input->b_eof ) { - vlc_mutex_unlock( &p_playlist->object_lock ); input_StopThread( p_playlist->p_input ); + vlc_mutex_unlock( &p_playlist->object_lock ); continue; } else @@ -625,6 +461,23 @@ static void RunThread ( playlist_t *p_playlist ) msleep( INTF_IDLE_SLEEP ); } + + /* close all remaining sout */ + while( ( p_obj = vlc_object_find( p_playlist, + VLC_OBJECT_SOUT, FIND_CHILD ) ) ) + { + vlc_object_release( p_obj ); + sout_DeleteInstance( (sout_instance_t*)p_obj ); + } + + /* close all remaining vout */ + while( ( p_obj = vlc_object_find( p_playlist, + VLC_OBJECT_VOUT, FIND_CHILD ) ) ) + { + vlc_object_detach( p_obj ); + vlc_object_release( p_obj ); + vout_Destroy( (vout_thread_t *)p_obj ); + } } /***************************************************************************** @@ -636,7 +489,7 @@ static void RunThread ( playlist_t *p_playlist ) static void SkipItem( playlist_t *p_playlist, int i_arg ) { int i_oldindex = p_playlist->i_index; - vlc_bool_t b_random; + vlc_bool_t b_random, b_repeat, b_loop; vlc_value_t val; /* If the playlist is empty, there is no current item */ @@ -646,7 +499,12 @@ static void SkipItem( playlist_t *p_playlist, int i_arg ) return; } - b_random = config_GetInt( p_playlist, "random" ); + var_Get( p_playlist, "random", &val ); + b_random = val.b_bool; + var_Get( p_playlist, "repeat", &val ); + b_repeat = val.b_bool; + var_Get( p_playlist, "loop", &val ); + b_loop = val.b_bool; /* Increment */ if( b_random ) @@ -661,15 +519,16 @@ static void SkipItem( playlist_t *p_playlist, int i_arg ) i_arg = (int)((float)p_playlist->i_size * rand() / (RAND_MAX+1.0)); } } - + if( b_repeat ) + { + i_arg = 0; + } p_playlist->i_index += i_arg; /* Boundary check */ if( p_playlist->i_index >= p_playlist->i_size ) { - if( p_playlist->i_status == PLAYLIST_STOPPED - || b_random - || config_GetInt( p_playlist, "loop" ) ) + if( p_playlist->i_status == PLAYLIST_STOPPED || b_random || b_loop ) { p_playlist->i_index -= p_playlist->i_size * ( p_playlist->i_index / p_playlist->i_size ); @@ -686,8 +545,12 @@ static void SkipItem( playlist_t *p_playlist, int i_arg ) p_playlist->i_index = p_playlist->i_size - 1; } - val.b_bool = VLC_TRUE; - var_Set( p_playlist, "intf-change", val ); + /* Check that the item is enabled */ + if( p_playlist->pp_items[p_playlist->i_index]->b_enabled == VLC_FALSE && + p_playlist->i_enabled != 0) + { + SkipItem( p_playlist , 1 ); + } } /***************************************************************************** @@ -698,148 +561,31 @@ static void SkipItem( playlist_t *p_playlist, int i_arg ) *****************************************************************************/ static void PlayItem( playlist_t *p_playlist ) { + playlist_item_t *p_item; + int i, j; + vlc_value_t val; if( p_playlist->i_index == -1 ) { - if( p_playlist->i_size == 0 ) + if( p_playlist->i_size == 0 || p_playlist->i_enabled == 0) { return; } - SkipItem( p_playlist, 1 ); } - - msg_Dbg( p_playlist, "creating new input thread" ); - p_playlist->p_input = input_CreateThread( p_playlist, - p_playlist->pp_items[p_playlist->i_index] ); -} - -/***************************************************************************** - * Poubellize: put an input thread in the trashcan - ***************************************************************************** - * XXX: unused - *****************************************************************************/ -static void Poubellize ( playlist_t *p_playlist, input_thread_t *p_input ) -{ - msg_Dbg( p_playlist, "poubellizing input %i\n", p_input->i_object_id ); -} - -/***************************************************************************** - * playlist_LoadFile: load a playlist file. - ****************************************************************************/ -int playlist_LoadFile( playlist_t * p_playlist, const char *psz_filename ) -{ - FILE *file; - char line[1024]; - int i_current_status; - int i; - - msg_Dbg( p_playlist, "opening playlist file %s", psz_filename ); - - file = fopen( psz_filename, "rt" ); - if( !file ) + if( p_playlist->i_enabled == 0) { - msg_Err( p_playlist, "playlist file %s does not exist", psz_filename ); - return -1; - } - fseek( file, 0L, SEEK_SET ); - - /* check the file is not empty */ - if ( ! fgets( line, 1024, file ) ) - { - msg_Err( p_playlist, "playlist file %s is empty", psz_filename ); - fclose( file ); - return -1; - } - - /* get rid of line feed */ - if( line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r' ) - { - line[strlen(line)-1] = (char)0; - if( line[strlen(line)-1] == '\r' ) line[strlen(line)-1] = (char)0; - } - /* check the file format is valid */ - if ( strcmp ( line , PLAYLIST_FILE_HEADER_0_5 ) ) - { - msg_Err( p_playlist, "playlist file %s format is unsupported" - , psz_filename ); - fclose( file ); - return -1; - } - - /* stop playing */ - i_current_status = p_playlist->i_status; - if ( p_playlist->i_status != PLAYLIST_STOPPED ) - { - playlist_Stop ( p_playlist ); - } - - /* delete current content of the playlist */ - for( i = p_playlist->i_size - 1; i >= 0; i-- ) - { - playlist_Delete ( p_playlist , i ); - } - - /* simply add each line */ - while( fgets( line, 1024, file ) ) - { - /* ignore comments or empty lines */ - if( (line[0] == '#') || (line[0] == '\r') || (line[0] == '\n') - || (line[0] == (char)0) ) - continue; - - /* get rid of line feed */ - if( line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r' ) - { - line[strlen(line)-1] = (char)0; - if( line[strlen(line)-1] == '\r' ) line[strlen(line)-1] = (char)0; - } - - playlist_Add ( p_playlist , (char *)&line , - 0, 0, PLAYLIST_APPEND , PLAYLIST_END ); - } - - /* start playing */ - if ( i_current_status != PLAYLIST_STOPPED ) - { - playlist_Play ( p_playlist ); - } - - fclose( file ); - - return 0; -} - -/***************************************************************************** - * playlist_SaveFile: Save a playlist in a file. - *****************************************************************************/ -int playlist_SaveFile( playlist_t * p_playlist, const char * psz_filename ) -{ - FILE *file; - int i; - - vlc_mutex_lock( &p_playlist->object_lock ); - - msg_Dbg( p_playlist, "saving playlist file %s", psz_filename ); - - file = fopen( psz_filename, "wt" ); - if( !file ) - { - msg_Err( p_playlist , "could not create playlist file %s" - , psz_filename ); - return -1; + return; } - fprintf( file , PLAYLIST_FILE_HEADER_0_5 "\n" ); - - for ( i = 0 ; i < p_playlist->i_size ; i++ ) - { - fprintf( file , p_playlist->pp_items[i]->psz_uri ); - fprintf( file , "\n" ); - } + msg_Dbg( p_playlist, "creating new input thread" ); + p_item = p_playlist->pp_items[p_playlist->i_index]; - fclose( file ); + p_item->i_nb_played++; - vlc_mutex_unlock( &p_playlist->object_lock ); + p_playlist->p_input = input_CreateThread( p_playlist, p_item->psz_uri, + p_item->ppsz_options, + p_item->i_options ); - return 0; + val.i_int = p_playlist->i_index; + var_Set( p_playlist, "playlist-current", val); }