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

Victorien Le Couviour victorien.lecouviour.tuffet at gmail.com
Mon Dec 3 11:07:22 CET 2018


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20181203/e8608967/attachment.html>


More information about the vlc-devel mailing list