[vlc-devel] [PATCH 3/3] player: check input_PushControl*() return values

Thomas Guillem thomas at gllm.fr
Mon Aug 26 15:10:29 CEST 2019


And modify return values of public functions to return the status.
Don't send event or notify via osd if it returns an error.

input_PushControl() returns an error when the control array is full. We could
fix it by using a dynamic array but we will still have to check for the
allocation in that case.
---
 include/vlc_player.h | 152 +++++++++++-------
 src/player/input.c   |  10 +-
 src/player/player.c  | 375 +++++++++++++++++++++++++------------------
 3 files changed, 312 insertions(+), 225 deletions(-)

diff --git a/include/vlc_player.h b/include/vlc_player.h
index 0e0ae33680..98caca567f 100644
--- a/include/vlc_player.h
+++ b/include/vlc_player.h
@@ -455,24 +455,27 @@ vlc_player_Stop(vlc_player_t *player);
  * Pause the playback
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_Pause(vlc_player_t *player);
 
 /**
  * Resume the playback from a pause
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_Resume(vlc_player_t *player);
 
 /**
  * Pause and display the next video frame
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_NextVideoFrame(vlc_player_t *player);
 
 /**
@@ -531,16 +534,17 @@ vlc_player_IsPaused(vlc_player_t *player)
 /**
  * Helper to toggle the pause state
  */
-static inline void
+static inline int
 vlc_player_TogglePause(vlc_player_t *player)
 {
     if (vlc_player_IsStarted(player))
     {
         if (vlc_player_IsPaused(player))
-            vlc_player_Resume(player);
+            return vlc_player_Resume(player);
         else
-            vlc_player_Pause(player);
+            return vlc_player_Pause(player);
     }
+    return VLC_EGENERIC;
 }
 
 /**
@@ -610,24 +614,27 @@ vlc_player_GetRate(vlc_player_t *player);
  *
  * @param player locked player instance
  * @param rate new rate (< 1.f is slower, > 1.f is faster)
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_ChangeRate(vlc_player_t *player, float rate);
 
 /**
  * Increment the rate of the player (faster)
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_IncrementRate(vlc_player_t *player);
 
 /**
  * Decrement the rate of the player (Slower)
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_DecrementRate(vlc_player_t *player);
 
 /**
@@ -680,8 +687,9 @@ vlc_player_GetPosition(vlc_player_t *player);
  * @param position position in the range [0.f;1.f]
  * @param speed precise of fast
  * @param whence absolute or relative
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SeekByPos(vlc_player_t *player, float position,
                      enum vlc_player_seek_speed speed,
                      enum vlc_player_whence whence);
@@ -698,8 +706,9 @@ vlc_player_SeekByPos(vlc_player_t *player, float position,
  * @param time a time in the range [0;length]
  * @param speed precise of fast
  * @param whence absolute or relative
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
                       enum vlc_player_seek_speed speed,
                       enum vlc_player_whence whence);
@@ -707,65 +716,65 @@ vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
 /**
  * Helper to set the absolute position precisely
  */
-static inline void
+static inline int
 vlc_player_SetPosition(vlc_player_t *player, float position)
 {
-    vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_PRECISE,
-                         VLC_PLAYER_WHENCE_ABSOLUTE);
+    return vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_PRECISE,
+                                VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
 /**
  * Helper to set the absolute position fast
  */
