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