event.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * event.c: Events
  3.  *****************************************************************************
  4.  * Copyright (C) 2008 Laurent Aimar
  5.  * $Id: 242bf1fd01b61e6bf5c45f7fd9deb58499abe022 $
  6.  *
  7.  * Authors: Laurent Aimar < fenrir _AT_ videolan _DOT_ org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_input.h>
  31. #include "input_internal.h"
  32. #include "event.h"
  33. #include <assert.h>
  34. /* */
  35. static void Trigger( input_thread_t *, int i_type );
  36. static void VarListAdd( input_thread_t *,
  37.                         const char *psz_variable, int i_event,
  38.                         int i_value, const char *psz_text );
  39. static void VarListDel( input_thread_t *,
  40.                         const char *psz_variable, int i_event,
  41.                         int i_value );
  42. static void VarListSelect( input_thread_t *,
  43.                            const char *psz_variable, int i_event,
  44.                            int i_value );
  45. /*****************************************************************************
  46.  * Event for input.c
  47.  *****************************************************************************/
  48. void input_SendEventDead( input_thread_t *p_input )
  49. {
  50.     p_input->b_dead = true;
  51.     Trigger( p_input, INPUT_EVENT_DEAD );
  52. }
  53. void input_SendEventAbort( input_thread_t *p_input )
  54. {
  55.     Trigger( p_input, INPUT_EVENT_ABORT );
  56. }
  57. void input_SendEventTimes( input_thread_t *p_input,
  58.                            double f_position, mtime_t i_time, mtime_t i_length )
  59. {
  60.     vlc_value_t val;
  61.     /* */
  62.     val.f_float = f_position;
  63.     var_Change( p_input, "position", VLC_VAR_SETVALUE, &val, NULL );
  64.     /* */
  65.     val.i_time = i_time;
  66.     var_Change( p_input, "time", VLC_VAR_SETVALUE, &val, NULL );
  67. /* FIXME ugly + what about meta change event ? */
  68.     if( var_GetTime( p_input, "length" ) != i_length )
  69.         input_item_SetDuration( p_input->p->p_item, i_length );
  70.     val.i_time = i_length;
  71.     var_Change( p_input, "length", VLC_VAR_SETVALUE, &val, NULL );
  72.     Trigger( p_input, INPUT_EVENT_TIMES );
  73. }
  74. void input_SendEventStatistics( input_thread_t *p_input )
  75. {
  76.     Trigger( p_input, INPUT_EVENT_STATISTICS );
  77. }
  78. void input_SendEventRate( input_thread_t *p_input, int i_rate )
  79. {
  80. vlc_value_t val;
  81. val.i_int = i_rate;
  82. var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
  83.     Trigger( p_input, INPUT_EVENT_RATE );
  84. }
  85. void input_SendEventAudioDelay( input_thread_t *p_input, mtime_t i_delay )
  86. {
  87. vlc_value_t val;
  88. val.i_time = i_delay;
  89. var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, &val, NULL );
  90.     Trigger( p_input, INPUT_EVENT_AUDIO_DELAY );
  91. }
  92. void input_SendEventSubtitleDelay( input_thread_t *p_input, mtime_t i_delay )
  93. {
  94. vlc_value_t val;
  95. val.i_time = i_delay;
  96. var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, &val, NULL );
  97.     Trigger( p_input, INPUT_EVENT_SUBTITLE_DELAY );
  98. }
  99. /* TODO and file name ? */
  100. void input_SendEventRecord( input_thread_t *p_input, bool b_recording )
  101. {
  102. vlc_value_t val;
  103. val.b_bool = b_recording;
  104. var_Change( p_input, "record", VLC_VAR_SETVALUE, &val, NULL );
  105.     Trigger( p_input, INPUT_EVENT_RECORD );
  106. }
  107. void input_SendEventTitle( input_thread_t *p_input, int i_title )
  108. {
  109. vlc_value_t val;
  110. val.i_int = i_title;
  111. var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );
  112. input_ControlVarTitle( p_input, i_title );
  113.     Trigger( p_input, INPUT_EVENT_TITLE );
  114. }
  115. void input_SendEventSeekpoint( input_thread_t *p_input, int i_title, int i_seekpoint )
  116. {
  117. vlc_value_t val;
  118. VLC_UNUSED( i_title );
  119. val.i_int = i_seekpoint;
  120. var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );
  121.     Trigger( p_input, INPUT_EVENT_CHAPTER );
  122. }
  123. void input_SendEventSignal( input_thread_t *p_input, double f_quality, double f_strength )
  124. {
  125.     vlc_value_t val;
  126.     val.f_float = f_quality;
  127. var_Change( p_input, "signal-quality", VLC_VAR_SETVALUE, &val, NULL );
  128.     val.f_float = f_strength;
  129. var_Change( p_input, "signal-strength", VLC_VAR_SETVALUE, &val, NULL );
  130.     Trigger( p_input, INPUT_EVENT_SIGNAL );
  131. }
  132. void input_SendEventState( input_thread_t *p_input, int i_state )
  133. {
  134.     vlc_value_t val;
  135.     val.i_int = i_state;
  136.     var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL );
  137.     Trigger( p_input, INPUT_EVENT_STATE );
  138. }
  139. void input_SendEventCache( input_thread_t *p_input, double f_level )
  140. {
  141.     vlc_value_t val;
  142.     val.f_float = f_level;
  143. var_Change( p_input, "cache", VLC_VAR_SETVALUE, &val, NULL );
  144.     Trigger( p_input, INPUT_EVENT_CACHE );
  145. }
  146. /* FIXME: review them because vlc_event_send might be
  147.  * moved inside input_item* functions.
  148.  */
  149. void input_SendEventMeta( input_thread_t *p_input )
  150. {
  151.     Trigger( p_input, INPUT_EVENT_ITEM_META );
  152. /* FIXME remove this ugliness ? */
  153. vlc_event_t event;
  154. event.type = vlc_InputItemMetaChanged;
  155. event.u.input_item_meta_changed.meta_type = vlc_meta_ArtworkURL;
  156. vlc_event_send( &p_input->p->p_item->event_manager, &event );
  157. }
  158. void input_SendEventMetaInfo( input_thread_t *p_input )
  159. {
  160.     Trigger( p_input, INPUT_EVENT_ITEM_INFO );
  161. /* FIXME remove this ugliness */
  162.     vlc_event_t event;
  163.     event.type = vlc_InputItemInfoChanged;
  164.     vlc_event_send( &p_input->p->p_item->event_manager, &event );
  165. }
  166. void input_SendEventMetaName( input_thread_t *p_input, const char *psz_name )
  167. {
  168.     Trigger( p_input, INPUT_EVENT_ITEM_NAME );
  169. /* FIXME remove this ugliness */
  170.     vlc_event_t event;
  171.     event.type = vlc_InputItemNameChanged;
  172.     event.u.input_item_name_changed.new_name = psz_name;
  173.     vlc_event_send( &p_input->p->p_item->event_manager, &event );
  174. }
  175. /*****************************************************************************
  176.  * Event for es_out.c
  177.  *****************************************************************************/
  178. void input_SendEventProgramAdd( input_thread_t *p_input,
  179.                                 int i_program, const char *psz_text )
  180. {
  181.     VarListAdd( p_input, "program", INPUT_EVENT_PROGRAM, i_program, psz_text );
  182. }
  183. void input_SendEventProgramDel( input_thread_t *p_input, int i_program )
  184. {
  185.     VarListDel( p_input, "program", INPUT_EVENT_PROGRAM, i_program );
  186. }
  187. void input_SendEventProgramSelect( input_thread_t *p_input, int i_program )
  188. {
  189.     VarListSelect( p_input, "program", INPUT_EVENT_PROGRAM, i_program );
  190. }
  191. void input_SendEventProgramScrambled( input_thread_t *p_input, int i_group, bool b_scrambled )
  192. {
  193.     if( var_GetInteger( p_input, "program" ) != i_group )
  194.         return;
  195.     var_SetBool( p_input, "program-scrambled", b_scrambled );
  196.     Trigger( p_input, INPUT_EVENT_PROGRAM );
  197. }
  198. static const char *GetEsVarName( int i_cat )
  199. {
  200.     switch( i_cat )
  201.     {
  202.     case VIDEO_ES:
  203.         return "video-es";
  204.     case AUDIO_ES:
  205.         return "audio-es";
  206.     default:
  207.         assert( i_cat == SPU_ES );
  208.         return "spu-es";
  209.     }
  210. }
  211. void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const char *psz_text )
  212. {
  213.     if( i_cat != UNKNOWN_ES )
  214.         VarListAdd( p_input, GetEsVarName( i_cat ), INPUT_EVENT_ES,
  215.                     i_id, psz_text );
  216. }
  217. void input_SendEventEsDel( input_thread_t *p_input, int i_cat, int i_id )
  218. {
  219.     if( i_cat != UNKNOWN_ES )
  220.         VarListDel( p_input, GetEsVarName( i_cat ), INPUT_EVENT_ES, i_id );
  221. }
  222. /* i_id == -1 will unselect */
  223. void input_SendEventEsSelect( input_thread_t *p_input, int i_cat, int i_id )
  224. {
  225.     if( i_cat != UNKNOWN_ES )
  226.         VarListSelect( p_input, GetEsVarName( i_cat ), INPUT_EVENT_ES, i_id );
  227. }
  228. void input_SendEventTeletextAdd( input_thread_t *p_input,
  229.                                  int i_teletext, const char *psz_text )
  230. {
  231.     VarListAdd( p_input, "teletext-es", INPUT_EVENT_TELETEXT, i_teletext, psz_text );
  232. }
  233. void input_SendEventTeletextDel( input_thread_t *p_input, int i_teletext )
  234. {
  235.     VarListDel( p_input, "teletext-es", INPUT_EVENT_TELETEXT, i_teletext );
  236. }
  237. void input_SendEventTeletextSelect( input_thread_t *p_input, int i_teletext )
  238. {
  239.     VarListSelect( p_input, "teletext-es", INPUT_EVENT_TELETEXT, i_teletext );
  240. }
  241. void input_SendEventVout( input_thread_t *p_input )
  242. {
  243.     Trigger( p_input, INPUT_EVENT_VOUT );
  244. }
  245. void input_SendEventAout( input_thread_t *p_input )
  246. {
  247.     Trigger( p_input, INPUT_EVENT_AOUT );
  248. }
  249. /*****************************************************************************
  250.  * Event for control.c/input.c
  251.  *****************************************************************************/
  252. void input_SendEventBookmark( input_thread_t *p_input )
  253. {
  254.     Trigger( p_input, INPUT_EVENT_BOOKMARK );
  255. }
  256. /*****************************************************************************
  257.  *
  258.  *****************************************************************************/
  259. static void Trigger( input_thread_t *p_input, int i_type )
  260. {
  261.     var_SetInteger( p_input, "intf-event", i_type );
  262. }
  263. static void VarListAdd( input_thread_t *p_input,
  264.                         const char *psz_variable, int i_event,
  265.                         int i_value, const char *psz_text )
  266. {
  267.     vlc_value_t val;
  268.     vlc_value_t text;
  269.     val.i_int = i_value;
  270.     text.psz_string = (char*)psz_text;
  271.     var_Change( p_input, psz_variable, VLC_VAR_ADDCHOICE,
  272.                 &val, psz_text ? &text : NULL );
  273.     Trigger( p_input, i_event );
  274. }
  275. static void VarListDel( input_thread_t *p_input,
  276.                         const char *psz_variable, int i_event,
  277.                         int i_value )
  278. {
  279.     vlc_value_t val;
  280.     if( i_value >= 0 )
  281.     {
  282.         val.i_int = i_value;
  283.         var_Change( p_input, psz_variable, VLC_VAR_DELCHOICE, &val, NULL );
  284.     }
  285.     else
  286.     {
  287.         var_Change( p_input, psz_variable, VLC_VAR_CLEARCHOICES, &val, NULL );
  288.     }
  289.     Trigger( p_input, i_event );
  290. }
  291. static void VarListSelect( input_thread_t *p_input,
  292.                            const char *psz_variable, int i_event,
  293.                            int i_value )
  294. {
  295.     vlc_value_t val;
  296.     val.i_int = i_value;
  297.     var_Change( p_input, psz_variable, VLC_VAR_SETVALUE, &val, NULL );
  298.     Trigger( p_input, i_event );
  299. }