]> git.sesse.net Git - vlc/blobdiff - src/control/media_player.c
check against libvlc_state_t states
[vlc] / src / control / media_player.c
index b2ee0962012b2be6df0235c49a91c01444d2826e..6ae4b41b54cdb06efc06ca6ada5ebab6bbf1632b 100644 (file)
@@ -69,7 +69,7 @@ static inline libvlc_state_t vlc_to_libvlc_state( int vlc_state )
  *
  * Object lock is NOT held.
  */
-static void release_input_thread( libvlc_media_player_t *p_mi )
+static void release_input_thread( libvlc_media_player_t *p_mi, bool b_input_abort )
 {
     input_thread_t * p_input_thread;
 
@@ -89,11 +89,12 @@ static void release_input_thread( libvlc_media_player_t *p_mi )
                          input_event_changed, p_mi );
 
         /* We owned this one */
-        input_StopThread( p_input_thread );
+        input_StopThread( p_input_thread, b_input_abort );
         vlc_thread_join( p_input_thread );
 
         var_Destroy( p_input_thread, "drawable-hwnd" );
         var_Destroy( p_input_thread, "drawable-xid" );
+        var_Destroy( p_input_thread, "drawable-agl" );
     }
 
     vlc_object_release( p_input_thread );
@@ -215,7 +216,7 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
                 return VLC_SUCCESS;
         }
 
-        libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL);
+        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 )
@@ -274,6 +275,7 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance,
         return NULL;
     }
     p_mi->p_md = NULL;
+    p_mi->drawable.agl = 0;
     p_mi->drawable.xid = 0;
     p_mi->drawable.hwnd = NULL;
     p_mi->p_libvlc_instance = p_libvlc_instance;
@@ -455,7 +457,7 @@ void libvlc_media_player_release( libvlc_media_player_t *p_mi )
     vlc_mutex_unlock( &p_mi->object_lock );
     vlc_mutex_destroy( &p_mi->object_lock );
 
-    release_input_thread( p_mi );
+    release_input_thread( p_mi, true );
 
     libvlc_event_manager_release( p_mi->p_event_manager );
 
@@ -494,7 +496,12 @@ void libvlc_media_player_set_media(
 
     vlc_mutex_lock( &p_mi->object_lock );
 
-    release_input_thread( p_mi );
+    /* FIXME I am not sure if it is a user request or on die(eof/error)
+     * request here */
+    release_input_thread( p_mi,
+                          p_mi->p_input_thread &&
+                          !p_mi->p_input_thread->b_eof &&
+                          !p_mi->p_input_thread->b_error );
 
     if( p_mi->p_md )
         libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, p_e );
@@ -602,7 +609,6 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi,
     p_mi->p_input_thread = input_CreateThread(
             p_mi->p_libvlc_instance->p_libvlc_int, p_mi->p_md->p_input_item );
 
