*
* This implements a way to send and receive event for an object (which can be
* a simple C struct or less).
- *
+ *
* This is in direct concurrency with the Variable based Callback
* (see src/misc/variables.c).
*
*
* (vlc_cool_object_t doesn't need to have the VLC_COMMON_MEMBERS.)
*
- * struct vlc_cool_object_t
+ * struct vlc_cool_object_t
* {
* ...
* vlc_event_manager_t p_event_manager;
* vlc_my_cool_object_new()
* {
* ...
- * vlc_event_manager_Create( &p_self->p_event_manager, p_this );
+ * vlc_event_manager_init( &p_self->p_event_manager, p_self, p_a_libvlc_object );
* vlc_event_manager_register_event_type(p_self->p_event_manager,
* vlc_MyCoolObjectDidSomething, p_e)
* ...
* vlc_my_cool_object_release()
* {
* ...
- * vlc_event_manager_release( p_self->p_event_manager );
+ * vlc_event_manager_fini( &p_self->p_event_manager );
* ...
* }
*
* vlc_event_t event;
* event.type = vlc_MyCoolObjectDidSomething;
* event.u.my_cool_object_did_something.what_it_did = kSomething;
- * vlc_event_send( p_self->p_event_manager, &event );
+ * vlc_event_send( &p_self->p_event_manager, &event );
* }
* */
-
+
/*****************************************************************************
* Event Type
*****************************************************************************/
typedef struct vlc_event_manager_t
{
void * p_obj;
+ vlc_mutex_t object_lock;
+ vlc_mutex_t event_sending_lock;
+ vlc_object_t *p_parent_object;
DECL_ARRAY(struct vlc_event_listeners_group_t *) listeners_groups;
} vlc_event_manager_t;
/* List of event */
+/* Be sure to keep sync-ed with misc/events.c debug name table */
typedef enum vlc_event_type_t {
+ /* Input (thread) events */
+ vlc_InputStateChanged,
+ vlc_InputSelectedStreamChanged,
+
+ /* Input item events */
vlc_InputItemMetaChanged,
- vlc_InputItemSubItemAdded
+ vlc_InputItemSubItemAdded,
+ vlc_InputItemSubItemTreeAdded,
+ vlc_InputItemDurationChanged,
+ vlc_InputItemPreparsedChanged,
+ vlc_InputItemNameChanged,
+ vlc_InputItemInfoChanged,
+ vlc_InputItemErrorWhenReadingChanged,
+
+ /* Service Discovery event */
+ vlc_ServicesDiscoveryItemAdded,
+ vlc_ServicesDiscoveryItemRemoved,
+ vlc_ServicesDiscoveryStarted,
+ vlc_ServicesDiscoveryEnded
} vlc_event_type_t;
/* Event definition */
void * p_obj; /* Sender object, automatically filled by vlc_event_send() */
union vlc_event_type_specific
{
+ /* Input (thread) events */
+ struct vlc_input_state_changed
+ {
+ int new_state;
+ } input_state_changed;
+ struct vlc_input_selected_stream_changed
+ {
+ void * unused;
+ } input_selected_stream_changed;
+
+ /* Input item events */
struct vlc_input_item_meta_changed
{
vlc_meta_type_t meta_type;
{
input_item_t * p_new_child;
} input_item_subitem_added;
+ struct vlc_input_item_subitem_tree_added
+ {
+ input_item_node_t * p_root;
+ } input_item_subitem_tree_added;
+ struct vlc_input_item_duration_changed
+ {
+ mtime_t new_duration;
+ } input_item_duration_changed;
+ struct vlc_input_item_preparsed_changed
+ {
+ int new_status;
+ } input_item_preparsed_changed;
+ struct vlc_input_item_name_changed
+ {
+ const char * new_name;
+ } input_item_name_changed;
+ struct vlc_input_item_info_changed
+ {
+ void * unused;
+ } input_item_info_changed;
+ struct input_item_error_when_reading_changed
+ {
+ bool new_value;
+ } input_item_error_when_reading_changed;
+
+ /* Service discovery events */
+ struct vlc_services_discovery_item_added
+ {
+ input_item_t * p_new_item;
+ const char * psz_category;
+ } services_discovery_item_added;
+ struct vlc_services_discovery_item_removed
+ {
+ input_item_t * p_item;
+ } services_discovery_item_removed;
+ struct vlc_services_discovery_started
+ {
+ void * unused;
+ } services_discovery_started;
+ struct vlc_services_discovery_ended
+ {
+ void * unused;
+ } services_discovery_ended;
+
} u;
} vlc_event_t;
/*
* p_obj points to the object that owns the event manager, and from
* which events are sent
+ * p_obj is here to give us a libvlc instance
*/
+#define vlc_event_manager_init_with_vlc_object(a,b) \
+ vlc_event_manager_init( a, b, b )
+
VLC_EXPORT(int, vlc_event_manager_init, ( vlc_event_manager_t * p_em,
- void * p_obj ));
+ void * p_obj, vlc_object_t * ));
+#define vlc_event_manager_init(a,b,c) \
+ vlc_event_manager_init(a, b, VLC_OBJECT(c))
/*
* Destroy
VLC_EXPORT(int, vlc_event_attach, ( vlc_event_manager_t * p_event_manager,
vlc_event_type_t event_type,
vlc_event_callback_t pf_callback,
- void *p_user_data ));
+ void *p_user_data,
+ const char * psz_debug_name ));
+#define vlc_event_attach(a, b, c, d) vlc_event_attach(a, b, c, d, #c)
/*
* Remove a callback for an event.
VLC_EXPORT(int, vlc_event_detach, ( vlc_event_manager_t *p_event_manager,
vlc_event_type_t event_type,
vlc_event_callback_t pf_callback,
- void *p_user_data ));
+ void *p_user_data ));
#endif /* VLC_EVENTS_H */