]> git.sesse.net Git - vlc/blob - src/input/event.c
Added INPUT_EVENT_DEAD event.
[vlc] / src / input / event.c
1 /*****************************************************************************
2  * event.c: Events
3  *****************************************************************************
4  * Copyright (C) 2008 Laurent Aimar
5  * $Id$
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 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <vlc_common.h>
32 #include <vlc_input.h>
33 #include "input_internal.h"
34 #include "event.h"
35 #include <assert.h>
36
37 static void Trigger( input_thread_t *p_input, int i_type );
38
39 /*****************************************************************************
40  * Event for input.c
41  *****************************************************************************/
42 void input_SendEventDead( input_thread_t *p_input )
43 {
44     p_input->b_dead = true;
45
46     Trigger( p_input, INPUT_EVENT_DEAD );
47 }
48
49 void input_SendEventTimes( input_thread_t *p_input,
50                            double f_position, mtime_t i_time, mtime_t i_length )
51 {
52     vlc_value_t val;
53
54     /* */
55     val.f_float = f_position;
56     var_Change( p_input, "position", VLC_VAR_SETVALUE, &val, NULL );
57
58     /* */
59     val.i_time = i_time;
60     var_Change( p_input, "time", VLC_VAR_SETVALUE, &val, NULL );
61
62         /* FIXME ugly + what about meta change event ? */
63     if( var_GetTime( p_input, "length" ) != i_length )
64         input_item_SetDuration( p_input->p->p_item, i_length );
65     val.i_time = i_length;
66     var_Change( p_input, "length", VLC_VAR_SETVALUE, &val, NULL );
67
68     Trigger( p_input, INPUT_EVENT_TIMES );
69 }
70 void input_SendEventStatistics( input_thread_t *p_input )
71 {
72     Trigger( p_input, INPUT_EVENT_STATISTICS );
73 }
74 void input_SendEventRate( input_thread_t *p_input, int i_rate )
75 {
76         vlc_value_t val;
77
78         val.i_int = i_rate;
79         var_Change( p_input, "rate", VLC_VAR_SETVALUE, &val, NULL );
80
81     Trigger( p_input, INPUT_EVENT_RATE );
82 }
83 void input_SendEventAudioDelay( input_thread_t *p_input, mtime_t i_delay )
84 {
85         vlc_value_t val;
86
87         val.i_time = i_delay;
88         var_Change( p_input, "audio-delay", VLC_VAR_SETVALUE, &val, NULL );
89
90     Trigger( p_input, INPUT_EVENT_AUDIO_DELAY );
91 }
92
93 void input_SendEventSubtitleDelay( input_thread_t *p_input, mtime_t i_delay )
94 {
95         vlc_value_t val;
96
97         val.i_time = i_delay;
98         var_Change( p_input, "spu-delay", VLC_VAR_SETVALUE, &val, NULL );
99
100     Trigger( p_input, INPUT_EVENT_SUBTITLE_DELAY );
101 }
102
103 /* TODO and file name ? */
104 void input_SendEventRecord( input_thread_t *p_input, bool b_recording )
105 {
106         vlc_value_t val;
107
108         val.b_bool = b_recording;
109         var_Change( p_input, "record", VLC_VAR_SETVALUE, &val, NULL );
110
111     Trigger( p_input, INPUT_EVENT_RECORD );
112 }
113
114 void input_SendEventTitle( input_thread_t *p_input, int i_title )
115 {
116         vlc_value_t val;
117
118         val.i_int = i_title;
119         var_Change( p_input, "title", VLC_VAR_SETVALUE, &val, NULL );
120
121         input_ControlVarTitle( p_input, i_title );
122
123     Trigger( p_input, INPUT_EVENT_TITLE );
124 }
125
126 void input_SendEventSeekpoint( input_thread_t *p_input, int i_title, int i_seekpoint )
127 {
128         vlc_value_t val;
129
130         VLC_UNUSED( i_title );
131         val.i_int = i_seekpoint;
132         var_Change( p_input, "chapter", VLC_VAR_SETVALUE, &val, NULL );
133
134     Trigger( p_input, INPUT_EVENT_CHAPTER );
135 }
136
137 void input_SendEventSignal( input_thread_t *p_input, double f_quality, double f_strength )
138 {
139     vlc_value_t val;
140
141     val.f_float = f_quality;
142         var_Change( p_input, "signal-quality", VLC_VAR_SETVALUE, &val, NULL );
143
144     val.f_float = f_strength;
145         var_Change( p_input, "signal-strength", VLC_VAR_SETVALUE, &val, NULL );
146
147     Trigger( p_input, INPUT_EVENT_SIGNAL );
148 }
149
150 void input_SendEventState( input_thread_t *p_input, int i_state )
151 {
152     vlc_value_t val;
153
154     val.i_int = i_state;
155     var_Change( p_input, "state", VLC_VAR_SETVALUE, &val, NULL );
156
157     Trigger( p_input, INPUT_EVENT_STATE );
158 }
159
160 void input_SendEventCache( input_thread_t *p_input, double f_level )
161 {
162     vlc_value_t val;
163
164     val.f_float = f_level;
165         var_Change( p_input, "cache", VLC_VAR_SETVALUE, &val, NULL );
166
167     Trigger( p_input, INPUT_EVENT_CACHE );
168 }
169
170 /* FIXME: review them because vlc_event_send might be
171  * moved inside input_item* functions.
172  */
173 void input_SendEventMeta( input_thread_t *p_input )
174 {
175     Trigger( p_input, INPUT_EVENT_ITEM_META );
176
177         /* FIXME remove this ugliness ? */
178         vlc_event_t event;
179
180         event.type = vlc_InputItemMetaChanged;
181         event.u.input_item_meta_changed.meta_type = vlc_meta_ArtworkURL;
182         vlc_event_send( &p_input->p->p_item->event_manager, &event );
183 }
184
185 void input_SendEventMetaInfo( input_thread_t *p_input )
186 {
187     Trigger( p_input, INPUT_EVENT_ITEM_INFO );
188
189         /* FIXME remove this ugliness */
190     vlc_event_t event;
191
192     event.type = vlc_InputItemInfoChanged;
193     vlc_event_send( &p_input->p->p_item->event_manager, &event );
194 }
195
196 void input_SendEventMetaName( input_thread_t *p_input, const char *psz_name )
197 {
198     Trigger( p_input, INPUT_EVENT_ITEM_NAME );
199
200         /* FIXME remove this ugliness */
201     vlc_event_t event;
202
203     event.type = vlc_InputItemNameChanged;
204     event.u.input_item_name_changed.new_name = psz_name;
205     vlc_event_send( &p_input->p->p_item->event_manager, &event );
206 }
207
208 /*****************************************************************************
209  * Event for es_out.c
210  *****************************************************************************/
211 void input_SendEventProgramAdd( input_thread_t *p_input,
212                                 int i_program, const char *psz_text )
213 {
214     vlc_value_t val;
215     vlc_value_t text;
216
217     val.i_int = i_program;
218     text.psz_string = (char*)psz_text;
219
220     var_Change( p_input, "program", VLC_VAR_ADDCHOICE,
221                 &val, psz_text ? &text : NULL );
222
223     Trigger( p_input, INPUT_EVENT_PROGRAM );
224 }
225 void input_SendEventProgramDel( input_thread_t *p_input, int i_program )
226 {
227     vlc_value_t val;
228
229     val.i_int = i_program;
230     var_Change( p_input, "program", VLC_VAR_DELCHOICE, &val, NULL );
231
232     Trigger( p_input, INPUT_EVENT_PROGRAM );
233 }
234 void input_SendEventProgramSelect( input_thread_t *p_input, int i_program )
235 {
236     vlc_value_t val;
237
238     val.i_int = i_program;
239     var_Change( p_input, "program", VLC_VAR_SETVALUE, &val, NULL );
240
241     Trigger( p_input, INPUT_EVENT_PROGRAM );
242 }
243
244 static const char *GetEsVarName( int i_cat )
245 {
246     switch( i_cat )
247     {
248     case VIDEO_ES:
249         return "video-es";
250     case AUDIO_ES:
251         return "audio-es";
252     default:
253         assert( i_cat == SPU_ES );
254         return "spu-es";
255     }
256 }
257 void input_SendEventEsDel( input_thread_t *p_input, int i_cat, int i_id )
258 {
259     vlc_value_t val;
260
261     if( i_cat == UNKNOWN_ES )
262         return;
263
264     if( i_id >= 0 )
265     {
266         val.i_int = i_id;
267         var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_DELCHOICE, &val, NULL );
268     }
269     else
270     {
271         var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_CLEARCHOICES, NULL, NULL );
272     }
273
274     Trigger( p_input, INPUT_EVENT_ES );
275 }
276 void input_SendEventEsAdd( input_thread_t *p_input, int i_cat, int i_id, const char *psz_text )
277 {
278     vlc_value_t val;
279     vlc_value_t text;
280
281     if( i_cat == UNKNOWN_ES )
282         return;
283
284     val.i_int = i_id;
285     text.psz_string = (char*)psz_text;
286
287     var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_ADDCHOICE,
288                 &val, psz_text ? &text : NULL );
289
290     Trigger( p_input, INPUT_EVENT_ES );
291 }
292
293 /* i_id == -1 will unselect */
294 void input_SendEventEsSelect( input_thread_t *p_input, int i_cat, int i_id )
295 {
296     vlc_value_t val;
297
298     if( i_cat == UNKNOWN_ES )
299         return;
300
301     val.i_int = i_id;
302     var_Change( p_input, GetEsVarName( i_cat ), VLC_VAR_SETVALUE, &val, NULL );
303
304     Trigger( p_input, INPUT_EVENT_ES );
305 }
306
307 void input_SendEventTeletext( input_thread_t *p_input, int i_id )
308 {
309     vlc_value_t val;
310
311     val.i_int = i_id;
312     var_Change( p_input, "teletext-es", VLC_VAR_SETVALUE, &val, NULL );
313
314     Trigger( p_input, INPUT_EVENT_TELETEXT );
315 }
316
317 void input_SendEventVout( input_thread_t *p_input )
318 {
319     Trigger( p_input, INPUT_EVENT_VOUT );
320 }
321
322 /*****************************************************************************
323  * Event for control.c/input.c
324  *****************************************************************************/
325 void input_SendEventBookmark( input_thread_t *p_input )
326 {
327     Trigger( p_input, INPUT_EVENT_BOOKMARK );
328 }
329
330 /*****************************************************************************
331  *
332  *****************************************************************************/
333 static void Trigger( input_thread_t *p_input, int i_type )
334 {
335     var_SetInteger( p_input, "intf-event", i_type );
336 }