[vlc-devel] [PATCH 1/3] core: playlist: move Expand() to content.c

Romain Vimont rom1v at videolabs.io
Tue Dec 11 15:22:11 CET 2018


Expanding an item (replacing it by its subitems) was implemented in
preparse.c, essentially because it's only used for preparsing.

For consistency, implement all functions changing the content of the
playlist in content.c. This avoids to expose internal functions
like vlc_playlist_ItemsInserted().
---
 src/playlist/content.c  | 14 ++++++++++++--
 src/playlist/content.h  |  9 +++++----
 src/playlist/item.h     |  1 +
 src/playlist/preparse.c | 33 +++++++++++++--------------------
 src/playlist/preparse.h |  4 ++--
 src/playlist/test.c     |  4 ++--
 6 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/src/playlist/content.c b/src/playlist/content.c
index 7c8fca044c..ee586fe3fe 100644
--- a/src/playlist/content.c
+++ b/src/playlist/content.c
@@ -56,8 +56,7 @@ vlc_playlist_ItemsReset(vlc_playlist_t *playlist)
     vlc_playlist_state_NotifyChanges(playlist, &state);
 }
 
-/* not static, it's called from preparse.c */
-void
+static void
 vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index, size_t count)
 {
     if (playlist->order == VLC_PLAYLIST_PLAYBACK_ORDER_RANDOM)
@@ -286,3 +285,14 @@ vlc_playlist_Remove(vlc_playlist_t *playlist, size_t index, size_t count)
 
     vlc_playlist_ItemsRemoved(playlist, index, count);
 }
+
+int
+vlc_playlist_Expand(vlc_playlist_t *playlist, size_t index,
+                    input_item_t *const media[], size_t count)
+{
+    vlc_playlist_AssertLocked(playlist);
+    assert(index < playlist->items.size);
+
+    vlc_playlist_RemoveOne(playlist, index);
+    return vlc_playlist_Insert(playlist, index, media, count);
+}
diff --git a/src/playlist/content.h b/src/playlist/content.h
index 0bd7d98611..d0d6d37147 100644
--- a/src/playlist/content.h
+++ b/src/playlist/content.h
@@ -22,14 +22,15 @@
 #define VLC_PLAYLIST_CONTENT_H
 
 typedef struct vlc_playlist vlc_playlist_t;
+typedef struct input_item_t input_item_t;
 
 /* called by vlc_playlist_Delete() in playlist.c */
 void
 vlc_playlist_ClearItems(vlc_playlist_t *playlist);
 
-/* called by vlc_playlist_ExpandItem() in preparse.c */
-void
-vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index,
-                           size_t count);
+/* expand an item (replace it by the given media array) */
+int
+vlc_playlist_Expand(vlc_playlist_t *playlist, size_t index,
+                    input_item_t *const media[], size_t count);
 
 #endif
diff --git a/src/playlist/item.h b/src/playlist/item.h
index 86189cd18b..f55cc83e84 100644
--- a/src/playlist/item.h
+++ b/src/playlist/item.h
@@ -24,6 +24,7 @@
 #include <vlc_atomic.h>
 
 typedef struct vlc_playlist_item vlc_playlist_item_t;
+typedef struct input_item_t input_item_t;
 
 struct vlc_playlist_item
 {
diff --git a/src/playlist/preparse.c b/src/playlist/preparse.c
index 5231f0646a..c636757ff5 100644
--- a/src/playlist/preparse.c
+++ b/src/playlist/preparse.c
@@ -29,42 +29,36 @@
 #include "playlist.h"
 #include "libvlc.h" /* for vlc_MetadataRequest() */
 
+typedef struct VLC_VECTOR(input_item_t *) media_vector_t;
+
 static void
-vlc_playlist_CollectChildren(playlist_item_vector_t *dest,
-                             input_item_node_t *node)
+vlc_playlist_CollectChildren(media_vector_t *dest, input_item_node_t *node)
 {
     for (int i = 0; i < node->i_children; ++i)
     {
         input_item_node_t *child = node->pp_children[i];
-        vlc_playlist_item_t *item = vlc_playlist_item_New(child->p_item);
-        if (item)
-        {
-            if (!vlc_vector_push(dest, item))
-                vlc_playlist_item_Release(item);
-        }
+        input_item_t *media = child->p_item;
+        vlc_vector_push(dest, media);
         vlc_playlist_CollectChildren(dest, child);
     }
 }
 
-bool
+int
 vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
                         input_item_node_t *node)
 {
     vlc_playlist_AssertLocked(playlist);
-    vlc_playlist_RemoveOne(playlist, index);
 
-    playlist_item_vector_t flatten = VLC_VECTOR_INITIALIZER;
+    media_vector_t flatten = VLC_VECTOR_INITIALIZER;
     vlc_playlist_CollectChildren(&flatten, node);
 
-    if (vlc_vector_insert_all(&playlist->items, index, flatten.data,
-                              flatten.size))
-        vlc_playlist_ItemsInserted(playlist, index, flatten.size);
-
+    int ret = vlc_playlist_Expand(playlist, index, flatten.data, flatten.size);
     vlc_vector_destroy(&flatten);
-    return true;
+
+    return ret;
 }
 
-bool
+int
 vlc_playlist_ExpandItemFromNode(vlc_playlist_t *playlist,
                                 input_item_node_t *subitems)
 {
@@ -72,11 +66,10 @@ vlc_playlist_ExpandItemFromNode(vlc_playlist_t *playlist,
     input_item_t *media = subitems->p_item;
     ssize_t index = vlc_playlist_IndexOfMedia(playlist, media);
     if (index == -1)
-        return false;
+        return VLC_ENOITEM;
 
     /* replace the item by its flatten subtree */
-    vlc_playlist_ExpandItem(playlist, index, subitems);
-    return true;
+    return vlc_playlist_ExpandItem(playlist, index, subitems);
 }
 
 static void
diff --git a/src/playlist/preparse.h b/src/playlist/preparse.h
index 84191a1517..600df83320 100644
--- a/src/playlist/preparse.h
+++ b/src/playlist/preparse.h
@@ -26,11 +26,11 @@
 typedef struct vlc_playlist vlc_playlist_t;
 typedef struct input_item_node_t input_item_node_t;
 
-bool
+int
 vlc_playlist_ExpandItem(vlc_playlist_t *playlist, size_t index,
                         input_item_node_t *node);
 
-bool
+int
 vlc_playlist_ExpandItemFromNode(vlc_playlist_t *playlist,
                                 input_item_node_t *subitems);
 
diff --git a/src/playlist/test.c b/src/playlist/test.c
index c42254ec22..b24a95adb7 100644
--- a/src/playlist/test.c
+++ b/src/playlist/test.c
@@ -285,8 +285,8 @@ test_expand_item(void)
         assert(node);
     }
 
-    bool ok = vlc_playlist_ExpandItem(playlist, 8, root);
-    assert(ok);
+    ret = vlc_playlist_ExpandItem(playlist, 8, root);
+    assert(ret == VLC_SUCCESS);
     assert(vlc_playlist_Count(playlist) == 15);
     EXPECT_AT(7, 7);
 
-- 
2.20.0.rc2



More information about the vlc-devel mailing list