-static inline void
+static inline int
 vlc_player_SetPositionFast(vlc_player_t *player, float position)
 {
-    vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_FAST,
-                         VLC_PLAYER_WHENCE_ABSOLUTE);
+    return vlc_player_SeekByPos(player, position, VLC_PLAYER_SEEK_FAST,
+                                VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
 /**
  * Helper to jump the position precisely
  */
-static inline void
+static inline int
 vlc_player_JumpPos(vlc_player_t *player, float jumppos)
 {
     /* No fask seek for jumps. Indeed, jumps can seek to the current position
      * if not precise enough or if the jump value is too small. */
-    vlc_player_SeekByPos(player, jumppos, VLC_PLAYER_SEEK_PRECISE,
-                         VLC_PLAYER_WHENCE_RELATIVE);
+    return vlc_player_SeekByPos(player, jumppos, VLC_PLAYER_SEEK_PRECISE,
+                                VLC_PLAYER_WHENCE_RELATIVE);
 }
 
 /**
  * Helper to set the absolute time precisely
  */
-static inline void
+static inline int
 vlc_player_SetTime(vlc_player_t *player, vlc_tick_t time)
 {
-    vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_PRECISE,
-                          VLC_PLAYER_WHENCE_ABSOLUTE);
+    return vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_PRECISE,
+                                 VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
 /**
  * Helper to set the absolute time fast
  */
-static inline void
+static inline int
 vlc_player_SetTimeFast(vlc_player_t *player, vlc_tick_t time)
 {
-    vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_FAST,
-                          VLC_PLAYER_WHENCE_ABSOLUTE);
+    return vlc_player_SeekByTime(player, time, VLC_PLAYER_SEEK_FAST,
+                                 VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
 /**
  * Helper to jump the time precisely
  */
-static inline void
+static inline int
 vlc_player_JumpTime(vlc_player_t *player, vlc_tick_t jumptime)
 {
     /* No fask seek for jumps. Indeed, jumps can seek to the current position
      * if not precise enough or if the jump value is too small. */
-    vlc_player_SeekByTime(player, jumptime, VLC_PLAYER_SEEK_PRECISE,
-                          VLC_PLAYER_WHENCE_RELATIVE);
+    return vlc_player_SeekByTime(player, jumptime, VLC_PLAYER_SEEK_PRECISE,
+                                 VLC_PLAYER_WHENCE_RELATIVE);
 }
 
 /**
@@ -817,8 +826,9 @@ vlc_player_GetAtoBLoop(vlc_player_t *player, vlc_tick_t *a_time, float *a_pos,
  *
  * @param player locked player instance
  * @param nav navigation key
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_Navigate(vlc_player_t *player, enum vlc_player_nav nav);
 
 /**
@@ -829,7 +839,7 @@ vlc_player_Navigate(vlc_player_t *player, enum vlc_player_nav nav);
   * @param whence absolute or relative
   * @return VLC_SUCCESS or a VLC error code
   */
-VLC_API void
+VLC_API int
 vlc_player_UpdateViewpoint(vlc_player_t *player,
                            const vlc_viewpoint_t *viewpoint,
                            enum vlc_player_whence whence);
@@ -853,8 +863,9 @@ vlc_player_IsRecording(vlc_player_t *player);
  *
  * @param player locked player instance
  * @param enabled true to enable recording
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SetRecordingEnabled(vlc_player_t *player, bool enabled);
 
 /**
@@ -1041,8 +1052,9 @@ vlc_player_GetSelectedTitle(vlc_player_t *player)
  *
  * @param player locked player instance
  * @param index valid index in the range [0;count[
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectTitleIdx(vlc_player_t *player, size_t index);
 
 /**
@@ -1056,8 +1068,9 @@ vlc_player_SelectTitleIdx(vlc_player_t *player, size_t index);
  *
  * @param player locked player instance
  * @param title a valid title coming from the vlc_player_title_list
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectTitle(vlc_player_t *player,
                        const struct vlc_player_title *title);
 
@@ -1070,8 +1083,9 @@ vlc_player_SelectTitle(vlc_player_t *player,
  * @param player locked player instance
  * @param title the selected title
  * @param chapter_idx index from vlc_player_title.chapters
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectChapter(vlc_player_t *player,
                          const struct vlc_player_title *title,
                          size_t chapter_idx);
@@ -1080,16 +1094,18 @@ vlc_player_SelectChapter(vlc_player_t *player,
  * Select the next title for the current media
  *
  * @see vlc_player_SelectTitleIdx()
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectNextTitle(vlc_player_t *player);
 
 /**
  * Select the previous title for the current media
  *
  * @see vlc_player_SelectTitleIdx()
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectPrevTitle(vlc_player_t *player);
 
 /**
@@ -1125,24 +1141,27 @@ vlc_player_GetSelectedChapter(vlc_player_t *player)
  *
  * @param player locked player instance
  * @param index valid index in the range [0;vlc_player_title.chapter_count[
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectChapterIdx(vlc_player_t *player, size_t index);
 
 /**
  * Select the next chapter for the current media
  *
  * @see vlc_player_SelectChapterIdx()
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectNextChapter(vlc_player_t *player);
 
 /**
  * Select the previous chapter for the current media
  *
  * @see vlc_player_SelectChapterIdx()
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectPrevChapter(vlc_player_t *player);
 
 /** @} vlc_player__titles */
@@ -1232,24 +1251,27 @@ vlc_player_GetProgram(vlc_player_t *player, int group_id);
  * @param player locked player instance
  * @param group_id a program ID (retrieved from
  * vlc_player_cbs.on_program_list_changed or vlc_player_GetProgramAt())
+ * @return VLC_SUCCESS or VLC_EGENERIC in case of error
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectProgram(vlc_player_t *player, int group_id);
 
 /**
  * Select the next program
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or VLC_EGENERIC in case of error
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectNextProgram(vlc_player_t *player);
 
 /**
  * Select the previous program
  *
  * @param player locked player instance
+ * @return VLC_SUCCESS or VLC_EGENERIC in case of error
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectPrevProgram(vlc_player_t *player);
 
 /**
@@ -1511,9 +1533,9 @@ vlc_player_GetSelectedTrack(vlc_player_t *player, enum es_format_category_e cat)
  * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
  * vlc_player_GetTrackAt())
  * @param policy exclusive or simultaneous
- * @return the number of track selected for es_id category
+ * @return the number of track selected for es_id category or a VLC error code
  */
-VLC_API unsigned
+VLC_API int
 vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *es_id,
                       enum vlc_player_select_policy policy);
 
@@ -1521,7 +1543,7 @@ vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *es_id,
 /**
  * Helper to select a track
  */
-static inline unsigned
+static inline int
 vlc_player_SelectTrack(vlc_player_t *player,
                        const struct vlc_player_track *track,
                        enum vlc_player_select_policy policy)
@@ -1549,9 +1571,9 @@ vlc_player_SelectTrack(vlc_player_t *player,
  * corresponding to the category will be ignored.
  * (ES IDs can be retrieved from vlc_player_cbs.on_track_list_changed or
  * vlc_player_GetTrackAt())
- * @return the number of track selected for that category
+ * @return the number of track selected for that category or a VLC error code
  */
-VLC_API unsigned
+VLC_API int
 vlc_player_SelectEsIdList(vlc_player_t *player,
                           enum es_format_category_e cat,
                           vlc_es_id_t *const es_id_list[]);
@@ -1568,8 +1590,9 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
  *
  * @param player locked player instance
  * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
+ * @return the number of newly track selected or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectNextTrack(vlc_player_t *player,
                            enum es_format_category_e cat);
 
@@ -1585,8 +1608,9 @@ vlc_player_SelectNextTrack(vlc_player_t *player,
  *
  * @param player locked player instance
  * @param cat VIDEO_ES, AUDIO_ES or SPU_ES
+ * @return the number of newly track selected or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectPrevTrack(vlc_player_t *player,
                            enum es_format_category_e cat);
 
@@ -1601,18 +1625,19 @@ vlc_player_SelectPrevTrack(vlc_player_t *player,
  * @param player locked player instance
  * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
  * vlc_player_GetTrackAt())
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_UnselectEsId(vlc_player_t *player, vlc_es_id_t *es_id);
 
 /**
  * Helper to unselect a track
  */
-static inline void
+static inline int 
 vlc_player_UnselectTrack(vlc_player_t *player,
                          const struct vlc_player_track *track)
 {
-    vlc_player_UnselectEsId(player, track->es_id);
+    return vlc_player_UnselectEsId(player, track->es_id);
 }
 
 /**
@@ -1642,18 +1667,19 @@ vlc_player_UnselectTrackCategory(vlc_player_t *player,
  * @param player locked player instance
  * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
  * vlc_player_GetTrackAt())
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_RestartEsId(vlc_player_t *player, vlc_es_id_t *es_id);
 
 /**
  * Helper to restart a track
  */
-static inline void
+static inline int
 vlc_player_RestartTrack(vlc_player_t *player,
                         const struct vlc_player_track *track)
 {
-    vlc_player_RestartEsId(player, track->es_id);
+    return vlc_player_RestartEsId(player, track->es_id);
 }
 
 /**
@@ -1995,11 +2021,12 @@ vlc_player_HasTeletextMenu(vlc_player_t *player);
  *
  * @note A successful call will trigger the
  * vlc_player_cbs.on_teletext_enabled_changed event.
- * 
+ *
  * @param player locked player instance
  * @param enabled true to enable
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SetTeletextEnabled(vlc_player_t *player, bool enabled);
 
 /**
@@ -2026,8 +2053,9 @@ vlc_player_IsTeletextEnabled(vlc_player_t *player);
  *
  * @param player locked player instance
  * @param page a page in the range ]0;888] or a valid key
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SelectTeletextPage(vlc_player_t *player, unsigned page);
 
 /**
@@ -2050,8 +2078,9 @@ vlc_player_GetTeletextPage(vlc_player_t *player);
  *
  * @param player locked player instance
  * @param enabled true to enable
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SetTeletextTransparency(vlc_player_t *player, bool enabled);
 
 /**
@@ -2080,8 +2109,9 @@ vlc_player_IsTeletextTransparent(vlc_player_t *player);
  * @param player locked player instance
  * @param renderer a valid renderer item or NULL (to disable it), the item will
  * be held by the player
+ * @return VLC_SUCCESS or a VLC error code
  */
-VLC_API void
+VLC_API int
 vlc_player_SetRenderer(vlc_player_t *player, vlc_renderer_item_t *renderer);
 
 /**
diff --git a/src/player/input.c b/src/player/input.c
index 4ffe59522c..afb88ed1cd 100644
--- a/src/player/input.c
+++ b/src/player/input.c
@@ -794,10 +794,12 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
             const input_control_param_t param = {
                 .cat_delay = { i, cat_delays[i] }
             };
-            input_ControlPush(input->thread, INPUT_CONTROL_SET_CATEGORY_DELAY,
-                              &param);
-            vlc_player_SendEvent(player, on_category_delay_changed, i,
-                                 cat_delays[i]);
+            int ret = input_ControlPush(input->thread,
+                                        INPUT_CONTROL_SET_CATEGORY_DELAY,
+                                        &param);
+            if (ret == VLC_SUCCESS)
+                vlc_player_SendEvent(player, on_category_delay_changed, i,
+                                     cat_delays[i]);
         }
     }
     return input;
diff --git a/src/player/player.c b/src/player/player.c
index 0b1b031e0d..54b6d41aef 100644
--- a/src/player/player.c
+++ b/src/player/player.c
@@ -273,30 +273,32 @@ vlc_player_GetProgram(vlc_player_t *player, int id)
     return prgm;
 }
 
-void
+int
 vlc_player_SelectProgram(vlc_player_t *player, int id)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
+        return VLC_EGENERIC;
 
     const struct vlc_player_program *prgm =
         vlc_player_program_vector_FindById(&input->program_vector,
                                            id, NULL);
-    if (prgm)
-    {
-        input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_PROGRAM,
-                                &(vlc_value_t) { .i_int = id });
+    if (!prgm)
+        return VLC_EGENERIC;
+    int ret = input_ControlPushHelper(input->thread,
+                                      INPUT_CONTROL_SET_PROGRAM,
+                                      &(vlc_value_t) { .i_int = id });
+    if (ret == VLC_SUCCESS)
         vlc_player_osd_Program(player, prgm->name);
-    }
+    return ret;
 }
 
-static void
+static int
 vlc_player_CycleProgram(vlc_player_t *player, bool next)
 {
     size_t count = vlc_player_GetProgramCount(player);
     if (!count)
-        return;
+        return VLC_EGENERIC;
     size_t index = 0;
     bool selected = false;
     for (size_t i = 0; i < count; ++i)
@@ -322,19 +324,19 @@ vlc_player_CycleProgram(vlc_player_t *player, bool next)
     const struct vlc_player_program *prgm =
         vlc_player_GetProgramAt(player, index);
     assert(prgm);
-    vlc_player_SelectProgram(player, prgm->group_id);
+    return vlc_player_SelectProgram(player, prgm->group_id);
 }
 
-void
+int
 vlc_player_SelectNextProgram(vlc_player_t *player)
 {
-    vlc_player_CycleProgram(player, true);
+    return vlc_player_CycleProgram(player, true);
 }
 
-void
+int
 vlc_player_SelectPrevProgram(vlc_player_t *player)
 {
-    vlc_player_CycleProgram(player, false);
+    return vlc_player_CycleProgram(player, false);
 }
 
 size_t
@@ -429,7 +431,7 @@ vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout)
     return NULL;
 }
 
-unsigned
+int
 vlc_player_SelectEsIdList(vlc_player_t *player,
                           enum es_format_category_e cat,
                           vlc_es_id_t *const es_id_list[])
@@ -444,7 +446,7 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
 
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return 0;
+        return VLC_EGENERIC;
 
     const size_t max_tracks = max_tracks_by_cat[cat];
 
@@ -464,7 +466,7 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
         vlc_alloc(track_count + 1, sizeof(vlc_es_id_t *));
 
     if (allocated_ids == NULL)
-        return 0;
+        return VLC_ENOMEM;
 
     track_count = 0;
     for (size_t i = 0; es_id_list[i] != NULL; i++)
@@ -479,11 +481,13 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
     allocated_ids[track_count] = NULL;
 
     /* Attempt to select all the requested tracks */
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_ES_LIST,
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_ES_LIST,
         &(input_control_param_t) {
             .list.cat = cat,
             .list.ids = allocated_ids,
         });
+    if (ret != VLC_SUCCESS)
+        return ret;
 
     /* Display track selection message */
     const char *cat_name = es_format_category_to_string(cat);
@@ -517,20 +521,17 @@ vlc_player_SelectEsIdList(vlc_player_t *player,
     return track_count;
 }
 
-unsigned
+int
 vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *id,
                       enum vlc_player_select_policy policy)
 {
+    int ret;
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
         return 0;
 
     if (policy == VLC_PLAYER_SELECT_EXCLUSIVE)
-    {
-        input_ControlPushEsHelper(input->thread, INPUT_CONTROL_SET_ES, id);
-        vlc_player_osd_Track(player, id, true);
-        return 1;
-    }
+        goto select_one;
 
     /* VLC_PLAYER_SELECT_SIMULTANEOUS */
     const enum es_format_category_e cat = vlc_es_id_GetCat(id);
@@ -549,16 +550,12 @@ vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *id,
     }
 
     if (selected_track_count == 1)
-    {
-        input_ControlPushEsHelper(input->thread, INPUT_CONTROL_SET_ES, id);
-        vlc_player_osd_Track(player, id, true);
-        return 1;
-    }
+        goto select_one;
 
     vlc_es_id_t **es_id_list =
         vlc_alloc(selected_track_count + 1, sizeof(vlc_es_id_t*));
     if (!es_id_list)
-        return 0;
+        return VLC_ENOMEM;
 
     size_t es_id_list_idx = 0;
     /* Assure to select the requeste track */
@@ -573,18 +570,26 @@ vlc_player_SelectEsId(vlc_player_t *player, vlc_es_id_t *id,
     }
     es_id_list[selected_track_count] = NULL;
 
-    unsigned ret = vlc_player_SelectEsIdList(player, cat, es_id_list);
+    ret = vlc_player_SelectEsIdList(player, cat, es_id_list);
     free(es_id_list);
     return ret;
+
+select_one:
+    ret = input_ControlPushEsHelper(input->thread, INPUT_CONTROL_SET_ES, id);
+    if (ret != VLC_SUCCESS)
+        return ret;
+    vlc_player_osd_Track(player, id, true);
+    return 1;
+
 }
 
