#define TITLE_ALL N_( "All items, unsorted" )
#define PLAYLIST_PROFILE 1
+#undef PLAYLIST_DEBUG
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static void RunThread ( playlist_t * );
static playlist_item_t * NextItem ( playlist_t * );
-static void PlayItem ( playlist_t *, playlist_item_t * );
+static int PlayItem ( playlist_t *, playlist_item_t * );
static int ItemChange( vlc_object_t *, const char *,
vlc_value_t, vlc_value_t, void * );
val.b_bool = VLC_TRUE;
var_Set( p_playlist, "intf-show", val );
+
/* Variables to control playback */
var_CreateGetBool( p_playlist, "play-and-stop" );
var_CreateGetBool( p_playlist, "random" );
p_playlist->i_sort = SORT_ID;
p_playlist->i_order = ORDER_NORMAL;
-
/* Finally, launch the thread ! */
if( vlc_thread_create( p_playlist, "playlist", RunThread,
VLC_THREAD_PRIORITY_LOW, VLC_TRUE ) )
*
* Delete all items in the playlist and free the playlist structure.
* \param p_playlist the playlist structure to destroy
+ * \return VLC_SUCCESS or an error
*/
-void playlist_Destroy( playlist_t * p_playlist )
+int playlist_Destroy( playlist_t * p_playlist )
{
int i;
p_playlist->b_die = 1;
+ for( i = 0 ; i< p_playlist->i_sds ; i++ )
+ {
+ playlist_ServicesDiscoveryRemove( p_playlist,
+ p_playlist->pp_sds[i]->psz_module );
+ }
+
vlc_thread_join( p_playlist );
var_Destroy( p_playlist, "intf-change" );
}
vlc_object_destroy( p_playlist );
+
+ return VLC_SUCCESS;
}
int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args )
{
- vlc_mutex_lock( &p_playlist->object_lock );
-
playlist_view_t *p_view;
vlc_value_t val;
+ vlc_mutex_lock( &p_playlist->object_lock );
+
#ifdef PLAYLIST_PROFILE
p_playlist->request_date = mdate();
#endif
playlist_item_t *);
p_playlist->request.i_view = p_playlist->status.i_view;
p_view = playlist_ViewFind( p_playlist, p_playlist->status.i_view );
- p_playlist->request.p_node = p_view->p_root;
+ if( p_view )
+ {
+ p_playlist->request.p_node = p_view->p_root;
+ }
+ else
+ {
+ p_playlist->request.p_node = NULL;
+ }
break;
case PLAYLIST_VIEWPLAY:
p_playlist->request.i_goto = -1;
break;
+ case PLAYLIST_AUTOPLAY:
+ p_playlist->status.i_status = PLAYLIST_RUNNING;
+
+ p_playlist->request.b_request = VLC_FALSE;
+ break;
+
case PLAYLIST_PAUSE:
val.i_int = 0;
if( p_playlist->p_input )
}
vlc_mutex_unlock( &p_playlist->object_lock );
+ fprintf(stderr,"control done, request is %i\n", p_playlist->request.b_request);
return VLC_SUCCESS;
}
mtime_t i_vout_destroyed_date = 0;
mtime_t i_sout_destroyed_date = 0;
- playlist_item_t *p_autodelete_item = 0;
+ playlist_item_t *p_autodelete_item = NULL;
/* Tell above that we're ready */
vlc_thread_ready( p_playlist );
i_vout_destroyed_date = 0;
i_sout_destroyed_date = 0;
- /* Check for autodeletion */
- if( p_autodelete_item )
- {
- playlist_ItemDelete( p_autodelete_item );
- p_autodelete_item = 0;
- }
-
continue;
}
/* This input is dying, let him do */
{
/* TODO FIXME XXX TODO FIXME XXX */
/* Check for autodeletion */
- input_StopThread( p_playlist->p_input );
if( p_playlist->status.p_item->i_flags & PLAYLIST_DEL_FLAG )
{
- /* This ain't pretty but hey it works */
p_autodelete_item = p_playlist->status.p_item;
- p_playlist->status.p_item =
- playlist_ItemNew( p_playlist,
- p_autodelete_item->input.psz_uri, 0);
-
- vlc_mutex_unlock( &p_playlist->object_lock );
-
- playlist_Delete( p_playlist,
- p_playlist->status.p_item->input.i_id );
- p_playlist->request.i_skip = 1;
- p_playlist->status.i_status = PLAYLIST_RUNNING;
-
- vlc_mutex_lock( &p_playlist->object_lock );
- }
- else
- {
- /* Select the next playlist item */
- input_StopThread( p_playlist->p_input );
- vlc_mutex_unlock( &p_playlist->object_lock );
- continue;
}
+ input_StopThread( p_playlist->p_input );
+ /* Select the next playlist item */
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ continue;
}
else if( p_playlist->p_input->i_state != INIT_S )
{
* Get the next item to play */
p_item = NextItem( p_playlist );
+
/* We must stop */
if( p_item == NULL )
{
+ if( p_autodelete_item )
+ {
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ playlist_Delete( p_playlist,
+ p_autodelete_item->input.i_id );
+ vlc_mutex_lock( &p_playlist->object_lock );
+ p_autodelete_item = NULL;
+ }
p_playlist->status.i_status = PLAYLIST_STOPPED;
vlc_mutex_unlock( &p_playlist->object_lock );
continue;
}
PlayItem( p_playlist, p_item );
+
+ if( p_autodelete_item )
+ {
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ playlist_Delete( p_playlist, p_autodelete_item->input.i_id );
+ vlc_mutex_lock( &p_playlist->object_lock );
+ p_autodelete_item = NULL;
+ }
}
else if( p_playlist->status.i_status == PLAYLIST_STOPPED )
{
return NULL;
}
+ if( !p_playlist->request.b_request &&
+ !(p_playlist->status.p_item->i_flags & PLAYLIST_SKIP_FLAG) )
+ {
+ msg_Dbg( p_playlist, "no-skip mode, stopping") ;
+ return NULL;
+ }
+
/* TODO: improve this (only use current node) */
/* TODO: use the "shuffled view" internally ? */
/* Random case. This is an exception: if request, but request is skip +- 1
/* We are not playing from a view */
if( p_playlist->request.i_view == -1 )
{
+#ifdef PLAYLIST_DEBUG
+ msg_Dbg( p_playlist, "non-view mode request");
+#endif
/* Directly select the item, just like now */
i_skip = p_playlist->request.i_skip;
i_goto = p_playlist->request.i_goto;
}
else
{
+#ifdef PLAYLIST_DEBUG
+ msg_Dbg( p_playlist, "view mode request" );
+#endif
p_new = p_playlist->request.p_item;
i_skip = p_playlist->request.i_skip;
{
p_playlist->i_index++;
p_new = p_playlist->pp_items[p_playlist->i_index];
+ if( !(p_new->i_flags & PLAYLIST_SKIP_FLAG) )
+ {
+ return NULL;
+ }
}
else
{
}
#ifdef PLAYLIST_PROFILE
- msg_Dbg(p_playlist,"next item found in "I64Fi " us\n",mdate()-start );
+ msg_Dbg(p_playlist,"next item found in "I64Fi " us", mdate()-start );
#endif
if( p_new == NULL ) { msg_Info( p_playlist, "Nothing to play" ); }
/*****************************************************************************
* PlayItem: start the input thread for an item
****************************************************************************/
-static void PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
+static int PlayItem( playlist_t *p_playlist, playlist_item_t *p_item )
{
vlc_value_t val;
- int i;
msg_Dbg( p_playlist, "creating new input thread" );
p_item->i_nb_played++;
p_playlist->status.p_item = p_item;
+ p_playlist->i_index = playlist_GetPositionById( p_playlist,
+ p_item->input.i_id );
+
#ifdef PLAYLIST_PROFILE
if( p_playlist->request_date != 0 )
{
var_Set( p_playlist, "playlist-current", val);
vlc_mutex_lock( &p_playlist->object_lock);
+ return VLC_SUCCESS;
+
}
/* Forward item change from input */
vlc_value_t oldval, vlc_value_t newval, void *param )
{
playlist_t *p_playlist = (playlist_t *)param;
+ int i_index;
//p_playlist->b_need_update = VLC_TRUE;
var_SetInteger( p_playlist, "item-change", newval.i_int );