*
* 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;
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 );
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 )
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;
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 );
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 );
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 );
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 );
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;
+ return libvlc_Playing == state;
}
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 );
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
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
**************************************************************************/
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
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
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" );
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,