]> git.sesse.net Git - vlc/blobdiff - src/control/media_player.c
Remove unused change_float_list
[vlc] / src / control / media_player.c
index 8a191930c215862448fdae12aec2f220a182bfc7..87788ccd53d3855fee65fdf3855232245b796908 100644 (file)
@@ -28,9 +28,7 @@
 #include <vlc_input.h>
 #include <vlc_vout.h>
 #include "libvlc.h"
-
-static void
-input_state_changed( const vlc_event_t * event, void * p_userdata );
+#include <assert.h>
 
 static int
 input_seekable_changed( vlc_object_t * p_this, char const * psz_cmd,
@@ -45,14 +43,15 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
                      vlc_value_t oldval, vlc_value_t newval,
                      void * p_userdata );
 
+static int SnapshotTakenCallback( vlc_object_t *p_this, char const *psz_cmd,
+                       vlc_value_t oldval, vlc_value_t newval, void *p_data );
+
 static const libvlc_state_t vlc_to_libvlc_state_array[] =
 {
     [INIT_S]        = libvlc_NothingSpecial,
     [OPENING_S]     = libvlc_Opening,
-    [BUFFERING_S]   = libvlc_Buffering,
     [PLAYING_S]     = libvlc_Playing,
     [PAUSE_S]       = libvlc_Paused,
-    [STOP_S]        = libvlc_Stopped,
     [END_S]         = libvlc_Ended,
     [ERROR_S]       = libvlc_Error,
 };
@@ -82,8 +81,6 @@ static void release_input_thread( libvlc_media_player_t *p_mi )
     /* No one is tracking this input_thread appart us. Destroy it */
     if( p_mi->b_own_its_input_thread )
     {
-        vlc_event_manager_t * p_em = input_get_event_manager( p_input_thread );
-        vlc_event_detach( p_em, vlc_InputStateChanged, input_state_changed, p_mi );
         var_DelCallback( p_input_thread, "can-seek", input_seekable_changed, p_mi );
         var_DelCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi );
         var_DelCallback( p_input_thread, "intf-event", input_event_changed, p_mi );
@@ -129,59 +126,6 @@ input_thread_t *libvlc_get_input_thread( libvlc_media_player_t *p_mi,
     return p_input_thread;
 }
 
-/*
- * input_state_changed (Private) (vlc_InputStateChanged callback)
- */
-static void
-input_state_changed( const vlc_event_t * event, void * p_userdata )
-{
-    libvlc_media_player_t * p_mi = p_userdata;
-    libvlc_event_t forwarded_event;
-    libvlc_event_type_t type = event->u.input_state_changed.new_state;
-
-    switch ( type )
-    {
-        case INIT_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL);
-            forwarded_event.type = libvlc_MediaPlayerNothingSpecial;
-            break;
-        case OPENING_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Opening, NULL);
-            forwarded_event.type = libvlc_MediaPlayerOpening;
-            break;
-        case BUFFERING_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Buffering, NULL);
-            forwarded_event.type = libvlc_MediaPlayerBuffering;
-            break;
-        case PLAYING_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Playing, NULL);
-            forwarded_event.type = libvlc_MediaPlayerPlaying;
-            break;
-        case PAUSE_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Paused, NULL);
-            forwarded_event.type = libvlc_MediaPlayerPaused;
-            break;
-        case STOP_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, NULL);
-            forwarded_event.type = libvlc_MediaPlayerStopped;
-            break;
-        case END_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Ended, NULL);
-            forwarded_event.type = libvlc_MediaPlayerEndReached;
-            break;
-        case ERROR_S:
-            libvlc_media_set_state( p_mi->p_md, libvlc_Error, NULL);
-            forwarded_event.type = libvlc_MediaPlayerEncounteredError;
-            break;
-
-        default:
-            return;
-    }
-
-    libvlc_event_send( p_mi->p_event_manager, &forwarded_event );
-    return;
-}
-
 static int
 input_seekable_changed( vlc_object_t * p_this, char const * psz_cmd,
                         vlc_value_t oldval, vlc_value_t newval,
@@ -230,23 +174,61 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
     libvlc_media_player_t * p_mi = p_userdata;
     libvlc_event_t event;
 
-    if( newval.i_int != INPUT_EVENT_TIMES )
-        return VLC_EGENERIC;
+    assert( !strcmp( psz_cmd, "intf-event" ) );
 
-    assert( !strcmp(psz_cmd, "intf-event" ) );
+    if( newval.i_int == INPUT_EVENT_STATE )
+    {
+        libvlc_state_t libvlc_state;
 
-    if( var_GetInteger( p_input, "state" ) != PLAYING_S )
-        return VLC_SUCCESS; /* Don't send the position while stopped */
+        switch ( var_GetInteger( p_input, "state" ) )
+        {
+            case INIT_S:
+                libvlc_state = libvlc_NothingSpecial;
+                event.type = libvlc_MediaPlayerNothingSpecial;
+                break;
+            case OPENING_S:
+                libvlc_state = libvlc_Opening;
+                event.type = libvlc_MediaPlayerOpening;
+                break;
+            case PLAYING_S:
+                libvlc_state = libvlc_Playing;
+                event.type = libvlc_MediaPlayerPlaying;
+                break;
+            case PAUSE_S:
+                libvlc_state = libvlc_Paused;
+                event.type = libvlc_MediaPlayerPaused;
+                break;
+            case END_S:
+                libvlc_state = libvlc_Ended;
+                event.type = libvlc_MediaPlayerEndReached;
+                break;
+            case ERROR_S:
+                libvlc_state = libvlc_Error;
+                event.type = libvlc_MediaPlayerEncounteredError;
+                break;
+
+            default:
+                return VLC_SUCCESS;
+        }
 
-    /* */
-    event.type = libvlc_MediaPlayerPositionChanged;
-    event.u.media_player_position_changed.new_position = var_GetFloat( p_input, "position" );;
-    libvlc_event_send( p_mi->p_event_manager, &event );
+        libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL);
+        libvlc_event_send( p_mi->p_event_manager, &event );
+    }
+    else if( newval.i_int == INPUT_EVENT_TIMES )
+    {
+        if( var_GetInteger( p_input, "state" ) != PLAYING_S )
+            return VLC_SUCCESS; /* Don't send the position while stopped */
 
-    /* */
-    event.type = libvlc_MediaPlayerTimeChanged;
-    event.u.media_player_time_changed.new_time = var_GetTime( p_input, "time" );
-    libvlc_event_send( p_mi->p_event_manager, &event );
+        /* */
+        event.type = libvlc_MediaPlayerPositionChanged;
+        event.u.media_player_position_changed.new_position = var_GetFloat( p_input, "position" );;
+        libvlc_event_send( p_mi->p_event_manager, &event );
+
+        /* */
+        event.type = libvlc_MediaPlayerTimeChanged;
+        event.u.media_player_time_changed.new_time = var_GetTime( p_input, "time" );
+        libvlc_event_send( p_mi->p_event_manager, &event );
+    }
 
     return VLC_SUCCESS;
 
