]> git.sesse.net Git - vlc/commitdiff
python bindings: add support for the new libvlc API
authorOlivier Aubert <olivier.aubert@liris.cnrs.fr>
Wed, 20 Sep 2006 11:10:44 +0000 (11:10 +0000)
committerOlivier Aubert <olivier.aubert@liris.cnrs.fr>
Wed, 20 Sep 2006 11:10:44 +0000 (11:10 +0000)
bindings/mediacontrol-python/Makefile.am
bindings/mediacontrol-python/README [new file with mode: 0644]
bindings/mediacontrol-python/setup.py
bindings/mediacontrol-python/vlc_input.c [new file with mode: 0644]
bindings/mediacontrol-python/vlc_instance.c [new file with mode: 0644]
bindings/mediacontrol-python/vlc_mediacontrol.c [new file with mode: 0644]
bindings/mediacontrol-python/vlc_module.c [new file with mode: 0644]
bindings/mediacontrol-python/vlc_object.c [new file with mode: 0644]
bindings/mediacontrol-python/vlc_position.c [new file with mode: 0644]
bindings/mediacontrol-python/vlcglue.c [deleted file]
bindings/mediacontrol-python/vlcglue.h

index a227718f1052c9625982c192944ee8b1672fc9e3..fefc6da28eaf83239dd1996032591dc33e55284d 100644 (file)
@@ -2,7 +2,10 @@
 # Building the Python binding
 ###############################################################################
 
-EXTRA_DIST = vlcglue.c vlcglue.h setup.py vlcwrapper.py
+EXTRA_DIST = vlcglue.h setup.py vlcwrapper.py \
+       vlc_module.c vlc_object.c \
+       vlc_mediacontrol.c vlc_position.c \
+       vlc_instance.c vlc_input.c
 
 if BUILD_PYTHON
 
diff --git a/bindings/mediacontrol-python/README b/bindings/mediacontrol-python/README
new file mode 100644 (file)
index 0000000..32c2293
--- /dev/null
@@ -0,0 +1,22 @@
+* Compilation
+
+* Testing
+
+If you try to compile the bindings from a development tree, you will
+have to specify the path for VLC modules, which cannot be guessed by
+the extension module.
+
+For vlc.MediaControl:
+mc=vlc.MediaControl('--plugin-path /path/to/vlc/directory'.split())
+
+For vlc.Instance:
+i=vlc.Instance('--plugin-path /path/to/vlc/directory'.split())
+
+* Skeleton generation :
+
+** For method bindings:
+
+perl -n -e 'print "static PyObject *\nvlcInput_$2( PyObject *self, PyObject *args )\n{\n    libvlc_exception_t ex;\n    LIBVLC_TRY;\n    $1_$2( self->p_input, &ex);    LIBVLC_EXCEPT;\n    Py_INCREF( Py_None );\n    return Py_None;\n}\n\n" if /(libvlc_input)_(\w+)/ and ($2 ne "t")' ../../include/vlc/libvlc.h 
+
+** For method table:
+perl -n -e 'print "    { \"$2\", $1_$2, METH_VARARGS,\n      \"$2()\" },\n" if /^(vlcInput)_(\w+)/' vlc_instance.c 
index 2736569bd9298952c468e6d29814a523f52bdbee..b681f9ef58e46fbde9da6864c890216417cf032f 100644 (file)
@@ -21,15 +21,8 @@ except KeyError:
 if not srcdir:
     srcdir = '.'
 
-#if os.sys.platform in ('win32', 'darwin'):
-    # Do not use PIC version on win32 and Mac OS X
-if True:
-    # PIC version seems to be disabled on all platforms
-    vlclib=os.path.join( top_builddir, 'src', 'libvlc.a' )
-    picflag=''
-else:
-    vlclib=os.path.join( top_builddir, 'src', 'libvlc_pic.a' )
-    picflag='pic'
+vlclib="-lvlc"
+picflag=''
 
 def get_vlcconfig():
     vlcconfig=None
@@ -69,39 +62,47 @@ def get_ldflags():
        ldflags = []
        if os.sys.platform == 'darwin':
            ldflags = "-read_only_relocs warning".split()
