QVisu
Qt-based visualization for smart homes
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
vlc_events.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * vlc_events.h: events definitions
3  * Interface used to send events.
4  *****************************************************************************
5  * Copyright (C) 2007 VLC authors and VideoLAN
6  * $Id: 9e37f7f5753243d52a4fba2616d958598083a53f $
7  *
8  * Authors: Pierre d'Herbemont
9  *
10  * This program is free software; you can redistribute it and/or modify it
11  * under the terms of the GNU Lesser General Public License as published by
12  * the Free Software Foundation; either version 2.1 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24 
25 #ifndef VLC_EVENTS_H
26 # define VLC_EVENTS_H
27 
28 #include <vlc_arrays.h>
29 #include <vlc_meta.h>
30 
37 /*****************************************************************************
38  * Documentation
39  *****************************************************************************/
40 /*
41  **** Background
42  *
43  * This implements a way to send and receive event for an object (which can be
44  * a simple C struct or less).
45  *
46  * This is in direct concurrency with the Variable based Callback
47  * (see src/misc/variables.c).
48  *
49  * It has the following advantages over Variable based Callback:
50  * - No need to implement the whole VLC_COMMON_MEMBERS in the object,
51  * thus it reduce it size. This is especially true for input_item_t which
52  * doesn't have VLC_COMMON_MEMBERS. This is the first reason of existence of
53  * this implementation.
54  * - Libvlc can easily be based upon that.
55  * - Existing event are clearly declared (in include/vlc_events.h)
56  *
57  *
58  **** Example usage
59  *
60  * (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.)
61  *
62  * struct vlc_cool_object_t
63  * {
64  * ...
65  * vlc_event_manager_t p_event_manager;
66  * ...
67  * }
68  *
69  * vlc_my_cool_object_new()
70  * {
71  * ...
72  * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object );
73  * vlc_event_manager_register_event_type(p_self->p_event_manager,
74  * vlc_MyCoolObjectDidSomething, p_e)
75  * ...
76  * }
77  *
78  * vlc_my_cool_object_release()
79  * {
80  * ...
81  * vlc_event_manager_fini( &p_self->p_event_manager );
82  * ...
83  * }
84  *
85  * vlc_my_cool_object_do_something()
86  * {
87  * ...
88  * vlc_event_t event;
89  * event.type = vlc_MyCoolObjectDidSomething;
90  * event.u.my_cool_object_did_something.what_it_did = kSomething;
91  * vlc_event_send( &p_self->p_event_manager, &event );
92  * }
93  * */
94 
95  /*****************************************************************************
96  * Event Type
97  *****************************************************************************/
98 
99 /* Private structure defined in misc/events.c */
100 struct vlc_event_listeners_group_t;
101 
102 /* Event manager type */
103 typedef struct vlc_event_manager_t
104 {
105  void * p_obj;
106  vlc_mutex_t object_lock;
107  vlc_mutex_t event_sending_lock;
108  DECL_ARRAY(struct vlc_event_listeners_group_t *) listeners_groups;
110 
111 /* List of event */
112 typedef enum vlc_event_type_t {
113  /* Input (thread) events */
114  vlc_InputStateChanged,
115  vlc_InputSelectedStreamChanged,
116 
117  /* Input item events */
118  vlc_InputItemMetaChanged,
119  vlc_InputItemSubItemAdded,
120  vlc_InputItemSubItemTreeAdded,
121  vlc_InputItemDurationChanged,
122  vlc_InputItemPreparsedChanged,
123  vlc_InputItemNameChanged,
124  vlc_InputItemInfoChanged,
125  vlc_InputItemErrorWhenReadingChanged,
126 
127  /* Service Discovery event */
128  vlc_ServicesDiscoveryItemAdded,
129  vlc_ServicesDiscoveryItemRemoved,
130  vlc_ServicesDiscoveryItemRemoveAll,
131  vlc_ServicesDiscoveryStarted,
132  vlc_ServicesDiscoveryEnded
133 } vlc_event_type_t;
134 
135 /* Event definition */
136 typedef struct vlc_event_t
137 {
138  vlc_event_type_t type;
139  void * p_obj; /* Sender object, automatically filled by vlc_event_send() */
141  {
142  /* Input (thread) events */
144  {
145  int new_state;
146  } input_state_changed;
148  {
149  void * unused;
150  } input_selected_stream_changed;
151 
152  /* Input item events */
154  {
155  vlc_meta_type_t meta_type;
156  } input_item_meta_changed;
158  {
159  input_item_t * p_new_child;
160  } input_item_subitem_added;
162  {
163  input_item_node_t * p_root;
164  } input_item_subitem_tree_added;
166  {
167  mtime_t new_duration;
168  } input_item_duration_changed;
170  {
171  int new_status;
172  } input_item_preparsed_changed;
174  {
175  const char * new_name;
176  } input_item_name_changed;
178  {
179  void * unused;
180  } input_item_info_changed;
182  {
183  bool new_value;
185 
186  /* Service discovery events */
188  {
189  input_item_t * p_new_item;
190  const char * psz_category;
191  } services_discovery_item_added;
193  {
194  input_item_t * p_item;
195  } services_discovery_item_removed;
197  {
198  void * unused;
199  } services_discovery_started;
201  {
202  void * unused;
203  } services_discovery_ended;
204 
205  } u;
206 } vlc_event_t;
207 
208 /* Event callback type */
209 typedef void ( *vlc_event_callback_t )( const vlc_event_t *, void * );
210 
211  /*****************************************************************************
212  * Event manager
213  *****************************************************************************/
214 
215 /*
216  * p_obj points to the object that owns the event manager, and from
217  * which events are sent
218  */
219 VLC_API int vlc_event_manager_init( vlc_event_manager_t * p_em, void * p_obj );
220 
221 /*
222  * Destroy
223  */
224 VLC_API void vlc_event_manager_fini( vlc_event_manager_t * p_em );
225 
226 /*
227  * Tells a specific event manager that it will handle event_type object
228  */
229 VLC_API int vlc_event_manager_register_event_type( vlc_event_manager_t * p_em,
230  vlc_event_type_t );
231 
232 /*
233  * Send an event to the listener attached to this p_em.
234  */
235 VLC_API void vlc_event_send( vlc_event_manager_t * p_em, vlc_event_t * );
236 
237 /*
238  * Add a callback for an event.
239  */
240 VLC_API int vlc_event_attach( vlc_event_manager_t * p_event_manager,
241  vlc_event_type_t event_type,
242  vlc_event_callback_t pf_callback,
243  void *p_user_data );
244 
245 /*
246  * Remove a callback for an event.
247  */
248 VLC_API void vlc_event_detach( vlc_event_manager_t *p_event_manager,
249  vlc_event_type_t event_type,
250  vlc_event_callback_t pf_callback,
251  void *p_user_data );
252 
253 #endif /* VLC_EVENTS_H */
Definition: vlc_input_item.h:55
Definition: vlc_input_item.h:109
Definition: vlc_events.h:103
Definition: vlc_events.h:140
Definition: vlc_events.h:136
int64_t mtime_t
Definition: vlc_common.h:153