[vlc-devel] [PATCH 06/20] player: add vlc_player_SelectEsIdList
Rémi Denis-Courmont
remi at remlab.net
Thu Jun 20 17:51:43 CEST 2019
Hi,
You could use memstream_puts directly here.
Le 20 juin 2019 18:23:49 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>From: Roland Bewick <roland.bewick at gmail.com>
>
>Signed-off-by: Thomas Guillem <thomas at gllm.fr>
>---
> include/vlc_player.h | 26 +++++++++++++++++
> src/input/player.c | 68 ++++++++++++++++++++++++++++++++++++++++++++
> src/libvlccore.sym | 1 +
> 3 files changed, 95 insertions(+)
>
>diff --git a/include/vlc_player.h b/include/vlc_player.h
>index 225051447a..4fcf4f0bb7 100644
>--- a/include/vlc_player.h
>+++ b/include/vlc_player.h
>@@ -1749,6 +1749,32 @@ vlc_player_SelectTrack(vlc_player_t *player,
> vlc_player_SelectEsId(player, track->es_id);
> }
>
>+/**
>+ * Select multiple tracks from a list of ES identifiers.
>+ *
>+ * Any tracks of the category, not referenced in the list will be
>unselected.
>+ *
>+ * @warning there is no guarantee all requested tracks will be
>selected.
>+ * Only one audio track can be selected at a time. Two subtitle tracks
>+ * can be selected simultaneously.
>+ *
>+ * @warning behaviour is undefined if the list is not null-terminated.
>+ *
>+ * @note A successful call will trigger the
>+ * vlc_player_cbs.on_track_selection_changed event for each track that
>has
>+ * its selection state changed.
>+ *
>+ * @param player locked player instance
>+ * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
>+ * @param es_id_list a null-terminated list of ES identifiers.
>+ * (ES IDs can be retrieved from vlc_player_cbs.on_track_list_changed
>or
>+ * vlc_player_GetTrackAt())
>+ */
>+VLC_API void
>+vlc_player_SelectEsIdList(vlc_player_t *player,
>+ enum es_format_category_e cat,
>+ vlc_es_id_t *const es_id_list[]);
>+
> /**
> * Select the next track
> *
>diff --git a/src/input/player.c b/src/input/player.c
>index fd0ef7f8ea..358502d21b 100644
>--- a/src/input/player.c
>+++ b/src/input/player.c
>@@ -32,6 +32,7 @@
> #include <vlc_atomic.h>
> #include <vlc_tick.h>
> #include <vlc_decoder.h>
>+#include <vlc_memstream.h>
>
> #include "libvlc.h"
> #include "input_internal.h"
>@@ -1394,6 +1395,73 @@ vlc_player_SelectEsId(vlc_player_t *player,
>vlc_es_id_t *id)
> vlc_player_vout_OSDTrack(player, id, true);
> }
>
>+void
>+vlc_player_SelectEsIdList(vlc_player_t *player,
>+ enum es_format_category_e cat,
>+ vlc_es_id_t *const es_id_list[])
>+{
>+ struct vlc_player_input *input =
>vlc_player_get_input_locked(player);
>+ if (!input)
>+ return;
>+
>+ /* First, count and hold all the ES Ids.
>+ Ids will be released in input.c:ControlRelease */
>+ size_t id_count;
>+ for (id_count = 0; es_id_list[id_count] != NULL; id_count++);
>+
>+ /* Copy es_id_list into an allocated list so that it remains in
>memory until
>+ selection completes. The list will be freed in
>input.c:ControlRelease */
>+ struct vlc_es_id_t **allocated_ids =
>+ vlc_alloc(id_count + 1, sizeof(vlc_es_id_t *));
>+
>+ if (allocated_ids == NULL)
>+ return;
>+
>+ for (size_t i = 0; i < id_count; i++)
>+ {
>+ vlc_es_id_t *es_id = es_id_list[i];
>+
>+ vlc_es_id_Hold(es_id);
>+ allocated_ids[i] = es_id;
>+ }
>+ allocated_ids[id_count] = NULL;
>+
>+ /* Attempt to select all the requested tracks */
>+ input_ControlPush(input->thread, INPUT_CONTROL_SET_ES_LIST,
>+ &(input_control_param_t) {
>+ .list.cat = cat,
>+ .list.ids = allocated_ids,
>+ });
>+
>+ /* Display track selection message */
>+ const char *cat_name = es_format_category_to_string(cat);
>+ if (id_count == 0)
>+ vlc_player_vout_OSDMessage(player, _("%s track: %s"),
>cat_name,
>+ _("N/A"));
>+ else if (id_count == 1)
>+ vlc_player_vout_OSDTrack(player, es_id_list[0], true);
>+ else
>+ {
>+ struct vlc_memstream stream;
>+ vlc_memstream_open(&stream);
>+ for (size_t i = 0; i < id_count; i++)
>+ {
>+ const struct vlc_player_track *track =
>+ vlc_player_GetTrack(player, es_id_list[i]);
>+
>+ if (track)
>+ vlc_memstream_printf(&stream, "%s%s",
>+ i == 0 ? "" : ", ", track->name);
>+ }
>+ if (vlc_memstream_close(&stream) == 0)
>+ {
>+ vlc_player_vout_OSDMessage(player, _("%s tracks: %s"),
>cat_name,
>+ stream.ptr);
>+ free(stream.ptr);
>+ }
>+ }
>+}
>+
> static void
>vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e
>cat,
> bool next)
>diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>index 7432848866..3c11a9fefd 100644
>--- a/src/libvlccore.sym
>+++ b/src/libvlccore.sym
>@@ -834,6 +834,7 @@ vlc_player_SelectCategoryLanguage
> vlc_player_SelectChapter
> vlc_player_SelectChapterIdx
> vlc_player_SelectEsId
>+vlc_player_SelectEsIdList
> vlc_player_SelectNextChapter
> vlc_player_SelectNextTitle
> vlc_player_SelectNextTrack
>--
>2.20.1
>
>_______________________________________________
>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/20190620/aedf49e7/attachment.html>
More information about the vlc-devel
mailing list