]> git.sesse.net Git - vlc/blobdiff - src/control/media_player.c
libvlc: Properly release vout. Pointed out by Lukas.
[vlc] / src / control / media_player.c
index 20faa24707355ad2e92b16b399ac893cb2d3fcc1..a42e655cd78193cef72956052540a4cfeba6b602 100644 (file)
@@ -53,12 +53,13 @@ static const libvlc_state_t vlc_to_libvlc_state_array[] =
 {
     [INIT_S]        = libvlc_Opening,
     [OPENING_S]     = libvlc_Opening,
-    [BUFFERING_S]   = libvlc_Buffering,    
-    [PLAYING_S]     = libvlc_Playing,    
-    [PAUSE_S]       = libvlc_Paused,    
-    [END_S]         = libvlc_Ended,    
-    [ERROR_S]       = libvlc_Error,    
+    [BUFFERING_S]   = libvlc_Buffering,
+    [PLAYING_S]     = libvlc_Playing,
+    [PAUSE_S]       = libvlc_Paused,
+    [END_S]         = libvlc_Ended,
+    [ERROR_S]       = libvlc_Error,
 };
+
 static inline libvlc_state_t vlc_to_libvlc_state( int vlc_state )
 {
     if( vlc_state < 0 || vlc_state > 6 )
@@ -113,7 +114,7 @@ input_thread_t *libvlc_get_input_thread( libvlc_media_player_t *p_mi,
     input_thread_t *p_input_thread;
 
     if( !p_mi ) RAISENULL( "Media Instance is NULL" );
-    
+
     vlc_mutex_lock( &p_mi->object_lock );
 
     if( !p_mi->p_input_thread )
@@ -257,7 +258,7 @@ input_time_changed( vlc_object_t * p_this, char const * psz_cmd,
     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 */
@@ -290,6 +291,11 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance,
     }
 
     p_mi = malloc( sizeof(libvlc_media_player_t) );
+    if( !p_mi )
+    {
+        libvlc_exception_raise( p_e, "Not enough memory" );
+        return NULL;
+    }
     p_mi->p_md = NULL;
     p_mi->drawable = 0;
     p_mi->p_libvlc_instance = p_libvlc_instance;
@@ -300,13 +306,12 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance,
      *   operation the refcount is 0, the object is destroyed.
      * - Accessor _retain increase the refcount by 1 (XXX: to implement) */
     p_mi->i_refcount = 1;
-    p_mi->b_own_its_input_thread = VLC_TRUE;
+    p_mi->b_own_its_input_thread = true;
     /* object_lock strategy:
      * - No lock held in constructor
      * - Lock when accessing all variable this lock is held
      * - Lock when attempting to destroy the object the lock is also held */
-    vlc_mutex_init( p_mi->p_libvlc_instance->p_libvlc_int,
-                    &p_mi->object_lock );
+    vlc_mutex_init( &p_mi->object_lock );
     p_mi->p_event_manager = libvlc_event_manager_new( p_mi,
             p_libvlc_instance, p_e );
     if( libvlc_exception_raised( p_e ) )
@@ -392,7 +397,7 @@ libvlc_media_player_t * libvlc_media_player_new_from_input_thread(
     vlc_object_yield( p_input );
 
     p_mi->p_input_thread = p_input;
-    p_mi->b_own_its_input_thread = VLC_FALSE;
+    p_mi->b_own_its_input_thread = false;
 
     return p_mi;
 }
@@ -439,7 +444,7 @@ void libvlc_media_player_release( libvlc_media_player_t *p_mi )
         return;
 
     vlc_mutex_lock( &p_mi->object_lock );
+
     p_mi->i_refcount--;
 
     if( p_mi->i_refcount > 0 )
@@ -453,7 +458,7 @@ void libvlc_media_player_release( libvlc_media_player_t *p_mi )
     release_input_thread( p_mi );
 
     libvlc_event_manager_release( p_mi->p_event_manager );
+
     libvlc_media_release( p_mi->p_md );
 
     free( p_mi );
@@ -478,7 +483,7 @@ void libvlc_media_player_set_media(
                             libvlc_media_t *p_md,
                             libvlc_exception_t *p_e )
 {
-    (void)p_e;
+    VLC_UNUSED(p_e);
 
     if( !p_mi )
         return;
@@ -488,7 +493,7 @@ void libvlc_media_player_set_media(
     release_input_thread( p_mi );
 
     if( p_mi->p_md )
-        libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, NULL );
+        libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, p_e );
 
     libvlc_media_release( p_mi->p_md );
 
@@ -501,7 +506,7 @@ void libvlc_media_player_set_media(
 
     libvlc_media_retain( p_md );
     p_mi->p_md = p_md;
+
     /* The policy here is to ignore that we were created using a different
      * libvlc_instance, because we don't really care */
     p_mi->p_libvlc_instance = p_md->p_libvlc_instance;
@@ -517,7 +522,7 @@ libvlc_media_player_get_media(
                             libvlc_media_player_t *p_mi,
                             libvlc_exception_t *p_e )
 {
-    (void)p_e;
+    VLC_UNUSED(p_e);
 
     if( !p_mi->p_md )
         return NULL;
@@ -534,7 +539,7 @@ libvlc_media_player_event_manager(
                             libvlc_media_player_t *p_mi,
                             libvlc_exception_t *p_e )
 {
-    (void)p_e;
+    VLC_UNUSED(p_e);
 
     return p_mi->p_event_manager;
 }
@@ -559,7 +564,7 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi,
     libvlc_exception_clear( p_e );
 
     vlc_mutex_lock( &p_mi->object_lock );
+
     if( !p_mi->p_md )
     {
         libvlc_exception_raise( p_e, "no associated media descriptor" );
@@ -606,9 +611,9 @@ void libvlc_media_player_pause( libvlc_media_player_t *p_mi,
     if( !p_input_thread )
         return;
 
-    int state = var_GetInteger( p_input_thread, "state" );
+    libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e );
 
-    if( state == PLAYING_S )
+    if( state == libvlc_Playing )
     {
         if( libvlc_media_player_can_pause( p_mi, p_e ) )
             input_Control( p_input_thread, INPUT_SET_STATE, PAUSE_S );
@@ -627,12 +632,19 @@ void libvlc_media_player_pause( libvlc_media_player_t *p_mi,
 void libvlc_media_player_stop( 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 );
+    libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e );
 
-    if( !p_input_thread )
-            return;
+    if( state == libvlc_Playing || state == libvlc_Paused )
+    {
+        /* Send a stop notification event only of we are in playing or paused states */
 
-    int state = var_GetInteger( p_input_thread, "state" );
+        libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, p_e );
+
+        /* Construct and send the event */
+        libvlc_event_t event;
+        event.type = libvlc_MediaPlayerStopped;
+        libvlc_event_send( p_mi->p_event_manager, &event );
+    }
 
     if( p_mi->b_own_its_input_thread )
     {
@@ -642,18 +654,14 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi,
     }
     else
     {
+        input_thread_t * p_input_thread = libvlc_get_input_thread( p_mi, p_e );
+
+        if( !p_input_thread )
+            return;
+
         input_StopThread( p_input_thread );
         vlc_object_release( p_input_thread );
     }
-
-    if( state == PLAYING_S || state == PAUSE_S )
-    {
-        /* Send a stop notification event */
-        libvlc_event_t event;
-        libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, NULL );
-        event.type = libvlc_MediaPlayerStopped;
-        libvlc_event_send( p_mi->p_event_manager, &event );
-    }
 }
 
 /**************************************************************************
@@ -663,7 +671,7 @@ void libvlc_media_player_set_drawable( libvlc_media_player_t *p_mi,
                                          libvlc_drawable_t drawable,
                                          libvlc_exception_t *p_e )
 {
-    (void)p_e;
+    VLC_UNUSED(p_e);
     p_mi->drawable = drawable;
 }
 
@@ -673,7 +681,7 @@ void libvlc_media_player_set_drawable( libvlc_media_player_t *p_mi,
 libvlc_drawable_t
 libvlc_media_player_get_drawable ( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e )
 {
-    (void)p_e;
+    VLC_UNUSED(p_e);
     return p_mi->drawable;
 }
 
@@ -837,15 +845,15 @@ int libvlc_media_player_will_play( libvlc_media_player_t *p_mi,
     input_thread_t *p_input_thread =
                             libvlc_get_input_thread ( p_mi, p_e);
     if ( !p_input_thread )
-        return VLC_FALSE;
+        return false;
 
     if ( !p_input_thread->b_die && !p_input_thread->b_dead )
     {
         vlc_object_release( p_input_thread );
-        return VLC_TRUE;
+        return true;
     }
     vlc_object_release( p_input_thread );
-    return VLC_FALSE;
+    return false;
 }
 
 void libvlc_media_player_set_rate(
@@ -920,7 +928,7 @@ int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi,
         /* We do return the right value, no need to throw an exception */
         if( libvlc_exception_raised( p_e ) )
             libvlc_exception_clear( p_e );
-        return VLC_FALSE;
+        return false;
     }
     var_Get( p_input_thread, "seekable", &val );
     vlc_object_release( p_input_thread );
@@ -940,7 +948,7 @@ int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi,
         /* We do return the right value, no need to throw an exception */
         if( libvlc_exception_raised( p_e ) )
             libvlc_exception_clear( p_e );
-        return VLC_FALSE;
+        return false;
     }
     var_Get( p_input_thread, "can-pause", &val );
     vlc_object_release( p_input_thread );