-static void
+static int
 vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e cat,
                       bool next)
 {
     size_t count = vlc_player_GetTrackCount(player, cat);
     if (!count)
-        return;
+        return 0;
 
     size_t index;
     bool selected = false;
@@ -599,7 +604,7 @@ vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e cat,
             {
                 /* Can't cycle through tracks if there are more than one
                  * selected */
-                return;
+                return VLC_EGENERIC;
             }
             index = i;
             selected = true;
@@ -624,43 +629,48 @@ vlc_player_CycleTrack(vlc_player_t *player, enum es_format_category_e cat,
     const struct vlc_player_track *track =
         vlc_player_GetTrackAt(player, cat, index);
     if (selected)
-        vlc_player_SelectTrack(player, track, VLC_PLAYER_SELECT_EXCLUSIVE);
+        return vlc_player_SelectTrack(player, track, VLC_PLAYER_SELECT_EXCLUSIVE);
     else
-        vlc_player_UnselectTrack(player, track);
+        return vlc_player_UnselectTrack(player, track);
 }
 
-void
+int
 vlc_player_SelectNextTrack(vlc_player_t *player,
                            enum es_format_category_e cat)
 {
-    vlc_player_CycleTrack(player, cat, true);
+    return vlc_player_CycleTrack(player, cat, true);
 }
 
-void
+int
 vlc_player_SelectPrevTrack(vlc_player_t *player,
                            enum es_format_category_e cat)
 {
-    vlc_player_CycleTrack(player, cat, false);
+    return vlc_player_CycleTrack(player, cat, false);
 }
 
-void
+int
 vlc_player_UnselectEsId(vlc_player_t *player, vlc_es_id_t *id)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
+        return VLC_EGENERIC;
 
-    input_ControlPushEsHelper(input->thread, INPUT_CONTROL_UNSET_ES, id);
-    vlc_player_osd_Track(player, id, false);
+    int ret = input_ControlPushEsHelper(input->thread, INPUT_CONTROL_UNSET_ES,
+                                        id);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Track(player, id, false);
+    return ret;
 }
 
