X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fevent.c;h=2ce0a23970d5bf8eb25fba5993bf02efd13835d3;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=e61ee9de6c990deee3fc1e89d1eabb2c2b14bfd3;hpb=556953c4c2ec361c1d5508702083b76edf89cb4d;p=vlc diff --git a/src/control/event.c b/src/control/event.c index e61ee9de6c..2ce0a23970 100644 --- a/src/control/event.c +++ b/src/control/event.c @@ -1,7 +1,7 @@ /***************************************************************************** * event.c: New libvlc event control API ***************************************************************************** - * Copyright (C) 2007 the VideoLAN team + * Copyright (C) 2007-2010 the VideoLAN team * $Id $ * * Authors: Filippo Carone @@ -212,10 +212,10 @@ void libvlc_event_send( libvlc_event_manager_t * p_em, else { /* The listener wants to block the emitter during event callback */ - + listener_cached->pf_callback( p_event, listener_cached->p_user_data ); listener_cached++; - + if( listeners_group->b_sublistener_removed ) { /* If a callback was removed, this gets called */ @@ -228,7 +228,7 @@ void libvlc_event_send( libvlc_event_manager_t * p_em, listener_cached++; continue; } - } + } } } vlc_mutex_unlock( &p_em->event_sending_lock ); @@ -240,25 +240,83 @@ void libvlc_event_send( libvlc_event_manager_t * p_em, * Public libvlc functions */ -/************************************************************************** - * libvlc_event_type_name (public) : - * - * Get the char * name of an event type. - **************************************************************************/ -static const char event_type_to_name[][libvlc_num_event_types] = +#define DEF( a ) { libvlc_##a, #a, }, + +typedef struct { -#define DEF(a) [libvlc_##a]=#a - DEFINE_LIBVLC_EVENT_TYPES -#undef DEF + int type; + const char name[40]; +} event_name_t; + +static const event_name_t event_list[] = { + DEF(MediaMetaChanged) + DEF(MediaSubItemAdded) + DEF(MediaDurationChanged) + DEF(MediaParsedChanged) + DEF(MediaFreed) + DEF(MediaStateChanged) + + DEF(MediaPlayerMediaChanged) + DEF(MediaPlayerNothingSpecial) + DEF(MediaPlayerOpening) + DEF(MediaPlayerBuffering) + DEF(MediaPlayerPlaying) + DEF(MediaPlayerPaused) + DEF(MediaPlayerStopped) + DEF(MediaPlayerForward) + DEF(MediaPlayerBackward) + DEF(MediaPlayerEndReached) + DEF(MediaPlayerEncounteredError) + DEF(MediaPlayerTimeChanged) + DEF(MediaPlayerPositionChanged) + DEF(MediaPlayerSeekableChanged) + DEF(MediaPlayerPausableChanged) + DEF(MediaPlayerTitleChanged) + DEF(MediaPlayerSnapshotTaken) + DEF(MediaPlayerLengthChanged) + + DEF(MediaListItemAdded) + DEF(MediaListWillAddItem) + DEF(MediaListItemDeleted) + DEF(MediaListWillDeleteItem) + + DEF(MediaListViewItemAdded) + DEF(MediaListViewWillAddItem) + DEF(MediaListViewItemDeleted) + DEF(MediaListViewWillDeleteItem) + + DEF(MediaListPlayerPlayed) + DEF(MediaListPlayerNextItemSet) + DEF(MediaListPlayerStopped) + + DEF(MediaDiscovererStarted) + DEF(MediaDiscovererEnded) + + DEF(VlmMediaAdded) + DEF(VlmMediaRemoved) + DEF(VlmMediaChanged) + DEF(VlmMediaInstanceStarted) + DEF(VlmMediaInstanceStopped) + DEF(VlmMediaInstanceStatusInit) + DEF(VlmMediaInstanceStatusOpening) }; +#undef DEF static const char unknown_event_name[] = "Unknown Event"; -const char * libvlc_event_type_name( libvlc_event_type_t event_type ) +static int evcmp( const void *a, const void *b ) +{ + return (*(const int *)a) - ((event_name_t *)b)->type; +} + +const char * libvlc_event_type_name( int event_type ) { - if( event_type >= libvlc_num_event_types ) - return unknown_event_name; - return event_type_to_name[event_type]; + const event_name_t *p; + + p = bsearch( &event_type, event_list, + sizeof(event_list)/sizeof(event_list[0]), sizeof(*p), + evcmp ); + return p ? p->name : unknown_event_name; } /************************************************************************** @@ -275,16 +333,16 @@ int event_attach( libvlc_event_manager_t * p_event_manager, libvlc_event_listeners_group_t * listeners_group; libvlc_event_listener_t * listener; int i; - + listener = malloc(sizeof(libvlc_event_listener_t)); if( unlikely(listener == NULL) ) return ENOMEM; - + listener->event_type = event_type; listener->p_user_data = p_user_data; listener->pf_callback = pf_callback; listener->is_asynchronous = is_asynchronous; - + vlc_mutex_lock( &p_event_manager->object_lock ); for( i = 0; i < vlc_array_count(&p_event_manager->listeners_groups); i++ ) { @@ -297,11 +355,12 @@ int event_attach( libvlc_event_manager_t * p_event_manager, } } vlc_mutex_unlock( &p_event_manager->object_lock ); - + free(listener); fprintf( stderr, "This object event manager doesn't know about '%s' events", libvlc_event_type_name(event_type) ); assert(0); + return -1; } /************************************************************************** @@ -346,7 +405,7 @@ void libvlc_event_detach( libvlc_event_manager_t *p_event_manager, libvlc_event_listener_t * listener; int i, j; bool found = false; - + vlc_mutex_lock( &p_event_manager->event_sending_lock ); vlc_mutex_lock( &p_event_manager->object_lock ); for( i = 0; i < vlc_array_count(&p_event_manager->listeners_groups); i++)