]> git.sesse.net Git - vlc/blobdiff - src/playlist/playlist.c
Merge [11470],[11471],[11474] and [11475] - Closes: #205
[vlc] / src / playlist / playlist.c
index b6c98d25f157652b08f67e3b2e6a4ea0543dda70..10bdae5cbc46923568069c8efaf7ac9f38840c79 100644 (file)
@@ -288,6 +288,8 @@ int playlist_Control( playlist_t * p_playlist, int i_query, ... )
 int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args )
 {
     playlist_view_t *p_view;
+    playlist_item_t *p_item, *p_node;
+    int i_view;
     vlc_value_t val;
 
 #ifdef PLAYLIST_PROFILE
@@ -307,11 +309,13 @@ int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args )
         break;
 
     case PLAYLIST_ITEMPLAY:
+        p_item = (playlist_item_t *)va_arg( args, playlist_item_t * );
+        if ( p_item == NULL || p_item->input.psz_uri == NULL )
+            return VLC_EGENERIC;
         p_playlist->status.i_status = PLAYLIST_RUNNING;
         p_playlist->request.i_skip = 0;
         p_playlist->request.b_request = VLC_TRUE;
-        p_playlist->request.p_item = (playlist_item_t *)va_arg( args,
-                                                   playlist_item_t *);
+        p_playlist->request.p_item = p_item;
         p_playlist->request.i_view = p_playlist->status.i_view;
         p_view = playlist_ViewFind( p_playlist, p_playlist->status.i_view );
         if( p_view )
@@ -325,14 +329,22 @@ int playlist_vaControl( playlist_t * p_playlist, int i_query, va_list args )
         break;
 
     case PLAYLIST_VIEWPLAY:
+        i_view = (int)va_arg( args,int );
+        p_node = (playlist_item_t *)va_arg( args, playlist_item_t * );
+        p_item = (playlist_item_t *)va_arg( args, playlist_item_t * );
+        if ( p_node == NULL || (p_item != NULL && p_item->input.psz_uri
+                                                         == NULL ))
+        {
+            p_playlist->status.i_status = PLAYLIST_STOPPED;
+            p_playlist->request.b_request = VLC_TRUE;
+            return VLC_SUCCESS;
+        }
         p_playlist->status.i_status = PLAYLIST_RUNNING;
         p_playlist->request.i_skip = 0;
         p_playlist->request.b_request = VLC_TRUE;
-        p_playlist->request.i_view = (int)va_arg( args,int );
-        p_playlist->request.p_node = (playlist_item_t *)va_arg( args,
-                                                        playlist_item_t *);
-        p_playlist->request.p_item = (playlist_item_t *)va_arg( args,
-                                                        playlist_item_t *);
+        p_playlist->request.i_view = i_view;
+        p_playlist->request.p_node = p_node;
+        p_playlist->request.p_item = p_item;
 
         /* If we select a node, play only it.
          * If we select an item, continue */
@@ -761,7 +773,7 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
     int i_skip,i_goto,i, i_new, i_count ;
     playlist_view_t *p_view;
 
-    vlc_bool_t b_loop = var_GetBool( p_playlist, "loop");
+    vlc_bool_t b_loop = var_GetBool( p_playlist, "loop" );
     vlc_bool_t b_random = var_GetBool( p_playlist, "random" );
     vlc_bool_t b_repeat = var_GetBool( p_playlist, "repeat" );
     vlc_bool_t b_playstop = var_GetBool( p_playlist, "play-and-stop" );
@@ -771,7 +783,6 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
     int64_t start = mdate();
 #endif
 
-
     /* Handle quickly a few special cases */
 
     /* No items to play */
@@ -830,7 +841,7 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
             {
                 p_playlist->pp_items[--i_count]->i_nb_played = 0;
             }
-           if( !b_loop )
+            if( !b_loop )
             {
                 return NULL;
             }
@@ -838,7 +849,7 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
         p_playlist->request.i_skip = 0;
         p_playlist->request.b_request = VLC_FALSE;
         return p_playlist->pp_items[i_new];
-   }
+    }
 
     /* Start the real work */
     if( p_playlist->request.b_request )
@@ -856,7 +867,7 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
             i_skip = p_playlist->request.i_skip;
             i_goto = p_playlist->request.i_goto;
 
-            if( p_playlist->i_index == -1 ) p_playlist->i_index = 0;
+            if( p_playlist->i_index < 0 ) p_playlist->i_index = 0;
             p_new = p_playlist->pp_items[p_playlist->i_index];
 
             if( i_goto >= 0  && i_goto < p_playlist->i_size )
@@ -911,6 +922,9 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
                     {
                         if( b_loop )
                         {
+#ifdef PLAYLIST_DEBUG
+                            msg_Dbg( p_playlist, "looping" );
+#endif
                             p_new = playlist_FindNextFromParent( p_playlist,
                                       p_playlist->request.i_view,
                                       p_view->p_root,
@@ -949,6 +963,9 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
 
         if( p_playlist->status.i_view == -1 )
         {
+#ifdef PLAYLIST_DEBUG
+        msg_Dbg( p_playlist,"no request - old mode" );
+#endif
             if( p_playlist->i_index + 1 < p_playlist->i_size )
             {
                 p_playlist->i_index++;
@@ -972,6 +989,9 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
         /* We are playing with a view */
         else
         {
+#ifdef PLAYLIST_DEBUG
+            msg_Dbg( p_playlist,"no request - from a view" );
+#endif
             playlist_view_t *p_view =
                     playlist_ViewFind( p_playlist,
                                    p_playlist->status.i_view );
@@ -988,6 +1008,9 @@ static playlist_item_t * NextItem( playlist_t *p_playlist )
                             p_playlist->status.p_item );
                 if( p_new == NULL && b_loop )
                 {
+#ifdef PLAYLIST_DEBUG
+                    msg_Dbg( p_playlist, "looping" );
+#endif
                     p_new = playlist_FindNextFromParent( p_playlist,
                                    p_playlist->status.i_view,
                                    p_view->p_root,