+typedef libvlc_media_list_view_t * (*libvlc_media_list_view_constructor_func_t)( libvlc_media_list_t * p_mlist, libvlc_exception_t * p_e ) ;
+typedef void (*libvlc_media_list_view_release_func_t)( libvlc_media_list_view_t * p_mlv ) ;
+
+typedef int (*libvlc_media_list_view_count_func_t)( libvlc_media_list_view_t * p_mlv,
+ libvlc_exception_t * ) ;
+
+typedef libvlc_media_t *
+ (*libvlc_media_list_view_item_at_index_func_t)(
+ libvlc_media_list_view_t * p_mlv,
+ int index,
+ libvlc_exception_t * ) ;
+
+typedef libvlc_media_list_view_t *
+ (*libvlc_media_list_view_children_at_index_func_t)(
+ libvlc_media_list_view_t * p_mlv,
+ int index,
+ libvlc_exception_t * ) ;
+
+/* A way to see a media list */
+struct libvlc_media_list_view_t
+{
+ libvlc_event_manager_t * p_event_manager;
+ libvlc_instance_t * p_libvlc_instance;
+ int i_refcount;
+ vlc_mutex_t object_lock;
+
+ libvlc_media_list_t * p_mlist;
+
+ struct libvlc_media_list_view_private_t * p_this_view_data;
+
+ /* Accessors */
+ libvlc_media_list_view_count_func_t pf_count;
+ libvlc_media_list_view_item_at_index_func_t pf_item_at_index;
+ libvlc_media_list_view_children_at_index_func_t pf_children_at_index;
+
+ libvlc_media_list_view_constructor_func_t pf_constructor;
+ libvlc_media_list_view_release_func_t pf_release;
+
+ /* Notification callback */
+ void (*pf_ml_item_added)(const libvlc_event_t *, libvlc_media_list_view_t *);
+ void (*pf_ml_item_removed)(const libvlc_event_t *, libvlc_media_list_view_t *);
+};
+
+struct libvlc_media_player_t
+{
+ int i_refcount;
+ vlc_mutex_t object_lock;
+ input_thread_t * p_input_thread;
+ struct libvlc_instance_t * p_libvlc_instance; /* Parent instance */
+ libvlc_media_t * p_md; /* current media descriptor */
+ libvlc_event_manager_t * p_event_manager;
+ libvlc_drawable_t drawable;
+
+ bool b_own_its_input_thread;
+};
+
+struct libvlc_media_list_player_t
+{
+ libvlc_event_manager_t * p_event_manager;
+ libvlc_instance_t * p_libvlc_instance;
+ int i_refcount;
+ vlc_mutex_t object_lock;
+ libvlc_media_list_path_t current_playing_item_path;
+ libvlc_media_t * p_current_playing_item;
+ libvlc_media_list_t * p_mlist;
+ libvlc_media_player_t * p_mi;
+};
+
+struct libvlc_media_library_t
+{
+ libvlc_event_manager_t * p_event_manager;
+ libvlc_instance_t * p_libvlc_instance;
+ int i_refcount;
+ libvlc_media_list_t * p_mlist;
+};
+
+struct libvlc_media_discoverer_t
+{
+ libvlc_event_manager_t * p_event_manager;
+ libvlc_instance_t * p_libvlc_instance;
+ services_discovery_t * p_sd;
+ libvlc_media_list_t * p_mlist;
+ bool running;
+ vlc_dictionary_t catname_to_submedialist;
+};
+
+/*
+ * Event Handling
+ */
+/* Example usage
+ *
+ * struct libvlc_cool_object_t
+ * {
+ * ...
+ * libvlc_event_manager_t * p_event_manager;
+ * ...
+ * }
+ *
+ * libvlc_my_cool_object_new()
+ * {
+ * ...
+ * p_self->p_event_manager = libvlc_event_manager_init( p_self,
+ * p_self->p_libvlc_instance, p_e);
+ * libvlc_event_manager_register_event_type(p_self->p_event_manager,
+ * libvlc_MyCoolObjectDidSomething, p_e)
+ * ...
+ * }
+ *
+ * libvlc_my_cool_object_release()
+ * {
+ * ...
+ * libvlc_event_manager_release( p_self->p_event_manager );
+ * ...
+ * }
+ *
+ * libvlc_my_cool_object_do_something()
+ * {
+ * ...
+ * libvlc_event_t event;
+ * event.type = libvlc_MyCoolObjectDidSomething;
+ * event.u.my_cool_object_did_something.what_it_did = kSomething;
+ * libvlc_event_send( p_self->p_event_manager, &event );
+ * }
+ * */
+
+typedef struct libvlc_event_listener_t
+{
+ libvlc_event_type_t event_type;
+ void * p_user_data;
+ libvlc_callback_t pf_callback;
+} libvlc_event_listener_t;
+
+typedef struct libvlc_event_listeners_group_t
+{
+ libvlc_event_type_t event_type;
+ vlc_array_t listeners;
+ bool b_sublistener_removed;
+} libvlc_event_listeners_group_t;
+
+typedef struct libvlc_event_manager_t
+{
+ void * p_obj;
+ struct libvlc_instance_t * p_libvlc_instance;
+ vlc_array_t listeners_groups;
+ vlc_mutex_t object_lock;
+ vlc_mutex_t event_sending_lock;
+} libvlc_event_sender_t;
+
+