-void
+int
 vlc_player_RestartEsId(vlc_player_t *player, vlc_es_id_t *id)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
+    if (!input)
+        return VLC_EGENERIC;
 
-    if (input)
-        input_ControlPushEsHelper(input->thread, INPUT_CONTROL_RESTART_ES, id);
+    return input_ControlPushEsHelper(input->thread, INPUT_CONTROL_RESTART_ES,
+                                     id);
 }
 
 void
@@ -698,41 +708,41 @@ vlc_player_GetCategoryLanguage(vlc_player_t *player,
     }
 }
 
-void
+int
 vlc_player_SetTeletextEnabled(vlc_player_t *player, bool enabled)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input || !input->teletext_menu)
-        return;
+        return VLC_EGENERIC;
     if (enabled)
-        vlc_player_SelectEsId(player, input->teletext_menu->t.es_id,
-                              VLC_PLAYER_SELECT_EXCLUSIVE);
+        return vlc_player_SelectEsId(player, input->teletext_menu->t.es_id,
+                                     VLC_PLAYER_SELECT_EXCLUSIVE);
     else
-        vlc_player_UnselectEsId(player, input->teletext_menu->t.es_id);
+        return vlc_player_UnselectEsId(player, input->teletext_menu->t.es_id);
 }
 
-void
+int
 vlc_player_SelectTeletextPage(vlc_player_t *player, unsigned page)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input || !input->teletext_menu)
