1 /*****************************************************************************
2 * vlc_instance.c: vlc.Instance binding
3 *****************************************************************************
4 * Copyright (C) 2006 the VideoLAN team
7 * Authors: Olivier Aubert <oaubert at bat710.univ-lyon1.fr>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 /* Helper functions */
27 pyoptions_to_args(PyObject *py_options, char*** pppsz_args)
31 char** ppsz_args = *pppsz_args;
35 Py_INCREF( py_options );
36 if( ! PySequence_Check( py_options ) )
38 PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
41 i_size = PySequence_Size( py_options );
42 ppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
45 PyErr_SetString( PyExc_MemoryError, "Out of memory" );
49 for ( i_index = 0; i_index < i_size; i_index++ )
52 strdup( PyString_AsString( PyObject_Str(
53 PySequence_GetItem( py_options,
56 ppsz_args[i_size] = NULL;
57 Py_DECREF( py_options );
62 free_args(int i_size, char** ppsz_args)
66 for ( i_index = 0; i_index < i_size; i_index++ )
67 if( ppsz_args[i_index] )
68 free(ppsz_args[i_index]);
72 /*****************************************************************************
73 * Instance object implementation
74 *****************************************************************************/
77 vlcInstance_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
80 libvlc_exception_t ex;
81 PyObject* py_list = NULL;
82 char** ppsz_args = NULL;
85 self = PyObject_New( vlcInstance, &vlcInstance_Type );
88 if( PyArg_ParseTuple( args, "O", &py_list ) )
90 i_size = pyoptions_to_args( py_list, &ppsz_args );
96 /* No arguments were given. Clear the exception raised
97 by PyArg_ParseTuple. */
101 Py_BEGIN_ALLOW_THREADS
103 LIBVLC_INSTANCE->p_instance = libvlc_new( i_size, ppsz_args, &ex );
104 free_args( i_size, ppsz_args );
109 return ( PyObject * )self;
113 vlcInstance_dealloc( PyObject *self )
115 libvlc_exception_t ex;
116 libvlc_destroy( LIBVLC_INSTANCE->p_instance, &ex );
121 vlcInstance_get_vlc_id( PyObject *self, PyObject *args )
123 return Py_BuildValue( "i", libvlc_get_vlc_id( LIBVLC_INSTANCE->p_instance ) );
126 /* Playlist play. 2 parameters: i_id, the id to play
127 l_options: a list of options */
129 vlcInstance_playlist_play( PyObject *self, PyObject *args )
131 libvlc_exception_t ex;
133 PyObject *py_options = NULL;
135 char** ppsz_args = NULL;
137 if( !PyArg_ParseTuple( args, "|iO", &i_id, &py_options ) )
142 i_size = pyoptions_to_args( py_options, &ppsz_args );
146 libvlc_playlist_play( LIBVLC_INSTANCE->p_instance, i_id, i_size, ppsz_args, &ex );
147 free_args( i_size, ppsz_args );
150 Py_INCREF( Py_None );
155 vlcInstance_playlist_pause( PyObject *self, PyObject *args )
157 libvlc_exception_t ex;
159 libvlc_playlist_pause( LIBVLC_INSTANCE->p_instance, &ex );
161 Py_INCREF( Py_None );
166 vlcInstance_playlist_isplaying( PyObject *self, PyObject *args )
168 libvlc_exception_t ex;
172 i_ret = libvlc_playlist_isplaying( LIBVLC_INSTANCE->p_instance, &ex );
174 return Py_BuildValue( "i", i_ret );
178 vlcInstance_playlist_items_count( PyObject *self, PyObject *args )
180 libvlc_exception_t ex;
184 i_ret = libvlc_playlist_items_count( LIBVLC_INSTANCE->p_instance, &ex );
186 return Py_BuildValue( "i", i_ret );
190 vlcInstance_playlist_stop( PyObject *self, PyObject *args )
192 libvlc_exception_t ex;
194 libvlc_playlist_stop( LIBVLC_INSTANCE->p_instance, &ex );
196 Py_INCREF( Py_None );
201 vlcInstance_playlist_next( PyObject *self, PyObject *args )
203 libvlc_exception_t ex;
205 libvlc_playlist_next( LIBVLC_INSTANCE->p_instance, &ex );
207 Py_INCREF( Py_None );
212 vlcInstance_playlist_prev( PyObject *self, PyObject *args )
214 libvlc_exception_t ex;
216 libvlc_playlist_prev( LIBVLC_INSTANCE->p_instance, &ex );
218 Py_INCREF( Py_None );
223 vlcInstance_playlist_clear( PyObject *self, PyObject *args )
225 libvlc_exception_t ex;
227 libvlc_playlist_clear( LIBVLC_INSTANCE->p_instance, &ex );
229 Py_INCREF( Py_None );
233 /* Add a playlist item. Main parameter: URI.
234 Optional parameters: name, options */
236 vlcInstance_playlist_add( PyObject *self, PyObject *args)
238 libvlc_exception_t ex;
240 char* psz_uri = NULL;
241 char* psz_name = NULL;
242 PyObject *py_options = NULL;
244 char** ppsz_args = NULL;
246 if( !PyArg_ParseTuple( args, "s|sO", &psz_uri, &psz_name, &py_options ) )
251 /* Set a default name */
252 psz_name = strdup( psz_uri );
257 i_size = pyoptions_to_args( py_options, &ppsz_args );
263 i_ret = libvlc_playlist_add_extended( LIBVLC_INSTANCE->p_instance,
269 free_args( i_size, ppsz_args );
273 i_ret = libvlc_playlist_add( LIBVLC_INSTANCE->p_instance,
280 return Py_BuildValue( "i", i_ret );
284 vlcInstance_playlist_delete_item( PyObject *self, PyObject *args )
286 libvlc_exception_t ex;
290 if( !PyArg_ParseTuple( args, "i", &i_id ) )
294 i_ret = libvlc_playlist_delete_item( LIBVLC_INSTANCE->p_instance, i_id, &ex );
297 return Py_BuildValue( "i", i_ret );
301 vlcInstance_playlist_get_input( PyObject *self, PyObject *args )
303 libvlc_exception_t ex;
304 libvlc_input_t *p_input;
308 p_input = libvlc_playlist_get_input( LIBVLC_INSTANCE->p_instance, &ex );
311 p_ret = PyObject_New( vlcInput, &vlcInput_Type );
312 p_ret->p_input = p_input;
313 Py_INCREF( p_ret ); /* Ah bon ? */
314 return ( PyObject * )p_ret;
318 vlcInstance_video_set_parent( PyObject *self, PyObject *args )
320 libvlc_exception_t ex;
323 if( !PyArg_ParseTuple( args, "i", &i_drawable ) )
327 libvlc_video_set_parent( LIBVLC_INSTANCE->p_instance, (libvlc_drawable_t) i_drawable, &ex );
330 Py_INCREF( Py_None );
335 vlcInstance_video_set_size( PyObject *self, PyObject *args )
337 libvlc_exception_t ex;
341 if( !PyArg_ParseTuple( args, "ii", &i_width, &i_height ) )
345 libvlc_video_set_size( LIBVLC_INSTANCE->p_instance, i_width, i_height, &ex );
348 Py_INCREF( Py_None );
353 vlcInstance_audio_toggle_mute( PyObject *self, PyObject *args )
355 libvlc_exception_t ex;
357 libvlc_audio_toggle_mute( LIBVLC_INSTANCE->p_instance, &ex );
359 Py_INCREF( Py_None );
364 vlcInstance_audio_get_mute( PyObject *self, PyObject *args )
366 libvlc_exception_t ex;
370 i_ret = libvlc_audio_get_mute( LIBVLC_INSTANCE->p_instance, &ex );
372 return Py_BuildValue( "i", i_ret );
376 vlcInstance_audio_set_mute( PyObject *self, PyObject *args )
378 libvlc_exception_t ex;
381 if( !PyArg_ParseTuple( args, "i", &i_mute ) )
385 libvlc_audio_set_mute( LIBVLC_INSTANCE->p_instance, i_mute, &ex );
387 Py_INCREF( Py_None );
392 vlcInstance_audio_get_volume( PyObject *self, PyObject *args )
394 libvlc_exception_t ex;
398 i_ret = libvlc_audio_get_volume( LIBVLC_INSTANCE->p_instance, &ex );
400 return Py_BuildValue( "i", i_ret );
404 vlcInstance_audio_set_volume( PyObject *self, PyObject *args )
406 libvlc_exception_t ex;
409 if( !PyArg_ParseTuple( args, "i", &i_volume ) )
413 libvlc_audio_set_mute( LIBVLC_INSTANCE->p_instance, i_volume, &ex );
415 Py_INCREF( Py_None );
419 /* vlm_add_broadcast : name, input MRL, output MRL
420 Keywords: options, enable, loop */
422 vlcInstance_vlm_add_broadcast( PyObject *self, PyObject *args, PyObject *kwds )
424 libvlc_exception_t ex;
425 static char *kwlist[] = { "name", "input", "output",
426 "options", "enable", "loop", NULL};
427 char* psz_name = NULL;
428 char* psz_input = NULL;
429 char* psz_output = NULL;
430 PyObject* py_options = NULL;
434 char** ppsz_args = NULL;
436 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
438 &psz_input, &psz_output,
439 &py_options, &i_enable, &i_loop ) )
444 i_size = pyoptions_to_args( py_options, &ppsz_args );
448 libvlc_vlm_add_broadcast( LIBVLC_INSTANCE->p_instance,
449 psz_name, psz_input, psz_output,
450 i_size, ppsz_args, i_enable, i_loop, &ex);
451 free_args( i_size, ppsz_args );
453 Py_INCREF( Py_None );
458 vlcInstance_vlm_del_media( PyObject *self, PyObject *args )
460 libvlc_exception_t ex;
463 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
467 libvlc_vlm_del_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
469 Py_INCREF( Py_None );
474 vlcInstance_vlm_set_enabled( PyObject *self, PyObject *args )
476 libvlc_exception_t ex;
480 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_enabled ) )
484 libvlc_vlm_set_enabled( LIBVLC_INSTANCE->p_instance, psz_name, i_enabled, &ex);
486 Py_INCREF( Py_None );
491 vlcInstance_vlm_set_output( PyObject *self, PyObject *args )
493 libvlc_exception_t ex;
497 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_output ) )
501 libvlc_vlm_set_output( LIBVLC_INSTANCE->p_instance, psz_name, psz_output, &ex);
503 Py_INCREF( Py_None );
508 vlcInstance_vlm_set_input( PyObject *self, PyObject *args )
510 libvlc_exception_t ex;
514 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_input ) )
518 libvlc_vlm_set_input( LIBVLC_INSTANCE->p_instance, psz_name, psz_input, &ex);
520 Py_INCREF( Py_None );
525 vlcInstance_vlm_set_loop( PyObject *self, PyObject *args )
527 libvlc_exception_t ex;
531 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_loop ) )
535 libvlc_vlm_set_loop( LIBVLC_INSTANCE->p_instance, psz_name, i_loop, &ex);
537 Py_INCREF( Py_None );
542 vlcInstance_vlm_change_media( PyObject *self, PyObject *args, PyObject *kwds )
544 libvlc_exception_t ex;
545 static char *kwlist[] = { "name", "input", "output",
546 "options", "enable", "loop", NULL};
547 char* psz_name = NULL;
548 char* psz_input = NULL;
549 char* psz_output = NULL;
550 PyObject* py_options = NULL;
554 char** ppsz_args = NULL;
556 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
558 &psz_input, &psz_output,
559 &py_options, &i_enable, &i_loop ) )
564 i_size = pyoptions_to_args( py_options, &ppsz_args );
568 libvlc_vlm_change_media( LIBVLC_INSTANCE->p_instance,
569 psz_name, psz_input, psz_output,
570 i_size, ppsz_args, i_enable, i_loop, &ex);
571 free_args( i_size, ppsz_args );
573 Py_INCREF( Py_None );
578 vlcInstance_vlm_play_media( PyObject *self, PyObject *args )
580 libvlc_exception_t ex;
583 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
587 libvlc_vlm_play_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
589 Py_INCREF( Py_None );
594 vlcInstance_vlm_stop_media( PyObject *self, PyObject *args )
596 libvlc_exception_t ex;
599 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
603 libvlc_vlm_stop_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
605 Py_INCREF( Py_None );
610 vlcInstance_vlm_pause_media( PyObject *self, PyObject *args )
612 libvlc_exception_t ex;
615 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
619 libvlc_vlm_pause_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
621 Py_INCREF( Py_None );
626 static PyMethodDef vlcInstance_methods[] =
628 { "get_vlc_id", vlcInstance_get_vlc_id, METH_VARARGS,
629 "get_vlc_id( ) -> int Get the instance id."},
630 { "playlist_play", vlcInstance_playlist_play, METH_VARARGS,
631 "playlist_play(id=int, options=list) Play the given playlist item (-1 for current item) with optional options (a list of strings)" },
632 { "playlist_pause", vlcInstance_playlist_pause, METH_VARARGS,
633 "playlist_pause() Pause the current stream"},
634 { "playlist_isplaying", vlcInstance_playlist_isplaying, METH_VARARGS,
635 "playlist_isplaying() -> int Return True if the playlist if playing"},
636 { "playlist_items_count", vlcInstance_playlist_items_count, METH_VARARGS,
637 "playlist_items_count() -> int Return the number of items in the playlist"},
638 { "playlist_stop", vlcInstance_playlist_stop, METH_VARARGS,
639 "playlist_stop() Stop the current stream"},
640 { "playlist_next", vlcInstance_playlist_next, METH_VARARGS,
641 "playlist_next() Play the next item"},
642 { "playlist_prev", vlcInstance_playlist_prev, METH_VARARGS,
643 "playlist_prev() Play the previous item"},
644 { "playlist_clear", vlcInstance_playlist_clear, METH_VARARGS,
645 "playlist_clear() Clear the playlist"},
646 { "playlist_add", vlcInstance_playlist_add, METH_VARARGS,
647 "playlist_add(mrl=str, name=str, options=list) -> int Add a new item to the playlist. options is a list of strings."},
648 { "playlist_delete_item", vlcInstance_playlist_delete_item, METH_VARARGS,
649 "playlist_delete_item(id=int) Delete the given item"},
650 { "playlist_get_input", vlcInstance_playlist_get_input, METH_VARARGS,
651 "playlist_get_input() -> object Return the current input"},
652 { "video_set_parent", vlcInstance_video_set_parent, METH_VARARGS,
653 "video_set_parent(xid=int) Set the parent xid or HWND"},
654 { "video_set_size", vlcInstance_video_set_size, METH_VARARGS,
655 "video_set_size(width=int, height=int) Set the video width and height"},
656 { "audio_toggle_mute", vlcInstance_audio_toggle_mute, METH_VARARGS,
657 "audio_toggle_mute() Toggle the mute state"},
658 { "audio_get_mute", vlcInstance_audio_get_mute, METH_VARARGS,
659 "audio_get_mute() -> int Get the mute state"},
660 { "audio_set_mute", vlcInstance_audio_set_mute, METH_VARARGS,
661 "audio_set_mute(state=int) Set the mute state"},
662 { "audio_get_volume", vlcInstance_audio_get_volume, METH_VARARGS,
663 "audio_get_volume() -> int Get the audio volume"},
664 { "audio_set_volume", vlcInstance_audio_set_volume, METH_VARARGS,
665 "audio_set_volume(volume=int) Set the audio volume"},
667 { "vlm_add_broadcast", vlcInstance_vlm_add_broadcast, METH_VARARGS | METH_KEYWORDS,
668 "vlm_add_broadcast(name=str, input=str, output=str, options=list, enable=int, loop=int) Add a new broadcast" },
669 { "vlm_del_media", vlcInstance_vlm_del_media, METH_VARARGS,
670 "vlm_del_media(name=str) Delete a media" },
671 { "vlm_set_enabled", vlcInstance_vlm_set_enabled, METH_VARARGS,
672 "vlm_set_enabled(name=str, enabled=int) Enable/disable a media" },
673 { "vlm_set_output", vlcInstance_vlm_set_output, METH_VARARGS,
674 "vlm_set_output(name=str, output=str) Set the output" },
675 { "vlm_set_input", vlcInstance_vlm_set_input, METH_VARARGS,
676 "vlm_set_input(name=str, output=str) Set the input" },
677 { "vlm_set_loop", vlcInstance_vlm_set_loop, METH_VARARGS,
678 "vlm_set_loop(name=str, loop=int) Change the looping value" },
679 { "vlm_change_media", vlcInstance_vlm_change_media, METH_VARARGS | METH_KEYWORDS,
680 "vlm_change_media(name=str, input=str, output=str, options=list, enable=int, loop=int) Change the broadcast parameters" },
681 { "vlm_play_media", vlcInstance_vlm_play_media, METH_VARARGS,
682 "vlm_play_media(name=str)" },
683 { "vlm_stop_media", vlcInstance_vlm_stop_media, METH_VARARGS,
684 "vlm_stop_media(name=str)" },
685 { "vlm_pause_media", vlcInstance_vlm_pause_media, METH_VARARGS,
686 "vlm_pause_media(name=str)" },
688 { NULL, NULL, 0, NULL },
691 static PyTypeObject vlcInstance_Type =
693 PyObject_HEAD_INIT( NULL )
695 "vlc.Instance", /*tp_name*/
696 sizeof( vlcInstance_Type ), /*tp_basicsize*/
698 ( destructor )vlcInstance_dealloc, /*tp_dealloc*/
705 0, /*tp_as_sequence*/
713 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
714 "VLC Instance(args)\n\nNote: if args is specified, the first arg is interpreted as an executable name to get the directory of the VLC plugins.", /* tp_doc */
717 0, /* tp_richcompare */
718 0, /* tp_weaklistoffset */
721 vlcInstance_methods, /* tp_methods */
726 0, /* tp_descr_get */
727 0, /* tp_descr_set */
728 0, /* tp_dictoffset */
731 vlcInstance_new, /* tp_new */