-
     if( !p_mi->p_input_thread )
     {
         vlc_mutex_unlock( &p_mi->object_lock );
@@ -611,6 +617,10 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi,
 
     p_input_thread = p_mi->p_input_thread;
 
+    var_Create( p_input_thread, "drawable-agl", VLC_VAR_INTEGER );
+    if( p_mi->drawable.agl )
+        var_SetInteger( p_input_thread, "drawable-agl", p_mi->drawable.agl );
+
     var_Create( p_input_thread, "drawable-xid", VLC_VAR_INTEGER );
     if( p_mi->drawable.xid )
         var_SetInteger( p_input_thread, "drawable-xid", p_mi->drawable.xid );
@@ -666,12 +676,17 @@ int libvlc_media_player_is_playing( libvlc_media_player_t *p_mi,
     input_thread_t * p_input_thread = libvlc_get_input_thread( p_mi, p_e );
 
     if( !p_input_thread )
+    {
+        /* We do return the right value, no need to throw an exception */
+        if( libvlc_exception_raised( p_e ) )
+            libvlc_exception_clear( p_e );
         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;
@@ -690,7 +705,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi,
 
     if( state == libvlc_Playing || state == libvlc_Paused )
     {
-        /* Send a stop notification event only of we are in playing or
+        /* Send a stop notification event only if we are in playing or
          * paused states */
         libvlc_media_set_state( p_mi->p_md, libvlc_Ended, p_e );
 
@@ -703,7 +718,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi,
     if( p_mi->b_own_its_input_thread )
     {
         vlc_mutex_lock( &p_mi->object_lock );
-        release_input_thread( p_mi ); /* This will stop the input thread */
+        release_input_thread( p_mi, true ); /* This will stop the input thread */
         vlc_mutex_unlock( &p_mi->object_lock );
     }
     else
@@ -713,11 +728,31 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi,
         if( !p_input_thread )
             return;
 
-        input_StopThread( p_input_thread );
+        input_StopThread( p_input_thread, true );
         vlc_object_release( p_input_thread );
+        p_mi->p_input_thread = NULL;
     }
 }
 
+/**************************************************************************
+ * set_agl
+ **************************************************************************/
+void libvlc_media_player_set_agl( libvlc_media_player_t *p_mi,
+                                      uint32_t drawable,
+                                      libvlc_exception_t *p_e )
+{
+    (void) p_e;
+    p_mi->drawable.agl = drawable;
+}
+
+/**************************************************************************
+ * get_agl
+ **************************************************************************/
+uint32_t libvlc_media_player_get_agl( libvlc_media_player_t *p_mi )
+{
+    return p_mi->drawable.agl;
+}
+
 /**************************************************************************
  * set_xwindow
  **************************************************************************/
@@ -768,6 +803,8 @@ void libvlc_media_player_set_drawable( libvlc_media_player_t *p_mi,
         p_mi->drawable.hwnd = (HWND)drawable;
     else
         libvlc_exception_raise(p_e, "Operation not supported");
+#elif defined(__APPLE__)
+    p_mi->drawable.agl = drawable;
 #else
     p_mi->drawable.xid = drawable;
 #endif
@@ -787,6 +824,8 @@ libvlc_media_player_get_drawable ( libvlc_media_player_t *p_mi,
         return (libvlc_drawable_t)p_mi->drawable.hwnd;
     else
         return 0;
+#elif defined(__APPLE__)
+    return p_mi->drawable.agl;
 #else
     return p_mi->drawable.xid;
 #endif
@@ -1092,15 +1131,12 @@ void libvlc_media_player_set_rate(
     vlc_value_t val;
     bool b_can_rewind;
 
-    if( rate != 0 )
-        RAISEVOID( "Rate value is invalid" );
-
-    p_input_thread = libvlc_get_input_thread ( p_mi, p_e);
+    p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
     if( !p_input_thread )
         return;
 
     b_can_rewind = var_GetBool( p_input_thread, "can-rewind" );
-    if( (rate < 0) && !b_can_rewind )
+    if( (rate < 0.0) && !b_can_rewind )
     {
         vlc_object_release( p_input_thread );
         libvlc_exception_raise( p_e, "Rate value is invalid" );
@@ -1141,21 +1177,30 @@ libvlc_state_t libvlc_media_player_get_state(
                                  libvlc_exception_t *p_e )
 {
     input_thread_t *p_input_thread;
+    libvlc_state_t state = libvlc_Ended;
     vlc_value_t val;
 
     p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
-    if ( !p_input_thread )
+    if( !p_input_thread )
     {
         /* We do return the right value, no need to throw an exception */
         if( libvlc_exception_raised( p_e ) )
             libvlc_exception_clear( p_e );
-        return libvlc_Ended;
+        return state;
     }
 
     var_Get( p_input_thread, "state", &val );
-    vlc_object_release( p_input_thread );
+    state = vlc_to_libvlc_state(val.i_int);
 
-    return vlc_to_libvlc_state(val.i_int);
+    if( state == libvlc_Playing )
+    {
+        float caching;
+        caching = var_GetFloat( p_input_thread, "cache" );
+        if( caching > 0.0 && caching < 1.0 )
+            state = libvlc_Buffering;
+    }
+    vlc_object_release( p_input_thread );
+    return state;
 }
 
 int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi,