]> git.sesse.net Git - vlc/commitdiff
Clean up a bit unused playlist functions and added lock asserts.
authorLaurent Aimar <fenrir@videolan.org>
Mon, 22 Dec 2008 09:21:28 +0000 (10:21 +0100)
committerLaurent Aimar <fenrir@videolan.org>
Mon, 5 Jan 2009 19:49:05 +0000 (20:49 +0100)
Some interfaces may assert because of missing playlist lock.

include/vlc_playlist.h
modules/gui/qt4/dialogs/interaction.cpp
src/libvlccore.sym
src/playlist/control.c
src/playlist/engine.c
src/playlist/loadsave.c
src/playlist/playlist_internal.h
src/playlist/search.c

index 49372b288904b4aae1976cc4705254615bca5243..11cf3e6d0a8a9469a91b640c8b22d6a85712a3fb 100644 (file)
@@ -181,22 +181,27 @@ struct playlist_add_t
     int i_position;
 };
 
-#define SORT_ID 0
-#define SORT_TITLE 1
-#define SORT_TITLE_NODES_FIRST 2
-#define SORT_ARTIST 3
-#define SORT_GENRE 4
-#define SORT_RANDOM 5
-#define SORT_DURATION 6
-#define SORT_TITLE_NUMERIC 7
-#define SORT_ALBUM 8
-#define SORT_TRACK_NUMBER 9
-#define SORT_DESCRIPTION 10
-#define SORT_RATING 11
-#define SORT_URI 12
-
-#define ORDER_NORMAL 0
-#define ORDER_REVERSE 1
+enum
+{
+    SORT_ID = 0,
+    SORT_TITLE = 1,
+    SORT_TITLE_NODES_FIRST = 2,
+    SORT_ARTIST = 3,
+    SORT_GENRE = 4,
+    SORT_RANDOM = 5,
+    SORT_DURATION = 6,
+    SORT_TITLE_NUMERIC = 7,
+    SORT_ALBUM = 8,
+    SORT_TRACK_NUMBER = 9,
+    SORT_DESCRIPTION = 10,
+    SORT_RATING = 11,
+    SORT_URI = 12,
+};
+enum
+{
+    ORDER_NORMAL = 0,
+    ORDER_REVERSE = 1,
+};
 
 /* Used by playlist_Import */
 #define PLAYLIST_INSERT          0x0001
@@ -221,6 +226,7 @@ enum pl_locked_state
 /* Helpers */
 #define PL_LOCK vlc_object_lock( p_playlist )
 #define PL_UNLOCK vlc_object_unlock( p_playlist )
+#define PL_ASSERT_LOCKED vlc_object_assert_locked( p_playlist )
 
 VLC_EXPORT( playlist_t *, __pl_Hold, ( vlc_object_t * ) );
 #define pl_Hold( a ) __pl_Hold( VLC_OBJECT(a) )
@@ -234,7 +240,7 @@ VLC_EXPORT( void, __pl_Release, ( vlc_object_t * ) );
 #define playlist_Stop(p) playlist_Control(p,PLAYLIST_STOP, pl_Unlocked )
 #define playlist_Next(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, 1)
 #define playlist_Prev(p) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked, -1)
-#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked,  i)
+#define playlist_Skip(p,i) playlist_Control(p,PLAYLIST_SKIP, pl_Unlocked,  (i) )
 
 /**
  * Do a playlist action.
@@ -260,8 +266,6 @@ VLC_EXPORT( void,  playlist_Clear, ( playlist_t *, bool ) );
 /** Enqueue an input item for preparsing */
 VLC_EXPORT( int, playlist_PreparseEnqueue, (playlist_t *, input_item_t *) );
 
-/** Enqueue a playlist item and all of its children if any for preparsing */
-VLC_EXPORT( int, playlist_PreparseEnqueueItem, (playlist_t *, playlist_item_t *) );
 /** Request the art for an input item to be fetched */
 VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) );
 
@@ -269,8 +273,8 @@ VLC_EXPORT( int, playlist_AskForArtEnqueue, (playlist_t *, input_item_t *) );
 VLC_EXPORT( int,  playlist_TreeMove, ( playlist_t *, playlist_item_t *, playlist_item_t *, int ) );
 VLC_EXPORT( int,  playlist_RecursiveNodeSort, ( playlist_t *, playlist_item_t *,int, int ) );
 
-VLC_EXPORT( playlist_item_t *,  playlist_CurrentPlayingItem, ( playlist_t * ) );
 VLC_EXPORT( int,  playlist_CurrentId, ( playlist_t * ) );
+VLC_EXPORT( playlist_item_t *,  playlist_CurrentPlayingItem, ( playlist_t * ) );
 VLC_EXPORT( bool,  playlist_IsPlaying, ( playlist_t * ) );
 VLC_EXPORT( int,   playlist_Status, ( playlist_t * ) );
 
@@ -284,6 +288,11 @@ VLC_EXPORT( int,   playlist_Status, ( playlist_t * ) );
  */
 VLC_EXPORT( int,  playlist_Export, ( playlist_t *p_playlist, const char *psz_name, playlist_item_t *p_export_root, const char *psz_type ) );
 
+/**
+ * Open a playlist file, add its content to the current playlist
+ */
+VLC_EXPORT( int, playlist_Import, ( playlist_t *p_playlist, const char *psz_file ) );
+
 /********************** Services discovery ***********************/
 
 /** Add a list of comma-separated service discovery modules */
@@ -354,21 +363,6 @@ VLC_EXPORT( playlist_item_t *, playlist_GetLastLeaf, ( playlist_t *p_playlist, p
 /***********************************************************************
  * Inline functions
  ***********************************************************************/
-/** Open a playlist file, add its content to the current playlist */
-static inline int playlist_Import( playlist_t *p_playlist, const char *psz_file)
-{
-    char psz_uri[256+10];
-    input_item_t *p_input;
-    snprintf( psz_uri, 256+9, "file/://%s", psz_file );
-    const char *const psz_option = "meta-file";
-    p_input = input_item_NewExt( p_playlist, psz_uri, psz_file,
-                                1, &psz_option, -1 );
-    playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END,
-                       true, false );
-    input_Read( p_playlist, p_input, true );
-    return VLC_SUCCESS;
-}
-
 /** Small helper tp get current playing input or NULL. Release the input after use. */
 #define pl_CurrentInput(a) __pl_CurrentInput( VLC_OBJECT(a) )
 static  inline input_thread_t * __pl_CurrentInput( vlc_object_t * p_this )
@@ -381,13 +375,18 @@ static  inline input_thread_t * __pl_CurrentInput( vlc_object_t * p_this )
 }
 
 /** Tell if the playlist is empty */
-#define playlist_IsEmpty( pl ) ( pl->items.i_size == 0 )
+static inline bool playlist_IsEmpty( playlist_t *p_playlist )
+{
+    PL_ASSERT_LOCKED;
+    return p_playlist->items.i_size == 0;
+}
 
 /** Tell the number of items in the current playing context */
-#define playlist_CurrentSize( pl ) pl->current.i_size
-
-/** Ask the playlist to do some work */
-VLC_EXPORT( void, playlist_Signal, ( playlist_t * ) );
+static inline int playlist_CurrentSize( playlist_t *p_playlist )
+{
+    PL_ASSERT_LOCKED;
+    return p_playlist->current.i_size;
+}
 
 /** @} */
 # ifdef __cplusplus
index 447d0afb99b5d06d04350446c70773aba58ff6f7..7c5920f36df96a5f0aa696cffbdf0bcad9e7c01f 100644 (file)
@@ -253,6 +253,5 @@ void InteractionDialog::Finish( int i_ret )
 
     hide();
     vlc_object_unlock( p_dialog->p_interaction );
-    playlist_Signal( THEPL );
 }
 
index 7ec2be26b42e96965f4d2babc6bc3f63803c3f6f..8ce3e762175501f7903052d13f96e1ca1ee5884e 100644 (file)
@@ -288,6 +288,7 @@ playlist_GetNextLeaf
 playlist_GetPreferredNode
 playlist_GetPrevLeaf
 playlist_IsPlaying
