* @{
*/
+/** Create an empty Media Instance object
+ * \param p_libvlc_instance the libvlc instance in which the Media Instance
+ * should be (not used for now).
+ */
+VLC_PUBLIC_API libvlc_media_instance_t * libvlc_media_instance_new( libvlc_instance_t *, libvlc_exception_t * );
+
/** Create a Media Instance object from a Media Descriptor
- * \param p_md the Media Descriptor from which the Media Instance should be
- * created. The p_md can then be destroyed if needed.
+ * \param p_md the media descriptor. Afterwards the p_md can safely be
+ * destroyed.
*/
-VLC_PUBLIC_API libvlc_media_instance_t * libvlc_media_instance_new( libvlc_media_descriptor_t * );
+VLC_PUBLIC_API libvlc_media_instance_t * libvlc_media_instance_new_from_media_descriptor( libvlc_media_descriptor_t *, libvlc_exception_t * );
-/** Destroy a Media Instance object
+/** Destroy a Media Instance object (going private)
* \param p_mi the Media Instance to free
*/
VLC_PUBLIC_API void libvlc_media_instance_destroy( libvlc_media_instance_t * );
-/* Will be renamed to libvlc_media_instance_release */
+/** Release a media_instance after use
+ * \param p_mi the Media Instance to free
+ */
VLC_PUBLIC_API void libvlc_media_instance_release( libvlc_media_instance_t * );
+/** Set the media descriptor that will be used by the media_instance. If any,
+ * previous md will be released.
+ * \param p_mi the Media Instance
+ * \param p_md the Media Descriptor. Afterwards the p_md can safely be
+ * destroyed.
+ */
+VLC_PUBLIC_API void libvlc_media_instance_set_media_descriptor( libvlc_media_instance_t *, libvlc_media_descriptor_t *, libvlc_exception_t * );
+
+/** Get the media descriptor used by the media_instance (if any). A copy of
+ * the md is returned. NULL is returned if no media instance is associated.
+ * \param p_mi the Media Instance
+ * \param p_md the Media Descriptor. Afterwards the p_md can safely be
+ * destroyed.
+ */
+VLC_PUBLIC_API libvlc_media_descriptor_t * libvlc_media_instance_get_media_descriptor( libvlc_media_instance_t *, libvlc_exception_t * );
+
+
VLC_PUBLIC_API void libvlc_media_instance_play ( libvlc_media_instance_t *, libvlc_exception_t * );
VLC_PUBLIC_API void libvlc_media_instance_pause ( libvlc_media_instance_t *, libvlc_exception_t * );
#include <vlc_input.h>
#include "input/input_internal.h"
+/*
+ * Release the associated input thread
+ */
+static void release_input_thread( libvlc_media_instance_t *p_mi )
+{
+ input_thread_t *p_input_thread;
+ vlc_bool_t should_destroy;
+ libvlc_exception_t p_e;
+
+ /* XXX: locking */
+ libvlc_exception_init( &p_e );
+
+ p_input_thread = libvlc_get_input_thread( p_mi, &p_e );
+
+ p_mi->i_input_id = -1;
+
+ if( libvlc_exception_raised( &p_e ) )
+ return;
+
+ /* release for previous libvlc_get_input_thread */
+ vlc_object_release( p_input_thread );
+
+ should_destroy = p_input_thread->i_refcount == 1;
+
+ /* release for initial p_input_thread yield (see _new()) */
+ vlc_object_release( p_input_thread );
+
+ /* No one is tracking this input_thread appart us. Destroy it */
+ if( should_destroy )
+ input_DestroyThread( p_input_thread );
+}
+
/*
* Retrieve the input thread. Be sure to release the object
* once you are done with it. (libvlc Internal)
return p_input_thread;
}
+
/**************************************************************************
* Create a Media Instance object
**************************************************************************/
libvlc_media_instance_t *
-libvlc_media_instance_new( libvlc_media_descriptor_t *p_md )
+libvlc_media_instance_new( libvlc_instance_t * p_libvlc_instance,
+ libvlc_exception_t *p_e )
+{
+ libvlc_media_instance_t * p_mi;
+
+ if( !p_libvlc_instance )
+ {
+ libvlc_exception_raise( p_e, "invalid libvlc instance" );
+ return NULL;
+ }
+
+ p_mi = malloc( sizeof(libvlc_media_instance_t) );
+ p_mi->p_md = NULL;
+ p_mi->p_libvlc_instance = p_libvlc_instance;
+ p_mi->i_input_id = -1;
+
+ return p_mi;
+}
+
+/**************************************************************************
+ * Create a Media Instance object with a media descriptor
+ **************************************************************************/
+libvlc_media_instance_t *
+libvlc_media_instance_new_from_media_descriptor(
+ libvlc_media_descriptor_t * p_md,
+ libvlc_exception_t *p_e )
{
libvlc_media_instance_t * p_mi;
if( !p_md )
+ {
+ libvlc_exception_raise( p_e, "invalid media descriptor" );
return NULL;
+ }
p_mi = malloc( sizeof(libvlc_media_instance_t) );
p_mi->p_md = libvlc_media_descriptor_duplicate( p_md );
**************************************************************************/
void libvlc_media_instance_release( libvlc_media_instance_t *p_mi )
{
- input_thread_t *p_input_thread;
- libvlc_exception_t p_e;
-
/* XXX: locking */
- libvlc_exception_init( &p_e );
if( !p_mi )
return;
- p_input_thread = libvlc_get_input_thread( p_mi, &p_e );
+ release_input_thread( p_mi );
- if( !libvlc_exception_raised( &p_e ) )
- {
- /* release for previous libvlc_get_input_thread */
- vlc_object_release( p_input_thread );
+ libvlc_media_descriptor_destroy( p_mi->p_md );
- /* release for initial p_input_thread yield (see _new()) */
- vlc_object_release( p_input_thread );
+ free( p_mi );
+}
- /* No one is tracking this input_thread appart us. Destroy it */
- if( p_input_thread->i_refcount <= 0 )
- input_DestroyThread( p_input_thread );
- /* btw, we still have an XXX locking here */
- }
+/**************************************************************************
+ * Set the Media descriptor associated with the instance
+ **************************************************************************/
+void libvlc_media_instance_set_media_descriptor(
+ libvlc_media_instance_t *p_mi,
+ libvlc_media_descriptor_t *p_md,
+ libvlc_exception_t *p_e )
+{
+ (void)p_e;
+
+ /* XXX : lock */
+
+ if( !p_mi )
+ return;
+
+ release_input_thread( p_mi );
libvlc_media_descriptor_destroy( p_mi->p_md );
- free( p_mi );
+ if( !p_md )
+ {
+ p_mi->p_md = NULL;
+ return; /* It is ok to pass a NULL md */
+ }
+
+ p_mi->p_md = libvlc_media_descriptor_duplicate( 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;
+
+}
+
+/**************************************************************************
+ * Set the Media descriptor associated with the instance
+ **************************************************************************/
+libvlc_media_descriptor_t *
+libvlc_media_instance_get_media_descriptor(
+ libvlc_media_instance_t *p_mi,
+ libvlc_exception_t *p_e )
+{
+ (void)p_e;
+
+ if( !p_mi->p_md )
+ return NULL;
+
+ return libvlc_media_descriptor_duplicate( p_mi->p_md );
}
/**************************************************************************
return;
}
+ if( !p_mi->p_md )
+ {
+ libvlc_exception_raise( p_e, "no associated media descriptor" );
+ return;
+ }
+
p_input_thread = input_CreateThread( p_mi->p_libvlc_instance->p_libvlc_int,
p_mi->p_md->p_input_item );
p_mi->i_input_id = p_input_thread->i_object_id;