[vlc-devel] [PATCH 06/20] player: add vlc_player_SelectEsIdList
Thomas Guillem
thomas at gllm.fr
Thu Jun 20 17:23:49 CEST 2019
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
More information about the vlc-devel
mailing list