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

Rémi Denis-Courmont remi at remlab.net
Mon Dec 3 11:57:47 CET 2018


The parenting cannot be changed. Outstanding code relies on it.

Le 3 décembre 2018 12:07:22 GMT+02:00, Victorien Le Couviour <victorien.lecouviour.tuffet at gmail.com> a écrit :
>I'm updating the code with the new playlist, which means removing uses
>of
>the old one. So this parenting has to be changed.
>
>On Thu, Nov 29, 2018 at 2:56 PM Rémi Denis-Courmont <remi at remlab.net>
>wrote:
>
>> Why do you change the parenting here?
>>
>> Le 28 novembre 2018 16:09:07 GMT+02:00, Victorien Le Couviour--Tuffet
><
>> victorien.lecouviour.tuffet at gmail.com> a écrit :
>>>
>>> ------------------------------
>>>  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
>>>
>>>
>> --
>> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez
>excuser ma
>> brièveté.
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20181203/3fcbb5dc/attachment.html>


More information about the vlc-devel mailing list