@@ -330,6 +312,16 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance,
     libvlc_event_manager_register_event_type( p_mi->p_event_manager,
             libvlc_MediaPlayerPausableChanged, p_e );
 
+    /* Snapshot initialization */
+    libvlc_event_manager_register_event_type( p_mi->p_event_manager,
+           libvlc_MediaPlayerSnapshotTaken, p_e );
+    /* Attach a var callback to the global object to provide the glue between
+        vout_thread that generates the event and media_player that re-emits it
+        with its own event manager
+    */
+    var_Create( p_libvlc_instance->p_libvlc_int, "vout-snapshottaken", VLC_VAR_STRING | VLC_VAR_ISCOMMAND );
+    var_AddCallback( p_libvlc_instance->p_libvlc_int, "vout-snapshottaken", SnapshotTakenCallback, p_mi );
+
     return p_mi;
 }
 
@@ -408,6 +400,9 @@ void libvlc_media_player_destroy( libvlc_media_player_t *p_mi )
     if( !p_mi )
         return;
 
+       /* Detach Callback from the main libvlc object */
+    var_DelCallback( p_mi->p_libvlc_instance->p_libvlc_int, "vout-snapshottaken", SnapshotTakenCallback, p_mi );
+
     p_input_thread = libvlc_get_input_thread( p_mi, &p_e );
 
     if( libvlc_exception_raised( &p_e ) )
@@ -535,6 +530,28 @@ libvlc_media_player_event_manager(
     return p_mi->p_event_manager;
 }
 
+/**************************************************************************
+ * Trigger a snapshot Taken Event
+ *************************************************************************/
+static int SnapshotTakenCallback( vlc_object_t *p_this, char const *psz_cmd,
+                       vlc_value_t oldval, vlc_value_t newval, void *p_data )
+{
+    VLC_UNUSED(psz_cmd); VLC_UNUSED(oldval);
+    VLC_UNUSED(p_this) ;
+
+    libvlc_media_player_t* p_mi = (libvlc_media_player_t*) p_data ;
+    libvlc_event_t event ;
+    event.type = libvlc_MediaPlayerSnapshotTaken ;
+    event.u.media_player_snapshot_taken.psz_filename = newval.psz_string ;
+    /* Snapshot psz data is a vlc_variable owned by libvlc object .
+         Its memmory management is taken care by the obj*/
+    msg_Dbg( p_this, "about to emit libvlc_snapshot_taken.make psz_str=0x%x (%s)",
+          event.u.media_player_snapshot_taken.psz_filename ,event.u.media_player_snapshot_taken.psz_filename );
+    libvlc_event_send( p_mi->p_event_manager, &event );
+
+    return VLC_SUCCESS;
+}
+
 /**************************************************************************
  * Play
  **************************************************************************/
@@ -583,9 +600,6 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi,
         var_Set( p_input_thread, "drawable", val );
     }
 
-    vlc_event_manager_t * p_em = input_get_event_manager( p_input_thread );
-    vlc_event_attach( p_em, vlc_InputStateChanged, input_state_changed, p_mi );
-
     var_AddCallback( p_input_thread, "can-seek", input_seekable_changed, p_mi );
     var_AddCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi );
     var_AddCallback( p_input_thread, "intf-event", input_event_changed, p_mi );
@@ -619,6 +633,29 @@ void libvlc_media_player_pause( libvlc_media_player_t *p_mi,
     vlc_object_release( p_input_thread );
 }
 
+/**************************************************************************
+ * is_playing
+ **************************************************************************/
+int libvlc_media_player_is_playing( libvlc_media_player_t *p_mi,
+                                     libvlc_exception_t *p_e )
+{
+    input_thread_t * p_input_thread = libvlc_get_input_thread( p_mi, p_e );
+
+    if( !p_input_thread )
+        return 0;
+
+    libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e );
+
+    vlc_object_release( p_input_thread );
+    
+    if( state == libvlc_Playing )
+    {
+        return 1;
+    }
+    return 0;
+}
+
+
 /**************************************************************************
  * Stop
  **************************************************************************/
@@ -634,7 +671,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi,
 
         /* Construct and send the event */
         libvlc_event_t event;
-        event.type = libvlc_MediaPlayerEndReached;
+        event.type = libvlc_MediaPlayerStopped;
         libvlc_event_send( p_mi->p_event_manager, &event );
     }