-        ldflags.extend(os.popen('%s --libs vlc %s builtin' % (vlcconfig,
+        ldflags.extend(os.popen('%s --libs vlc %s' % (vlcconfig,
                                                              picflag), 
                                'r').readline().rstrip().split())
        if os.sys.platform == 'darwin':
            ldflags.append('-lstdc++')
         return ldflags
 
+#source_files = [ 'vlc_module.c', 'vlc_object.c', 'vlc_mediacontrol.c',
+#                 'vlc_position.c', 'vlc_instance.c', 'vlc_input.c' ]
+source_files = [ 'vlc_module.c' ]
+
 # To compile in a local vlc tree
 vlclocal = Extension('vlc',
-                sources = [ os.path.join( srcdir, 'vlcglue.c'),
-                            os.path.join( srcdir, '../../src/control/mediacontrol_init.c')],
-                include_dirs = [ top_builddir,
-                                os.path.join( srcdir, '../../include'),
-                                os.path.join( srcdir, '../../', '/usr/win32/include') ],
-
+                     sources = [ os.path.join( srcdir, f ) for f in source_files ] +
+                     [ os.path.join( top_builddir, 'src/control/mediacontrol_init.c') ],
+                     include_dirs = [ top_builddir,
+                                      os.path.join( top_builddir, 'include' ),
+                                      srcdir,
+                                      '/usr/win32/include' ],
                 extra_objects = [ vlclib ],
                 extra_compile_args = get_cflags(),
                extra_link_args = [ '-L' + top_builddir ]  + get_ldflags(),
                 )
 
-setup (name = 'MediaControl',
+setup (name = 'VLC Bindings',
        version = get_vlc_version(),
-       scripts = [ os.path.join( srcdir, 'vlcwrapper.py') ],
+       #scripts = [ os.path.join( srcdir, 'vlcwrapper.py') ],
        keywords = [ 'vlc', 'video' ],
        license = "GPL", 
        description = """VLC bindings for python.
 
-This module provides a MediaControl object, which implements an API
-inspired from the OMG Audio/Video Stream 1.0 specification. Moreover,
-the module provides a Object type, which gives a low-level access to
-the vlc objects and their variables.
+This module provides bindings for the native libvlc API of the VLC
+video player. Documentation can be found on the VLC wiki : 
+http://wiki.videolan.org/index.php/ExternalAPI
 
-Documentation can be found on the VLC wiki : 
+The module also provides a Object type, which gives a low-level access
+to the vlc objects and their variables.
+
+This module also provides a MediaControl object, which implements an
+API inspired from the OMG Audio/Video Stream 1.0 specification.
+Documentation can be found on the VLC wiki :
 http://wiki.videolan.org/index.php/PythonBinding
 
 Example session:
@@ -135,5 +136,6 @@ o.info()
 i=o.find_object('input')
 i.list()
 i.get('time')
+
        """,
        ext_modules = [ vlclocal ])
diff --git a/bindings/mediacontrol-python/vlc_input.c b/bindings/mediacontrol-python/vlc_input.c
new file mode 100644 (file)
index 0000000..939acc1
--- /dev/null
@@ -0,0 +1,234 @@
+/*****************************************************************************
+ * vlc_input.c: vlc.Input binding
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#include "vlcglue.h"
+
+/***********************************************************************
+ * vlc.Input
+ ***********************************************************************/
+
+static PyObject *
+vlcInput_get_length( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    vlc_int64_t i_ret;
+    LIBVLC_TRY;
+    i_ret = libvlc_input_get_length( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "L", i_ret );
+}
+
+static PyObject *
+vlcInput_get_time( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    vlc_int64_t i_ret;
+    LIBVLC_TRY;
+    i_ret = libvlc_input_get_time( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "L", i_ret );
+}
+
+static PyObject *
+vlcInput_set_time( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    vlc_int64_t i_time;
+
+    if( !PyArg_ParseTuple( args, "L", &i_time ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_input_set_time( LIBVLC_INPUT->p_input, i_time, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInput_get_position( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    float f_ret;
+    LIBVLC_TRY;
+    f_ret = libvlc_input_get_position( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "f", f_ret );
+}
+
+static PyObject *
+vlcInput_set_position( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    float f_pos;
+
+    if( !PyArg_ParseTuple( args, "f", &f_pos ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_input_set_position( LIBVLC_INPUT->p_input, f_pos, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInput_will_play( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+    LIBVLC_TRY;
+    i_ret = libvlc_input_will_play( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInput_get_rate( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    float f_ret;
+    LIBVLC_TRY;
+    f_ret = libvlc_input_get_rate( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "f", f_ret );
+}
+
+static PyObject *
+vlcInput_set_rate( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    float f_rate;
+
+    if( !PyArg_ParseTuple( args, "f", &f_rate ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_input_set_rate( LIBVLC_INPUT->p_input, f_rate, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInput_get_state( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+    LIBVLC_TRY;
+    i_ret = libvlc_input_get_state( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInput_has_vout( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+    LIBVLC_TRY;
+    i_ret = libvlc_input_has_vout( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInput_get_fps( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    float f_ret;
+    LIBVLC_TRY;
+    f_ret = libvlc_input_get_fps( LIBVLC_INPUT->p_input, &ex);
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "f", f_ret );
+}
+
+static PyMethodDef vlcInput_methods[] =
+{
+    { "get_length", vlcInput_get_length, METH_VARARGS,
+      "get_length() -> long" },
+    { "get_time", vlcInput_get_time, METH_VARARGS,
+      "get_time() -> long" },
+    { "set_time", vlcInput_set_time, METH_VARARGS,
+      "set_time(long)" },
+    { "get_position", vlcInput_get_position, METH_VARARGS,
+      "get_position() -> float" },
+    { "set_position", vlcInput_set_position, METH_VARARGS,
+      "set_position(float)" },
+    { "will_play", vlcInput_will_play, METH_VARARGS,
+      "will_play() -> int" },
+    { "get_rate", vlcInput_get_rate, METH_VARARGS,
+      "get_rate() -> float" },
+    { "set_rate", vlcInput_set_rate, METH_VARARGS,
+      "set_rate(float)" },
+    { "get_state", vlcInput_get_state, METH_VARARGS,
+      "get_state() -> int" },
+    { "has_vout", vlcInput_has_vout, METH_VARARGS,
+      "has_vout() -> int" },
+    { "get_fps", vlcInput_get_fps, METH_VARARGS,
+      "get_fps() -> float" },
+    { NULL }  /* Sentinel */
+};
+
+static PyTypeObject vlcInput_Type =
+{
+    PyObject_HEAD_INIT( NULL )
+    0,                         /*ob_size*/
+    "vlc.Input",            /*tp_name*/
+    sizeof( vlcInput_Type ),   /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    0,                         /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+    "vlc.Input object",  /* tp_doc */
+    0,                        /* tp_traverse */
+    0,                        /* tp_clear */
+    0,                         /* tp_richcompare */
+    0,                         /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                          /* tp_iternext */
+    vlcInput_methods,          /* tp_methods */
+    0,                         /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,                         /* tp_init */
+    0,                         /* tp_alloc */
+    0,                         /* tp_new */
+};
+
diff --git a/bindings/mediacontrol-python/vlc_instance.c b/bindings/mediacontrol-python/vlc_instance.c
new file mode 100644 (file)
index 0000000..42c91f9
--- /dev/null
@@ -0,0 +1,644 @@
+/*****************************************************************************
+ * vlc_instance.c: vlc.Instance binding
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#include "vlcglue.h"
+
+/*****************************************************************************
+ * Instance object implementation
+ *****************************************************************************/
+
+static PyObject *
+vlcInstance_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
+{
+    vlcInstance *self;
+    libvlc_exception_t ex;
+    PyObject* py_list = NULL;
+    char** ppsz_args = NULL;
+    int i_size = 0;
+
+    self = PyObject_New( vlcInstance, &vlcInstance_Type );
+
+    if( PyArg_ParseTuple( args, "O", &py_list ) )
+    {
+        int i_index;
+
+        Py_INCREF( py_list );
+        if( ! PySequence_Check( py_list ) )
+        {
+            PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
+            return NULL;
+        }
+        i_size = PySequence_Size( py_list );
+        ppsz_args = malloc( ( i_size + 2 ) * sizeof( char * ) );
+        if( ! ppsz_args )
+        {
+            PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+            return NULL;
+        }
+
+       /* FIXME: we define a default args[0], since the libvlc API
+          needs one. But it would be cleaner to fix the libvlc API.
+        */
+        ppsz_args[0] = strdup("vlc");
+        for ( i_index = 0; i_index < i_size; i_index++ )
+        {
+            ppsz_args[i_index + 1] =
+                strdup( PyString_AsString( PyObject_Str(
+                                               PySequence_GetItem( py_list,
+                                                                   i_index ) ) ) );
+        }
+        ppsz_args[i_size + 1] = NULL;
+        /* Since we prepended the arg[0] */
+        i_size += 1;
+        Py_DECREF( py_list );
+    }
+    else
+    {
+        /* No arguments were given. Clear the exception raised
+           by PyArg_ParseTuple. */
+        PyErr_Clear( );
+    }
+
+    Py_BEGIN_ALLOW_THREADS
+    LIBVLC_TRY
+    LIBVLC_INSTANCE->p_instance = libvlc_new( i_size, ppsz_args, &ex );
+    LIBVLC_EXCEPT
+    Py_END_ALLOW_THREADS
+
+    Py_INCREF( self );
+    return ( PyObject * )self;
+}
+
+static void
+vlcInstance_dealloc( PyObject *self )
+{
+    libvlc_exception_t ex;
+    libvlc_destroy( LIBVLC_INSTANCE->p_instance, &ex );
+    PyMem_DEL( self );
+}
+
+static PyObject *
+vlcInstance_get_vlc_id( PyObject *self, PyObject *args )
+{
+    return Py_BuildValue( "i", libvlc_get_vlc_id( LIBVLC_INSTANCE->p_instance ) );
+}
+
+/* Playlist play. 2 parameters: i_id, the id to play
+   l_options: a list of options */
+static PyObject *
+vlcInstance_playlist_play( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_id = -1;
+    PyObject *py_options = NULL;
+    int i_size = 0;
+    char** ppsz_args = NULL;
+
+    if( !PyArg_ParseTuple( args, "|iO", &i_id, &py_options ) )
+        return NULL;
+
+    if( py_options )
+    {
+        /* Options were given. Convert them to a char** */
+        int i_index;
+
+        Py_INCREF( py_options );
+        if( ! PySequence_Check( py_options ) )
+        {
+            PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
+            return NULL;
+        }
+        i_size = PySequence_Size( py_options );
+        ppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
+        if( ! ppsz_args )
+        {
+            PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+            return NULL;
+        }
+
+        for ( i_index = 0; i_index < i_size; i_index++ )
+        {
+            ppsz_args[i_index] =
+                strdup( PyString_AsString( PyObject_Str(
+                                               PySequence_GetItem( py_options,
+                                                                   i_index ) ) ) );
+        }
+        ppsz_args[i_size] = NULL;
+        Py_DECREF( py_options );
+    }
+
+    LIBVLC_TRY;
+    libvlc_playlist_play( LIBVLC_INSTANCE->p_instance, i_id, i_size, ppsz_args, &ex );
+    LIBVLC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_playlist_pause( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_playlist_pause( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_playlist_isplaying( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+
+    LIBVLC_TRY;
+    i_ret = libvlc_playlist_isplaying( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_playlist_items_count( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+
+    LIBVLC_TRY;
+    i_ret = libvlc_playlist_items_count( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_playlist_stop( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_playlist_stop( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_playlist_next( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_playlist_next( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_playlist_prev( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_playlist_prev( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_playlist_clear( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_playlist_clear( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+/* Add a playlist item. Main parameter: URI.
+   Optional parameters: name, options */
+static PyObject *
+vlcInstance_playlist_add( PyObject *self, PyObject *args)
+{
+    libvlc_exception_t ex;
+    int i_ret;
+    char* psz_uri = NULL;
+    char* psz_name = NULL;
+    PyObject *py_options = NULL;
+    int i_size = 0;
+    char** ppsz_args = NULL;
+
+    if( !PyArg_ParseTuple( args, "s|sO", &psz_uri, &psz_name, &py_options ) )
+        return NULL;
+
+    if( !psz_name )
+    {
+        /* Set a default name */
+        psz_name = strdup( psz_uri );
+    }
+
+    if( py_options )
+    {
+        /* Options were given. Convert them to a char** */
+        int i_index;
+
+        Py_INCREF( py_options );
+        if( ! PySequence_Check( py_options ) )
+        {
+            PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
+            return NULL;
+        }
+        i_size = PySequence_Size( py_options );
+        ppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
+        if( ! ppsz_args )
+        {
+            PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+            return NULL;
+        }
+
+        for ( i_index = 0; i_index < i_size; i_index++ )
+        {
+            ppsz_args[i_index] =
+                strdup( PyString_AsString( PyObject_Str(
+                                               PySequence_GetItem( py_options,
+                                                                   i_index ) ) ) );
+        }
+        ppsz_args[i_size] = NULL;
+        Py_DECREF( py_options );
+    }
+
+    LIBVLC_TRY;
+    if( ppsz_args )
+    {
+        i_ret = libvlc_playlist_add_extended( LIBVLC_INSTANCE->p_instance,
+                                              psz_uri,
+                                              psz_name,
+                                              i_size,
+                                              ppsz_args,
+                                              &ex );
+    }
+    else
+    {
+        i_ret = libvlc_playlist_add( LIBVLC_INSTANCE->p_instance,
+                                     psz_uri,
+                                     psz_name,
+                                     &ex );
+    }
+    LIBVLC_EXCEPT;
+
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_playlist_delete_item( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_id;
+    int i_ret;
+
+    if( !PyArg_ParseTuple( args, "i", &i_id ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    i_ret = libvlc_playlist_delete_item( LIBVLC_INSTANCE->p_instance, i_id, &ex );
+    LIBVLC_EXCEPT;
+
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_playlist_get_input( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    libvlc_input_t *p_input;
+    vlcInput *p_ret;
+
+    LIBVLC_TRY;
+    p_input = libvlc_playlist_get_input( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+
+    p_ret = PyObject_New( vlcInput, &vlcInput_Type );
+    p_ret->p_input = p_input;
+    Py_INCREF( p_ret ); /* Ah bon ? */
+    return ( PyObject * )p_ret;
+}
+
+static PyObject *
+vlcInstance_video_set_parent( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_drawable;
+
+    if( !PyArg_ParseTuple( args, "i", &i_drawable ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_video_set_parent( LIBVLC_INSTANCE->p_instance, (libvlc_drawable_t) i_drawable, &ex );
+    LIBVLC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_video_set_size( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_width;
+    int i_height;
+
+    if( !PyArg_ParseTuple( args, "ii", &i_width, &i_height ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_video_set_size( LIBVLC_INSTANCE->p_instance, i_width, i_height, &ex );
+    LIBVLC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_audio_toggle_mute( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_audio_toggle_mute( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_audio_get_mute( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+
+    LIBVLC_TRY;
+    i_ret = libvlc_audio_get_mute( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_audio_set_mute( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_mute;
+
+    if( !PyArg_ParseTuple( args, "i", &i_mute ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_audio_set_mute( LIBVLC_INSTANCE->p_instance, i_mute, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_audio_get_volume( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_ret;
+
+    LIBVLC_TRY;
+    i_ret = libvlc_audio_get_volume( LIBVLC_INSTANCE->p_instance, &ex );
+    LIBVLC_EXCEPT;
+    return Py_BuildValue( "i", i_ret );
+}
+
+static PyObject *
+vlcInstance_audio_set_volume( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    int i_volume;
+
+    if( !PyArg_ParseTuple( args, "i", &i_volume ) )
+        return NULL;
+
+    LIBVLC_TRY;
+    libvlc_audio_set_mute( LIBVLC_INSTANCE->p_instance, i_volume, &ex );
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+/* FIXME: add vlm related bindings here */
+
+/* static PyObject *
+vlcInstance_vlm_add_broadcast( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    FIXME libvlc_vlm_add_broadcast( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_del_media( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_del_media( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_set_enabled( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_set_enabled( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_set_output( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_set_output( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_set_input( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_set_input( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_set_loop( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_set_loop( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_change_media( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_change_media( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_play_media( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_play_media( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_stop_media( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_stop_media( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcInstance_vlm_pause_media( PyObject *self, PyObject *args )
+{
+    libvlc_exception_t ex;
+    LIBVLC_TRY;
+    libvlc_vlm_pause_media( LIBVLC_INSTANCE->p_instance, &ex);
+    LIBVLC_EXCEPT;
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+*/
+
+/* Method table */
+static PyMethodDef vlcInstance_methods[] =
+{
+    { "get_vlc_id", vlcInstance_get_vlc_id, METH_VARARGS,
+      "get_vlc_id( ) -> int        Get the instance id."},
+    { "playlist_play", vlcInstance_playlist_play, METH_VARARGS,
+      "playlist_play( int, options )   Play the given playlist item (-1 for current item) with optional options (a list of strings)" },
+    { "playlist_pause", vlcInstance_playlist_pause, METH_VARARGS,
+      "playlist_pause()            Pause the current stream"},
+    { "playlist_isplaying", vlcInstance_playlist_isplaying, METH_VARARGS,
+      "playlist_isplaying() -> int     Return True if the playlist if playing"},
+    { "playlist_items_count", vlcInstance_playlist_items_count, METH_VARARGS,
+      "playlist_items_count() -> int   Return the number of items in the playlist"},
+    { "playlist_stop", vlcInstance_playlist_stop, METH_VARARGS,
+      "playlist_stop()             Stop the current stream"},
+    { "playlist_next", vlcInstance_playlist_next, METH_VARARGS,
+      "playlist_next()             Play the next item"},
+    { "playlist_prev", vlcInstance_playlist_prev, METH_VARARGS,
+      "playlist_prev()             Play the previous item"},
+    { "playlist_clear", vlcInstance_playlist_clear, METH_VARARGS,
+      "playlist_clear()            Clear the playlist"},
+    { "playlist_add", vlcInstance_playlist_add, METH_VARARGS,
+      "playlist_add( str, str, options ) -> int  Add a new item to the playlist. Second argument is its name. options is a list of strings."},
+    { "playlist_delete_item", vlcInstance_playlist_delete_item, METH_VARARGS,
+      "playlist_delete_item(int)   Delete the given item"},
+    { "playlist_get_input", vlcInstance_playlist_get_input, METH_VARARGS,
+      "playlist_get_input() -> object   Return the current input"},
+    { "video_set_parent", vlcInstance_video_set_parent, METH_VARARGS,
+      "video_set_parent(int)       Set the parent xid or HWND"},
+    { "video_set_size", vlcInstance_video_set_size, METH_VARARGS,
+      "video_set_size(int, int)    Set the video width and height"},
+    { "audio_toggle_mute", vlcInstance_audio_toggle_mute, METH_VARARGS,
+      "audio_toggle_mute()         Toggle the mute state"},
+    { "audio_get_mute", vlcInstance_audio_get_mute, METH_VARARGS,
+      "audio_get_mute() -> int     Get the mute state"},
+    { "audio_set_mute", vlcInstance_audio_set_mute, METH_VARARGS,
+      "audio_set_mute(int)         Set the mute state"},
+    { "audio_get_volume", vlcInstance_audio_get_volume, METH_VARARGS,
+      "audio_get_volume() -> int   Get the audio volume"},
+    { "audio_set_volume", vlcInstance_audio_set_volume, METH_VARARGS,
+      "audio_set_volume(int)       Set the audio volume"},
+    { NULL, NULL, 0, NULL },
+};
+
+static PyTypeObject vlcInstance_Type =
+{
+    PyObject_HEAD_INIT( NULL )
+    0,                          /*ob_size*/
+    "vlc.Instance",             /*tp_name*/
+    sizeof( vlcInstance_Type ), /*tp_basicsize*/
+    0,                          /*tp_itemsize*/
+    ( destructor )vlcInstance_dealloc,      /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+    "VLC Instance.",  /* tp_doc */
+    0,                     /* tp_traverse */
+    0,                     /* tp_clear */
+    0,                     /* tp_richcompare */
+    0,                     /* tp_weaklistoffset */
+    0,                     /* tp_iter */
+    0,                     /* tp_iternext */
+    vlcInstance_methods,             /* tp_methods */
+    0,             /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,                         /* tp_init */
+    0,                         /* tp_alloc */
+    vlcInstance_new,          /* tp_new */
+};
diff --git a/bindings/mediacontrol-python/vlc_mediacontrol.c b/bindings/mediacontrol-python/vlc_mediacontrol.c
new file mode 100644 (file)
index 0000000..0722e22
--- /dev/null
@@ -0,0 +1,660 @@
+/*****************************************************************************
+ * vlc_mediacontrol.c: vlc.MediaControl binding
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#include "vlcglue.h"
+
+/*****************************************************************************
+ * VLC MediaControl object implementation
+ *****************************************************************************/
+
+static PyObject *
+MediaControl_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
+{
+    MediaControl *self;
+    mediacontrol_Exception *exception = NULL;
+    PyObject* py_list = NULL;
+    char** ppsz_args = NULL;
+
+    fprintf(stderr, "mc_new start\n");
+    self = PyObject_New( MediaControl, &MediaControl_Type );
+
+    if( PyArg_ParseTuple( args, "O", &py_list ) )
+    {
+        int i_size;
+        int i_index;
+
+        Py_INCREF( py_list );
+        if( ! PySequence_Check( py_list ) )
+        {
+            PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
+            return NULL;
+        }
+        i_size = PySequence_Size( py_list );
+        ppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
+        if( ! ppsz_args )
+        {
+            PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+            return NULL;
+        }
+
+        for ( i_index = 0; i_index < i_size; i_index++ )
+        {
+            ppsz_args[i_index] =
+                strdup( PyString_AsString( PyObject_Str(
+                                               PySequence_GetItem( py_list,
+                                                                   i_index ) ) ) );
+        }
+        ppsz_args[i_size] = NULL;
+        Py_DECREF( py_list );
+    }
+    else
+    {
+        /* No arguments were given. Clear the exception raised
+           by PyArg_ParseTuple. */
+        PyErr_Clear( );
+    }
+
+    fprintf(stderr, "before mc_new\n");
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    self->mc = mediacontrol_new( ppsz_args, exception );
+    MC_EXCEPT;
+    Py_END_ALLOW_THREADS
+
+    fprintf(stderr, "mc_new end\n");
+
+    Py_INCREF( self );
+    return ( PyObject * )self;
+}
+
+static void
+MediaControl_dealloc( PyObject *self )
+{
+    PyMem_DEL( self );
+}
+
+/**
+ *  Return the current position in the stream. The returned value can
+   be relative or absolute ( according to PositionOrigin ) and the unit
+   is set by PositionKey
+ */
+static PyObject *
+MediaControl_get_media_position( PyObject *self, PyObject *args )
+{
+    mediacontrol_Position* pos;
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_origin;
+    PyObject *py_key;
+    PyObject *py_retval;
+    mediacontrol_PositionOrigin origin;
+    mediacontrol_PositionKey key;
+
+    if( !PyArg_ParseTuple( args, "OO", &py_origin, &py_key ) )
+        return NULL;
+
+    origin = positionOrigin_py_to_c( py_origin );
+    key    = positionKey_py_to_c( py_key );
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    pos = mediacontrol_get_media_position( SELF->mc, origin, key, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    py_retval = ( PyObject* )position_c_to_py( pos );
+    free( pos );
+    return py_retval;
+}
+
+/** Set the media position */
+static PyObject *
+MediaControl_set_media_position( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    mediacontrol_Position *a_position;
+    PyObject *py_pos;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+        return NULL;
+
+    a_position = position_py_to_c( py_pos );
+    if( !a_position )
+    {
+        PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+        return NULL;
+    }
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_set_media_position( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_start( PyObject *self, PyObject *args )
+{
+    mediacontrol_Position *a_position;
+    mediacontrol_Exception *exception = NULL;
+    PyObject *py_pos;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+    {
+        /* No argument. Use a default 0 value. */
+        PyErr_Clear( );
+        py_pos = NULL;
+    }
+    a_position = position_py_to_c( py_pos );
+    if( !a_position )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_start( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_pause( PyObject *self, PyObject *args )
+{
+    mediacontrol_Position *a_position;
+    mediacontrol_Exception *exception = NULL;
+    PyObject *py_pos;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+    {
+        /* No argument. Use a default 0 value. */
+        PyErr_Clear( );
+        py_pos = NULL;
+    }
+    a_position = position_py_to_c( py_pos );
+    if( !a_position )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_pause( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+  Py_INCREF( Py_None );
+  return Py_None;
+}
+
+static PyObject *
+MediaControl_resume( PyObject *self, PyObject *args )
+{
+    mediacontrol_Position *a_position;
+    mediacontrol_Exception *exception = NULL;
+    PyObject *py_pos;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+    {
+        /* No argument. Use a default 0 value. */
+        PyErr_Clear( );
+        py_pos = NULL;
+    }
+    a_position = position_py_to_c( py_pos );
+    if( !a_position )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_start( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_stop( PyObject *self, PyObject *args )
+{
+    mediacontrol_Position *a_position;
+    mediacontrol_Exception *exception = NULL;
+    PyObject *py_pos;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+    {
+        /* No argument. Use a default 0 value. */
+        PyErr_Clear( );
+        py_pos = NULL;
+    }
+    a_position = position_py_to_c( py_pos );
+    if( !a_position )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_stop( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_exit( PyObject *self, PyObject *args )
+{
+    mediacontrol_exit( SELF->mc );
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_playlist_add_item( PyObject *self, PyObject *args )
+{
+    char *psz_file;
+    mediacontrol_Exception *exception = NULL;
+
+    if( !PyArg_ParseTuple( args, "s", &psz_file ) )
+      return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_playlist_add_item( SELF->mc, psz_file, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_playlist_clear( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception *exception = NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_playlist_clear( SELF->mc, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+MediaControl_playlist_get_list( PyObject *self, PyObject *args )
+{
+    PyObject *py_retval;
+    mediacontrol_Exception *exception = NULL;
+    mediacontrol_PlaylistSeq* pl;
+    int i_index;
+    int i_playlist_size;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    pl = mediacontrol_playlist_get_list( SELF->mc, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    i_playlist_size = pl->size;
+
+    py_retval = PyList_New( i_playlist_size );
+
+    for ( i_index = 0 ; i_index < i_playlist_size ; i_index++ )
+    {
+        PyList_SetItem( py_retval, i_index,
+                        Py_BuildValue( "s", pl->data[i_index] ) );
+    }
+    mediacontrol_PlaylistSeq__free( pl );
+
+    return py_retval;
+}
+
+
+static PyObject *
+MediaControl_snapshot( PyObject *self, PyObject *args )
+{
+    mediacontrol_RGBPicture *p_retval = NULL;
+    mediacontrol_Exception* exception = NULL;
+    mediacontrol_Position *a_position = NULL;
+    PyObject *py_pos = NULL;
+    PyObject *py_obj = NULL;
+
+    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
+      return NULL;
+
+    a_position = position_py_to_c( py_pos );
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    p_retval = mediacontrol_snapshot( SELF->mc, a_position, exception );
+    free( a_position );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    if( !p_retval )
+    {
+        Py_INCREF( Py_None );
+        return Py_None;
+    }
+
+    /* FIXME: create a real RGBPicture object */
+    py_obj = PyDict_New();
+
+    PyDict_SetItemString( py_obj, "width",
+                          Py_BuildValue( "i", p_retval->width ) );
+    PyDict_SetItemString( py_obj, "height",
+                          Py_BuildValue( "i", p_retval->height ) );
+    PyDict_SetItemString( py_obj, "type",
+                          Py_BuildValue( "i", p_retval->type ) );
+    PyDict_SetItemString( py_obj, "data",
+                          Py_BuildValue( "s#", p_retval->data, p_retval->size ) );
+    PyDict_SetItemString( py_obj, "date",
+                          Py_BuildValue( "L", p_retval->date ) );
+
+    return py_obj;
+}
+
+static PyObject*
+MediaControl_display_text( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_begin, *py_end;
+    char* message;
+    mediacontrol_Position * begin;
+    mediacontrol_Position * end;
+
+    if( !PyArg_ParseTuple( args, "sOO", &message, &py_begin, &py_end ) )
+        return NULL;
+
+    begin = position_py_to_c( py_begin );
+    end   = position_py_to_c( py_end );
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_display_text( SELF->mc, message, begin, end, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    free( begin );
+    free( end );
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject*
+MediaControl_get_stream_information( PyObject *self, PyObject *args )
+{
+    mediacontrol_StreamInformation *retval  = NULL;
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_obj;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    retval = mediacontrol_get_stream_information(
+        SELF->mc, mediacontrol_MediaTime, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    py_obj = PyDict_New( );
+
+     /* FIXME: create a real StreamInformation object */
+    PyDict_SetItemString( py_obj, "status",
+                  Py_BuildValue( "i", retval->streamstatus ) );
+    PyDict_SetItemString( py_obj, "url",
+                  Py_BuildValue( "s", retval->url ) );
+    PyDict_SetItemString( py_obj, "position",
+                  Py_BuildValue( "L", retval->position ) );
+    PyDict_SetItemString( py_obj, "length",
+                  Py_BuildValue( "L", retval->length ) );
+
+    free( retval->url );
+    free( retval );
+
+    return py_obj;
+}
+
+static PyObject*
+MediaControl_sound_set_volume( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    unsigned short volume;
+
+    if( !PyArg_ParseTuple( args, "H", &volume ) )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_sound_set_volume( SELF->mc, volume, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject*
+MediaControl_sound_get_volume( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_retval;
+    unsigned short volume;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    volume = mediacontrol_sound_get_volume( SELF->mc, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    py_retval = Py_BuildValue( "H", volume );
+    return py_retval;
+}
+
+static PyObject*
+MediaControl_set_rate( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    int rate;
+
+    if( !PyArg_ParseTuple( args, "i", &rate ) )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_set_rate( SELF->mc, rate, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject*
+MediaControl_get_rate( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_retval;
+    int rate;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    rate = mediacontrol_get_rate( SELF->mc, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    py_retval = Py_BuildValue( "i", rate );
+    return py_retval;
+}
+
+static PyObject*
+MediaControl_set_fullscreen( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    int fs;
+
+    if( !PyArg_ParseTuple( args, "i", &fs ) )
+        return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_set_fullscreen( SELF->mc, fs, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject*
+MediaControl_get_fullscreen( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    PyObject *py_retval;
+    int fs;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    fs = mediacontrol_get_fullscreen( SELF->mc, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    py_retval = Py_BuildValue( "i", fs );
+    return py_retval;
+}
+
+static PyObject*
+MediaControl_set_visual( PyObject *self, PyObject *args )
+{
+    mediacontrol_Exception* exception = NULL;
+    WINDOWHANDLE visual;
+
+    if( !PyArg_ParseTuple( args, "i", &visual ) )
+       return NULL;
+
+    Py_BEGIN_ALLOW_THREADS
+    MC_TRY;
+    mediacontrol_set_visual( SELF->mc, visual, exception );
+    Py_END_ALLOW_THREADS
+    MC_EXCEPT;
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyMethodDef MediaControl_methods[] =
+{
+    {"get_media_position", MediaControl_get_media_position, METH_VARARGS,
+     "get_media_position( origin, key ) -> Position    Get current media position." },
+    { "set_media_position", MediaControl_set_media_position, METH_VARARGS,
+      "set_media_position( Position )            Set media position" },
+    { "start", MediaControl_start, METH_VARARGS,
+      "start( Position )         Start the player." },
+    { "pause", MediaControl_pause, METH_VARARGS,
+      "pause( Position )         Pause the player." },
+    { "resume", MediaControl_resume, METH_VARARGS,
+      "resume( Position )        Resume the player" },
+    { "stop", MediaControl_stop, METH_VARARGS,
+      "stop( Position )              Stop the player" },
+    { "exit", MediaControl_exit, METH_VARARGS,
+      "exit( )                     Exit the player" },
+    { "playlist_add_item", MediaControl_playlist_add_item, METH_VARARGS,
+      "playlist_add_item( str )               Add an item to the playlist" },
+    { "playlist_get_list", MediaControl_playlist_get_list, METH_VARARGS,
+      "playlist_get_list( ) -> list       Get the contents of the playlist" },
+    { "playlist_clear", MediaControl_playlist_clear, METH_VARARGS,
+      "clear( )         Clear the playlist." },
+    { "snapshot", MediaControl_snapshot, METH_VARARGS,
+      "snapshot( Position ) -> dict        Take a snapshot" },
+    { "display_text", MediaControl_display_text, METH_VARARGS,
+      "display_text( str, Position, Position )    Display a text on the video" },
+    { "get_stream_information", MediaControl_get_stream_information,
+      METH_VARARGS,
+      "get_stream_information( ) -> dict      Get information about the stream"},
+    { "sound_get_volume", MediaControl_sound_get_volume, METH_VARARGS,
+      "sound_get_volume( ) -> int       Get the volume" },
+    { "sound_set_volume", MediaControl_sound_set_volume, METH_VARARGS,
+      "sound_set_volume( int )           Set the volume" },
+    { "set_visual", MediaControl_set_visual, METH_VARARGS,
+      "set_visual( int )           Set the embedding window visual ID" },
+    { "get_rate", MediaControl_get_rate, METH_VARARGS,
+      "get_rate( ) -> int       Get the rate" },
+    { "set_rate", MediaControl_set_rate, METH_VARARGS,
+      "set_rate( int )              Set the rate" },
+    { "get_fullscreen", MediaControl_get_fullscreen, METH_VARARGS,
+      "get_fullscreen( ) -> int       Get the fullscreen status" },
+    { "set_fullscreen", MediaControl_set_fullscreen, METH_VARARGS,
+      "set_fullscreen( int )              Set the fullscreen status" },
+    { NULL, NULL, 0, NULL },
+};
+
+static PyTypeObject MediaControl_Type =
+{
+    PyObject_HEAD_INIT( NULL )
+    0,                         /*ob_size*/
+    "vlc.MediaControl",        /*tp_name*/
+    sizeof( MediaControl_Type ), /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    ( destructor )MediaControl_dealloc,      /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+    "Control of a VLC instance.",  /* tp_doc */
+    0,                     /* tp_traverse */
+    0,                     /* tp_clear */
+    0,                     /* tp_richcompare */
+    0,                     /* tp_weaklistoffset */
+    0,                     /* tp_iter */
+    0,                     /* tp_iternext */
+    MediaControl_methods,             /* tp_methods */
+    0,             /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,                         /* tp_init */
+    0,                         /* tp_alloc */
+    MediaControl_new,          /* tp_new */
+};
diff --git a/bindings/mediacontrol-python/vlc_module.c b/bindings/mediacontrol-python/vlc_module.c
new file mode 100644 (file)
index 0000000..ba2fd32
--- /dev/null
@@ -0,0 +1,182 @@
+/*****************************************************************************
+ * vlc_module.c: vlc python binding module
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+/* We need to access some internal features of VLC (for vlc_object) */
+#define __VLC__
+
+
+#include "vlcglue.h"
+
+/**************************************************************************
+ * VLC Module
+ **************************************************************************/
+
+#ifndef vlcMODINIT_FUNC /* declarations for DLL import/export */
+#define vlcMODINIT_FUNC void
+#endif
+
+static PyMethodDef vlc_methods[] = {
+    { NULL }  /* Sentinel */
+};
+
+/* Module globals */
+PyObject* MediaControl_InternalException          = NULL;
+PyObject* MediaControl_PositionKeyNotSupported    = NULL;
+PyObject *MediaControl_PositionOriginNotSupported = NULL;
+PyObject* MediaControl_InvalidPosition            = NULL;
+PyObject *MediaControl_PlaylistException          = NULL;
+
+vlcMODINIT_FUNC
+initvlc( void )
+{
+    PyObject* p_module;
+
+    PyPosition_Type.tp_new = PyType_GenericNew;
+    PyPosition_Type.tp_alloc = PyType_GenericAlloc;
+
+    vlcInput_Type.tp_new = PyType_GenericNew;
+    vlcInput_Type.tp_alloc = PyType_GenericAlloc;
+
+    p_module = Py_InitModule3( "vlc", vlc_methods,
+                               "VLC media player embedding module." );
+
+    if( !p_module )
+      return;
+
+    if( PyType_Ready( &PyPosition_Type ) < 0 )
+        return;
+    if( PyType_Ready( &MediaControl_Type ) < 0 )
+        return;
+    if( PyType_Ready( &vlcObject_Type ) < 0 )
+        return;
+    if( PyType_Ready( &vlcInstance_Type ) < 0 )
+        return;
+    if( PyType_Ready( &vlcInput_Type ) < 0 )
+        return;
+
+    /* Exceptions */
+    MediaControl_InternalException =
+            PyErr_NewException( "vlc.InternalException", NULL, NULL );
+    Py_INCREF( MediaControl_InternalException );
+    PyModule_AddObject( p_module, "InternalException",
+                        MediaControl_InternalException );
+
+    MediaControl_PositionKeyNotSupported =
+            PyErr_NewException( "vlc.PositionKeyNotSupported", NULL, NULL );
+    Py_INCREF( MediaControl_PositionKeyNotSupported );
+    PyModule_AddObject( p_module, "PositionKeyNotSupported",
+                        MediaControl_PositionKeyNotSupported );
+
+    MediaControl_PositionOriginNotSupported=
+            PyErr_NewException( "vlc.InvalidPosition", NULL, NULL );
+    Py_INCREF( MediaControl_PositionOriginNotSupported );
+    PyModule_AddObject( p_module, "PositionOriginNotSupported",
+                        MediaControl_PositionOriginNotSupported );
+
+    MediaControl_InvalidPosition =
+            PyErr_NewException( "vlc.InvalidPosition", NULL, NULL );
+    Py_INCREF( MediaControl_InvalidPosition );
+    PyModule_AddObject( p_module, "InvalidPosition",
+                        MediaControl_InvalidPosition );
+
+    MediaControl_PlaylistException =
+            PyErr_NewException( "vlc.PlaylistException", NULL, NULL );
+    Py_INCREF( MediaControl_PlaylistException );
+    PyModule_AddObject( p_module, "PlaylistException",
+                        MediaControl_PlaylistException );
+
+    /* Exceptions */
+    vlcInstance_Exception =
+        PyErr_NewException( "vlc.InstanceException", NULL, NULL );
+    Py_INCREF( vlcInstance_Exception );
+    PyModule_AddObject( p_module, "InstanceException",
+                        vlcInstance_Exception );
+
+    /* Types */
+    Py_INCREF( &PyPosition_Type );
+    PyModule_AddObject( p_module, "Position",
+                        ( PyObject * )&PyPosition_Type );
+
+    Py_INCREF( &MediaControl_Type );
+    PyModule_AddObject( p_module, "MediaControl",
+                        ( PyObject * )&MediaControl_Type );
+
+    Py_INCREF( &vlcObject_Type );
+    PyModule_AddObject( p_module, "Object",
+                        ( PyObject * )&vlcObject_Type );
+    Py_INCREF( &vlcInstance_Type );
+    PyModule_AddObject( p_module, "Instance",
+                        ( PyObject * )&vlcInstance_Type );
+    Py_INCREF( &vlcInput_Type );
+    PyModule_AddObject( p_module, "Input",
+                        ( PyObject * )&vlcInput_Type );
+
+    /* Constants */
+    PyModule_AddIntConstant( p_module, "AbsolutePosition",
+                             mediacontrol_AbsolutePosition );
+    PyModule_AddIntConstant( p_module, "RelativePosition",
+                             mediacontrol_RelativePosition );
+    PyModule_AddIntConstant( p_module, "ModuloPosition",
+                             mediacontrol_ModuloPosition );
+
+    PyModule_AddIntConstant( p_module, "ByteCount",
+                             mediacontrol_ByteCount );
+    PyModule_AddIntConstant( p_module, "SampleCount",
+                             mediacontrol_SampleCount );
+    PyModule_AddIntConstant( p_module, "MediaTime",
+                             mediacontrol_MediaTime );
+    PyModule_AddIntConstant( p_module, "PlayingStatus",
+                             mediacontrol_PlayingStatus );
+    PyModule_AddIntConstant( p_module, "PauseStatus",
+                             mediacontrol_PauseStatus );
+    PyModule_AddIntConstant( p_module, "ForwardStatus",
+                             mediacontrol_ForwardStatus );
+    PyModule_AddIntConstant( p_module, "BackwardStatus",
+                             mediacontrol_BackwardStatus );
+    PyModule_AddIntConstant( p_module, "InitStatus",
+                             mediacontrol_InitStatus );
+    PyModule_AddIntConstant( p_module, "EndStatus",
+                             mediacontrol_EndStatus );
+    PyModule_AddIntConstant( p_module, "UndefinedStatus",
+                             mediacontrol_UndefinedStatus );
+}
+
+
+/* Make libpostproc happy... */
+void * fast_memcpy( void * to, const void * from, size_t len )
+{
+  return memcpy( to, from, len );
+}
+
+/* Horrible hack... Please do not look.  Temporary workaround for the
+   forward declaration mess of python types (cf vlcglue.h). If we do a
+   separate compilation, we have to declare some types as extern. But
+   the recommended way to forward declare types in python is
+   static... I am sorting the mess but in the meantime, this will
+   produce a working python module.
+*/
+#include "vlc_mediacontrol.c"
+#include "vlc_position.c"
+#include "vlc_instance.c"
+#include "vlc_input.c"
+#include "vlc_object.c"
diff --git a/bindings/mediacontrol-python/vlc_object.c b/bindings/mediacontrol-python/vlc_object.c
new file mode 100644 (file)
index 0000000..068ab31
--- /dev/null
@@ -0,0 +1,616 @@
+/*****************************************************************************
+ * vlc_object.c: vlc.Object
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+/* We need to access some internal features of VLC */
+#define __VLC__
+
+#include "vlcglue.h"
+
+/*****************************************************************************
+ * VLCObject implementation
+ *****************************************************************************/
+
+static PyObject
+*vlcObject_new( PyTypeObject *p_type, PyObject *p_args, PyObject *p_kwds )
+{
+    vlcObject *self;
+    vlc_object_t *p_object;
+    int i_id;
+
+    self = PyObject_New( vlcObject, &vlcObject_Type );
+
+    if( !PyArg_ParseTuple( p_args, "i", &i_id ) )
+      return NULL;
+
+    /* Maybe we were already initialized */
+    p_object = ( vlc_object_t* )vlc_current_object( i_id );
+
+    if( !p_object )
+    {
+        /* Try to initialize */
+        i_id = VLC_Create();
+        if( i_id < 0 )
+        {
+            PyErr_SetString( PyExc_StandardError, "Unable to create a VLC instance." );
+            return NULL;
+        }
+        p_object = ( vlc_object_t* )vlc_current_object( i_id );
+    }
+
+    if( !p_object )
+    {
+        PyErr_SetString( PyExc_StandardError, "Unable to get object." );
+        return NULL;
+    }
+
+    self->p_object = p_object;
+    self->b_released = 0;
+
+    Py_INCREF(  self ); /* Ah bon ? */
+    return ( PyObject * )self;
+}
+
+static PyObject *
+vlcObject_release(  PyObject *self, PyObject *p_args )
+{
+    if( VLCSELF->b_released == 0 )
+    {
+        vlc_object_release( VLCSELF->p_object );
+        VLCSELF->b_released = 1;
+    }
+    Py_INCREF(  Py_None );
+    return Py_None;
+}
+
+static void
+vlcObject_dealloc( PyObject *self )
+{
+    vlcObject_release( self, NULL );
+    PyMem_DEL( self );
+}
+
+static PyObject *
+vlcObject_find_object( PyObject *self, PyObject *args )
+{
+    vlcObject *p_retval;
+    vlc_object_t *p_obj;
+    char *psz_name;
+    int i_object_type;
+
+    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
+        return NULL;
+
+    /* psz_name is in
+       ( aout, decoder, input, httpd, intf, playlist, root, vlc, vout )
+    */
+    if( !strncmp( psz_name, "aout", 4 ) )
+    {
+        i_object_type = VLC_OBJECT_AOUT;
+    }
+    else if (! strncmp( psz_name, "decoder", 7 ) )
+    {
+        i_object_type = VLC_OBJECT_DECODER;
+    }
+    else if (! strncmp( psz_name, "httpd", 5 ) )
+    {
+            i_object_type = VLC_OBJECT_HTTPD;
+    }
+    else if (! strncmp( psz_name, "intf", 4 ) )
+    {
+        i_object_type = VLC_OBJECT_INTF;
+    }
+    else if (! strncmp( psz_name, "input", 5 ) )
+    {
+        i_object_type = VLC_OBJECT_INPUT;
+    }
+    else if (! strncmp( psz_name, "playlist", 8 ) )
+    {
+        i_object_type = VLC_OBJECT_PLAYLIST;
+    }
+    else if (! strncmp( psz_name, "root", 4 ) )
+    {
+        i_object_type = VLC_OBJECT_ROOT;
+    }
+    else if (! strncmp( psz_name, "libvlc", 6 ) )
+    {
+        i_object_type = VLC_OBJECT_LIBVLC;
+    }
+    else if (! strncmp( psz_name, "vout", 4 ) )
+    {
+        i_object_type = VLC_OBJECT_VOUT;
+    }
+    else
+    {
+        /* FIXME: raise an exception ? */
+        Py_INCREF( Py_None );
+        return Py_None;
+    }
+
+    p_obj = vlc_object_find( VLCSELF->p_object, i_object_type, FIND_ANYWHERE );
+
+    if( !p_obj )
+    {
+        Py_INCREF( Py_None );
+        return Py_None;
+    }
+
+    p_retval = PyObject_New( vlcObject, &vlcObject_Type );
+
+    p_retval->p_object = p_obj;
+
+    return ( PyObject * )p_retval;
+}
+
+static PyObject *
+vlcObject_info( PyObject *self, PyObject *args )
+{
+    PyObject *p_retval;
+    vlc_object_t *p_obj;
+
+    p_obj = VLCSELF->p_object;
+
+    /* Return information about the object as a dict. */
+    p_retval = PyDict_New();
+
+    PyDict_SetItemString( p_retval, "object-id",
+                          Py_BuildValue( "l", p_obj->i_object_id ) );
+    PyDict_SetItemString( p_retval, "object-type",
+                          Py_BuildValue( "s", p_obj->psz_object_type ) );
+    PyDict_SetItemString( p_retval, "object-name",
+                          Py_BuildValue( "s", p_obj->psz_object_name ) );
+    PyDict_SetItemString( p_retval, "thread",
+                          PyBool_FromLong( p_obj->b_thread ) );
+    PyDict_SetItemString( p_retval, "thread-id",
+                          PyLong_FromLongLong( p_obj->thread_id ) );
+    PyDict_SetItemString( p_retval, "refcount",
+                          PyInt_FromLong( p_obj->i_refcount ) );
+
+    return p_retval;
+}
+
+static PyObject *
+vlcObject_find_id( PyObject *self, PyObject *args )
+{
+    vlcObject *p_retval;
+    vlc_object_t* p_object;
+    int i_id;
+
+    if( !PyArg_ParseTuple( args, "i", &i_id ) )
+        return NULL;
+
+    p_object = ( vlc_object_t* )vlc_current_object( i_id );
+
+    if( !p_object )
+    {
+        Py_INCREF( Py_None );
+        return Py_None;
+    }
+
+    p_retval = PyObject_NEW( vlcObject, &vlcObject_Type );
+
+    p_retval->p_object = p_object;
+
+    return ( PyObject * )p_retval;
+}
+
+/* Do a var_Get call on the object. Parameter: the variable name. */
+static PyObject *
+vlcObject_var_get( PyObject *self, PyObject *args )
+{
+    PyObject *p_retval;
+    vlc_value_t value;
+    char *psz_name;
+    int i_type;
+
+    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
+        return NULL;
+
+    if( var_Get( VLCSELF->p_object, psz_name, &value ) != VLC_SUCCESS )
+    {
+        PyErr_SetString( PyExc_StandardError,
+                         "Error: variable does not exist.\n" );
+        return NULL;
+    }
+
+    i_type = var_Type ( VLCSELF->p_object, psz_name );
+
+    switch ( i_type )
+    {
+    case VLC_VAR_VOID      :
+        p_retval = PyString_FromString( "A void variable" );
+        break;
+    case VLC_VAR_BOOL      :
+        p_retval = PyBool_FromLong( value.b_bool );
+        break;
+    case VLC_VAR_INTEGER   :
+        p_retval = PyInt_FromLong( ( long )value.i_int );
+        break;
+    case VLC_VAR_HOTKEY    :
+        p_retval = PyString_FromFormat( "A hotkey variable ( %d )", value.i_int );
+        break;
+    case VLC_VAR_FILE      :
+    case VLC_VAR_STRING    :
+    case VLC_VAR_DIRECTORY :
+    case VLC_VAR_VARIABLE  :
+        p_retval = PyString_FromString( value.psz_string );
+        break;
+    case VLC_VAR_MODULE   :
+        p_retval = ( PyObject* )PyObject_New( vlcObject, &vlcObject_Type );
+        ( ( vlcObject* )p_retval )->p_object = value.p_object;
+        break;
+    case VLC_VAR_FLOAT     :
+        p_retval = PyFloat_FromDouble( ( double )value.f_float );
+        break;
+    case VLC_VAR_TIME      :
+        p_retval = PyLong_FromLongLong( value.i_time );
+        break;
+    case VLC_VAR_ADDRESS   :
+        p_retval = PyString_FromString( "A VLC address ( not handled yet )" );
+        break;
+    case VLC_VAR_LIST      :
+        p_retval = PyString_FromString( "A VLC list ( not handled yet )" );
+        break;
+    case VLC_VAR_MUTEX :
+        p_retval = PyString_FromString( "A mutex" );
+        break;
+    default:
+        p_retval = Py_None;
+    }
+
+    Py_INCREF( p_retval );
+    return p_retval;
+}
+
+static PyObject *
+vlcObject_var_type( PyObject *self, PyObject *args )
+{
+    char *psz_name;
+    PyObject *p_retval;
+    int i_type;
+
+    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
+        return NULL;
+
+    i_type = var_Type( VLCSELF->p_object, psz_name );
+
+    switch ( i_type )
+    {
+    case VLC_VAR_VOID   :
+        p_retval = PyString_FromString( "Void" );
+        break;
+    case VLC_VAR_BOOL      :
+        p_retval = PyString_FromString( "Boolean" );
+        break;
+    case VLC_VAR_INTEGER   :
+        p_retval = PyString_FromString( "Integer" );
+        break;
+    case VLC_VAR_HOTKEY   :
+        p_retval = PyString_FromString( "Hotkey" );
+        break;
+    case VLC_VAR_FILE      :
+        p_retval = PyString_FromString( "File" );
+        break;
+    case VLC_VAR_STRING    :
+        p_retval = PyString_FromString( "String" );
+        break;
+    case VLC_VAR_DIRECTORY :
+        p_retval = PyString_FromString( "Directory" );
+        break;
+    case VLC_VAR_VARIABLE  :
+        p_retval = PyString_FromString( "Variable" );
+        break;
+    case VLC_VAR_MODULE   :
+        p_retval = PyString_FromString( "Module" );
+        break;
+    case VLC_VAR_FLOAT     :
+        p_retval = PyString_FromString( "Float" );
+        break;
+    case VLC_VAR_TIME      :
+        p_retval = PyString_FromString( "Time" );
+        break;
+    case VLC_VAR_ADDRESS   :
+        p_retval = PyString_FromString( "Address" );
+        break;
+    case VLC_VAR_LIST      :
+        p_retval = PyString_FromString( "List" );
+        break;
+    case VLC_VAR_MUTEX :
+        p_retval = PyString_FromString( "Mutex" );
+        break;
+    default:
+        p_retval = PyString_FromString( "Unknown" );
+    }
+    return p_retval;
+}
+
+/* Do a var_Set call on the object. Parameter: the variable name. */
+static PyObject *
+vlcObject_var_set( PyObject *self, PyObject *args )
+{
+    vlc_value_t value;
+    char *psz_name;
+    PyObject *py_value;
+    int i_type;
+    vlc_object_t *p_obj;
+
+    if( !PyArg_ParseTuple( args, "sO", &psz_name, &py_value ) )
+        return NULL;
+
+    p_obj = VLCSELF->p_object;
+    i_type = var_Type( p_obj, psz_name );
+
+    switch ( i_type )
+    {
+    case VLC_VAR_VOID   :
+        break;
+    case VLC_VAR_BOOL      :
+        value.b_bool = PyInt_AsLong( py_value );
+        break;
+    case VLC_VAR_INTEGER   :
+    case VLC_VAR_HOTKEY   :
+        value.i_int = PyInt_AsLong( py_value );
+        break;
+    case VLC_VAR_FILE      :
+    case VLC_VAR_STRING    :
+    case VLC_VAR_DIRECTORY :
+    case VLC_VAR_VARIABLE  :
+        value.psz_string = strdup( PyString_AsString( py_value ) );
+        break;
+    case VLC_VAR_MODULE   :
+        /* FIXME: we should check the PyObject type and get its p_object */
+        value.p_object = ( ( vlcObject* )p_obj )->p_object;
+        break;
+    case VLC_VAR_FLOAT     :
+        value.f_float = PyFloat_AsDouble( py_value );
+        break;
+    case VLC_VAR_TIME      :
+        value.i_time = PyLong_AsLongLong( py_value );
+        break;
+    case VLC_VAR_ADDRESS   :
+        value.p_address = ( char* )PyLong_AsVoidPtr( py_value );
+        break;
+    case VLC_VAR_LIST      :
+        /* FIXME */
+        value.p_list = NULL;
+        break;
+    case VLC_VAR_MUTEX :
+        break;
+    }
+
+    var_Set( p_obj, psz_name, value );
+
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcObject_var_list( PyObject *self, PyObject *args )
+{
+    PyObject *p_retval;
+    int i_size;
+    int i_index;
+
+    i_size = VLCSELF->p_object->i_vars;
+    p_retval = PyTuple_New( i_size );
+
+    for ( i_index = 0 ; i_index < i_size ; i_index++ )
+    {
+        PyTuple_SetItem( p_retval, i_index,
+                         Py_BuildValue( "s", VLCSELF->p_object->p_vars[i_index].psz_name ) );
+    }
+
+    return p_retval;
+}
+
+/* Do a config_Get call on the object. Parameter: the variable name. */
+static PyObject *
+vlcObject_config_get( PyObject *self, PyObject *args )
+{
+    PyObject *p_retval;
+    vlc_value_t value;
+    char *psz_name;
+    module_config_t *p_config;
+
+    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
+        return NULL;
+
+    p_config = config_FindConfig( VLCSELF->p_object, psz_name );
+
+    if( !p_config )
+    {
+        PyErr_SetString( PyExc_StandardError,
+                         "Error: config variable does not exist.\n" );
+        return NULL;
+    }
+
+    switch ( p_config->i_type )
+    {
+    case CONFIG_ITEM_BOOL      :
+        p_retval = PyBool_FromLong( p_config->i_value );
+        break;
+    case CONFIG_ITEM_INTEGER   :
+        p_retval = PyInt_FromLong( ( long )p_config->i_value );
+        break;
+    case CONFIG_ITEM_KEY   :
+        p_retval = PyString_FromFormat( "A hotkey variable ( %d )", p_config->i_value );
+        break;
+    case CONFIG_ITEM_FILE      :
+    case CONFIG_ITEM_STRING    :
+    case CONFIG_ITEM_DIRECTORY :
+    case CONFIG_ITEM_MODULE    :
+        vlc_mutex_lock( p_config->p_lock );
+        if( p_config->psz_value )
+            p_retval = PyString_FromString( p_config->psz_value );
+        else
+            p_retval = PyString_FromString( "" );
+        vlc_mutex_unlock( p_config->p_lock );
+        break;
+        p_retval = ( PyObject* )PyObject_New( vlcObject, &vlcObject_Type );
+        ( ( vlcObject* )p_retval )->p_object = value.p_object;
+        break;
+    case CONFIG_ITEM_FLOAT     :
+        p_retval = PyFloat_FromDouble( ( double )p_config->f_value );
+        break;
+    default:
+        p_retval = Py_None;
+        Py_INCREF( p_retval );
+    }
+
+    return p_retval;
+}
+
+/* Do a config_put* call on the object. Parameter: the variable name. */
+static PyObject *
+vlcObject_config_set( PyObject *self, PyObject *args )
+{
+    char *psz_name;
+    PyObject *py_value;
+    vlc_object_t *p_obj;
+    module_config_t *p_config;
+
+
+    if( !PyArg_ParseTuple( args, "sO", &psz_name, &py_value ) )
+        return NULL;
+
+    p_obj = VLCSELF->p_object;
+    p_config = config_FindConfig( p_obj, psz_name );
+    /* sanity checks */
+    if( !p_config )
+    {
+        PyErr_SetString( PyExc_StandardError,
+                         "Error: option does not exist.\n" );
+        return NULL;
+    }
+
+    switch ( p_config->i_type )
+    {
+    case CONFIG_ITEM_BOOL      :
+    case CONFIG_ITEM_INTEGER   :
+    case CONFIG_ITEM_KEY       :
+        config_PutInt( p_obj, psz_name, PyInt_AsLong( py_value ) );
+        break;
+    case CONFIG_ITEM_FILE      :
+    case CONFIG_ITEM_STRING    :
+    case CONFIG_ITEM_DIRECTORY :
+    case CONFIG_ITEM_MODULE   :
+        config_PutPsz( p_obj, psz_name, PyString_AsString( py_value ) );
+        break;
+    case CONFIG_ITEM_FLOAT     :
+        config_PutFloat( p_obj, psz_name, PyFloat_AsDouble( py_value ) );
+        break;
+    }
+    Py_INCREF( Py_None );
+    return Py_None;
+}
+
+static PyObject *
+vlcObject_children( PyObject *self, PyObject *args )
+{
+    PyObject *p_retval;
+    int i_size;
+    int i_index;
+
+    i_size = VLCSELF->p_object->i_children;
+    p_retval = PyTuple_New( i_size );
+
+    for ( i_index = 0 ; i_index < i_size ; i_index++ )
+    {
+        PyTuple_SetItem( p_retval, i_index,
+                         Py_BuildValue( "i",
+                                        VLCSELF->p_object->pp_children[i_index]->i_object_id ) );
+    }
+
+    return p_retval;
+}
+
+
+/* Method table */
+static PyMethodDef vlcObject_methods[] =
+{
+    { "get", vlcObject_var_get, METH_VARARGS,
+      "get( str ) -> value   Get a variable value."},
+    { "set", vlcObject_var_set, METH_VARARGS,
+      "set( str, value )     Set a variable value" },
+    { "config_get", vlcObject_config_get, METH_VARARGS,
+      "config_get( str ) -> value   Get a configuration option." },
+    { "config_set", vlcObject_config_set, METH_VARARGS,
+      "config_set( str, value )     Set a configuration option" },
+    { "type", vlcObject_var_type, METH_VARARGS,
+      "type( str ) -> str     Get a variable type" },
+    { "list", vlcObject_var_list, METH_NOARGS,
+      "list( )             List the available variables" },
+    { "children", vlcObject_children, METH_NOARGS,
+      "children( )             List the children ids" },
+    { "find_object", vlcObject_find_object, METH_VARARGS,
+      "find_object( str ) -> Object     Find the object of a given type.\n\nAvailable types are : aout, decoder, input, httpd, intf, playlist, root, vlc, vout"},
+    { "find_id", vlcObject_find_id, METH_VARARGS,
+      "find_id( int ) -> Object      Find an object by id" },
+    { "info", vlcObject_info, METH_NOARGS,
+       "info( ) -> dict    Return information about the object" },
+    { "release", vlcObject_release, METH_NOARGS,
+      "release( ) ->     Release the VLC Object" },
+    { NULL, NULL, 0, NULL },
+};
+
+static PyTypeObject vlcObject_Type =
+{
+    PyObject_HEAD_INIT( NULL )
+    0,                         /*ob_size*/
+    "vlc.Object",       /*tp_name*/
+    sizeof( vlcObject_Type ), /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    ( destructor )vlcObject_dealloc,      /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+    "Expose VLC object infrastructure.",  /* tp_doc */
+    0,                     /* tp_traverse */
+    0,                     /* tp_clear */
+    0,                     /* tp_richcompare */
+    0,                     /* tp_weaklistoffset */
+    0,                     /* tp_iter */
+    0,                     /* tp_iternext */
+    vlcObject_methods,             /* tp_methods */
+    0,             /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    0,                         /* tp_init */
+    0,                         /* tp_alloc */
+    vlcObject_new,          /* tp_new */
+};
diff --git a/bindings/mediacontrol-python/vlc_position.c b/bindings/mediacontrol-python/vlc_position.c
new file mode 100644 (file)
index 0000000..2e6b527
--- /dev/null
@@ -0,0 +1,188 @@
+/*****************************************************************************
+ * vlc_position.c: vlc.Position binding
+ *****************************************************************************
+ * Copyright (C) 2006 the VideoLAN team
+ * $Id: $
+ *
+ * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#include "vlcglue.h"
+
+/***********************************************************************
+ * Position
+ ***********************************************************************/
+
+static int
+PyPosition_init( PyPosition *self, PyObject *args, PyObject *kwds )
+{
+    self->origin = mediacontrol_AbsolutePosition;
+    self->key    = mediacontrol_MediaTime;
+    self->value  = 0;
+    return 0;
+}
+
+mediacontrol_PositionKey
+positionKey_py_to_c( PyObject * py_key )
+{
+    mediacontrol_PositionKey key_position = mediacontrol_MediaTime;
+    int key;
+
+    if( !PyArg_Parse( py_key, "i", &key ) )
+    {
+        PyErr_SetString ( MediaControl_InternalException, "Invalid key value" );
+        return key_position;
+    }
+
+    switch ( key )
+    {
+    case 0: key = mediacontrol_ByteCount;   break;
+    case 1: key = mediacontrol_SampleCount; break;
+    case 2: key = mediacontrol_MediaTime;   break;
+    }
+    return key_position;
+}
+
+mediacontrol_PositionOrigin
+positionOrigin_py_to_c( PyObject * py_origin )
+{
+    mediacontrol_PositionOrigin  origin_position = mediacontrol_AbsolutePosition;
+    int origin;
+
+    if( !PyArg_Parse( py_origin,"i", &origin ) )
+    {
+        PyErr_SetString( MediaControl_InternalException,
+                         "Invalid origin value" );
+        return origin_position;
+    }
+
+    switch ( origin )
+    {
+    case 0: origin_position = mediacontrol_AbsolutePosition; break;
+    case 1: origin_position = mediacontrol_RelativePosition; break;
+    case 2: origin_position = mediacontrol_ModuloPosition;   break;
+    }
+
+    return origin_position;
+}
+
+/* Methods for transforming the Position Python object to Position structure*/
+mediacontrol_Position*
+position_py_to_c( PyObject * py_position )
+{
+    mediacontrol_Position * a_position = NULL;
+    PyPosition *pos = ( PyPosition* )py_position;
+
+    a_position = ( mediacontrol_Position* )malloc( sizeof( mediacontrol_Position ) );
+    if( !a_position )
+    {
+        PyErr_SetString( PyExc_MemoryError, "Out of memory" );
+        return NULL;
+    }
+
+    if( !py_position )
+    {
+        /* If we give a NULL value, it will be considered as
+           a 0 relative position in mediatime */
+        a_position->origin = mediacontrol_RelativePosition;
+        a_position->key    = mediacontrol_MediaTime;
+        a_position->value  = 0;
+    }
+    else if( PyObject_IsInstance( py_position, ( PyObject* )&PyPosition_Type ) )
+    {
+        a_position->origin = pos->origin;
+        a_position->key    = pos->key;
+        a_position->value  = ntohll(pos->value);
+    }
+    else
+    {
+        /* Feature: if we give an integer, it will be considered as
+           a relative position in mediatime */
+        a_position->origin = mediacontrol_RelativePosition;
+        a_position->key    = mediacontrol_MediaTime;
+        a_position->value  = PyLong_AsLongLong( py_position );
+    }
+    return a_position;
+}
+
+PyPosition*
+position_c_to_py( mediacontrol_Position *position )
+{
+    PyPosition* py_retval;
+
+    py_retval = PyObject_New( PyPosition, &PyPosition_Type );
+    py_retval->origin = position->origin;
+    py_retval->key    = position->key;
+    py_retval->value  = position->value;
+
+    return py_retval;
+}
+
+static PyMethodDef PyPosition_methods[] =
+{
+    { NULL }  /* Sentinel */
+};
+
+static PyMemberDef PyPosition_members[] =
+{
+    { "origin", T_INT, offsetof( PyPosition, origin ), 0, "Position origin" },
+    { "key",    T_INT, offsetof( PyPosition, key ),    0, "Position key" },
+    { "value",  T_ULONG, offsetof( PyPosition, value ), 0, "Position value" },
+    { NULL }  /* Sentinel */
+};
+
+static PyTypeObject PyPosition_Type =
+{
+    PyObject_HEAD_INIT( NULL )
+    0,                         /*ob_size*/
+    "vlc.Position",            /*tp_name*/
+    sizeof( PyPosition_Type ),   /*tp_basicsize*/
+    0,                         /*tp_itemsize*/
+    0,                         /*tp_dealloc*/
+    0,                         /*tp_print*/
+    0,                         /*tp_getattr*/
+    0,                         /*tp_setattr*/
+    0,                         /*tp_compare*/
+    0,                         /*tp_repr*/
+    0,                         /*tp_as_number*/
+    0,                         /*tp_as_sequence*/
+    0,                         /*tp_as_mapping*/
+    0,                         /*tp_hash */
+    0,                         /*tp_call*/
+    0,                         /*tp_str*/
+    0,                         /*tp_getattro*/
+    0,                         /*tp_setattro*/
+    0,                         /*tp_as_buffer*/
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+    "Represent a Position with origin, key and value",  /* tp_doc */
+    0,                        /* tp_traverse */
+    0,                        /* tp_clear */
+    0,                         /* tp_richcompare */
+    0,                         /* tp_weaklistoffset */
+    0,                         /* tp_iter */
+    0,                          /* tp_iternext */
+    PyPosition_methods,             /* tp_methods */
+    PyPosition_members,             /* tp_members */
+    0,                         /* tp_getset */
+    0,                         /* tp_base */
+    0,                         /* tp_dict */
+    0,                         /* tp_descr_get */
+    0,                         /* tp_descr_set */
+    0,                         /* tp_dictoffset */
+    ( initproc )PyPosition_init, /* tp_init */
+    0,                         /* tp_alloc */
+    0,                         /* tp_new */
+};
diff --git a/bindings/mediacontrol-python/vlcglue.c b/bindings/mediacontrol-python/vlcglue.c
deleted file mode 100644 (file)
index 9ebd28a..0000000
+++ /dev/null
@@ -1,1528 +0,0 @@
-/*****************************************************************************
- * vlcglue.c: VLC Module
- *****************************************************************************
- * Copyright (C) 1998-2004 the VideoLAN team
- * $Id$
- *
- * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
- *          Clément Stenac <zorglub@videolan.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-#include "vlcglue.h"
-
-/**************************************************************************
- * VLC Module
- **************************************************************************/
-
-#ifndef vlcMODINIT_FUNC /* declarations for DLL import/export */
-#define vlcMODINIT_FUNC void
-#endif
-
-static PyMethodDef vlc_methods[] = {
-    { NULL }  /* Sentinel */
-};
-
-/* Module globals */
-PyObject* MediaControl_InternalException          = NULL;
-PyObject* MediaControl_PositionKeyNotSupported    = NULL;
-PyObject *MediaControl_PositionOriginNotSupported = NULL;
-PyObject* MediaControl_InvalidPosition            = NULL;
-PyObject *MediaControl_PlaylistException          = NULL;
-
-vlcMODINIT_FUNC
-initvlc( void )
-{
-    PyObject* p_module;
-
-    PyPosition_Type.tp_new = PyType_GenericNew;
-    PyPosition_Type.tp_alloc = PyType_GenericAlloc;
-
-    p_module = Py_InitModule3( "vlc", vlc_methods,
-                               "VLC media player embedding module." );
-
-    if( !p_module )
-      return;
-
-    if( PyType_Ready( &PyPosition_Type ) < 0 )
-        return;
-    if( PyType_Ready( &MediaControl_Type ) < 0 )
-        return;
-    if( PyType_Ready( &vlcObject_Type ) < 0 )
-        return;
-
-    /* Exceptions */
-    MediaControl_InternalException =
-            PyErr_NewException( "vlc.InternalException", NULL, NULL );
-    Py_INCREF( MediaControl_InternalException );
-    PyModule_AddObject( p_module, "InternalException",
-                        MediaControl_InternalException );
-
-    MediaControl_PositionKeyNotSupported =
-            PyErr_NewException( "vlc.PositionKeyNotSupported", NULL, NULL );
-    Py_INCREF( MediaControl_PositionKeyNotSupported );
-    PyModule_AddObject( p_module, "PositionKeyNotSupported",
-                        MediaControl_PositionKeyNotSupported );
-
-    MediaControl_PositionOriginNotSupported=
-            PyErr_NewException( "vlc.InvalidPosition", NULL, NULL );
-    Py_INCREF( MediaControl_PositionOriginNotSupported );
-    PyModule_AddObject( p_module, "PositionOriginNotSupported",
-                        MediaControl_PositionOriginNotSupported );
-
-    MediaControl_InvalidPosition =
-            PyErr_NewException( "vlc.InvalidPosition", NULL, NULL );
-    Py_INCREF( MediaControl_InvalidPosition );
-    PyModule_AddObject( p_module, "InvalidPosition",
-                        MediaControl_InvalidPosition );
-
-    MediaControl_PlaylistException =
-            PyErr_NewException( "vlc.PlaylistException", NULL, NULL );
-    Py_INCREF( MediaControl_PlaylistException );
-    PyModule_AddObject( p_module, "PlaylistException",
-                        MediaControl_PlaylistException );
-
-    /* Types */
-    Py_INCREF( &PyPosition_Type );
-    PyModule_AddObject( p_module, "Position",
-                        ( PyObject * )&PyPosition_Type );
-
-    Py_INCREF( &MediaControl_Type );
-    PyModule_AddObject( p_module, "MediaControl",
-                        ( PyObject * )&MediaControl_Type );
-
-    Py_INCREF( &vlcObject_Type );
-    PyModule_AddObject( p_module, "Object",
-                        ( PyObject * )&vlcObject_Type );
-
-    /* Constants */
-    PyModule_AddIntConstant( p_module, "AbsolutePosition",
-                             mediacontrol_AbsolutePosition );
-    PyModule_AddIntConstant( p_module, "RelativePosition",
-                             mediacontrol_RelativePosition );
-    PyModule_AddIntConstant( p_module, "ModuloPosition",
-                             mediacontrol_ModuloPosition );
-
-    PyModule_AddIntConstant( p_module, "ByteCount",
-                             mediacontrol_ByteCount );
-    PyModule_AddIntConstant( p_module, "SampleCount",
-                             mediacontrol_SampleCount );
-    PyModule_AddIntConstant( p_module, "MediaTime",
-                             mediacontrol_MediaTime );
-    PyModule_AddIntConstant( p_module, "PlayingStatus",
-                             mediacontrol_PlayingStatus );
-    PyModule_AddIntConstant( p_module, "PauseStatus",
-                             mediacontrol_PauseStatus );
-    PyModule_AddIntConstant( p_module, "ForwardStatus",
-                             mediacontrol_ForwardStatus );
-    PyModule_AddIntConstant( p_module, "BackwardStatus",
-                             mediacontrol_BackwardStatus );
-    PyModule_AddIntConstant( p_module, "InitStatus",
-                             mediacontrol_InitStatus );
-    PyModule_AddIntConstant( p_module, "EndStatus",
-                             mediacontrol_EndStatus );
-    PyModule_AddIntConstant( p_module, "UndefinedStatus",
-                             mediacontrol_UndefinedStatus );
-}
-
-
-/* Make libpostproc happy... */
-void * fast_memcpy( void * to, const void * from, size_t len )
-{
-  return memcpy( to, from, len );
-}
-
-
-/*****************************************************************************
- * VLCObject implementation
- *****************************************************************************/
-
-static PyObject
-*vlcObject_new( PyTypeObject *p_type, PyObject *p_args, PyObject *p_kwds )
-{
-    vlcObject *self;
-    vlc_object_t *p_object;
-    int i_id;
-
-    self = PyObject_New( vlcObject, &vlcObject_Type );
-
-    if( !PyArg_ParseTuple( p_args, "i", &i_id ) )
-      return NULL;
-
-    /* Maybe we were already initialized */
-    p_object = ( vlc_object_t* )vlc_current_object( i_id );
-
-    if( !p_object )
-    {
-        /* Try to initialize */
-        i_id = VLC_Create();
-       if( i_id < 0 ) 
-        {
-            PyErr_SetString( PyExc_StandardError, "Unable to create a VLC instance." );
-            return NULL;            
-        }
-        p_object = ( vlc_object_t* )vlc_current_object( i_id );
-    }
-
-    if( !p_object )
-    {
-        PyErr_SetString( PyExc_StandardError, "Unable to get object." );
-        return NULL;
-    }
-
-    self->p_object = p_object;
-    self->b_released = 0;
-
-    Py_INCREF(  self ); /* Ah bon ? */
-    return ( PyObject * )self;
-}
-
-static PyObject *
-vlcObject_release(  PyObject *self, PyObject *p_args )
-{
-    if( VLCSELF->b_released == 0 )
-    {
-        vlc_object_release( VLCSELF->p_object );
-        VLCSELF->b_released = 1;
-    }
-    Py_INCREF(  Py_None );
-    return Py_None;
-}
-
-static void
-vlcObject_dealloc( PyObject *self )
-{
-    vlcObject_release( self, NULL );
-    PyMem_DEL( self );
-}
-
-static PyObject *
-vlcObject_find_object( PyObject *self, PyObject *args )
-{
-    vlcObject *p_retval;
-    vlc_object_t *p_obj;
-    char *psz_name;
-    int i_object_type;
-
-    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
-        return NULL;
-
-    /* psz_name is in
-       ( aout, decoder, input, httpd, intf, playlist, root, vlc, vout )
-    */
-    switch ( psz_name[0] )
-    {
-        case 'a':
-            i_object_type = VLC_OBJECT_AOUT;
-            break;
-        case 'd':
-            i_object_type = VLC_OBJECT_DECODER;
-            break;
-        case 'h':
-            i_object_type = VLC_OBJECT_HTTPD;
-            break;
-        case 'i':
-            if( strlen( psz_name ) < 3 )
-                    i_object_type = VLC_OBJECT_INTF;
-            else if( psz_name[2] == 't' )
-                    i_object_type = VLC_OBJECT_INTF;
-            else
-                    i_object_type = VLC_OBJECT_INPUT;
-            break;
-        case 'p':
-            i_object_type = VLC_OBJECT_PLAYLIST;
-            break;
-        case 'r':
-            i_object_type = VLC_OBJECT_ROOT;
-            break;
-        case 'v':
-            if( strlen( psz_name ) < 3 )
-                    i_object_type = VLC_OBJECT_VLC;
-            else if( psz_name[1] == 'l' )
-                    i_object_type = VLC_OBJECT_VLC;
-            else
-                    i_object_type = VLC_OBJECT_VOUT;
-            break;
-        default:
-            /* FIXME: raise an exception ? */
-            return Py_None;
-    }
-
-    p_obj = vlc_object_find( VLCSELF->p_object, i_object_type, FIND_ANYWHERE );
-
-    if( !p_obj )
-    {
-        Py_INCREF( Py_None );
-        return Py_None;
-    }
-
-    p_retval = PyObject_New( vlcObject, &vlcObject_Type );
-
-    p_retval->p_object = p_obj;
-
-    return ( PyObject * )p_retval;
-}
-
-static PyObject *
-vlcObject_info( PyObject *self, PyObject *args )
-{
-    PyObject *p_retval;
-    vlc_object_t *p_obj;
-
-    p_obj = VLCSELF->p_object;
-
-    /* Return information about the object as a dict. */
-    p_retval = PyDict_New();
-
-    PyDict_SetItemString( p_retval, "object-id",
-                          Py_BuildValue( "l", p_obj->i_object_id ) );
-    PyDict_SetItemString( p_retval, "object-type",
-                          Py_BuildValue( "s", p_obj->psz_object_type ) );
-    PyDict_SetItemString( p_retval, "object-name",
-                          Py_BuildValue( "s", p_obj->psz_object_name ) );
-    PyDict_SetItemString( p_retval, "thread",
-                          PyBool_FromLong( p_obj->b_thread ) );
-    PyDict_SetItemString( p_retval, "thread-id",
-                          PyLong_FromLongLong( p_obj->thread_id ) );
-    PyDict_SetItemString( p_retval, "refcount",
-                          PyInt_FromLong( p_obj->i_refcount ) );
-
-    return p_retval;
-}
-
-static PyObject *
-vlcObject_find_id( PyObject *self, PyObject *args )
-{
-    vlcObject *p_retval;
-    vlc_object_t* p_object;
-    int i_id;
-
-    if( !PyArg_ParseTuple( args, "i", &i_id ) )
-        return NULL;
-
-    p_object = ( vlc_object_t* )vlc_current_object( i_id );
-
-    if( !p_object )
-    {
-        Py_INCREF( Py_None );
-        return Py_None;
-    }
-
-    p_retval = PyObject_NEW( vlcObject, &vlcObject_Type );
-
-    p_retval->p_object = p_object;
-
-    return ( PyObject * )p_retval;
-}
-
-/* Do a var_Get call on the object. Parameter: the variable name. */
-static PyObject *
-vlcObject_var_get( PyObject *self, PyObject *args )
-{
-    PyObject *p_retval;
-    vlc_value_t value;
-    char *psz_name;
-    int i_type;
-
-    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
-        return NULL;
-
-    if( var_Get( VLCSELF->p_object, psz_name, &value ) != VLC_SUCCESS )
-    {
-        PyErr_SetString( PyExc_StandardError,
-                         "Error: variable does not exist.\n" );
-        return NULL;
-    }
-
-    i_type = var_Type ( VLCSELF->p_object, psz_name );
-
-    switch ( i_type )
-    {
-    case VLC_VAR_VOID      :
-        p_retval = PyString_FromString( "A void variable" );
-        break;
-    case VLC_VAR_BOOL      :
-        p_retval = PyBool_FromLong( value.b_bool );
-        break;
-    case VLC_VAR_INTEGER   :
-        p_retval = PyInt_FromLong( ( long )value.i_int );
-        break;
-    case VLC_VAR_HOTKEY    :
-        p_retval = PyString_FromFormat( "A hotkey variable ( %d )", value.i_int );
-        break;
-    case VLC_VAR_FILE      :
-    case VLC_VAR_STRING    :
-    case VLC_VAR_DIRECTORY :
-    case VLC_VAR_VARIABLE  :
-        p_retval = PyString_FromString( value.psz_string );
-        break;
-    case VLC_VAR_MODULE   :
-        p_retval = ( PyObject* )PyObject_New( vlcObject, &vlcObject_Type );
-        ( ( vlcObject* )p_retval )->p_object = value.p_object;
-        break;
-    case VLC_VAR_FLOAT     :
-        p_retval = PyFloat_FromDouble( ( double )value.f_float );
-        break;
-    case VLC_VAR_TIME      :
-        p_retval = PyLong_FromLongLong( value.i_time );
-        break;
-    case VLC_VAR_ADDRESS   :
-        p_retval = PyString_FromString( "A VLC address ( not handled yet )" );
-        break;
-    case VLC_VAR_LIST      :
-        p_retval = PyString_FromString( "A VLC list ( not handled yet )" );
-        break;
-    case VLC_VAR_MUTEX :
-        p_retval = PyString_FromString( "A mutex" );
-        break;
-    default:
-        p_retval = Py_None;
-    }
-
-    Py_INCREF( p_retval );
-    return p_retval;
-}
-
-static PyObject *
-vlcObject_var_type( PyObject *self, PyObject *args )
-{
-    char *psz_name;
-    PyObject *p_retval;
-    int i_type;
-
-    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
-        return NULL;
-
-    i_type = var_Type( VLCSELF->p_object, psz_name );
-
-    switch ( i_type )
-    {
-    case VLC_VAR_VOID   :
-        p_retval = PyString_FromString( "Void" );
-        break;
-    case VLC_VAR_BOOL      :
-        p_retval = PyString_FromString( "Boolean" );
-        break;
-    case VLC_VAR_INTEGER   :
-        p_retval = PyString_FromString( "Integer" );
-        break;
-    case VLC_VAR_HOTKEY   :
-        p_retval = PyString_FromString( "Hotkey" );
-        break;
-    case VLC_VAR_FILE      :
-        p_retval = PyString_FromString( "File" );
-        break;
-    case VLC_VAR_STRING    :
-        p_retval = PyString_FromString( "String" );
-        break;
-    case VLC_VAR_DIRECTORY :
-        p_retval = PyString_FromString( "Directory" );
-        break;
-    case VLC_VAR_VARIABLE  :
-        p_retval = PyString_FromString( "Variable" );
-        break;
-    case VLC_VAR_MODULE   :
-        p_retval = PyString_FromString( "Module" );
-        break;
-    case VLC_VAR_FLOAT     :
-        p_retval = PyString_FromString( "Float" );
-        break;
-    case VLC_VAR_TIME      :
-        p_retval = PyString_FromString( "Time" );
-        break;
-    case VLC_VAR_ADDRESS   :
-        p_retval = PyString_FromString( "Address" );
-        break;
-    case VLC_VAR_LIST      :
-        p_retval = PyString_FromString( "List" );
-        break;
-    case VLC_VAR_MUTEX :
-        p_retval = PyString_FromString( "Mutex" );
-        break;
-    default:
-        p_retval = PyString_FromString( "Unknown" );
-    }
-    return p_retval;
-}
-
-/* Do a var_Set call on the object. Parameter: the variable name. */
-static PyObject *
-vlcObject_var_set( PyObject *self, PyObject *args )
-{
-    vlc_value_t value;
-    char *psz_name;
-    PyObject *py_value;
-    int i_type;
-    vlc_object_t *p_obj;
-
-    if( !PyArg_ParseTuple( args, "sO", &psz_name, &py_value ) )
-        return NULL;
-
-    p_obj = VLCSELF->p_object;
-    i_type = var_Type( p_obj, psz_name );
-
-    switch ( i_type )
-    {
-    case VLC_VAR_VOID   :
-        break;
-    case VLC_VAR_BOOL      :
-        value.b_bool = PyInt_AsLong( py_value );
-        break;
-    case VLC_VAR_INTEGER   :
-    case VLC_VAR_HOTKEY   :
-        value.i_int = PyInt_AsLong( py_value );
-        break;
-    case VLC_VAR_FILE      :
-    case VLC_VAR_STRING    :
-    case VLC_VAR_DIRECTORY :
-    case VLC_VAR_VARIABLE  :
-        value.psz_string = strdup( PyString_AsString( py_value ) );
-        break;
-    case VLC_VAR_MODULE   :
-        /* FIXME: we should check the PyObject type and get its p_object */
-        value.p_object = ( ( vlcObject* )p_obj )->p_object;
-        break;
-    case VLC_VAR_FLOAT     :
-        value.f_float = PyFloat_AsDouble( py_value );
-        break;
-    case VLC_VAR_TIME      :
-        value.i_time = PyLong_AsLongLong( py_value );
-        break;
-    case VLC_VAR_ADDRESS   :
-        value.p_address = ( char* )PyLong_AsVoidPtr( py_value );
-        break;
-    case VLC_VAR_LIST      :
-        /* FIXME */
-        value.p_list = NULL;
-        break;
-    case VLC_VAR_MUTEX :
-        break;
-    }
-
-    var_Set( p_obj, psz_name, value );
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-vlcObject_var_list( PyObject *self, PyObject *args )
-{
-    PyObject *p_retval;
-    int i_size;
-    int i_index;
-
-    i_size = VLCSELF->p_object->i_vars;
-    p_retval = PyTuple_New( i_size );
-
-    for ( i_index = 0 ; i_index < i_size ; i_index++ )
-    {
-        PyTuple_SetItem( p_retval, i_index,
-                         Py_BuildValue( "s", VLCSELF->p_object->p_vars[i_index].psz_name ) );
-    }
-
-    return p_retval;
-}
-
-/* Do a config_Get call on the object. Parameter: the variable name. */
-static PyObject *
-vlcObject_config_get( PyObject *self, PyObject *args )
-{
-    PyObject *p_retval;
-    vlc_value_t value;
-    char *psz_name;
-    module_config_t *p_config;
-
-    if( !PyArg_ParseTuple( args, "s", &psz_name ) )
-        return NULL;
-
-    p_config = config_FindConfig( VLCSELF->p_object, psz_name );
-
-    if( !p_config )
-    {
-        PyErr_SetString( PyExc_StandardError,
-                         "Error: config variable does not exist.\n" );
-        return NULL;
-    }
-
-    switch ( p_config->i_type )
-    {
-    case CONFIG_ITEM_BOOL      :
-        p_retval = PyBool_FromLong( p_config->i_value );
-        break;
-    case CONFIG_ITEM_INTEGER   :
-        p_retval = PyInt_FromLong( ( long )p_config->i_value );
-        break;
-    case CONFIG_ITEM_KEY   :
-        p_retval = PyString_FromFormat( "A hotkey variable ( %d )", p_config->i_value );
-        break;
-    case CONFIG_ITEM_FILE      :
-    case CONFIG_ITEM_STRING    :
-    case CONFIG_ITEM_DIRECTORY :
-    case CONFIG_ITEM_MODULE    :
-        vlc_mutex_lock( p_config->p_lock );
-        if( p_config->psz_value )
-            p_retval = PyString_FromString( p_config->psz_value );
-        else
-            p_retval = PyString_FromString( "" );
-        vlc_mutex_unlock( p_config->p_lock );
-        break;
-        p_retval = ( PyObject* )PyObject_New( vlcObject, &vlcObject_Type );
-        ( ( vlcObject* )p_retval )->p_object = value.p_object;
-        break;
-    case CONFIG_ITEM_FLOAT     :
-        p_retval = PyFloat_FromDouble( ( double )p_config->f_value );
-        break;
-    default:
-        p_retval = Py_None;
-        Py_INCREF( p_retval );
-    }
-
-    return p_retval;
-}
-
-/* Do a config_put* call on the object. Parameter: the variable name. */
-static PyObject *
-vlcObject_config_set( PyObject *self, PyObject *args )
-{
-    char *psz_name;
-    PyObject *py_value;
-    vlc_object_t *p_obj;
-    module_config_t *p_config;
-
-
-    if( !PyArg_ParseTuple( args, "sO", &psz_name, &py_value ) )
-        return NULL;
-
-    p_obj = VLCSELF->p_object;
-    p_config = config_FindConfig( p_obj, psz_name );
-    /* sanity checks */
-    if( !p_config )
-    {
-        PyErr_SetString( PyExc_StandardError,
-                         "Error: option does not exist.\n" );
-        return NULL;
-    }
-
-    switch ( p_config->i_type )
-    {
-    case CONFIG_ITEM_BOOL      :
-    case CONFIG_ITEM_INTEGER   :
-    case CONFIG_ITEM_KEY       :
-        config_PutInt( p_obj, psz_name, PyInt_AsLong( py_value ) );
-        break;
-    case CONFIG_ITEM_FILE      :
-    case CONFIG_ITEM_STRING    :
-    case CONFIG_ITEM_DIRECTORY :
-    case CONFIG_ITEM_MODULE   :
-        config_PutPsz( p_obj, psz_name, PyString_AsString( py_value ) );
-        break;
-    case CONFIG_ITEM_FLOAT     :
-        config_PutFloat( p_obj, psz_name, PyFloat_AsDouble( py_value ) );
-        break;
-    }
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-vlcObject_children( PyObject *self, PyObject *args )
-{
-    PyObject *p_retval;
-    int i_size;
-    int i_index;
-
-    i_size = VLCSELF->p_object->i_children;
-    p_retval = PyTuple_New( i_size );
-
-    for ( i_index = 0 ; i_index < i_size ; i_index++ )
-    {
-        PyTuple_SetItem( p_retval, i_index,
-                         Py_BuildValue( "i",
-                                        VLCSELF->p_object->pp_children[i_index]->i_object_id ) );
-    }
-
-    return p_retval;
-}
-
-
-/* Method table */
-static PyMethodDef vlcObject_methods[] =
-{
-    { "get", vlcObject_var_get, METH_VARARGS,
-      "get( str ) -> value   Get a variable value."},
-    { "set", vlcObject_var_set, METH_VARARGS,
-      "set( str, value )     Set a variable value" },
-    { "config_get", vlcObject_config_get, METH_VARARGS,
-      "config_get( str ) -> value   Get a configuration option." },
-    { "config_set", vlcObject_config_set, METH_VARARGS,
-      "config_set( str, value )     Set a configuration option" },
-    { "type", vlcObject_var_type, METH_VARARGS,
-      "type( str ) -> str     Get a variable type" },
-    { "list", vlcObject_var_list, METH_NOARGS,
-      "list( )             List the available variables" },
-    { "children", vlcObject_children, METH_NOARGS,
-      "children( )             List the children ids" },
-    { "find_object", vlcObject_find_object, METH_VARARGS,
-      "find_object( str ) -> Object     Find the object of a given type.\n\nAvailable types are : aout, decoder, input, httpd, intf, playlist, root, vlc, vout"},
-    { "find_id", vlcObject_find_id, METH_VARARGS,
-      "find_id( int ) -> Object      Find an object by id" },
-    { "info", vlcObject_info, METH_NOARGS,
-       "info( ) -> dict    Return information about the object" },
-    { "release", vlcObject_release, METH_NOARGS,
-      "release( ) ->     Release the VLC Object" },
-    { NULL, NULL, 0, NULL },
-};
-
-static PyTypeObject vlcObject_Type =
-{
-    PyObject_HEAD_INIT( NULL )
-    0,                         /*ob_size*/
-    "vlc.Object",       /*tp_name*/
-    sizeof( vlcObject_Type ), /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    ( destructor )vlcObject_dealloc,      /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "Expose VLC object infrastructure.",  /* tp_doc */
-    0,                     /* tp_traverse */
-    0,                     /* tp_clear */
-    0,                     /* tp_richcompare */
-    0,                     /* tp_weaklistoffset */
-    0,                     /* tp_iter */
-    0,                     /* tp_iternext */
-    vlcObject_methods,             /* tp_methods */
-    0,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    0,                         /* tp_init */
-    0,                         /* tp_alloc */
-    vlcObject_new,          /* tp_new */
-};
-
-/*****************************************************************************
- * VLC MediaControl object implementation
- *****************************************************************************/
-
-static PyObject *
-MediaControl_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
-{
-    MediaControl *self;
-    mediacontrol_Exception *exception = NULL;
-    PyObject* py_list = NULL;
-    char** ppsz_args = NULL;
-
-    self = PyObject_New( MediaControl, &MediaControl_Type );
-
-    if( PyArg_ParseTuple( args, "O", &py_list ) )
-    {
-        int i_size;
-        int i_index;
-
-        Py_INCREF( py_list );
-        if( ! PySequence_Check( py_list ) )
-        {
-            PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
-            return NULL;
-        }
-        i_size = PySequence_Size( py_list );
-        ppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
-        if( ! ppsz_args )
-        {
-            PyErr_SetString( PyExc_MemoryError, "Out of memory" );
-            return NULL;
-        }
-
-        for ( i_index = 0; i_index < i_size; i_index++ )
-        {
-            ppsz_args[i_index] =
-                strdup( PyString_AsString( PyObject_Str(
-                                               PySequence_GetItem( py_list,
-                                                                   i_index ) ) ) );
-        }
-        ppsz_args[i_size] = NULL;
-        Py_DECREF( py_list );
-    }
-    else
-    {
-        /* No arguments were given. Clear the exception raised
-           by PyArg_ParseTuple. */
-        PyErr_Clear( );
-    }
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    self->mc = mediacontrol_new( ppsz_args, exception );
-    MC_EXCEPT;
-    Py_END_ALLOW_THREADS
-
-    Py_INCREF( self );
-    return ( PyObject * )self;
-}
-
-static void
-MediaControl_dealloc( PyObject *self )
-{
-    PyMem_DEL( self );
-}
-
-/**
- *  Return the current position in the stream. The returned value can
-   be relative or absolute ( according to PositionOrigin ) and the unit
-   is set by PositionKey
- */
-static PyObject *
-MediaControl_get_media_position( PyObject *self, PyObject *args )
-{
-    mediacontrol_Position* pos;
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_origin;
-    PyObject *py_key;
-    PyObject *py_retval;
-    mediacontrol_PositionOrigin origin;
-    mediacontrol_PositionKey key;
-
-    if( !PyArg_ParseTuple( args, "OO", &py_origin, &py_key ) )
-        return NULL;
-
-    origin = positionOrigin_py_to_c( py_origin );
-    key    = positionKey_py_to_c( py_key );
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    pos = mediacontrol_get_media_position( SELF->mc, origin, key, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    py_retval = ( PyObject* )position_c_to_py( pos );
-    free( pos );
-    return py_retval;
-}
-
-/** Set the media position */
-static PyObject *
-MediaControl_set_media_position( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    mediacontrol_Position *a_position;
-    PyObject *py_pos;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-        return NULL;
-
-    a_position = position_py_to_c( py_pos );
-    if( !a_position )
-    {
-        PyErr_SetString( PyExc_MemoryError, "Out of memory" );
-        return NULL;
-    }
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_set_media_position( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_start( PyObject *self, PyObject *args )
-{
-    mediacontrol_Position *a_position;
-    mediacontrol_Exception *exception = NULL;
-    PyObject *py_pos;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-    {
-        /* No argument. Use a default 0 value. */
-        PyErr_Clear( );
-        py_pos = NULL;
-    }
-    a_position = position_py_to_c( py_pos );
-    if( !a_position )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_start( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_pause( PyObject *self, PyObject *args )
-{
-    mediacontrol_Position *a_position;
-    mediacontrol_Exception *exception = NULL;
-    PyObject *py_pos;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-    {
-        /* No argument. Use a default 0 value. */
-        PyErr_Clear( );
-        py_pos = NULL;
-    }
-    a_position = position_py_to_c( py_pos );
-    if( !a_position )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_pause( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-  Py_INCREF( Py_None );
-  return Py_None;
-}
-
-static PyObject *
-MediaControl_resume( PyObject *self, PyObject *args )
-{
-    mediacontrol_Position *a_position;
-    mediacontrol_Exception *exception = NULL;
-    PyObject *py_pos;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-    {
-        /* No argument. Use a default 0 value. */
-        PyErr_Clear( );
-        py_pos = NULL;
-    }
-    a_position = position_py_to_c( py_pos );
-    if( !a_position )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_start( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_stop( PyObject *self, PyObject *args )
-{
-    mediacontrol_Position *a_position;
-    mediacontrol_Exception *exception = NULL;
-    PyObject *py_pos;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-    {
-        /* No argument. Use a default 0 value. */
-        PyErr_Clear( );
-        py_pos = NULL;
-    }
-    a_position = position_py_to_c( py_pos );
-    if( !a_position )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_stop( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_exit( PyObject *self, PyObject *args )
-{
-    mediacontrol_exit( SELF->mc );
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_playlist_add_item( PyObject *self, PyObject *args )
-{
-    char *psz_file;
-    mediacontrol_Exception *exception = NULL;
-
-    if( !PyArg_ParseTuple( args, "s", &psz_file ) )
-      return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_playlist_add_item( SELF->mc, psz_file, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_playlist_clear( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception *exception = NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_playlist_clear( SELF->mc, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject *
-MediaControl_playlist_get_list( PyObject *self, PyObject *args )
-{
-    PyObject *py_retval;
-    mediacontrol_Exception *exception = NULL;
-    mediacontrol_PlaylistSeq* pl;
-    int i_index;
-    int i_playlist_size;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    pl = mediacontrol_playlist_get_list( SELF->mc, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    i_playlist_size = pl->size;
-
-    py_retval = PyList_New( i_playlist_size );
-
-    for ( i_index = 0 ; i_index < i_playlist_size ; i_index++ )
-    {
-        PyList_SetItem( py_retval, i_index,
-                        Py_BuildValue( "s", pl->data[i_index] ) );
-    }
-    mediacontrol_PlaylistSeq__free( pl );
-
-    return py_retval;
-}
-
-
-static PyObject *
-MediaControl_snapshot( PyObject *self, PyObject *args )
-{
-    mediacontrol_RGBPicture *p_retval = NULL;
-    mediacontrol_Exception* exception = NULL;
-    mediacontrol_Position *a_position = NULL;
-    PyObject *py_pos = NULL;
-    PyObject *py_obj = NULL;
-
-    if( !PyArg_ParseTuple( args, "O", &py_pos ) )
-      return NULL;
-
-    a_position = position_py_to_c( py_pos );
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    p_retval = mediacontrol_snapshot( SELF->mc, a_position, exception );
-    free( a_position );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    if( !p_retval )
-    {
-        Py_INCREF( Py_None );
-        return Py_None;
-    }
-
-    /* FIXME: create a real RGBPicture object */
-    py_obj = PyDict_New();
-
-    PyDict_SetItemString( py_obj, "width",
-                          Py_BuildValue( "i", p_retval->width ) );
-    PyDict_SetItemString( py_obj, "height",
-                          Py_BuildValue( "i", p_retval->height ) );
-    PyDict_SetItemString( py_obj, "type",
-                          Py_BuildValue( "i", p_retval->type ) );
-    PyDict_SetItemString( py_obj, "data",
-                          Py_BuildValue( "s#", p_retval->data, p_retval->size ) );
-    PyDict_SetItemString( py_obj, "date",
-                          Py_BuildValue( "L", p_retval->date ) );
-
-    return py_obj;
-}
-
-static PyObject*
-MediaControl_display_text( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_begin, *py_end;
-    char* message;
-    mediacontrol_Position * begin;
-    mediacontrol_Position * end;
-
-    if( !PyArg_ParseTuple( args, "sOO", &message, &py_begin, &py_end ) )
-        return NULL;
-
-    begin = position_py_to_c( py_begin );
-    end   = position_py_to_c( py_end );
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_display_text( SELF->mc, message, begin, end, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    free( begin );
-    free( end );
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject*
-MediaControl_get_stream_information( PyObject *self, PyObject *args )
-{
-    mediacontrol_StreamInformation *retval  = NULL;
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_obj;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    retval = mediacontrol_get_stream_information(
-        SELF->mc, mediacontrol_MediaTime, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    py_obj = PyDict_New( );
-
-     /* FIXME: create a real StreamInformation object */
-    PyDict_SetItemString( py_obj, "status",
-                  Py_BuildValue( "i", retval->streamstatus ) );
-    PyDict_SetItemString( py_obj, "url",
-                  Py_BuildValue( "s", retval->url ) );
-    PyDict_SetItemString( py_obj, "position",
-                  Py_BuildValue( "L", retval->position ) );
-    PyDict_SetItemString( py_obj, "length",
-                  Py_BuildValue( "L", retval->length ) );
-
-    free( retval->url );
-    free( retval );
-
-    return py_obj;
-}
-
-static PyObject*
-MediaControl_sound_set_volume( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    unsigned short volume;
-
-    if( !PyArg_ParseTuple( args, "H", &volume ) )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_sound_set_volume( SELF->mc, volume, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject*
-MediaControl_sound_get_volume( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_retval;
-    unsigned short volume;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    volume = mediacontrol_sound_get_volume( SELF->mc, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    py_retval = Py_BuildValue( "H", volume );
-    return py_retval;
-}
-
-static PyObject*
-MediaControl_set_rate( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    int rate;
-
-    if( !PyArg_ParseTuple( args, "i", &rate ) )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_set_rate( SELF->mc, rate, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject*
-MediaControl_get_rate( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_retval;
-    int rate;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    rate = mediacontrol_get_rate( SELF->mc, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    py_retval = Py_BuildValue( "i", rate );
-    return py_retval;
-}
-
-static PyObject*
-MediaControl_set_fullscreen( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    int fs;
-
-    if( !PyArg_ParseTuple( args, "i", &fs ) )
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_set_fullscreen( SELF->mc, fs, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyObject*
-MediaControl_get_fullscreen( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    PyObject *py_retval;
-    int fs;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    fs = mediacontrol_get_fullscreen( SELF->mc, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    py_retval = Py_BuildValue( "i", fs );
-    return py_retval;
-}
-
-static PyObject*
-MediaControl_set_visual( PyObject *self, PyObject *args )
-{
-    mediacontrol_Exception* exception = NULL;
-    WINDOWHANDLE visual;
-
-    if( !PyArg_ParseTuple( args, "i", &visual ) )
-       return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    MC_TRY;
-    mediacontrol_set_visual( SELF->mc, visual, exception );
-    Py_END_ALLOW_THREADS
-    MC_EXCEPT;
-
-    Py_INCREF( Py_None );
-    return Py_None;
-}
-
-static PyMethodDef MediaControl_methods[] =
-{
-    {"get_media_position", MediaControl_get_media_position, METH_VARARGS,
-     "get_media_position( origin, key ) -> Position    Get current media position." },
-    { "set_media_position", MediaControl_set_media_position, METH_VARARGS,
-      "set_media_position( Position )            Set media position" },
-    { "start", MediaControl_start, METH_VARARGS,
-      "start( Position )         Start the player." },
-    { "pause", MediaControl_pause, METH_VARARGS,
-      "pause( Position )         Pause the player." },
-    { "resume", MediaControl_resume, METH_VARARGS,
-      "resume( Position )        Resume the player" },
-    { "stop", MediaControl_stop, METH_VARARGS,
-      "stop( Position )              Stop the player" },
-    { "exit", MediaControl_exit, METH_VARARGS,
-      "exit( )                     Exit the player" },
-    { "playlist_add_item", MediaControl_playlist_add_item, METH_VARARGS,
-      "playlist_add_item( str )               Add an item to the playlist" },
-    { "playlist_get_list", MediaControl_playlist_get_list, METH_VARARGS,
-      "playlist_get_list( ) -> list       Get the contents of the playlist" },
-    { "playlist_clear", MediaControl_playlist_clear, METH_VARARGS,
-      "clear( )         Clear the playlist." },
-    { "snapshot", MediaControl_snapshot, METH_VARARGS,
-      "snapshot( Position ) -> dict        Take a snapshot" },
-    { "display_text", MediaControl_display_text, METH_VARARGS,
-      "display_text( str, Position, Position )    Display a text on the video" },
-    { "get_stream_information", MediaControl_get_stream_information,
-      METH_VARARGS,
-      "get_stream_information( ) -> dict      Get information about the stream"},
-    { "sound_get_volume", MediaControl_sound_get_volume, METH_VARARGS,
-      "sound_get_volume( ) -> int       Get the volume" },
-    { "sound_set_volume", MediaControl_sound_set_volume, METH_VARARGS,
-      "sound_set_volume( int )           Set the volume" },
-    { "set_visual", MediaControl_set_visual, METH_VARARGS,
-      "set_visual( int )           Set the embedding window visual ID" },
-    { "get_rate", MediaControl_get_rate, METH_VARARGS,
-      "get_rate( ) -> int       Get the rate" },
-    { "set_rate", MediaControl_set_rate, METH_VARARGS,
-      "set_rate( int )              Set the rate" },
-    { "get_fullscreen", MediaControl_get_fullscreen, METH_VARARGS,
-      "get_fullscreen( ) -> int       Get the fullscreen status" },
-    { "set_fullscreen", MediaControl_set_fullscreen, METH_VARARGS,
-      "set_fullscreen( int )              Set the fullscreen status" },
-    { NULL, NULL, 0, NULL },
-};
-
-static PyTypeObject MediaControl_Type =
-{
-    PyObject_HEAD_INIT( NULL )
-    0,                         /*ob_size*/
-    "vlc.MediaControl",        /*tp_name*/
-    sizeof( MediaControl_Type ), /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    ( destructor )MediaControl_dealloc,      /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "Control of a VLC instance.",  /* tp_doc */
-    0,                     /* tp_traverse */
-    0,                     /* tp_clear */
-    0,                     /* tp_richcompare */
-    0,                     /* tp_weaklistoffset */
-    0,                     /* tp_iter */
-    0,                     /* tp_iternext */
-    MediaControl_methods,             /* tp_methods */
-    0,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    0,                         /* tp_init */
-    0,                         /* tp_alloc */
-    MediaControl_new,          /* tp_new */
-};
-
-/***********************************************************************
- * Position
- ***********************************************************************/
-
-
-static int
-PyPosition_init( PyPosition *self, PyObject *args, PyObject *kwds )
-{
-    self->origin = mediacontrol_AbsolutePosition;
-    self->key    = mediacontrol_MediaTime;
-    self->value  = 0;
-    return 0;
-}
-
-mediacontrol_PositionKey
-positionKey_py_to_c( PyObject * py_key )
-{
-    mediacontrol_PositionKey key_position = mediacontrol_MediaTime;
-    int key;
-
-    if( !PyArg_Parse( py_key, "i", &key ) )
-    {
-        PyErr_SetString ( MediaControl_InternalException, "Invalid key value" );
-        return key_position;
-    }
-
-    switch ( key )
-    {
-    case 0: key = mediacontrol_ByteCount;   break;
-    case 1: key = mediacontrol_SampleCount; break;
-    case 2: key = mediacontrol_MediaTime;   break;
-    }
-    return key_position;
-}
-
-mediacontrol_PositionOrigin
-positionOrigin_py_to_c( PyObject * py_origin )
-{
-    mediacontrol_PositionOrigin  origin_position = mediacontrol_AbsolutePosition;
-    int origin;
-
-    if( !PyArg_Parse( py_origin,"i", &origin ) )
-    {
-        PyErr_SetString( MediaControl_InternalException,
-                         "Invalid origin value" );
-        return origin_position;
-    }
-
-    switch ( origin )
-    {
-    case 0: origin_position = mediacontrol_AbsolutePosition; break;
-    case 1: origin_position = mediacontrol_RelativePosition; break;
-    case 2: origin_position = mediacontrol_ModuloPosition;   break;
-    }
-
-    return origin_position;
-}
-
-/* Methods for transforming the Position Python object to Position structure*/
-mediacontrol_Position*
-position_py_to_c( PyObject * py_position )
-{
-    mediacontrol_Position * a_position = NULL;
-    PyPosition *pos = ( PyPosition* )py_position;
-
-    a_position = ( mediacontrol_Position* )malloc( sizeof( mediacontrol_Position ) );
-    if( !a_position )
-    {
-        PyErr_SetString( PyExc_MemoryError, "Out of memory" );
-        return NULL;
-    }
-
-    if( !py_position )
-    {
-        /* If we give a NULL value, it will be considered as
-           a 0 relative position in mediatime */
-        a_position->origin = mediacontrol_RelativePosition;
-        a_position->key    = mediacontrol_MediaTime;
-        a_position->value  = 0;
-    }
-    else if( PyObject_IsInstance( py_position, ( PyObject* )&PyPosition_Type ) )
-    {
-        a_position->origin = pos->origin;
-        a_position->key    = pos->key;
-        a_position->value  = ntohll(pos->value);
-    }
-    else
-    {
-        /* Feature: if we give an integer, it will be considered as
-           a relative position in mediatime */
-        a_position->origin = mediacontrol_RelativePosition;
-        a_position->key    = mediacontrol_MediaTime;
-        a_position->value  = PyLong_AsLongLong( py_position );
-    }
-    return a_position;
-}
-
-PyPosition*
-position_c_to_py( mediacontrol_Position *position )
-{
-    PyPosition* py_retval;
-
-    py_retval = PyObject_New( PyPosition, &PyPosition_Type );
-    py_retval->origin = position->origin;
-    py_retval->key    = position->key;
-    py_retval->value  = position->value;
-
-    return py_retval;
-}
-
-static PyMethodDef PyPosition_methods[] =
-{
-    { NULL }  /* Sentinel */
-};
-
-static PyMemberDef PyPosition_members[] =
-{
-    { "origin", T_INT, offsetof( PyPosition, origin ), 0, "Position origin" },
-    { "key",    T_INT, offsetof( PyPosition, key ),    0, "Position key" },
-    { "value",  T_ULONG, offsetof( PyPosition, value ), 0, "Position value" },
-    { NULL }  /* Sentinel */
-};
-
-static PyTypeObject PyPosition_Type =
-{
-    PyObject_HEAD_INIT( NULL )
-    0,                         /*ob_size*/
-    "vlc.Position",            /*tp_name*/
-    sizeof( PyPosition_Type ),   /*tp_basicsize*/
-    0,                         /*tp_itemsize*/
-    0,                         /*tp_dealloc*/
-    0,                         /*tp_print*/
-    0,                         /*tp_getattr*/
-    0,                         /*tp_setattr*/
-    0,                         /*tp_compare*/
-    0,                         /*tp_repr*/
-    0,                         /*tp_as_number*/
-    0,                         /*tp_as_sequence*/
-    0,                         /*tp_as_mapping*/
-    0,                         /*tp_hash */
-    0,                         /*tp_call*/
-    0,                         /*tp_str*/
-    0,                         /*tp_getattro*/
-    0,                         /*tp_setattro*/
-    0,                         /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
-    "Represent a Position with origin, key and value",  /* tp_doc */
-    0,                        /* tp_traverse */
-    0,                        /* tp_clear */
-    0,                         /* tp_richcompare */
-    0,                         /* tp_weaklistoffset */
-    0,                         /* tp_iter */
-    0,                          /* tp_iternext */
-    PyPosition_methods,             /* tp_methods */
-    PyPosition_members,             /* tp_members */
-    0,                         /* tp_getset */
-    0,                         /* tp_base */
-    0,                         /* tp_dict */
-    0,                         /* tp_descr_get */
-    0,                         /* tp_descr_set */
-    0,                         /* tp_dictoffset */
-    ( initproc )PyPosition_init, /* tp_init */
-    0,                         /* tp_alloc */
-    0,                         /* tp_new */
-};
index 41623eb38eb1b59a379b3755763f43d93612e566..f5e450a15001967e76d53d086860505ef09494b9 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
+#ifndef _VLCGLUE_H
+#define _VLCGLUE_H 1
 
 #include <Python.h>
 #include "structmember.h"
 
-#define __VLC__
-
 #include <stdio.h>
 #include <vlc/vlc.h>
+#include <vlc/libvlc.h>
 #include <vlc/mediacontrol_structures.h>
 #include <vlc/mediacontrol.h>
 
@@ -70,6 +71,7 @@ PyObject *MediaControl_PositionKeyNotSupported;
 PyObject *MediaControl_PositionOriginNotSupported;
 PyObject *MediaControl_InvalidPosition;
 PyObject *MediaControl_PlaylistException;
+PyObject *vlcInstance_Exception;
 
 /**********************************************************************
  * VLC Object
@@ -86,8 +88,6 @@ typedef struct
     int b_released;
 } vlcObject;
 
-staticforward PyTypeObject vlcObject_Type;
-
 /**********************************************************************
  * MediaControl Object
  **********************************************************************/
@@ -95,9 +95,7 @@ typedef struct
 {
     PyObject_HEAD
     mediacontrol_Instance* mc;
-}MediaControl;
-
-staticforward PyTypeObject MediaControl_Type;
+} MediaControl;
 
 /**********************************************************************
  * Position Object
@@ -110,7 +108,42 @@ typedef struct
     PY_LONG_LONG value;
 } PyPosition;
 
+/**********************************************************************
+ * vlc.Instance Object
+ **********************************************************************/
+typedef struct
+{
+    PyObject_HEAD
+    libvlc_instance_t* p_instance;
+} vlcInstance;
+
+#define LIBVLC_INSTANCE ((vlcInstance*)self)
+
+/**********************************************************************
+ * vlc.Input Object
+ **********************************************************************/
+typedef struct
+{
+    PyObject_HEAD
+    libvlc_input_t* p_input;
+} vlcInput;
+
+/* Forward declarations */
+staticforward PyTypeObject vlcObject_Type;
+staticforward PyTypeObject MediaControl_Type;
 staticforward PyTypeObject PyPosition_Type;
+staticforward PyTypeObject vlcInstance_Type;
+staticforward PyTypeObject vlcInput_Type;
+
+#define LIBVLC_INPUT ((vlcInput*)self)
+
+#define LIBVLC_TRY libvlc_exception_init( &ex );
+
+#define LIBVLC_EXCEPT if( libvlc_exception_raised( &ex ) ) { \
+    PyObject *py_exc = vlcInstance_Exception; \
+    PyErr_SetString( py_exc, libvlc_exception_get_message( &ex ) ); \
+    return NULL; \
+  }
 
 mediacontrol_PositionKey positionKey_py_to_c( PyObject * py_key );
 mediacontrol_PositionOrigin positionOrigin_py_to_c( PyObject * py_origin );
@@ -124,3 +157,4 @@ PyPosition * position_c_to_py( mediacontrol_Position * position );
 #define ntohll(x) (x)
 #endif
 
+#endif