diff --git a/include/vlc_player.h b/include/vlc_player.h index 403f405d521c2fb2feba76d3d43fcb29a3d7d02b..5b7a2fe9a87b3ea6e6f07dae935fe4b62c6a9061 100644 --- a/include/vlc_player.h +++ b/include/vlc_player.h @@ -281,8 +281,7 @@ enum vlc_player_seek_speed * * @see vlc_player_SeekByPos() * @see vlc_player_SeekByTime() - * @see vlc_player_SetAudioDelay() - * @see vlc_player_SetSubtitleDelay() + * @see vlc_player_SetCategoryDelay() */ enum vlc_player_whence { @@ -671,28 +670,17 @@ struct vlc_player_cbs bool enabled, void *data); /** - * Called when the player audio delay has changed + * Called when the player category delay has changed * - * @see vlc_player_SetAudioDelay() + * @see vlc_player_SetCategoryDelay() * * @param player locked player instance + * @param cat AUDIO_ES or SPU_ES * @param new_delay audio delay * @param data opaque pointer set by vlc_player_AddListener() */ - void (*on_audio_delay_changed)(vlc_player_t *player, - vlc_tick_t new_delay, void *data); - - /** - * Called when the player subtitle delay has changed - * - * @see vlc_player_SetSubtitleDelay() - * - * @param player locked player instance - * @param new_delay subtitle delay - * @param data opaque pointer set by vlc_player_AddListener() - */ - void (*on_subtitle_delay_changed)(vlc_player_t *player, - vlc_tick_t new_delay, void *data); + void (*on_category_delay_changed)(vlc_player_t *player, + enum es_format_category_e cat, vlc_tick_t new_delay, void *data); /** * Called when associated subtitle has changed @@ -2404,52 +2392,71 @@ vlc_player_ToggleRecording(vlc_player_t *player) } /** - * Get the audio delay for the current media + * Get the delay of a category * - * @see vlc_player_cbs.on_audio_delay_changed + * @see vlc_player_cbs.on_category_delay_changed * * @param player locked player instance + * @param cat AUDIO_ES or SPU_ES (VIDEO_ES not supported yet) + * @return a valid delay or 0 */ VLC_API vlc_tick_t -vlc_player_GetAudioDelay(vlc_player_t *player); +vlc_player_GetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat); /** - * Set the audio delay for the current media + * Set the delay of one category for the current media * * @note A successful call will trigger the - * vlc_player_cbs.on_audio_delay_changed event. + * vlc_player_cbs.on_category_delay_changed event. * * @param player locked player instance + * @param cat AUDIO_ES or SPU_ES (VIDEO_ES not supported yet) * @param delay a valid time * @param whence absolute or relative + * @return VLC_SUCCESS or VLC_EGENERIC if the category is not handled */ -VLC_API void +VLC_API int +vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat, + vlc_tick_t delay, enum vlc_player_whence whence); + +/** + * Helper to get the audio delay + */ +static inline vlc_tick_t +vlc_player_GetAudioDelay(vlc_player_t *player) +{ + return vlc_player_GetCategoryDelay(player, AUDIO_ES); +} + +/** + * Helper to set the audio delay + */ +static inline void vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay, - enum vlc_player_whence whence); + enum vlc_player_whence whence) + +{ + vlc_player_SetCategoryDelay(player, AUDIO_ES, delay, whence); +} /** - * Get the subtitle delay for the current media - * - * @see vlc_player_cbs.on_subtitle_delay_changed - * - * @param player locked player instance + * Helper to get the subtitle delay */ -VLC_API vlc_tick_t -vlc_player_GetSubtitleDelay(vlc_player_t *player); +static inline vlc_tick_t +vlc_player_GetSubtitleDelay(vlc_player_t *player) +{ + return vlc_player_GetCategoryDelay(player, SPU_ES); +} /** - * Set the subtitle delay for the current media - * - * @note A successful call will trigger the - * vlc_player_cbs.on_subtitle_delay_changed event. - * - * @param player locked player instance - * @param delay a valid time - * @param whence absolute or relative + * Helper to set the subtitle delay */ -VLC_API void +static inline void vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay, - enum vlc_player_whence whence); + enum vlc_player_whence whence) +{ + vlc_player_SetCategoryDelay(player, SPU_ES, delay, whence); +} /** * Set the subtitle text scaling factor diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m index 04f71258d0b7ee3e9aabf833918c5f6eee2afc4f..a3478417aef77fedf3f4177c4ed297f839e84173 100644 --- a/modules/gui/macosx/playlist/VLCPlayerController.m +++ b/modules/gui/macosx/playlist/VLCPlayerController.m @@ -284,21 +284,23 @@ static void cb_player_teletext_transparency_changed(vlc_player_t *p_player, bool }); } -static void cb_player_audio_delay_changed(vlc_player_t *p_player, vlc_tick_t newDelay, void *p_data) +static void cb_player_category_delay_changed(vlc_player_t *p_player, enum es_format_category_e cat, + vlc_tick_t newDelay, void *p_data) { VLC_UNUSED(p_player); dispatch_async(dispatch_get_main_queue(), ^{ VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data; - [playerController audioDelayChanged:newDelay]; - }); -} - -static void cb_player_subtitle_delay_changed(vlc_player_t *p_player, vlc_tick_t newDelay, void *p_data) -{ - VLC_UNUSED(p_player); - dispatch_async(dispatch_get_main_queue(), ^{ - VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data; - [playerController subtitlesDelayChanged:newDelay]; + switch (cat) + { + case AUDIO_ES: + [playerController audioDelayChanged:newDelay]; + break; + case SPU_ES: + [playerController subtitlesDelayChanged:newDelay]; + break; + default: + vlc_assert_unreachable(); + } }); } @@ -464,8 +466,7 @@ static const struct vlc_player_cbs player_callbacks = { cb_player_teletext_enabled_changed, cb_player_teletext_page_changed, cb_player_teletext_transparency_changed, - cb_player_audio_delay_changed, - cb_player_subtitle_delay_changed, + cb_player_category_delay_changed, cb_player_associated_subs_fps_changed, cb_player_renderer_changed, cb_player_record_changed, diff --git a/modules/gui/qt/components/player_controller.cpp b/modules/gui/qt/components/player_controller.cpp index 3e386daf69d57fbfbbe3e0e67655e358bbe69ab0..aeb5954cfabe8beec71432ba8303178f69276911 100644 --- a/modules/gui/qt/components/player_controller.cpp +++ b/modules/gui/qt/components/player_controller.cpp @@ -579,25 +579,25 @@ static void on_player_teletext_transparency_changed(vlc_player_t *, bool enabled }); } -static void on_player_audio_delay_changed(vlc_player_t *, vlc_tick_t new_delay, +static void on_player_category_delay_changed(vlc_player_t *, + enum es_format_category_e cat, vlc_tick_t new_delay, void *data) { PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data); - msg_Dbg( that->p_intf, "on_player_audio_delay_changed"); - that->callAsync([that,new_delay] (){ - that->m_audioDelay = new_delay; - emit that->q_func()->audioDelayChanged( new_delay ); - }); -} - -static void on_player_subtitle_delay_changed(vlc_player_t *, vlc_tick_t new_delay, - void *data) -{ - PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data); - msg_Dbg( that->p_intf, "on_player_subtitle_delay_changed"); - that->callAsync([that,new_delay] (){ - that->m_subtitleDelay = new_delay; - emit that->q_func()->subtitleDelayChanged( new_delay ); + msg_Dbg( that->p_intf, "on_player_category_delay_changed: %d", cat ); + that->callAsync([that,cat,new_delay] (){ + switch (cat) + { + case AUDIO_ES: + that->m_audioDelay = new_delay; + emit that->q_func()->audioDelayChanged( new_delay ); + break; + case SPU_ES: + that->m_subtitleDelay = new_delay; + emit that->q_func()->subtitleDelayChanged( new_delay ); + break; + default: vlc_assert_unreachable(); + } }); } @@ -819,8 +819,7 @@ static const struct vlc_player_cbs player_cbs = { on_player_teletext_enabled_changed, on_player_teletext_page_changed, on_player_teletext_transparency_changed, - on_player_audio_delay_changed, - on_player_subtitle_delay_changed, + on_player_category_delay_changed, on_player_associated_subs_fps_changed, on_player_renderer_changed, on_player_record_changed, diff --git a/src/input/player.c b/src/input/player.c index cdb170f167c503846ac3f551e5f5bd46cfce69e1..35c6b554b524e02928ab5080eb227f0f6b497e92 100644 --- a/src/input/player.c +++ b/src/input/player.c @@ -2053,12 +2053,12 @@ input_thread_Events(input_thread_t *input_thread, break; case INPUT_EVENT_AUDIO_DELAY: input->audio_delay = event->audio_delay; - vlc_player_SendEvent(player, on_audio_delay_changed, + vlc_player_SendEvent(player, on_category_delay_changed, AUDIO_ES, input->audio_delay); break; case INPUT_EVENT_SUBTITLE_DELAY: input->subtitle_delay = event->subtitle_delay; - vlc_player_SendEvent(player, on_subtitle_delay_changed, + vlc_player_SendEvent(player, on_category_delay_changed, SPU_ES, input->subtitle_delay); break; case INPUT_EVENT_CACHE: @@ -2823,62 +2823,61 @@ vlc_player_SetRecordingEnabled(vlc_player_t *player, bool enable) _("Recording") : _("Recording done")); } -void -vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay, - enum vlc_player_whence whence) +int +vlc_player_SetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat, + vlc_tick_t delay, enum vlc_player_whence whence) { bool absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE; struct vlc_player_input *input = vlc_player_get_input_locked(player); if (!input) - return; + return VLC_EGENERIC; - input_ControlPush(input->thread, INPUT_CONTROL_SET_AUDIO_DELAY, - &(input_control_param_t) { - .delay = { - .b_absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE, - .i_val = delay, - }, - }); + switch (cat) + { + case AUDIO_ES: + input_ControlPush(input->thread, INPUT_CONTROL_SET_AUDIO_DELAY, + &(input_control_param_t) { + .delay = { + .b_absolute = absolute, + .i_val = delay, + }, + }); + break; + case SPU_ES: + input_ControlPush(input->thread, INPUT_CONTROL_SET_SPU_DELAY, + &(input_control_param_t) { + .delay = { + .b_absolute = absolute, + .i_val = delay, + }, + }); + break; + default: + return VLC_EGENERIC; + } - if (!absolute) - delay += input->audio_delay; - vlc_player_vout_OSDMessage(player, _("Audio delay: %i ms"), + vlc_player_vout_OSDMessage(player, _("%s delay: %s%i ms"), + es_format_category_to_string(cat), + absolute ? "" : "+", (int)MS_FROM_VLC_TICK(delay)); + return VLC_SUCCESS; } vlc_tick_t -vlc_player_GetAudioDelay(vlc_player_t *player) +vlc_player_GetCategoryDelay(vlc_player_t *player, enum es_format_category_e cat) { - struct vlc_player_input *input = vlc_player_get_input_locked(player); - return input ? input->audio_delay : 0; -} - -static void -vlc_player_SetSubtitleDelayInternal(vlc_player_t *player, vlc_tick_t delay, - enum vlc_player_whence whence) -{ - bool absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE; struct vlc_player_input *input = vlc_player_get_input_locked(player); if (!input) - return; - - input_ControlPush(input->thread, INPUT_CONTROL_SET_SPU_DELAY, - &(input_control_param_t) { - .delay = { - .b_absolute = absolute, - .i_val = delay, - }, - }); -} - -void -vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay, - enum vlc_player_whence whence) -{ - vlc_player_SetSubtitleDelayInternal(player, delay, whence); - vlc_player_vout_OSDMessage(player, _("Subtitle delay: %s%i ms"), - whence == VLC_PLAYER_WHENCE_ABSOLUTE ? "" : "+", - (int)MS_FROM_VLC_TICK(delay)); + return 0; + switch (cat) + { + case AUDIO_ES: + return input->audio_delay; + case SPU_ES: + return input->subtitle_delay; + default: + return 0; + } } static struct { @@ -2931,13 +2930,6 @@ vlc_player_GetSubtitleTextScale(vlc_player_t *player) return var_GetInteger(player, "sub-text-scale"); } -vlc_tick_t -vlc_player_GetSubtitleDelay(vlc_player_t *player) -{ - struct vlc_player_input *input = vlc_player_get_input_locked(player); - return input ? input->subtitle_delay : 0; -} - int vlc_player_GetSignal(vlc_player_t *player, float *quality, float *strength) { diff --git a/src/libvlccore.sym b/src/libvlccore.sym index 8cca2bbc01ae7e565df52d0535428a02c424c1e8..0cfe87f88cd6ec02d2cd14db298f954fe1760f09 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -783,8 +783,8 @@ vlc_player_CondWait vlc_player_DisplayPosition vlc_player_DecrementRate vlc_player_Delete -vlc_player_GetAudioDelay vlc_player_GetCapabilities +vlc_player_GetCategoryDelay vlc_player_GetCategoryLanguage vlc_player_GetCurrentMedia vlc_player_GetError @@ -801,7 +801,6 @@ vlc_player_GetSelectedTitleIdx vlc_player_GetSignal vlc_player_GetState vlc_player_GetStatistics -vlc_player_GetSubtitleDelay vlc_player_GetSubtitleTextScale vlc_player_GetTeletextPage vlc_player_GetTime @@ -848,13 +847,12 @@ vlc_player_SelectTitleIdx vlc_player_SelectTrack vlc_player_SetAssociatedSubsFPS vlc_player_SetAtoBLoop -vlc_player_SetAudioDelay +vlc_player_SetCategoryDelay vlc_player_SetCurrentMedia vlc_player_SetMediaStoppedAction vlc_player_SetRecordingEnabled vlc_player_SetRenderer vlc_player_SetStartPaused -vlc_player_SetSubtitleDelay vlc_player_SetSubtitleTextScale vlc_player_SetTeletextEnabled vlc_player_SetTeletextTransparency diff --git a/test/src/input/player.c b/test/src/input/player.c index 2c031f83a465df0d8c336df734f525592a2b7aaf..e467f60073afa2c7b7e69f6a9102fa35f82f9111 100644 --- a/test/src/input/player.c +++ b/test/src/input/player.c @@ -104,8 +104,7 @@ struct report_media_subitems X(vlc_player_title_list *, on_titles_changed) \ X(size_t, on_title_selection_changed) \ X(struct report_chapter_selection, on_chapter_selection_changed) \ - X(vlc_tick_t, on_audio_delay_changed) \ - X(vlc_tick_t, on_subtitle_delay_changed) \ + X(vlc_tick_t, on_category_delay_changed) \ X(bool, on_recording_changed) \ X(struct report_signal, on_signal_changed) \ X(struct input_stats_t, on_statistics_changed) \ @@ -389,19 +388,11 @@ player_on_chapter_selection_changed(vlc_player_t *player, } static void -player_on_audio_delay_changed(vlc_player_t *player, vlc_tick_t new_delay, +player_on_category_delay_changed(vlc_player_t *player, vlc_tick_t new_delay, void *data) { struct ctx *ctx = get_ctx(player, data); - VEC_PUSH(on_audio_delay_changed, new_delay); -} - -static void -player_on_subtitle_delay_changed(vlc_player_t *player, vlc_tick_t new_delay, - void *data) -{ - struct ctx *ctx = get_ctx(player, data); - VEC_PUSH(on_subtitle_delay_changed, new_delay); + VEC_PUSH(on_category_delay_changed, new_delay); } static void