#include "vlc_playlist.h"
#include "vlc_interaction.h"
-#undef PLAYLIST_DEBUG
-
/*****************************************************************************
* Local prototypes
*****************************************************************************/
p_playlist->i_last_input_id = 0;
p_playlist->p_input = NULL;
+ p_playlist->i_vout_destroyed_date = 0;
+ p_playlist->i_sout_destroyed_date = 0;
+
p_playlist->i_size = 0;
p_playlist->pp_items = NULL;
p_playlist->i_all_size = 0;
/* Create playlist and media library */
p_playlist->p_local_category = playlist_NodeCreate( p_playlist,
_( "Playlist" ),p_playlist->p_root_category );
- p_playlist->p_ml_category = playlist_NodeCreate( p_playlist,
- _( "Media Library" ), p_playlist->p_root_category );
p_playlist->p_local_onelevel = playlist_NodeCreate( p_playlist,
_( "Playlist" ), p_playlist->p_root_onelevel );
- p_playlist->p_ml_onelevel = playlist_NodeCreate( p_playlist,
- _( "Media Library" ), p_playlist->p_root_onelevel );
+ p_playlist->p_local_category->i_flags |= PLAYLIST_RO_FLAG;
+ p_playlist->p_local_onelevel->i_flags |= PLAYLIST_RO_FLAG;
- /* This is a hack to find it later. Quite ugly, but I haven't found a
- * better way */
+ /* Link the nodes together. Todo: actually create them from the same input*/
p_playlist->p_local_onelevel->p_input->i_id =
p_playlist->p_local_category->p_input->i_id;
- p_playlist->p_ml_onelevel->p_input->i_id =
- p_playlist->p_ml_category->p_input->i_id;
+
+ if( config_GetInt( p_playlist, "media-library") )
+ {
+ p_playlist->p_ml_category = playlist_NodeCreate( p_playlist,
+ _( "Media Library" ), p_playlist->p_root_category );
+ p_playlist->p_ml_onelevel = playlist_NodeCreate( p_playlist,
+ _( "Media Library" ), p_playlist->p_root_onelevel );
+ p_playlist->p_ml_category->i_flags |= PLAYLIST_RO_FLAG;
+ p_playlist->p_ml_onelevel->i_flags |= PLAYLIST_RO_FLAG;
+ p_playlist->p_ml_onelevel->p_input->i_id =
+ p_playlist->p_ml_category->p_input->i_id;
+ }
+ else
+ {
+ p_playlist->p_ml_category = p_playlist->p_ml_onelevel = NULL;
+ }
/* Initial status */
p_playlist->status.p_item = NULL;
var_Destroy( p_playlist, "loop" );
var_Destroy( p_playlist, "activity" );
- playlist_LockClear( p_playlist );
+ PL_LOCK;
+ playlist_NodeDelete( p_playlist, p_playlist->p_root_category, VLC_TRUE,
+ VLC_TRUE );
+ playlist_NodeDelete( p_playlist, p_playlist->p_root_onelevel, VLC_TRUE,
+ VLC_TRUE );
+ PL_UNLOCK;
if( p_playlist->p_stats )
free( p_playlist->p_stats );
{
playlist_item_t *p_item = NULL;
- mtime_t i_vout_destroyed_date = 0;
- mtime_t i_sout_destroyed_date = 0;
PL_LOCK
/* FIXME : this can be called several times */
if( p_playlist->request.b_request )
{
-#ifdef PLAYLIST_DEBUG
- msg_Dbg(p_playlist, "incoming request - stopping current input" );
-#endif
/* Stop the existing input */
- if( p_playlist->p_input )
+ if( p_playlist->p_input && !p_playlist->p_input->b_die )
{
+ PL_DEBUG( "incoming request - stopping current input" );
input_StopThread( p_playlist->p_input );
}
}
{
int i_activity;
input_thread_t *p_input;
+ PL_DEBUG( "dead input" );
p_input = p_playlist->p_input;
p_playlist->p_input = NULL;
/* Destroy object */
vlc_object_destroy( p_input );
- i_vout_destroyed_date = 0;
- i_sout_destroyed_date = 0;
+ p_playlist->i_vout_destroyed_date = 0;
+ p_playlist->i_sout_destroyed_date = 0;
if( p_playlist->status.p_item->i_flags
& PLAYLIST_REMOVE_FLAG )
{
+ PL_DEBUG( "%s was marked for deletion, deleting",
+ PLI_NAME( p_playlist->status.p_item ) );
playlist_ItemDelete( p_playlist->status.p_item );
+ if( p_playlist->request.p_item == p_playlist->status.p_item )
+ p_playlist->request.p_item = NULL;
p_playlist->status.p_item = NULL;
}
/* This input is dying, let it do */
else if( p_playlist->p_input->b_die )
{
- ;
+ PL_DEBUG( "dying input" );
}
/* This input has finished, ask it to die ! */
else if( p_playlist->p_input->b_error
|| p_playlist->p_input->b_eof )
{
+ PL_DEBUG( "finished input" );
input_StopThread( p_playlist->p_input );
/* Select the next playlist item */
PL_UNLOCK
}
else if( p_playlist->p_input->i_state != INIT_S )
{
- PL_UNLOCK
- i_vout_destroyed_date =
+ PL_UNLOCK;
+ p_playlist->i_vout_destroyed_date =
ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT,
- i_vout_destroyed_date );
- i_sout_destroyed_date =
+ p_playlist->i_vout_destroyed_date );
+ p_playlist->i_sout_destroyed_date =
ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT,
- i_sout_destroyed_date );
+ p_playlist->i_sout_destroyed_date );
PL_LOCK
}
}
( p_playlist->request.b_request &&
p_playlist->request.i_status != PLAYLIST_STOPPED ) )
{
- msg_Dbg( p_playlist, "Starting new item" );
+ msg_Dbg( p_playlist, "starting new item" );
stats_TimerStart( p_playlist, "Playlist walk",
STATS_TIMER_PLAYLIST_WALK );
p_item = playlist_NextItem( p_playlist );
}
else
{
- if( p_item && p_playlist->status.p_item &&
+ if( p_playlist->status.p_item &&
p_playlist->status.p_item->i_flags & PLAYLIST_REMOVE_FLAG )
{
- playlist_ItemDelete( p_item );
+ PL_DEBUG( "deleting item marked for deletion" );
+ playlist_ItemDelete( p_playlist->status.p_item );
p_playlist->status.p_item = NULL;
}
/* Collect garbage */
PL_UNLOCK
- i_sout_destroyed_date =
+ p_playlist->i_sout_destroyed_date =
ObjectGarbageCollector( p_playlist, VLC_OBJECT_SOUT, mdate() );
- i_vout_destroyed_date =
+ p_playlist->i_vout_destroyed_date =
ObjectGarbageCollector( p_playlist, VLC_OBJECT_VOUT, mdate() );
PL_LOCK
}