]> git.sesse.net Git - vlc/commitdiff
control/media_instance.c: Avoid multiple libvlc_MediaInstanceReachedEnd, by providing...
authorPierre d'Herbemont <pdherbemont@videolan.org>
Wed, 27 Feb 2008 23:45:10 +0000 (23:45 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Wed, 27 Feb 2008 23:45:10 +0000 (23:45 +0000)
include/vlc/libvlc_structures.h
src/control/media_instance.c

index 36ee04b5e1f3390bc9fdb57fd93c74a9fd3e0a61..067f1b8077bf2607233f0a23e178a5a3e6cf39b4 100644 (file)
@@ -321,6 +321,8 @@ typedef enum libvlc_event_type_t {
     libvlc_MediaInstanceEncounteredError,
     libvlc_MediaInstanceTimeChanged,
     libvlc_MediaInstancePositionChanged,
+    libvlc_MediaInstanceSeekableChanged,
+    libvlc_MediaInstancePausableChanged,
 
     libvlc_MediaListItemAdded,
     libvlc_MediaListWillAddItem,
@@ -389,6 +391,14 @@ typedef struct libvlc_event_t
         {
             libvlc_time_t new_time;
         } media_instance_time_changed;
+        struct
+        {
+            libvlc_time_t new_seekable;
+        } media_instance_seekable_changed;
+        struct
+        {
+            libvlc_time_t new_pausable;
+        } media_instance_pausable_changed;
 
         /* media list */
         struct
index 02549f0ea55d7fcae97cc9b79f92ae69704d28d7..d0f43196cbb4e4cddcec4a652d5e477d21a364db 100644 (file)
@@ -148,9 +148,6 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd,
     libvlc_event_t event;
     libvlc_event_type_t type = newval.i_int;
 
-    if( strcmp( psz_cmd, "state" ) )
-        type = var_GetInteger( p_this, "state" );
-
     switch ( type )
     {
         case END_S:
@@ -177,6 +174,40 @@ input_state_changed( vlc_object_t * p_this, char const * psz_cmd,
     return VLC_SUCCESS;
 }
 
+static int
+input_seakable_changed( vlc_object_t * p_this, char const * psz_cmd,
+                        vlc_value_t oldval, vlc_value_t newval,
+                        void * p_userdata )
+{
+    VLC_UNUSED(oldval);
+    libvlc_media_instance_t * p_mi = p_userdata;
+    libvlc_event_t event;
+
+    libvlc_media_descriptor_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL);
+    event.type = libvlc_MediaInstanceSeekableChanged;
+    event.u.media_instance_seekable_changed.new_seekable = newval.b_bool;
+
+    libvlc_event_send( p_mi->p_event_manager, &event );
+    return VLC_SUCCESS;
+}
+
+static int
+input_pausable_changed( vlc_object_t * p_this, char const * psz_cmd,
+                        vlc_value_t oldval, vlc_value_t newval,
+                        void * p_userdata )
+{
+    VLC_UNUSED(oldval);
+    libvlc_media_instance_t * p_mi = p_userdata;
+    libvlc_event_t event;
+
+    libvlc_media_descriptor_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL);
+    event.type = libvlc_MediaInstancePausableChanged;
+    event.u.media_instance_pausable_changed.new_pausable = newval.b_bool;
+
+    libvlc_event_send( p_mi->p_event_manager, &event );
+    return VLC_SUCCESS;
+}
+
 /*
  * input_position_changed (Private) (input var "intf-change" Callback)
  */
@@ -295,6 +326,10 @@ libvlc_media_instance_new( libvlc_instance_t * p_libvlc_instance,
             libvlc_MediaInstancePositionChanged, p_e );
     libvlc_event_manager_register_event_type( p_mi->p_event_manager,
             libvlc_MediaInstanceTimeChanged, p_e );
+    libvlc_event_manager_register_event_type( p_mi->p_event_manager,
+            libvlc_MediaInstanceSeekableChanged, p_e );
+    libvlc_event_manager_register_event_type( p_mi->p_event_manager,
+            libvlc_MediaInstancePausableChanged, p_e );
 
     return p_mi;
 }
@@ -552,8 +587,8 @@ void libvlc_media_instance_play( libvlc_media_instance_t *p_mi,
         var_Set( p_input_thread, "drawable", val );
     }
     var_AddCallback( p_input_thread, "state", input_state_changed, p_mi );
-    var_AddCallback( p_input_thread, "seekable", input_state_changed, p_mi );
-    var_AddCallback( p_input_thread, "pausable", input_state_changed, p_mi );
+    var_AddCallback( p_input_thread, "seekable", input_seekable_changed, p_mi );
+    var_AddCallback( p_input_thread, "pausable", input_pausable_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 );