From: Laurent Aimar Date: Sat, 22 Nov 2008 15:26:16 +0000 (+0100) Subject: Clean up input events. X-Git-Tag: 1.0.0-pre1~2067 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d6f0bd78c5aaae605b7894777d4d8eddb6fdaddb;p=vlc Clean up input events. A new variable intf-event has been added. It supercedes the following variables (they are still present for the time being): - intf-change - intf-change-vout - rate-change - stats-change and allows to have a better knowledge of the change done. It is documented in vlc_input.h (in progress). --- diff --git a/include/vlc_input.h b/include/vlc_input.h index ce3f25581d..55f39d79e1 100644 --- a/include/vlc_input.h +++ b/include/vlc_input.h @@ -382,29 +382,6 @@ static inline void vlc_input_attachment_Delete( input_attachment_t *a ) * input defines/constants. *****************************************************************************/ -/* "state" value */ -/* NOTE: you need to update ppsz_input_state in the RC interface - * if you modify this list. */ -typedef enum input_state_e -{ - INIT_S = 0, - OPENING_S, - BUFFERING_S, - PLAYING_S, - PAUSE_S, - STOP_S, - END_S, - ERROR_S, -} input_state_e; - -/* "rate" default, min/max - * A rate below 1000 plays the movie faster, - * A rate above 1000 plays the movie slower. - */ -#define INPUT_RATE_DEFAULT 1000 -#define INPUT_RATE_MIN 32 /* Up to 32/1 */ -#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ - /* i_update field of access_t/demux_t */ #define INPUT_UPDATE_NONE 0x0000 #define INPUT_UPDATE_SIZE 0x0001 @@ -446,6 +423,147 @@ struct input_thread_t input_thread_private_t *p; }; +/***************************************************************************** + * Input events and variables + *****************************************************************************/ + +/** + * \defgroup inputvariable Input variables + * + * The input provides multiples variable you can write to and/or read from. + * + * TODO complete the documentation. + * The read only variables are: + * - "length" + * - "bookmarks" + * - "seekable (if you can seek, it doesn't say if 'bar display' has be shown FIXME rename can-seek + * or not, for that check position != 0.0) + * - "can-pause" + * - "can-rewind" + * - "can-record" (if a stream can be recorded while playing) + * - "teletext-es" to get the index of spu track that is teletext --1 if no teletext) + * + * The read-write variables are: + * - state (\see input_state_e) + * - rate, rate-slower, rate-faster + * - position, position-offset + * - time, time-offset + * - title,title-next,title-prev + * - chapter,chapter-next, chapter-prev + * - program, audio-es, video-es, spu-es + * - audio-delay, spu-delay + * - bookmark + * - TODO add special titles variables + * + * The variable used for event is + * - intf-event (\see input_event_type_e) + * + * The legacy variable used for event are + * - intf-change + * - intf-change-vout + * - rate-change + * - stats-change + * You are advised to change to intf-event as soon as possible. + */ + +/** + * Input state + * + * This enum is used by the variable "state" + * + * NOTE: you need to update ppsz_input_state in the RC interface + * if you modify this list. + */ +typedef enum input_state_e +{ + INIT_S = 0, + OPENING_S, + BUFFERING_S, + PLAYING_S, + PAUSE_S, + STOP_S, + END_S, + ERROR_S, +} input_state_e; + +/** + * Input rate. + * + * It is an integer used by the variable "rate" in the + * range [INPUT_RATE_MIN, INPUT_RATE_MAX] the default value + * being INPUT_RATE_DEFAULT. + * + * A value lower than INPUT_RATE_DEFAULT plays faster. + * A value higher than INPUT_RATE_DEFAULT plays slower. + */ + +/** + * Default rate value + */ +#define INPUT_RATE_DEFAULT 1000 +/** + * Minimal rate value + */ +#define INPUT_RATE_MIN 32 /* Up to 32/1 */ +/** + * Maximal rate value + */ +#define INPUT_RATE_MAX 32000 /* Up to 1/32 */ + +/** + * Input events + * + * You can catch input event by adding a callback on the variable "intf-event". + * This variable is an integer that will hold a input_event_type_e value. + */ +typedef enum input_event_type_e +{ + /* "state" has changed */ + INPUT_EVENT_STATE, + /* "rate" has changed */ + INPUT_EVENT_RATE, + /* At least one of "position" or "time" or "length" has changed */ + INPUT_EVENT_TIMES, + + /* A title has been added or removed or selected. + * It imply that chapter has changed (not chapter event is sent) */ + INPUT_EVENT_TITLE, + /* A chapter has been added or removed or selected. */ + INPUT_EVENT_CHAPTER, + + /* A program has been added or removed or selected */ + INPUT_EVENT_PROGRAM, + /* A ES has been added or removed or selected */ + INPUT_EVENT_ES, + + /* "record" has changed */ + INPUT_EVENT_RECORD, + + /* A vout has been created/deleted by *the input* + * FIXME some event are not detected yet (audio visualisation) */ + INPUT_EVENT_VOUT, + + /* input_item_t media has changed */ + INPUT_EVENT_ITEM_META, + /* input_item_t info has changed */ + INPUT_EVENT_ITEM_INFO, + /* input_item_t name has changed */ + INPUT_EVENT_ITEM_NAME, + + /* Input statistics have been updated */ + INPUT_EVENT_STATISTICS, + /* At least one of "signal-quality" or "signal-strength" has changed */ + INPUT_EVENT_SIGNAL, + + /* "audio-delay" has changed */ + INPUT_EVENT_AUDIO_DELAY, + /* "spu-delay" has changed */ + INPUT_EVENT_SUBTITLE_DELAY, + +} input_event_type_e; + +/** @}*/ + /***************************************************************************** * Prototypes *****************************************************************************/ diff --git a/src/input/decoder.c b/src/input/decoder.c index 1421367c57..003155ad49 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -1973,7 +1973,7 @@ static void DeleteDecoder( decoder_t * p_dec ) /* We are about to die. Reattach video output to p_vlc. */ vout_Request( p_dec, p_owner->p_vout, NULL ); - var_SetBool( p_owner->p_input, "intf-change-vout", true ); + input_SendEventVout( p_owner->p_input ); } #ifdef ENABLE_SOUT @@ -2188,7 +2188,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) p_owner->p_vout = p_vout; vlc_mutex_unlock( &p_owner->lock ); - var_SetBool( p_owner->p_input, "intf-change-vout", true ); + input_SendEventVout( p_owner->p_input ); if( p_vout == NULL ) { msg_Err( p_dec, "failed to create video output" ); diff --git a/src/input/event.c b/src/input/event.c index 90f029f09e..4c4e3c913d 100644 --- a/src/input/event.c +++ b/src/input/event.c @@ -33,6 +33,8 @@ #include "input_internal.h" #include "event.h" +static void Trigger( input_thread_t *p_input, int i_type ); + /***************************************************************************** * Event for input.c *****************************************************************************/ @@ -54,12 +56,11 @@ void input_SendEventTimes( input_thread_t *p_input, const input_event_times_t *p val.i_time = p_times->i_length; var_Change( p_input, "length", VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-times", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_TIMES ); } void input_SendEventStatistics( input_thread_t *p_input ) { - var_TriggerCallback( p_input, "stats-change" ); /* FIXME rename */ + Trigger( p_input, INPUT_EVENT_STATISTICS ); } void input_SendEventRate( input_thread_t *p_input, int i_rate ) { @@ -68,7 +69,7 @@ void input_SendEventRate( input_thread_t *p_input, int i_rate ) val.i_int = i_rate; var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL ); - var_TriggerCallback( p_input, "rate-change" ); /* TODO rename */ + Trigger( p_input, INPUT_EVENT_RATE ); } void input_SendEventAudioDelay( input_thread_t *p_input, mtime_t i_delay ) { @@ -77,7 +78,7 @@ void input_SendEventAudioDelay( input_thread_t *p_input, mtime_t i_delay ) val.i_time = i_delay; var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-delay" ); /* TODO */ + Trigger( p_input, INPUT_EVENT_AUDIO_DELAY ); } void input_SendEventSubtitleDelay( input_thread_t *p_input, mtime_t i_delay ) @@ -87,7 +88,7 @@ void input_SendEventSubtitleDelay( input_thread_t *p_input, mtime_t i_delay ) val.i_time = i_delay; var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-delay" ); /* TODO */ + Trigger( p_input, INPUT_EVENT_SUBTITLE_DELAY ); } /* TODO and file name ? */ @@ -98,7 +99,7 @@ void input_SendEventRecord( input_thread_t *p_input, bool b_recording ) val.b_bool = b_recording; var_Change( p_input, "record", VLC_VAR_SETVALUE, &val, NULL ); - var_TriggerCallback( p_input, "intf-change" ); /* FIXME */ + Trigger( p_input, INPUT_EVENT_RECORD ); } void input_SendEventTitle( input_thread_t *p_input, int i_title ) @@ -108,9 +109,9 @@ void input_SendEventTitle( input_thread_t *p_input, int i_title ) val.i_int = i_title; var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL ); - input_ControlVarTitle( p_input, i_title ); /* FIXME ??? */ + input_ControlVarTitle( p_input, i_title ); - //var_SetBool( p_input, "intf-change-title" ); /* TODO */ + Trigger( p_input, INPUT_EVENT_TITLE ); } void input_SendEventSeekpoint( input_thread_t *p_input, int i_title, int i_seekpoint ) @@ -119,17 +120,22 @@ void input_SendEventSeekpoint( input_thread_t *p_input, int i_title, int i_seekp VLC_UNUSED( i_title ); val.i_int = i_seekpoint; - var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL); + var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-seekpoint" ); /* TODO. Merge with intf-change-title ? */ + Trigger( p_input, INPUT_EVENT_CHAPTER ); } void input_SendEventSignal( input_thread_t *p_input, double f_quality, double f_strength ) { - var_SetFloat( p_input, "signal-quality", f_quality ); - var_SetFloat( p_input, "signal-strength", f_strength ); + vlc_value_t val; + + val.f_float = f_quality; + var_Change( p_input, "signal-quality", VLC_VAR_SETVALUE, &val, NULL ); - /* TODO use Change and then a intf-change-signal instead ? */ + val.f_float = f_strength; + var_Change( p_input, "signal-strength", VLC_VAR_SETVALUE, &val, NULL ); + + Trigger( p_input, INPUT_EVENT_SIGNAL ); } void input_SendEventState( input_thread_t *p_input, int i_state ) @@ -139,7 +145,7 @@ void input_SendEventState( input_thread_t *p_input, int i_state ) val.i_int = i_state; var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL ); - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_STATE ); /* FIXME remove this ugliness */ vlc_event_t event; @@ -149,13 +155,12 @@ void input_SendEventState( input_thread_t *p_input, int i_state ) vlc_event_send( &p_input->p->event_manager, &event ); } -#warning "TODO meta" /* FIXME: review them because vlc_event_send might be * moved inside input_item* functions. */ void input_SendEventMeta( input_thread_t *p_input ) { - var_TriggerCallback( p_input, "intf-change" ); /* TODO intf-change-item-meta */ + Trigger( p_input, INPUT_EVENT_ITEM_META ); /* FIXME remove this ugliness ? */ vlc_event_t event; @@ -167,7 +172,7 @@ void input_SendEventMeta( input_thread_t *p_input ) void input_SendEventMetaInfo( input_thread_t *p_input ) { - var_TriggerCallback( p_input, "intf-change" ); /* TODO intf-change-item-info */ + Trigger( p_input, INPUT_EVENT_ITEM_INFO ); /* FIXME remove this ugliness */ vlc_event_t event; @@ -178,7 +183,7 @@ void input_SendEventMetaInfo( input_thread_t *p_input ) void input_SendEventMetaName( input_thread_t *p_input, const char *psz_name ) { - var_TriggerCallback( p_input, "intf-change" ); /* TODO intf-change-item-name */ + Trigger( p_input, INPUT_EVENT_ITEM_NAME ); /* FIXME remove this ugliness */ vlc_event_t event; @@ -203,8 +208,7 @@ void input_SendEventProgramAdd( input_thread_t *p_input, var_Change( p_input, "program", VLC_VAR_ADDCHOICE, &val, psz_text ? &text : NULL ); - //var_SetBool( p_input, "intf-change-program", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_PROGRAM ); } void input_SendEventProgramDel( input_thread_t *p_input, int i_program ) { @@ -213,8 +217,7 @@ void input_SendEventProgramDel( input_thread_t *p_input, int i_program ) val.i_int = i_program; var_Change( p_input, "program", VLC_VAR_DELCHOICE, &val, NULL ); - //var_SetBool( p_input, "intf-change-program", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_PROGRAM ); } void input_SendEventProgramSelect( input_thread_t *p_input, int i_program ) { @@ -223,8 +226,7 @@ void input_SendEventProgramSelect( input_thread_t *p_input, int i_program ) val.i_int = i_program; var_Change( p_input, "program", VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-program", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_PROGRAM ); } static const char *GetEsVarName( int i_cat ) @@ -254,8 +256,7 @@ void input_SendEventEsDel( input_thread_t *p_input, int i_cat, int i_id ) var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_CLEARCHOICES, NULL, NULL ); } - //var_SetBool( p_input, "intf-change-es", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_ES ); } void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const char *psz_text ) { @@ -268,8 +269,7 @@ void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const c var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_ADDCHOICE, &val, psz_text ? &text : NULL ); - //var_SetBool( p_input, "intf-change-es", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_ES ); } /* i_id == -1 will unselect */ @@ -280,8 +280,7 @@ void input_SendEventEsSelect( input_thread_t *p_input, int i_cat, int i_id ) val.i_int = i_id; var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_SETVALUE, &val, NULL ); - //var_SetBool( p_input, "intf-change-es", true ); /* TODO */ - var_TriggerCallback( p_input, "intf-change" ); + Trigger( p_input, INPUT_EVENT_ES ); /* FIXME to remove this ugliness */ vlc_event_t event; @@ -289,3 +288,15 @@ void input_SendEventEsSelect( input_thread_t *p_input, int i_cat, int i_id ) vlc_event_send( &p_input->p->event_manager, &event ); } +void input_SendEventVout( input_thread_t *p_input ) +{ + Trigger( p_input, INPUT_EVENT_VOUT ); +} + +/***************************************************************************** + * + *****************************************************************************/ +static void Trigger( input_thread_t *p_input, int i_type ) +{ + var_SetInteger( p_input, "intf-event", i_type ); +} diff --git a/src/input/event.h b/src/input/event.h index 6c4d959119..e4ad966c67 100644 --- a/src/input/event.h +++ b/src/input/event.h @@ -67,5 +67,10 @@ void input_SendEventEsDel( input_thread_t *p_input, int i_cat, int i_id ); void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const char *psz_text ); void input_SendEventEsSelect( input_thread_t *p_input, int i_cat, int i_id ); /* i_id == -1 will unselect */ +/***************************************************************************** + * Event for decoder.c + *****************************************************************************/ +void input_SendEventVout( input_thread_t *p_input ); + #endif diff --git a/src/input/input.c b/src/input/input.c index ebe7d28496..ff632952cb 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -106,32 +106,7 @@ static void input_ChangeState( input_thread_t *p_input, int i_state ); /* TODO f * This function creates a new input, and returns a pointer * to its description. On error, it returns NULL. * - * Variables for _public_ use: - * * Get and Set: - * - state - * - rate,rate-slower, rate-faster - * - position, position-offset - * - time, time-offset - * - title,title-next,title-prev - * - chapter,chapter-next, chapter-prev - * - program, audio-es, video-es, spu-es - * - audio-delay, spu-delay - * - bookmark - * * Get only: - * - length - * - bookmarks - * - seekable (if you can seek, it doesn't say if 'bar display' has be shown FIXME rename can-seek - * or not, for that check position != 0.0) - * - can-pause - * - can-record (if a stream can be recorded while playing) - * - teletext-es to get the index of spu track that is teletext --1 if no teletext) - * * For intf callback upon changes: - * - intf-change - * - intf-change-vout for when a vout is created or destroyed - * - rate-change for when playback rate changes - * - stats-change for when statistics are updated - * TODO explain when Callback is called - * TODO complete this list (?) + * XXX Do not forget to update vlc_input.h if you add new variables. *****************************************************************************/ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, const char *psz_header, bool b_quick, diff --git a/src/input/var.c b/src/input/var.c index 8218d6ad38..c61f3579b7 100644 --- a/src/input/var.c +++ b/src/input/var.c @@ -68,6 +68,9 @@ static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ); +static int IntfEvent( vlc_object_t *p_this, char const *psz_cmd, + vlc_value_t oldval, vlc_value_t newval, void *p_data ); + typedef struct { const char *psz_name; @@ -225,14 +228,14 @@ void input_ControlVarInit ( input_thread_t *p_input ) if( !p_input->b_preparsing ) { - /* Special "intf-change" variable, it allows intf to set up a callback - * to be notified of some changes. - * - * Add rate-change to inform about rate changin - * - * stats-change to inform when statistics are computed - * - * TODO list all changes warn by these callbacks */ + /* Special "intf-event" variable. */ + var_Create( p_input, "intf-event", VLC_VAR_INTEGER ); + + /* Callback for legacy variables */ + var_AddCallback( p_input, "intf-event", IntfEvent, NULL ); + + /* Legacy variable + * TODO remove them when unused */ static const char *ppsz_event[] = { "intf-change", "rate-change", @@ -837,3 +840,21 @@ static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd, return VLC_SUCCESS; } +static int IntfEvent( vlc_object_t *p_this, char const *psz_cmd, + vlc_value_t oldval, vlc_value_t newval, void *p_data ) +{ + VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval); VLC_UNUSED(p_data); + switch( newval.i_int ) + { + case INPUT_EVENT_RATE: + return var_SetBool( p_this, "rate-change", true ); + case INPUT_EVENT_STATISTICS: + return var_SetBool( p_this, "stats-change", true ); + case INPUT_EVENT_VOUT: + return var_SetBool( p_this, "intf-change-vout", true ); + + default: + return var_SetBool( p_this, "intf-change", true ); + } +} +