control/media_instance.c:

* Implement MediaInstancePositionChanged and MediaInstanceTimeChanged accurately.
control/event.c:
* Register the all event types.
* Don't strdup() in libvlc_event_type_name().
This commit is contained in:
Pierre d'Herbemont 2007-12-29 01:29:48 +00:00
parent 8a7b94a1bb
commit 48f7ca7f70
3 changed files with 53 additions and 9 deletions

View File

@ -305,6 +305,7 @@ typedef enum libvlc_event_type_t {
libvlc_MediaInstancePlayed,
libvlc_MediaInstancePaused,
libvlc_MediaInstanceReachedEnd,
libvlc_MediaInstanceTimeChanged,
libvlc_MediaInstancePositionChanged,
libvlc_MediaListItemAdded,
@ -368,8 +369,12 @@ typedef struct libvlc_event_t
/* media instance */
struct
{
long int new_position;
float new_position;
} media_instance_position_changed;
struct
{
long int new_time;
} media_instance_time_changed;
/* media list */
struct
@ -414,7 +419,8 @@ typedef struct libvlc_event_t
libvlc_media_descriptor_t * item;
int index;
} media_list_view_will_delete_item;
/* media list view */
/* media discoverer */
struct
{
void * unused;

View File

@ -213,10 +213,12 @@ static const char * event_type_to_name[] =
EVENT(libvlc_MediaDescriptorDurationChanged),
EVENT(libvlc_MediaDescriptorPreparsedChanged),
EVENT(libvlc_MediaDescriptorFreed),
EVENT(libvlc_MediaDescriptorStateChanged),
EVENT(libvlc_MediaInstancePlayed),
EVENT(libvlc_MediaInstancePaused),
EVENT(libvlc_MediaInstanceReachedEnd),
EVENT(libvlc_MediaInstanceTimeChanged),
EVENT(libvlc_MediaInstancePositionChanged),
EVENT(libvlc_MediaListItemAdded),
@ -231,7 +233,10 @@ static const char * event_type_to_name[] =
EVENT(libvlc_MediaListPlayerPlayed),
EVENT(libvlc_MediaListPlayerNextItemSet),
EVENT(libvlc_MediaListPlayerStopped)
EVENT(libvlc_MediaListPlayerStopped),
EVENT(libvlc_MediaDiscovererStarted),
EVENT(libvlc_MediaDiscovererEnded)
#undef EVENT
};
static const char * unkwown_event_name = "Unknown Event";
@ -240,7 +245,7 @@ const char * libvlc_event_type_name( libvlc_event_type_t event_type )
{
if( event_type >= sizeof(event_type_to_name)/sizeof(event_type_to_name[0]))
return unkwown_event_name;
return strdup(event_type_to_name[event_type]);
return event_type_to_name[event_type];
}
/**************************************************************************

View File

@ -132,7 +132,6 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd,
libvlc_media_instance_t * p_mi = p_userdata;
libvlc_event_t event;
printf("input_state_changed!!!!!!!!\n");
if( newval.i_int == oldval.i_int )
return VLC_SUCCESS; /* No change since last time, don't propagate */
@ -147,7 +146,6 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd,
event.type = libvlc_MediaInstancePaused;
break;
case PLAYING_S:
printf("PLAYING_S!!!!!!!!\n");
libvlc_media_descriptor_set_state( p_mi->p_md, libvlc_Playing, NULL);
event.type = libvlc_MediaInstancePlayed;
break;
@ -173,7 +171,39 @@ input_position_changed( vlc_object_t * p_this, char const * psz_cmd,
{
libvlc_media_instance_t * p_mi = p_userdata;
vlc_value_t val;
if (!strncmp(psz_cmd, "intf", 4 /* "-change" no need to go further */))
{
input_thread_t * p_input = (input_thread_t *)p_this;
var_Get( p_input, "state", &val );
if( val.i_int != PLAYING_S )
return VLC_SUCCESS; /* Don't send the position while stopped */
var_Get( p_input, "position", &val );
}
else
val.i_time = newval.i_time;
libvlc_event_t event;
event.type = libvlc_MediaInstancePositionChanged;
event.u.media_instance_position_changed.new_position = val.f_float;
libvlc_event_send( p_mi->p_event_manager, &event );
return VLC_SUCCESS;
}
/*
* input_time_changed (Private) (input var "intf-change" Callback)
*/
static int
input_time_changed( vlc_object_t * p_this, char const * psz_cmd,
vlc_value_t oldval, vlc_value_t newval,
void * p_userdata )
{
libvlc_media_instance_t * p_mi = p_userdata;
vlc_value_t val;
if (!strncmp(psz_cmd, "intf", 4 /* "-change" no need to go further */))
{
vlc_value_t val2;
@ -191,8 +221,8 @@ input_position_changed( vlc_object_t * p_this, char const * psz_cmd,
val.i_time = newval.i_time;
libvlc_event_t event;
event.type = libvlc_MediaInstancePositionChanged;
event.u.media_instance_position_changed.new_position = val.i_time;
event.type = libvlc_MediaInstanceTimeChanged;
event.u.media_instance_time_changed.new_time = val.i_time;
libvlc_event_send( p_mi->p_event_manager, &event );
return VLC_SUCCESS;
@ -247,6 +277,8 @@ libvlc_media_instance_new( libvlc_instance_t * p_libvlc_instance,
libvlc_MediaInstancePlayed, p_e );
libvlc_event_manager_register_event_type( p_mi->p_event_manager,
libvlc_MediaInstancePositionChanged, p_e );
libvlc_event_manager_register_event_type( p_mi->p_event_manager,
libvlc_MediaInstanceTimeChanged, p_e );
return p_mi;
}
@ -495,6 +527,7 @@ void libvlc_media_instance_play( libvlc_media_instance_t *p_mi,
}
var_AddCallback( p_input_thread, "state", input_state_changed, p_mi );
var_AddCallback( p_input_thread, "intf-change", input_position_changed, p_mi );
var_AddCallback( p_input_thread, "intf-change", input_time_changed, p_mi );
/* will be released in media_instance_release() */
vlc_object_yield( p_input_thread );