-        return;
+        return VLC_EGENERIC;
 
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_VBI_PAGE,
+    return input_ControlPush(input->thread, INPUT_CONTROL_SET_VBI_PAGE,
         &(input_control_param_t) {
             .vbi_page.id = input->teletext_menu->t.es_id,
             .vbi_page.page = page,
     });
 }
 
-void
+int
 vlc_player_SetTeletextTransparency(vlc_player_t *player, bool enabled)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input || !input->teletext_menu)
-        return;
+        return VLC_EGENERIC;
 
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_VBI_TRANSPARENCY,
+    return input_ControlPush(input->thread, INPUT_CONTROL_SET_VBI_TRANSPARENCY,
         &(input_control_param_t) {
             .vbi_transparency.id = input->teletext_menu->t.es_id,
             .vbi_transparency.enabled = enabled,
@@ -801,52 +811,63 @@ vlc_player_GetTitleIdx(vlc_player_t *player,
     return -1;
 }
 
-void
+int
 vlc_player_SelectTitleIdx(vlc_player_t *player, size_t index)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    if (input)
-        input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_TITLE,
-                                &(vlc_value_t){ .i_int = index });
+    if (!input)
+        return VLC_EGENERIC;
+
+    return input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_TITLE,
+                                   &(vlc_value_t){ .i_int = index });
 }
 
-void
+int
 vlc_player_SelectTitle(vlc_player_t *player,
                        const struct vlc_player_title *title)
 {
     ssize_t idx = vlc_player_GetTitleIdx(player, title);
-    if (idx != -1)
-        vlc_player_SelectTitleIdx(player, idx);
+    if (idx == -1)
+        return VLC_EGENERIC;
+
+    return vlc_player_SelectTitleIdx(player, idx);
 }
 
-void
+int
 vlc_player_SelectChapter(vlc_player_t *player,
                          const struct vlc_player_title *title,
                          size_t chapter_idx)
 {
     ssize_t idx = vlc_player_GetTitleIdx(player, title);
-    if (idx != -1 && idx == vlc_player_GetSelectedTitleIdx(player))
-        vlc_player_SelectChapterIdx(player, chapter_idx);
+    if (idx == -1 || idx != vlc_player_GetSelectedTitleIdx(player))
+        return VLC_EGENERIC;
+    return vlc_player_SelectChapterIdx(player, chapter_idx);
 }
 
-void
+int
 vlc_player_SelectNextTitle(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_TITLE_NEXT, NULL);
-    vlc_player_osd_Message(player, _("Next title"));
+        return VLC_EGENERIC;
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_TITLE_NEXT,
+                                NULL);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Next title"));
+    return ret;
 }
 
-void
+int
 vlc_player_SelectPrevTitle(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_TITLE_PREV, NULL);
-    vlc_player_osd_Message(player, _("Previous title"));
+        return VLC_EGENERIC;
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_TITLE_PREV,
+                                NULL);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Previous title"));
+    return ret;
 }
 
 ssize_t
@@ -859,35 +880,43 @@ vlc_player_GetSelectedChapterIdx(vlc_player_t *player)
     return input->chapter_selected;
 }
 
-void
+int
 vlc_player_SelectChapterIdx(vlc_player_t *player, size_t index)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_SEEKPOINT,
-                            &(vlc_value_t){ .i_int = index });
-    vlc_player_osd_Message(player, _("Chapter %ld"), index);
+        return VLC_EGENERIC;
+    int ret = input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_SEEKPOINT,
+                                      &(vlc_value_t){ .i_int = index });
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Chapter %ld"), index);
+    return ret;
 }
 
-void
+int
 vlc_player_SelectNextChapter(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_SEEKPOINT_NEXT, NULL);
-    vlc_player_osd_Message(player, _("Next chapter"));
+        return VLC_EGENERIC;
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_SEEKPOINT_NEXT,
+                                NULL);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Next chapter"));
+    return ret;
 }
 
-void
+int
 vlc_player_SelectPrevChapter(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_SEEKPOINT_PREV, NULL);
-    vlc_player_osd_Message(player, _("Previous chapter"));
+        return VLC_EGENERIC;
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_SEEKPOINT_PREV,
+                                NULL);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Previous chapter"));
+    return ret;
 }
 
 void
@@ -1031,7 +1060,11 @@ vlc_player_AddAssociatedMedia(vlc_player_t *player,
     slave->b_forced = select;
 
     vlc_value_t val = { .p_address = slave };
-    input_ControlPushHelper(input->thread, INPUT_CONTROL_ADD_SLAVE, &val);
+    int ret = input_ControlPushHelper(input->thread, INPUT_CONTROL_ADD_SLAVE,
+                                      &val);
+    if (ret != VLC_SUCCESS)
+        return ret;
+
     if (notify)
     {
         switch( type )
@@ -1166,40 +1199,46 @@ vlc_player_SetStartPaused(vlc_player_t *player, bool start_paused)
     player->start_paused = start_paused;
 }
 
-static void
+static int
 vlc_player_SetPause(vlc_player_t *player, bool pause)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
 
     if (!input || !input->started)
-        return;
+        return VLC_EGENERIC;
 
     vlc_value_t val = { .i_int = pause ? PAUSE_S : PLAYING_S };
-    input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_STATE, &val);
+    int ret = input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_STATE,
+                                      &val);
 
-    vlc_player_osd_Icon(player, pause ? OSD_PAUSE_ICON : OSD_PLAY_ICON);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Icon(player, pause ? OSD_PAUSE_ICON : OSD_PLAY_ICON);
+    return ret;
 }
 
