[vlc-devel] [PATCH] intf: use new playlist
Victorien Le Couviour--Tuffet
victorien.lecouviour.tuffet at gmail.com
Wed Nov 28 15:09:07 CET 2018
---
include/vlc_interface.h | 2 +-
src/interface/interface.c | 129 +++++++++++++-------------------------
src/libvlc.c | 2 +-
src/libvlc.h | 2 +-
4 files changed, 45 insertions(+), 90 deletions(-)
diff --git a/include/vlc_interface.h b/include/vlc_interface.h
index 632759060b..75c2060096 100644
--- a/include/vlc_interface.h
+++ b/include/vlc_interface.h
@@ -88,7 +88,7 @@ struct intf_dialog_args_t
struct interaction_dialog_t *p_dialog;
};
-VLC_API int intf_Create( playlist_t *, const char * );
+VLC_API int intf_Create(libvlc_int_t *, char const *);
VLC_API void libvlc_Quit( libvlc_int_t * );
diff --git a/src/interface/interface.c b/src/interface/interface.c
index 0f47e06fd8..f3901672a5 100644
--- a/src/interface/interface.c
+++ b/src/interface/interface.c
@@ -42,36 +42,29 @@
#include <vlc_common.h>
#include <vlc_modules.h>
#include <vlc_interface.h>
-#include <vlc_playlist_legacy.h>
+#include <vlc_playlist.h>
#include "libvlc.h"
-#include "playlist_legacy/playlist_internal.h"
#include "../lib/libvlc_internal.h"
static int AddIntfCallback( vlc_object_t *, char const *,
vlc_value_t , vlc_value_t , void * );
-/* This lock ensures that the playlist is created only once (per instance). It
- * also protects the list of running interfaces against concurrent access,
+/* This lock protects the list of running interfaces against concurrent access,
* either to add or remove an interface.
- *
- * However, it does NOT protect from destruction of the playlist by
- * intf_DestroyAll(). Instead, care must be taken that intf_Create() and any
- * other function that depends on the playlist is only called BEFORE
- * intf_DestroyAll() has the possibility to destroy all interfaces.
*/
static vlc_mutex_t lock = VLC_STATIC_MUTEX;
/**
* Create and start an interface.
*
- * @param playlist playlist and parent object for the interface
+ * @param libvlc libvlc and parent object for the interface
* @param chain configuration chain string
* @return VLC_SUCCESS or an error code
*/
-int intf_Create( playlist_t *playlist, const char *chain )
+int intf_Create(libvlc_int_t *libvlc, char const *chain)
{
/* Allocate structure */
- intf_thread_t *p_intf = vlc_custom_create( playlist, sizeof( *p_intf ),
+ intf_thread_t *p_intf = vlc_custom_create( libvlc, sizeof( *p_intf ),
"interface" );
if( unlikely(p_intf == NULL) )
return VLC_ENOMEM;
@@ -95,7 +88,7 @@ int intf_Create( playlist_t *playlist, const char *chain )
var_Change( p_intf, "intf-add", VLC_VAR_ADDCHOICE, val,
_("Mouse Gestures") );
- var_AddCallback( p_intf, "intf-add", AddIntfCallback, playlist );
+ var_AddCallback(p_intf, "intf-add", AddIntfCallback, NULL);
/* Choose the best module */
char *module;
@@ -110,9 +103,10 @@ int intf_Create( playlist_t *playlist, const char *chain )
goto error;
}
+ libvlc_priv_t *libvlc_p = libvlc_priv(libvlc);
vlc_mutex_lock( &lock );
- p_intf->p_next = pl_priv( playlist )->interface;
- pl_priv( playlist )->interface = p_intf;
+ p_intf->p_next = libvlc_p->interface;
+ libvlc_p->interface = p_intf;
vlc_mutex_unlock( &lock );
return VLC_SUCCESS;
@@ -125,27 +119,6 @@ error:
return VLC_EGENERIC;
}
-/**
- * Creates the playlist if necessary, and return a pointer to it.
- * @note The playlist is not reference-counted. So the pointer is only valid
- * until intf_DestroyAll() destroys interfaces.
- */
-static playlist_t *intf_GetPlaylist(libvlc_int_t *libvlc)
-{
- playlist_t *playlist;
-
- vlc_mutex_lock(&lock);
- playlist = libvlc_priv(libvlc)->playlist;
- if (playlist == NULL)
- {
- playlist = playlist_Create(VLC_OBJECT(libvlc));
- libvlc_priv(libvlc)->playlist = playlist;
- }
- vlc_mutex_unlock(&lock);
-
- return playlist;
-}
-
vlc_playlist_t *
vlc_intf_GetMainPlaylist(intf_thread_t *intf)
{
@@ -155,9 +128,9 @@ vlc_intf_GetMainPlaylist(intf_thread_t *intf)
/**
* Inserts an item in the playlist.
*
- * This function is used during initialization. Unlike playlist_Add() and
- * variants, it inserts an item to the beginning of the playlist. That is
- * meant to compensate for the reverse parsing order of the command line.
+ * This function is used during initialization. It inserts an item to the
+ * beginning of the playlist. That is meant to compensate for the reverse
+ * parsing order of the command line.
*
* @note This function may <b>not</b> be called at the same time as
* intf_DestroyAll().
@@ -165,36 +138,32 @@ vlc_intf_GetMainPlaylist(intf_thread_t *intf)
int intf_InsertItem(libvlc_int_t *libvlc, const char *mrl, unsigned optc,
const char *const *optv, unsigned flags)
{
- playlist_t *playlist = intf_GetPlaylist(libvlc);
- input_item_t *item = input_item_New(mrl, NULL);
+ int ret = -1;
+ input_item_t *item = input_item_New(mrl, NULL);
if (unlikely(item == NULL))
- return -1;
-
- int ret = -1;
+ goto end;
if (input_item_AddOptions(item, optc, optv, flags) == VLC_SUCCESS)
{
- playlist_Lock(playlist);
- if (playlist_NodeAddInput(playlist, item, playlist->p_playing,
- 0) != NULL)
+ vlc_playlist_t *playlist = libvlc_priv(libvlc)->main_playlist;
+ vlc_playlist_Lock(playlist);
+ if (vlc_playlist_InsertOne(playlist, 0, item) == VLC_SUCCESS)
ret = 0;
- playlist_Unlock(playlist);
+ vlc_playlist_Unlock(playlist);
}
input_item_Release(item);
+
+end:
return ret;
}
void libvlc_InternalPlay(libvlc_int_t *libvlc)
{
- playlist_t *pl;
-
- vlc_mutex_lock(&lock);
- pl = libvlc_priv(libvlc)->playlist;
- vlc_mutex_unlock(&lock);
-
- if (pl != NULL && var_GetBool(pl, "playlist-autostart"))
- playlist_Control(pl, PLAYLIST_PLAY, false);
+ vlc_playlist_t *playlist = libvlc_priv(libvlc)->main_playlist;
+ vlc_playlist_Lock(playlist);
+ vlc_playlist_Start(playlist);
+ vlc_playlist_Unlock(playlist);
}
/**
@@ -202,14 +171,10 @@ void libvlc_InternalPlay(libvlc_int_t *libvlc)
*/
int libvlc_InternalAddIntf(libvlc_int_t *libvlc, const char *name)
{
- playlist_t *playlist = intf_GetPlaylist(libvlc);
int ret;
- if (unlikely(playlist == NULL))
- ret = VLC_ENOMEM;
- else
if (name != NULL)
- ret = intf_Create(playlist, name);
+ ret = intf_Create(libvlc, name);
else
{ /* Default interface */
char *intf = var_InheritString(libvlc, "intf");
@@ -221,49 +186,39 @@ int libvlc_InternalAddIntf(libvlc_int_t *libvlc, const char *name)
msg_Info(libvlc, _("Running vlc with the default interface. "
"Use 'cvlc' to use vlc without interface."));
}
- ret = intf_Create(playlist, intf);
+ ret = intf_Create(libvlc, intf);
free(intf);
name = "default";
}
+
if (ret != VLC_SUCCESS)
msg_Err(libvlc, "interface \"%s\" initialization failed", name);
return ret;
}
/**
- * Stops and destroys all interfaces, then the playlist.
- * @warning FIXME
+ * Stops and destroys all interfaces
* @param libvlc the LibVLC instance
*/
void intf_DestroyAll(libvlc_int_t *libvlc)
{
- playlist_t *playlist;
-
+ libvlc_priv_t *libvlc_p = libvlc_priv(libvlc);
+ intf_thread_t *intf;
vlc_mutex_lock(&lock);
- playlist = libvlc_priv(libvlc)->playlist;
- if (playlist != NULL)
+ intf_thread_t **p_intf = &libvlc_p->interface;
+ while (*p_intf != NULL)
{
- intf_thread_t *intf, **pp = &(pl_priv(playlist)->interface);
-
- while ((intf = *pp) != NULL)
- {
- *pp = intf->p_next;
- vlc_mutex_unlock(&lock);
-
- module_unneed(intf, intf->p_module);
- config_ChainDestroy(intf->p_cfg);
- var_DelCallback(intf, "intf-add", AddIntfCallback, playlist);
- vlc_object_release(intf);
-
- vlc_mutex_lock(&lock);
- }
-
- libvlc_priv(libvlc)->playlist = NULL;
+ intf = *p_intf;
+ *p_intf = intf->p_next;
+ vlc_mutex_unlock(&lock);
+ module_unneed(intf, intf->p_module);
+ config_ChainDestroy(intf->p_cfg);
+ var_DelCallback(intf, "intf-add", AddIntfCallback, NULL);
+ vlc_object_release(intf);
+ vlc_mutex_lock(&lock);
}
+ libvlc_p->interface = NULL;
vlc_mutex_unlock(&lock);
-
- if (playlist != NULL)
- playlist_Destroy(playlist);
}
/* Following functions are local */
diff --git a/src/libvlc.c b/src/libvlc.c
index cf35bcfed3..b82b5bac53 100644
--- a/src/libvlc.c
+++ b/src/libvlc.c
@@ -96,8 +96,8 @@ libvlc_int_t * libvlc_InternalCreate( void )
return NULL;
priv = libvlc_priv (p_libvlc);
- priv->playlist = NULL;
priv->main_playlist = NULL;
+ priv->interface = NULL;
priv->p_vlm = NULL;
priv->media_source_provider = NULL;
diff --git a/src/libvlc.h b/src/libvlc.h
index a0adeeb26a..736c7fe85b 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -195,8 +195,8 @@ typedef struct libvlc_priv_t
vlm_t *p_vlm; ///< the VLM singleton (or NULL)
vlc_dialog_provider *p_dialog_provider; ///< dialog provider
vlc_keystore *p_memory_keystore; ///< memory keystore
- struct playlist_t *playlist; ///< Playlist for interfaces
vlc_playlist_t *main_playlist;
+ struct intf_thread_t *interface; ///< Linked list of interfaces
struct input_preparser_t *parser; ///< Input item meta data handler
vlc_media_source_provider_t *media_source_provider;
vlc_actions_t *actions; ///< Hotkeys handler
--
2.19.1
More information about the vlc-devel
mailing list