[vlc-devel] [PATCH 6/6] intf: use new playlist

Romain Vimont rom1v at videolabs.io
Tue Nov 27 13:37:07 CET 2018


On Tue, Nov 27, 2018 at 01:28:58PM +0100, Victorien Le Couviour--Tuffet wrote:
> ---
>  include/vlc_interface.h   |   2 +-
>  src/interface/interface.c | 120 ++++++++++++--------------------------
>  src/libvlc.c              |   1 -
>  src/libvlc.h              |   1 -
>  4 files changed, 37 insertions(+), 87 deletions(-)
> 
> diff --git a/include/vlc_interface.h b/include/vlc_interface.h
> index 558ac1099d..ca5c8bba04 100644
> --- a/include/vlc_interface.h
> +++ b/include/vlc_interface.h
> @@ -86,7 +86,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 7e0fed8412..cecb08ac84 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;
> @@ -124,27 +117,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)
>  {
> @@ -154,9 +126,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().
> @@ -164,36 +136,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;

ret = vlc_playlist_InsertOne(...) ?

> -        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);
>  }
>  
>  /**
> @@ -201,14 +169,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");
> @@ -220,48 +184,36 @@ 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);
> -    libvlc_priv_t *libvlc_p = livlc_priv(libvlc);
> -    playlist = libvlc_p->playlist;
> -    if (playlist != NULL)
> +    vlc_vector_foreach(intf, &libvlc_p->interfaces)
>      {
> -        intf_thread_t *intf;
> -        vlc_vector_foreach(intf, &libvlc_p->interfaces)
> -        {
> -            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);
> -        }
> -        vlc_vector_clear(&libvlc_p->interfaces);
> -        libvlc_p->playlist = NULL;
> +        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);
>      }
> +    vlc_vector_clear(&libvlc_p->interfaces);

vlc_vector_destroy() instead of _clear()

>      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 003a606373..5ccff0af20 100644
> --- a/src/libvlc.c
> +++ b/src/libvlc.c
> @@ -97,7 +97,6 @@ libvlc_int_t * libvlc_InternalCreate( void )
>  
>      priv = libvlc_priv (p_libvlc);
>      vlc_vector_init(&priv->interfaces);
> -    priv->playlist = NULL;
>      priv->main_playlist = NULL;
>      priv->p_vlm = NULL;
>      priv->media_source_provider = NULL;
> diff --git a/src/libvlc.h b/src/libvlc.h
> index 8fb96017eb..d37144650a 100644
> --- a/src/libvlc.h
> +++ b/src/libvlc.h
> @@ -199,7 +199,6 @@ typedef struct libvlc_priv_t
>      vlc_dialog_provider *p_dialog_provider; ///< dialog provider
>      vlc_keystore      *p_memory_keystore; ///< memory keystore
>      intf_vector interfaces; ///< LibVLC interfaces book keeping
> -    struct playlist_t *playlist;
>      vlc_playlist_t *main_playlist;
>      struct input_preparser_t *parser; ///< Input item meta data handler
>      vlc_media_source_provider_t *media_source_provider;
> -- 
> 2.19.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list