-void
+int
 vlc_player_Pause(vlc_player_t *player)
 {
-    vlc_player_SetPause(player, true);
+    return vlc_player_SetPause(player, true);
 }
 
-void
+int 
 vlc_player_Resume(vlc_player_t *player)
 {
-    vlc_player_SetPause(player, false);
+    return vlc_player_SetPause(player, false);
 }
 
-void
+int
 vlc_player_NextVideoFrame(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_FRAME_NEXT, NULL);
-    vlc_player_osd_Message(player, _("Next frame"));
+        return VLC_EGENERIC;
+    int ret = input_ControlPushHelper(input->thread,
+                                      INPUT_CONTROL_SET_FRAME_NEXT, NULL);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, _("Next frame"));
+    return ret;
 }
 
 enum vlc_player_state
@@ -1233,29 +1272,29 @@ vlc_player_GetRate(vlc_player_t *player)
         return var_GetFloat(player, "rate");
 }
 
-void
+int
 vlc_player_ChangeRate(vlc_player_t *player, float rate)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
 
     if (rate == 0.0)
-        return;
+        return VLC_EGENERIC;
 
     /* Save rate accross inputs */
     var_SetFloat(player, "rate", rate);
 
-    if (input)
-    {
-        input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_RATE,
-            &(vlc_value_t) { .f_float = rate });
-    }
-    else
+    /* The event is sent from the thread processing the control */
+    if (input
+     && input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_RATE,
+                                &(vlc_value_t) { .f_float = rate }) == VLC_SUCCESS)
+        vlc_player_osd_Message(player, ("Speed: %.2fx"), rate);
+    else /* Send the event anyway since it's a global state */
         vlc_player_SendEvent(player, on_rate_changed, rate);
 
-    vlc_player_osd_Message(player, ("Speed: %.2fx"), rate);
+    return VLC_SUCCESS;
 }
 
-static void
+static int
 vlc_player_ChangeRateOffset(vlc_player_t *player, bool increment)
 {
     static const float rates[] = {
@@ -1276,19 +1315,19 @@ vlc_player_ChangeRateOffset(vlc_player_t *player, bool increment)
         }
     }
 
-    vlc_player_ChangeRate(player, rate);
+    return vlc_player_ChangeRate(player, rate);
 }
 
-void
+int
 vlc_player_IncrementRate(vlc_player_t *player)
 {
-    vlc_player_ChangeRateOffset(player, true);
+    return vlc_player_ChangeRateOffset(player, true);
 }
 
-void
+int 
 vlc_player_DecrementRate(vlc_player_t *player)
 {
-    vlc_player_ChangeRateOffset(player, false);
+    return vlc_player_ChangeRateOffset(player, false);
 }
 
 vlc_tick_t
@@ -1340,7 +1379,7 @@ vlc_player_DisplayPosition(vlc_player_t *player)
                                 VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
-void
+int
 vlc_player_SeekByPos(vlc_player_t *player, float position,
                      enum vlc_player_seek_speed speed,
                      enum vlc_player_whence whence)
@@ -1349,22 +1388,24 @@ vlc_player_SeekByPos(vlc_player_t *player, float position,
 
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
+        return VLC_EGENERIC;
 
     const int type =
         whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_POSITION
                                              : INPUT_CONTROL_JUMP_POSITION;
-    input_ControlPush(input->thread, type,
+    int ret = input_ControlPush(input->thread, type,
         &(input_control_param_t) {
             .pos.f_val = position,
             .pos.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
     });
 
-    vlc_player_osd_Position(player, input, VLC_TICK_INVALID, position,
-                                   whence);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Position(player, input, VLC_TICK_INVALID, position,
+                                whence);
+    return ret;
 }
 
-void
+int
 vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
                       enum vlc_player_seek_speed speed,
                       enum vlc_player_whence whence)
@@ -1373,21 +1414,23 @@ vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
 
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
+        return VLC_EGENERIC;
 
     const int type =
         whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_TIME
                                              : INPUT_CONTROL_JUMP_TIME;
-    input_ControlPush(input->thread, type,
+    int ret = input_ControlPush(input->thread, type,
         &(input_control_param_t) {
             .time.i_val = time,
             .time.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
     });
 
-    vlc_player_osd_Position(player, input, time, -1, whence);
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Position(player, input, time, -1, whence);
+    return ret;
 }
 
-void
+int 
 vlc_player_SetRenderer(vlc_player_t *player, vlc_renderer_item_t *renderer)
 {
     vlc_player_assert_locked(player);
@@ -1405,6 +1448,7 @@ vlc_player_SetRenderer(vlc_player_t *player, vlc_renderer_item_t *renderer)
                                 &val);
     }
     vlc_player_SendEvent(player, on_renderer_changed, player->renderer);
+    return VLC_SUCCESS;
 }
 
 vlc_renderer_item_t *