+playlist_Import
 playlist_IsServicesDiscoveryLoaded
 playlist_ItemGetById
 playlist_ItemGetByInput
@@ -304,11 +305,9 @@ playlist_NodeInsert
 playlist_NodeRemoveItem
 playlist_NodesPairCreate
 playlist_PreparseEnqueue
-playlist_PreparseEnqueueItem
 playlist_RecursiveNodeSort
 playlist_ServicesDiscoveryAdd
 playlist_ServicesDiscoveryRemove
-playlist_Signal
 playlist_Status
 playlist_TreeMove
 __pl_Hold
index 5930b7750c16943058c48d580c751252e411fe61..04ca864e0287b55976fb9d2fd209bb12e25def41 100644 (file)
@@ -35,8 +35,6 @@
  *****************************************************************************/
 static int PlaylistVAControl( playlist_t * p_playlist, int i_query, va_list args );
 
-static void PreparseEnqueueItemSub( playlist_t *, playlist_item_t * );
-
 /*****************************************************************************
  * Playlist control
  *****************************************************************************/
@@ -45,7 +43,7 @@ playlist_t *__pl_Hold( vlc_object_t *p_this )
 {
     playlist_t *pl;
 
-    barrier ();
+    barrier();
     pl = libvlc_priv (p_this->p_libvlc)->p_playlist;
 
     assert( VLC_OBJECT(pl) != p_this /* This does not make sense to hold the playlist
@@ -68,19 +66,13 @@ void __pl_Release( vlc_object_t *p_this )
     vlc_object_release( pl );
 }
 
-void playlist_Signal( playlist_t *p_playlist )
-{
-    /* TODO: assert playlist lock? */
-    vlc_object_signal( p_playlist );
-}
-
 int playlist_Control( playlist_t * p_playlist, int i_query,
                       bool b_locked, ... )
 {
     va_list args;
     int i_result;
-    va_start( args, b_locked );
     PL_LOCK_IF( !b_locked );
+    va_start( args, b_locked );
     i_result = PlaylistVAControl( p_playlist, i_query, args );
     va_end( args );
     PL_UNLOCK_IF( !b_locked );
@@ -208,21 +200,6 @@ int playlist_PreparseEnqueue( playlist_t *p_playlist,
     return VLC_SUCCESS;
 }
 
-/** Enqueue a playlist item or a node for preparsing.
- *  This function shall be called without playlist and preparser locks */
-int playlist_PreparseEnqueueItem( playlist_t *p_playlist,
-                                  playlist_item_t *p_item )
-{
-    playlist_preparse_t *p_preparse = &pl_priv(p_playlist)->preparse;
-
-    vlc_object_lock( p_playlist );
-    vlc_mutex_lock( &p_preparse->lock );
-    PreparseEnqueueItemSub( p_playlist, p_item );
-    vlc_mutex_unlock( &p_preparse->lock );
-    vlc_object_unlock( p_playlist );
-    return VLC_SUCCESS;
-}
-
 int playlist_AskForArtEnqueue( playlist_t *p_playlist,
                                input_item_t *p_item )
 {
@@ -238,30 +215,6 @@ int playlist_AskForArtEnqueue( playlist_t *p_playlist,
     return VLC_SUCCESS;
 }
 
-static void PreparseEnqueueItemSub( playlist_t *p_playlist,
-                                    playlist_item_t *p_item )
-{
-    playlist_preparse_t *p_preparse = &pl_priv(p_playlist)->preparse;
-
-    if( p_item->i_children == -1 )
-    {
-        /* Leaf item */
-        vlc_gc_incref( p_item->p_input );
-        INSERT_ELEM( p_preparse->pp_waiting,
-                     p_preparse->i_waiting,
-                     p_preparse->i_waiting,
-                     p_item->p_input );
-    }
-    else
-    {
-        /* Non-leaf item: recurse */
-        for( int i = 0; i < p_item->i_children; i++)
-        {
-            PreparseEnqueueItemSub( p_playlist, p_item->pp_children[i] );
-        }
-    }
-}
-
 /*****************************************************************************
  * Playback logic
  *****************************************************************************/
index e0392a5beb66349a7d213669d7340ae98db20d00..14a62437ca960f1ed8212011a6d40b63dcf0b783 100644 (file)
@@ -44,9 +44,14 @@ static int RandomCallback( vlc_object_t *p_this, char const *psz_cmd,
                            vlc_value_t oldval, vlc_value_t newval, void *a )
 {
     (void)psz_cmd; (void)oldval; (void)newval; (void)a;
+    playlist_t *p_playlist = (playlist_t*)p_this;
 
-    pl_priv((playlist_t*)p_this)->b_reset_currently_playing = true;
-    playlist_Signal( ((playlist_t*)p_this) );
+    PL_LOCK;
+
+    pl_priv(p_playlist)->b_reset_currently_playing = true;
+    vlc_object_signal_unlocked( p_playlist );
+
+    PL_UNLOCK;
     return VLC_SUCCESS;
 }
 
@@ -228,17 +233,18 @@ static int InputEvent( vlc_object_t *p_this, char const *psz_cmd,
     VLC_UNUSED(p_this); VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
     playlist_t *p_playlist = p_data;
 
-    if( newval.i_int == INPUT_EVENT_STATE )
-    {
-        playlist_Signal( p_playlist );
-    }
-    else if( newval.i_int == INPUT_EVENT_ES )
-    {
-        PL_LOCK;
+    if( newval.i_int != INPUT_EVENT_STATE &&
+        newval.i_int != INPUT_EVENT_ES )
+        return VLC_SUCCESS;
+
+    PL_LOCK;
+
+    if( newval.i_int == INPUT_EVENT_ES )
         pl_priv(p_playlist)->gc_date = mdate();
-        vlc_object_signal_unlocked( p_playlist );
-        PL_UNLOCK;
-    }
+
+    vlc_object_signal_unlocked( p_playlist );
+
+    PL_UNLOCK;
     return VLC_SUCCESS;
 }
 
index 537a3de06cf7340895d195bb145b28b8f0496e91..bdde7dd85530d217ab2187addc6966bf5570ca50 100644 (file)
@@ -92,6 +92,24 @@ int playlist_Export( playlist_t * p_playlist, const char *psz_filename ,
     return i_ret;
 }
 
+int playlist_Import( playlist_t *p_playlist, const char *psz_file )
+{
+    input_item_t *p_input;
+    char *psz_uri;
+    const char *const psz_option = "meta-file";
+
+    if( asprintf( &psz_uri, "file/://%s", psz_file ) < 0 )
+        return VLC_EGENERIC;
+
+    p_input = input_item_NewExt( p_playlist, psz_uri, psz_file,
+                                1, &psz_option, -1 );
+    free( psz_uri );
+
+    playlist_AddInput( p_playlist, p_input, PLAYLIST_APPEND, PLAYLIST_END,
+                       true, false );
+    return input_Read( p_playlist, p_input, true );
+}
+
 /*****************************************************************************
  * A subitem has been added to the Media Library (Event Callback)
  *****************************************************************************/
index 90174d9f442c26186bb595cbc55289f921d311b1..f3d05b1926ade8a4ffc7950b15154a66faf6bace 100644 (file)
@@ -172,6 +172,7 @@ void playlist_release_current_input( playlist_t * p_playlist );
 void playlist_set_current_input(
     playlist_t * p_playlist, input_thread_t * p_input );
 
+
 /**
  * @}
  */
@@ -193,8 +194,6 @@ void playlist_set_current_input(
 
 #define PLI_NAME( p ) p && p->p_input ? p->p_input->psz_name : "null"
 
-#define PL_ASSERT_LOCKED vlc_assert_locked( &(vlc_internals(p_playlist)->lock) )
-
 #define PL_LOCK_IF( cond ) pl_lock_if( p_playlist, cond )
 static inline void pl_lock_if( playlist_t * p_playlist, bool cond )
 {
index 462e26a6c3fe47970570243b530371efdf3c6503..5851effec265995dc273b4c8add64f0ba9bbc2fa 100644 (file)
@@ -90,6 +90,7 @@ playlist_item_t * playlist_ItemGetByInput( playlist_t * p_playlist ,
     return NULL;
 }
 
+
 /**
  * Get input by item id
  *