[vlc-devel] [PATCH 07/10] Hotkey support for secondary subtitles (Part 2) - Secondary subtitle delay
Roland Bewick
roland.bewick at gmail.com
Sun May 5 12:01:47 CEST 2019
TODO in player controller will be addressed in a later commit.
---
include/vlc_input.h | 8 +++-
include/vlc_player.h | 8 ++--
modules/control/hotkeys.c | 3 +-
.../gui/macosx/playlist/VLCPlayerController.m | 3 +-
.../gui/qt/components/player_controller.cpp | 21 +++++++---
modules/lua/libs/input.c | 5 ++-
src/input/decoder.c | 6 +++
src/input/decoder.h | 1 +
src/input/es_out.c | 22 +++++++----
src/input/es_out.h | 6 ++-
src/input/event.h | 5 ++-
src/input/input.c | 27 ++++++++-----
src/input/input_internal.h | 3 +-
src/input/player.c | 38 ++++++++++++-------
src/input/var.c | 12 +++++-
15 files changed, 117 insertions(+), 51 deletions(-)
diff --git a/include/vlc_input.h b/include/vlc_input.h
index e6bd8440e3..08cffa0c77 100644
--- a/include/vlc_input.h
+++ b/include/vlc_input.h
@@ -477,6 +477,12 @@ struct vlc_input_event_vout
vout_thread_t *vout;
};
+struct vlc_input_event_subtitle_delay
+{
+ vlc_tick_t i_delay;
+ bool b_secondary;
+};
+
struct vlc_input_event
{
input_event_type_e type;
@@ -509,7 +515,7 @@ struct vlc_input_event
/* INPUT_EVENT_AUDIO_DELAY */
vlc_tick_t audio_delay;
/* INPUT_EVENT_SUBTITLE_DELAY */
- vlc_tick_t subtitle_delay;
+ struct vlc_input_event_subtitle_delay subtitle_delay;
/* INPUT_EVENT_CACHE */
float cache;
/* INPUT_EVENT_VOUT */
diff --git a/include/vlc_player.h b/include/vlc_player.h
index f1f43b7478..d9aeb6dc22 100644
--- a/include/vlc_player.h
+++ b/include/vlc_player.h
@@ -688,7 +688,7 @@ struct vlc_player_cbs
* @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);
+ vlc_tick_t new_delay, bool b_secondary, void *data);
/**
* Called when associated subtitle has changed
@@ -2371,9 +2371,10 @@ vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay,
* @see vlc_player_cbs.on_subtitle_delay_changed
*
* @param player locked player instance
+ * @param b_secondary retrieve delay for secondary subtitle track
*/
VLC_API vlc_tick_t
-vlc_player_GetSubtitleDelay(vlc_player_t *player);
+vlc_player_GetSubtitleDelay(vlc_player_t *player, bool b_secondary);
/**
* Set subtitle synchronisation
@@ -2404,10 +2405,11 @@ vlc_player_SetSubtitleSync(vlc_player_t *player,
* @param player locked player instance
* @param delay a valid time
* @param whence absolute or relative
+ * @param b_secondary apply to secondary subtitle track
*/
VLC_API void
vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay,
- enum vlc_player_whence whence);
+ enum vlc_player_whence whence, bool b_secondary);
/**
* Set the subtitle text scaling factor
diff --git a/modules/control/hotkeys.c b/modules/control/hotkeys.c
index d520d8a7ed..34901e2f07 100644
--- a/modules/control/hotkeys.c
+++ b/modules/control/hotkeys.c
@@ -390,7 +390,8 @@ PLAYER_ACTION_HANDLER(Delay)
if (type == AUDIODELAY)
vlc_player_SetAudioDelay(player, delta, whence);
else
- vlc_player_SetSubtitleDelay(player, delta, whence);
+ vlc_player_SetSubtitleDelay(player, delta, whence,
+ b_control_secondary_subtitles);
}
static inline float
diff --git a/modules/gui/macosx/playlist/VLCPlayerController.m b/modules/gui/macosx/playlist/VLCPlayerController.m
index 01b997faed..2a6a0b3f09 100644
--- a/modules/gui/macosx/playlist/VLCPlayerController.m
+++ b/modules/gui/macosx/playlist/VLCPlayerController.m
@@ -1263,7 +1263,8 @@ static const struct vlc_player_aout_cbs player_aout_callbacks = {
- (void)setSubtitlesDelay:(vlc_tick_t)subtitlesDelay
{
vlc_player_Lock(_p_player);
- vlc_player_SetSubtitleDelay(_p_player, subtitlesDelay, VLC_PLAYER_WHENCE_ABSOLUTE);
+ vlc_player_SetSubtitleDelay(_p_player, subtitlesDelay,
+ VLC_PLAYER_WHENCE_ABSOLUTE, false);
vlc_player_Unlock(_p_player);
}
diff --git a/modules/gui/qt/components/player_controller.cpp b/modules/gui/qt/components/player_controller.cpp
index 6104063a8d..dfaf07dccd 100644
--- a/modules/gui/qt/components/player_controller.cpp
+++ b/modules/gui/qt/components/player_controller.cpp
@@ -587,13 +587,21 @@ static void on_player_audio_delay_changed(vlc_player_t *, vlc_tick_t new_delay,
}
static void on_player_subtitle_delay_changed(vlc_player_t *, vlc_tick_t new_delay,
- void *data)
+ bool b_secondary, 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_subtitle_delay_changed %d",
+ b_secondary);
+ that->callAsync([that,new_delay,b_secondary] (){
+ if (!b_secondary)
+ {
+ that->m_subtitleDelay = new_delay;
+ emit that->q_func()->subtitleDelayChanged( new_delay );
+ }
+ else
+ {
+ // TODO: Support dual subtitles
+ }
});
}
@@ -1045,7 +1053,8 @@ void PlayerController::setSubtitleDelay(VLCTick delay)
{
Q_D(PlayerController);
vlc_player_locker lock{ d->m_player };
- vlc_player_SetSubtitleDelay( d->m_player, delay, VLC_PLAYER_WHENCE_ABSOLUTE );
+ vlc_player_SetSubtitleDelay( d->m_player, delay,
+ VLC_PLAYER_WHENCE_ABSOLUTE, false );
}
void PlayerController::setSubtitleFPS(float fps)
diff --git a/modules/lua/libs/input.c b/modules/lua/libs/input.c
index ac69f1f7b7..31459ded05 100644
--- a/modules/lua/libs/input.c
+++ b/modules/lua/libs/input.c
@@ -491,7 +491,7 @@ static int vlclua_player_get_subtitle_delay(lua_State *L)
vlc_player_t *player = vlclua_get_player_internal(L);
vlc_player_Lock(player);
- vlc_tick_t delay = vlc_player_GetSubtitleDelay(player);
+ vlc_tick_t delay = vlc_player_GetSubtitleDelay(player, false);
vlc_player_Unlock(player);
double delay_sec = secf_from_vlc_tick(delay);
@@ -508,7 +508,8 @@ static int vlclua_player_set_subtitle_delay(lua_State *L)
vlc_tick_t delay = vlc_tick_from_sec(delay_sec);
vlc_player_Lock(player);
- vlc_player_SetSubtitleDelay(player, delay, VLC_PLAYER_WHENCE_ABSOLUTE);
+ vlc_player_SetSubtitleDelay(player, delay,
+ VLC_PLAYER_WHENCE_ABSOLUTE, false);
vlc_player_Unlock(player);
return 0;
diff --git a/src/input/decoder.c b/src/input/decoder.c
index b699e52a67..f85c6e4e33 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -2389,6 +2389,12 @@ int input_DecoderSetSecondary( decoder_t *dec, bool b_secondary )
return VLC_SUCCESS;
}
+bool input_DecoderIsSecondary( decoder_t *dec )
+{
+ struct decoder_owner *p_owner = dec_get_owner( dec );
+ return p_owner->b_secondary;
+}
+
void input_DecoderChangePause( decoder_t *p_dec, bool b_paused, vlc_tick_t i_date )
{
struct decoder_owner *p_owner = dec_get_owner( p_dec );
diff --git a/src/input/decoder.h b/src/input/decoder.h
index 8fdb9c174b..43a8a1159e 100644
--- a/src/input/decoder.h
+++ b/src/input/decoder.h
@@ -115,6 +115,7 @@ size_t input_DecoderGetFifoSize( decoder_t *p_dec );
* and synchronization for dual subtitles.
*/
int input_DecoderSetSecondary( decoder_t *dec, bool b_secondary );
+bool input_DecoderIsSecondary( decoder_t *dec );
void input_DecoderSetVoutMouseEvent( decoder_t *, vlc_mouse_event, void * );
int input_DecoderAddVoutOverlay( decoder_t *, subpicture_t *, int * );
diff --git a/src/input/es_out.c b/src/input/es_out.c
index bd2f9f1025..5080b67a19 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -181,7 +181,7 @@ typedef struct
/* delay */
vlc_tick_t i_audio_delay;
- vlc_tick_t i_spu_delay;
+ vlc_tick_t spu_delays[2]; /* Primary / Secondary subtitle delay */
/* Clock configuration */
vlc_tick_t i_pts_delay;
@@ -564,7 +564,8 @@ static bool EsOutDecodersIsEmpty( es_out_t *out )
return true;
}
-static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay )
+static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay,
+ bool b_secondary )
{
es_out_sys_t *p_sys = container_of(out, es_out_sys_t, out);
es_out_id_t *es;
@@ -572,7 +573,7 @@ static void EsOutSetDelay( es_out_t *out, int i_cat, vlc_tick_t i_delay )
if( i_cat == AUDIO_ES )
p_sys->i_audio_delay = i_delay;
else if( i_cat == SPU_ES )
- p_sys->i_spu_delay = i_delay;
+ p_sys->spu_delays[b_secondary] = i_delay;
foreach_es_then_es_slaves(es)
EsOutDecoderChangeDelay(out, es);
@@ -902,7 +903,10 @@ static void EsOutDecoderChangeDelay( es_out_t *out, es_out_id_t *p_es )
if( p_es->fmt.i_cat == AUDIO_ES )
i_delay = p_sys->i_audio_delay;
else if( p_es->fmt.i_cat == SPU_ES )
- i_delay = p_sys->i_spu_delay;
+ {
+ bool b_secondary = p_es->p_dec && input_DecoderIsSecondary(p_es->p_dec);
+ i_delay = p_sys->spu_delays[b_secondary];
+ }
else
return;
@@ -2212,8 +2216,11 @@ static void EsOutSelect( es_out_t *out, es_out_id_t *es, bool b_force )
!b_select_secondary_subtitle )
p_esprops->p_main_es = es;
- if (es->fmt.i_cat == SPU_ES && es->p_dec)
- input_DecoderSetSecondary( es->p_dec, b_select_secondary_subtitle );
+ if( es->fmt.i_cat == SPU_ES && es->p_dec )
+ {
+ input_DecoderSetSecondary( es->p_dec, b_select_secondary_subtitle );
+ EsOutDecoderChangeDelay(out, es);
+ }
}
static void EsOutCreateCCChannels( es_out_t *out, vlc_fourcc_t codec, uint64_t i_bitmap,
@@ -3008,7 +3015,8 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
{
const int i_cat = va_arg( args, int );
const vlc_tick_t i_delay = va_arg( args, vlc_tick_t );
- EsOutSetDelay( out, i_cat, i_delay );
+ const bool b_secondary = va_arg( args, int );
+ EsOutSetDelay( out, i_cat, i_delay, b_secondary );
return VLC_SUCCESS;
}
diff --git a/src/input/es_out.h b/src/input/es_out.h
index 42b7d0152a..53c3befa7d 100644
--- a/src/input/es_out.h
+++ b/src/input/es_out.h
@@ -124,9 +124,11 @@ static inline bool es_out_GetEmpty( es_out_t *p_out )
assert( !i_ret );
return b;
}
-static inline void es_out_SetDelay( es_out_t *p_out, int i_cat, vlc_tick_t i_delay )
+static inline void es_out_SetDelay( es_out_t *p_out, int i_cat,
+ vlc_tick_t i_delay, bool b_secondary )
{
- int i_ret = es_out_Control( p_out, ES_OUT_SET_DELAY, i_cat, i_delay );
+ int i_ret = es_out_Control( p_out, ES_OUT_SET_DELAY, i_cat,
+ i_delay, b_secondary );
assert( !i_ret );
}
static inline int es_out_SetRecordState( es_out_t *p_out, bool b_record )
diff --git a/src/input/event.h b/src/input/event.h
index 5da39053d2..36493b513b 100644
--- a/src/input/event.h
+++ b/src/input/event.h
@@ -101,11 +101,12 @@ static inline void input_SendEventAudioDelay(input_thread_t *p_input,
}
static inline void input_SendEventSubtitleDelay(input_thread_t *p_input,
- vlc_tick_t i_delay)
+ vlc_tick_t i_delay,
+ bool b_secondary)
{
input_SendEvent(p_input, &(struct vlc_input_event) {
.type = INPUT_EVENT_SUBTITLE_DELAY,
- .subtitle_delay = i_delay,
+ .subtitle_delay = {i_delay, b_secondary},
});
}
diff --git a/src/input/input.c b/src/input/input.c
index 0965800f90..9a3cd9c535 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -426,7 +426,7 @@ static input_thread_t *Create( vlc_object_t *p_parent,
priv->i_audio_delay =
VLC_TICK_FROM_MS( var_GetInteger( p_input, "audio-desync" ) );
- priv->i_spu_delay = 0;
+ priv->spu_delays[0] = priv->spu_delays[1] = 0;
/* */
if( !priv->b_preparsing )
@@ -1059,10 +1059,12 @@ static void SetSubtitlesOptions( input_thread_t *p_input )
int64_t sub_delay = var_InheritInteger( p_input, "sub-delay" );
if( sub_delay != 0 )
{
- priv->i_spu_delay = vlc_tick_from_samples(sub_delay, 10);
- input_SendEventSubtitleDelay( p_input, priv->i_spu_delay );
+ priv->spu_delays[0] = vlc_tick_from_samples(sub_delay, 10);
+ input_SendEventSubtitleDelay( p_input, priv->spu_delays[0], false );
/* UpdatePtsDelay will be called next by InitPrograms */
}
+
+ /* TODO: Support secondary subtitle delay */
}
static void GetVarSlaves( input_thread_t *p_input,
@@ -1279,7 +1281,7 @@ static void UpdatePtsDelay( input_thread_t *p_input )
i_pts_delay = 0;
/* Take care of audio/spu delay */
- const vlc_tick_t i_extra_delay = __MIN( p_sys->i_audio_delay, p_sys->i_spu_delay );
+ const vlc_tick_t i_extra_delay = __MIN( __MIN( p_sys->i_audio_delay, p_sys->spu_delays[0] ), p_sys->spu_delays[1] );
if( i_extra_delay < 0 )
i_pts_delay -= i_extra_delay;
@@ -1288,9 +1290,12 @@ static void UpdatePtsDelay( input_thread_t *p_input )
/* */
es_out_SetDelay( input_priv(p_input)->p_es_out_display, AUDIO_ES,
- p_sys->i_audio_delay );
- es_out_SetDelay( input_priv(p_input)->p_es_out_display, SPU_ES,
- p_sys->i_spu_delay );
+ p_sys->i_audio_delay, false );
+ for ( int i = 0; i < 2; i++ )
+ {
+ es_out_SetDelay( input_priv(p_input)->p_es_out_display, SPU_ES,
+ p_sys->spu_delays[i], i );
+ }
es_out_SetJitter( input_priv(p_input)->p_es_out, i_pts_delay, 0, i_cr_average );
}
@@ -2179,10 +2184,12 @@ static bool Control( input_thread_t *p_input,
case INPUT_CONTROL_SET_SPU_DELAY:
if( param.delay.b_absolute )
- priv->i_spu_delay = param.delay.i_val;
+ priv->spu_delays[param.delay.b_secondary] = param.delay.i_val;
else
- priv->i_spu_delay += param.delay.i_val;
- input_SendEventSubtitleDelay( p_input, priv->i_spu_delay );
+ priv->spu_delays[param.delay.b_secondary] += param.delay.i_val;
+ input_SendEventSubtitleDelay( p_input,
+ priv->spu_delays[param.delay.b_secondary],
+ param.delay.b_secondary );
UpdatePtsDelay( p_input );
break;
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index 0cd8484ca8..37f7c1c664 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -95,6 +95,7 @@ typedef union
struct {
bool b_absolute;
vlc_tick_t i_val;
+ bool b_secondary;
} delay;
struct {
vlc_es_id_t *id;
@@ -141,7 +142,7 @@ typedef struct input_thread_private_t
/* Delays */
vlc_tick_t i_audio_delay;
- vlc_tick_t i_spu_delay;
+ vlc_tick_t spu_delays[2]; /* Primary and secondary subtitle delay */
/* Output */
bool b_out_pace_control; /* XXX Move it ot es_sout ? */
diff --git a/src/input/player.c b/src/input/player.c
index 483f6f0947..a3b9fde884 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -108,7 +108,7 @@ struct vlc_player_input
struct input_stats_t stats;
vlc_tick_t audio_delay;
- vlc_tick_t subtitle_delay;
+ vlc_tick_t subtitle_delays[2];
struct
{
@@ -649,7 +649,8 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
memset(&input->stats, 0, sizeof(input->stats));
- input->audio_delay = input->subtitle_delay = 0;
+ input->audio_delay = input->subtitle_delays[0]
+ = input->subtitle_delays[1] = 0;
input->subsync.audio_time =
input->subsync.subtitle_time = VLC_TICK_INVALID;
@@ -1965,10 +1966,15 @@ input_thread_Events(input_thread_t *input_thread,
input->audio_delay);
break;
case INPUT_EVENT_SUBTITLE_DELAY:
- input->subtitle_delay = event->subtitle_delay;
+ {
+ bool b_secondary = event->subtitle_delay.b_secondary;
+ int i_delay = event->subtitle_delay.i_delay;
+ input->subtitle_delays[b_secondary] = i_delay;
vlc_player_SendEvent(player, on_subtitle_delay_changed,
- input->subtitle_delay);
+ input->subtitle_delays[b_secondary],
+ event->subtitle_delay.b_secondary);
break;
+ }
case INPUT_EVENT_CACHE:
input->cache = event->cache;
vlc_player_SendEvent(player, on_buffering_changed, event->cache);
@@ -2711,6 +2717,7 @@ vlc_player_SetAudioDelay(vlc_player_t *player, vlc_tick_t delay,
.delay = {
.b_absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE,
.i_val = delay,
+ .b_secondary = false,
},
});
@@ -2729,7 +2736,8 @@ vlc_player_GetAudioDelay(vlc_player_t *player)
static void
vlc_player_SetSubtitleDelayInternal(vlc_player_t *player, vlc_tick_t delay,
- enum vlc_player_whence whence)
+ enum vlc_player_whence whence,
+ bool b_secondary)
{
bool absolute = whence == VLC_PLAYER_WHENCE_ABSOLUTE;
struct vlc_player_input *input = vlc_player_get_input_locked(player);
@@ -2741,16 +2749,19 @@ vlc_player_SetSubtitleDelayInternal(vlc_player_t *player, vlc_tick_t delay,
.delay = {
.b_absolute = absolute,
.i_val = delay,
+ .b_secondary = b_secondary,
},
});
}
void
vlc_player_SetSubtitleDelay(vlc_player_t *player, vlc_tick_t delay,
- enum vlc_player_whence whence)
+ enum vlc_player_whence whence,
+ bool b_secondary)
{
- vlc_player_SetSubtitleDelayInternal(player, delay, whence);
- vlc_player_vout_OSDMessage(player, _("Subtitle delay: %s%i ms"),
+ vlc_player_SetSubtitleDelayInternal(player, delay, whence, b_secondary);
+ vlc_player_vout_OSDMessage(player, _("%subtitle delay: %s%i ms"),
+ b_secondary ? "Secondary s" : "S",
whence == VLC_PLAYER_WHENCE_ABSOLUTE ? "" : "+",
(int)MS_FROM_VLC_TICK(delay));
}
@@ -2842,10 +2853,10 @@ vlc_player_SubtitleSyncApply(vlc_player_t *player)
input->subsync.audio_time = VLC_TICK_INVALID;
input->subsync.subtitle_time = VLC_TICK_INVALID;
vlc_player_SetSubtitleDelayInternal(player, delay,
- VLC_PLAYER_WHENCE_RELATIVE);
+ VLC_PLAYER_WHENCE_RELATIVE, false);
long long delay_ms = MS_FROM_VLC_TICK(delay);
- long long totdelay_ms = MS_FROM_VLC_TICK(input->subtitle_delay + delay);
+ long long totdelay_ms = MS_FROM_VLC_TICK(input->subtitle_delays[0] + delay);
vlc_player_vout_OSDMessage(player, _("Sub sync: corrected %"PRId64
" ms (total delay = %"PRId64" ms)"),
delay_ms, totdelay_ms);
@@ -2857,7 +2868,8 @@ vlc_player_SubtitleSyncReset(vlc_player_t *player)
struct vlc_player_input *input = vlc_player_get_input_locked(player);
if (!input)
return;
- vlc_player_SetSubtitleDelayInternal(player, 0, VLC_PLAYER_WHENCE_ABSOLUTE);
+ vlc_player_SetSubtitleDelayInternal(player, 0, VLC_PLAYER_WHENCE_ABSOLUTE,
+ false);
input->subsync.audio_time = VLC_TICK_INVALID;
input->subsync.subtitle_time = VLC_TICK_INVALID;
vlc_player_vout_OSDMessage(player, _("Sub sync: delay reset"));
@@ -2898,10 +2910,10 @@ vlc_player_SetSelectSecondarySubtitle(vlc_player_t *player, bool select)
}
vlc_tick_t
-vlc_player_GetSubtitleDelay(vlc_player_t *player)
+vlc_player_GetSubtitleDelay(vlc_player_t *player, bool b_secondary)
{
struct vlc_player_input *input = vlc_player_get_input_locked(player);
- return input ? input->subtitle_delay : 0;
+ return input ? input->subtitle_delays[b_secondary] : 0;
}
int
diff --git a/src/input/var.c b/src/input/var.c
index 9c9e7b9dba..5255227a03 100644
--- a/src/input/var.c
+++ b/src/input/var.c
@@ -410,9 +410,15 @@ void input_LegacyEvents( input_thread_t *p_input,
var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, val );
break;
case INPUT_EVENT_SUBTITLE_DELAY:
- val.i_int = event->subtitle_delay;
- var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, val );
+ {
+ /* Dual subtitles are not supported in legacy GUI */
+ if ( !event->subtitle_delay.b_secondary )
+ {
+ val.i_int = event->subtitle_delay.i_delay;
+ var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, val );
+ }
break;
+ }
case INPUT_EVENT_BOOKMARK:
UpdateBookmarksOption( p_input );
break;
@@ -1073,6 +1079,8 @@ static int EsDelayCallback ( vlc_object_t *p_this, char const *psz_cmd,
.delay = {
.b_absolute = true,
.i_val = newval.i_int,
+ /* Dual subtitles are not supported in legacy GUI */
+ .b_secondary = false,
},
};
if( !strcmp( psz_cmd, "audio-delay" ) )
--
2.17.1
More information about the vlc-devel
mailing list