@@ -1494,13 +1538,13 @@ vlc_player_GetAtoBLoop(vlc_player_t *player, vlc_tick_t *a_time, float *a_pos,
     return VLC_PLAYER_ABLOOP_B;
 }
 
-void
+int
 vlc_player_Navigate(vlc_player_t *player, enum vlc_player_nav nav)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
 
     if (!input)
-        return;
+        return VLC_EGENERIC;
 
     enum input_control_e control;
     switch (nav)
@@ -1529,25 +1573,25 @@ vlc_player_Navigate(vlc_player_t *player, enum vlc_player_nav nav)
         default:
             vlc_assert_unreachable();
     }
-    input_ControlPushHelper(input->thread, control, NULL);
+    return input_ControlPushHelper(input->thread, control, NULL);
 }
 
-void
+int
 vlc_player_UpdateViewpoint(vlc_player_t *player,
                            const vlc_viewpoint_t *viewpoint,
                            enum vlc_player_whence whence)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    if (input)
-    {
-        input_control_param_t param = { .viewpoint = *viewpoint };
-        if (whence == VLC_PLAYER_WHENCE_ABSOLUTE)
-            input_ControlPush(input->thread, INPUT_CONTROL_SET_VIEWPOINT,
-                              &param);
-        else
-            input_ControlPush(input->thread, INPUT_CONTROL_UPDATE_VIEWPOINT,
-                              &param);
-    }
+    if (!input)
+        return VLC_EGENERIC;
+
+    input_control_param_t param = { .viewpoint = *viewpoint };
+    if (whence == VLC_PLAYER_WHENCE_ABSOLUTE)
+        return input_ControlPush(input->thread, INPUT_CONTROL_SET_VIEWPOINT,
+                                 &param);
+    else
+        return input_ControlPush(input->thread, INPUT_CONTROL_UPDATE_VIEWPOINT,
+                                 &param);
 }
 
 bool
@@ -1558,17 +1602,20 @@ vlc_player_IsRecording(vlc_player_t *player)
     return input ? input->recording : false;
 }
 
-void
+int
 vlc_player_SetRecordingEnabled(vlc_player_t *player, bool enable)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
-        return;
-    input_ControlPushHelper(input->thread, INPUT_CONTROL_SET_RECORD_STATE,
-                            &(vlc_value_t) { .b_bool = enable });
+        return VLC_EGENERIC;
+    int ret = input_ControlPushHelper(input->thread,
+                                      INPUT_CONTROL_SET_RECORD_STATE,
+                                      &(vlc_value_t) { .b_bool = enable });
 
-    vlc_player_osd_Message(player, enable ?
-                           _("Recording") : _("Recording done"));
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Message(player, enable ?
+                               _("Recording") : _("Recording done"));
+    return ret;
 }
 
 int
@@ -1593,12 +1640,16 @@ vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat,
     }
 
     const input_control_param_t param = { .cat_delay = { cat, delay } };
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_CATEGORY_DELAY, &param);
-    vlc_player_osd_Message(player, _("%s delay: %i ms"),
-                           es_format_category_to_string(cat),
-                           (int)MS_FROM_VLC_TICK(delay));
-    vlc_player_SendEvent(player, on_category_delay_changed, cat, delay);
-    return VLC_SUCCESS;
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_CATEGORY_DELAY,
+                                &param);
+    if (ret == VLC_SUCCESS)
+    {
+        vlc_player_osd_Message(player, _("%s delay: %i ms"),
+                               es_format_category_to_string(cat),
+                               (int)MS_FROM_VLC_TICK(delay));
+        vlc_player_SendEvent(player, on_category_delay_changed, cat, delay);
+    }
+    return ret;
 }
 
 vlc_tick_t
@@ -1640,14 +1691,18 @@ vlc_player_SetEsIdDelay(vlc_player_t *player, vlc_es_id_t *es_id,
     }
 
     const input_control_param_t param = { .es_delay = { es_id, delay } };
-    input_ControlPush(input->thread, INPUT_CONTROL_SET_ES_DELAY, &param);
-    if (delay != INT64_MAX)
-        vlc_player_osd_Message(player, _("%s delay: %i ms"),
-                               trackpriv->t.name,
-                               (int)MS_FROM_VLC_TICK(delay));
-    vlc_player_SendEvent(player, on_track_delay_changed, es_id, delay);
+    int ret = input_ControlPush(input->thread, INPUT_CONTROL_SET_ES_DELAY,
+                                &param);
+    if (ret == VLC_SUCCESS)
+    {
+        if (delay != INT64_MAX)
+            vlc_player_osd_Message(player, _("%s delay: %i ms"),
+                                   trackpriv->t.name,
+                                   (int)MS_FROM_VLC_TICK(delay));
+        vlc_player_SendEvent(player, on_track_delay_changed, es_id, delay);
+    }
 
-    return VLC_SUCCESS;
+    return ret;
 }
 
 vlc_tick_t
-- 
2.20.1




More information about the vlc-devel mailing list