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 free( ppsz_args[i_index] );
71 /*****************************************************************************
72 * Instance object implementation
73 *****************************************************************************/
76 vlcInstance_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
79 libvlc_exception_t ex;
80 PyObject* py_list = NULL;
81 char** ppsz_args = NULL;
84 if( PyArg_ParseTuple( args, "O", &py_list ) )
86 i_size = pyoptions_to_args( py_list, &ppsz_args );
92 /* No arguments were given. Clear the exception raised
93 by PyArg_ParseTuple. */
97 self = PyObject_New( vlcInstance, &vlcInstance_Type );
99 Py_BEGIN_ALLOW_THREADS
101 LIBVLC_INSTANCE->p_instance = libvlc_new( i_size, ppsz_args, &ex );
102 free_args( i_size, ppsz_args );
107 return ( PyObject * )self;
111 vlcInstance_dealloc( PyObject *self )
113 libvlc_release( LIBVLC_INSTANCE->p_instance );
114 PyObject_DEL( self );
118 vlcInstance_get_vlc_id( PyObject *self, PyObject *args )
120 return Py_BuildValue( "i", libvlc_get_vlc_id( LIBVLC_INSTANCE->p_instance ) );
123 /* Set loop variable */
125 vlcInstance_playlist_loop( PyObject *self, PyObject *args )
127 libvlc_exception_t ex;
130 if( !PyArg_ParseTuple( args, "i", &i_loop ) )
134 libvlc_playlist_loop( LIBVLC_INSTANCE->p_instance, i_loop, &ex );
137 Py_INCREF( Py_None );
141 /* Playlist play. 2 parameters: i_id, the id to play
142 l_options: a list of options */
144 vlcInstance_playlist_play( PyObject *self, PyObject *args )
146 libvlc_exception_t ex;
148 PyObject *py_options = NULL;
150 char** ppsz_args = NULL;
152 if( !PyArg_ParseTuple( args, "|iO", &i_id, &py_options ) )
157 i_size = pyoptions_to_args( py_options, &ppsz_args );
161 libvlc_playlist_play( LIBVLC_INSTANCE->p_instance, i_id, i_size, ppsz_args, &ex );
162 free_args( i_size, ppsz_args );
165 Py_INCREF( Py_None );
170 vlcInstance_playlist_pause( PyObject *self, PyObject *args )
172 libvlc_exception_t ex;
174 libvlc_playlist_pause( LIBVLC_INSTANCE->p_instance, &ex );
176 Py_INCREF( Py_None );
181 vlcInstance_playlist_isplaying( PyObject *self, PyObject *args )
183 libvlc_exception_t ex;
187 i_ret = libvlc_playlist_isplaying( LIBVLC_INSTANCE->p_instance, &ex );
189 return Py_BuildValue( "i", i_ret );
193 vlcInstance_playlist_items_count( PyObject *self, PyObject *args )
195 libvlc_exception_t ex;
199 i_ret = libvlc_playlist_items_count( LIBVLC_INSTANCE->p_instance, &ex );
201 return Py_BuildValue( "i", i_ret );
205 vlcInstance_playlist_stop( PyObject *self, PyObject *args )
207 libvlc_exception_t ex;
209 libvlc_playlist_stop( LIBVLC_INSTANCE->p_instance, &ex );
211 Py_INCREF( Py_None );
216 vlcInstance_playlist_next( PyObject *self, PyObject *args )
218 libvlc_exception_t ex;
220 libvlc_playlist_next( LIBVLC_INSTANCE->p_instance, &ex );
222 Py_INCREF( Py_None );
227 vlcInstance_playlist_prev( PyObject *self, PyObject *args )
229 libvlc_exception_t ex;
231 libvlc_playlist_prev( LIBVLC_INSTANCE->p_instance, &ex );
233 Py_INCREF( Py_None );
238 vlcInstance_playlist_clear( PyObject *self, PyObject *args )
240 libvlc_exception_t ex;
242 libvlc_playlist_clear( LIBVLC_INSTANCE->p_instance, &ex );
244 Py_INCREF( Py_None );
248 /* Add a playlist item. Main parameter: URI.
249 Optional parameters: name, options */
251 vlcInstance_playlist_add( PyObject *self, PyObject *args)
253 libvlc_exception_t ex;
255 char* psz_uri = NULL;
256 char* psz_name = NULL;
257 PyObject *py_options = NULL;
259 char** ppsz_args = NULL;
261 if( !PyArg_ParseTuple( args, "s|sO", &psz_uri, &psz_name, &py_options ) )
266 /* Set a default name */
267 psz_name = strdup( psz_uri );
272 i_size = pyoptions_to_args( py_options, &ppsz_args );
278 i_ret = libvlc_playlist_add_extended( LIBVLC_INSTANCE->p_instance,
284 free_args( i_size, ppsz_args );
288 i_ret = libvlc_playlist_add( LIBVLC_INSTANCE->p_instance,
295 return Py_BuildValue( "i", i_ret );
299 vlcInstance_playlist_delete_item( PyObject *self, PyObject *args )
301 libvlc_exception_t ex;
305 if( !PyArg_ParseTuple( args, "i", &i_id ) )
309 i_ret = libvlc_playlist_delete_item( LIBVLC_INSTANCE->p_instance, i_id, &ex );
312 return Py_BuildValue( "i", i_ret );
316 vlcInstance_playlist_get_media_instance( PyObject *self, PyObject *args )
318 libvlc_exception_t ex;
319 libvlc_media_instance_t *p_mi;
320 vlcMediaInstance *p_ret;
323 p_mi = libvlc_playlist_get_media_instance( LIBVLC_INSTANCE->p_instance, &ex );
326 p_ret = PyObject_New( vlcMediaInstance, &vlcMediaInstance_Type );
328 Py_INCREF( p_ret ); /* Ah bon ? */
329 return ( PyObject * )p_ret;
333 vlcInstance_video_set_parent( PyObject *self, PyObject *args )
335 libvlc_exception_t ex;
338 if( !PyArg_ParseTuple( args, "i", &i_drawable ) )
342 libvlc_video_set_parent( LIBVLC_INSTANCE->p_instance, (libvlc_drawable_t) i_drawable, &ex );
345 Py_INCREF( Py_None );
350 vlcInstance_video_get_parent( PyObject *self, PyObject *args )
352 libvlc_exception_t ex;
353 libvlc_drawable_t i_ret;
356 i_ret = libvlc_video_get_parent( LIBVLC_INSTANCE->p_instance, &ex );
359 return Py_BuildValue( "L", i_ret );
363 vlcInstance_video_set_size( PyObject *self, PyObject *args )
365 libvlc_exception_t ex;
369 if( !PyArg_ParseTuple( args, "ii", &i_width, &i_height ) )
373 libvlc_video_set_size( LIBVLC_INSTANCE->p_instance, i_width, i_height, &ex );
376 Py_INCREF( Py_None );
381 vlcInstance_audio_toggle_mute( PyObject *self, PyObject *args )
383 libvlc_exception_t ex;
385 libvlc_audio_toggle_mute( LIBVLC_INSTANCE->p_instance, &ex );
387 Py_INCREF( Py_None );
392 vlcInstance_audio_get_mute( PyObject *self, PyObject *args )
394 libvlc_exception_t ex;
398 i_ret = libvlc_audio_get_mute( LIBVLC_INSTANCE->p_instance, &ex );
400 return Py_BuildValue( "i", i_ret );
404 vlcInstance_audio_set_mute( PyObject *self, PyObject *args )
406 libvlc_exception_t ex;
409 if( !PyArg_ParseTuple( args, "i", &i_mute ) )
413 libvlc_audio_set_mute( LIBVLC_INSTANCE->p_instance, i_mute, &ex );
415 Py_INCREF( Py_None );
420 vlcInstance_audio_get_volume( PyObject *self, PyObject *args )
422 libvlc_exception_t ex;
426 i_ret = libvlc_audio_get_volume( LIBVLC_INSTANCE->p_instance, &ex );
428 return Py_BuildValue( "i", i_ret );
432 vlcInstance_audio_set_volume( PyObject *self, PyObject *args )
434 libvlc_exception_t ex;
437 if( !PyArg_ParseTuple( args, "i", &i_volume ) )
441 libvlc_audio_set_volume( LIBVLC_INSTANCE->p_instance, i_volume, &ex );
443 Py_INCREF( Py_None );
448 vlcInstance_audio_get_channel( PyObject *self, PyObject *args )
450 libvlc_exception_t ex;
454 i_ret = libvlc_audio_get_channel( LIBVLC_INSTANCE->p_instance, &ex );
456 return Py_BuildValue( "i", i_ret );
460 vlcInstance_audio_set_channel( PyObject *self, PyObject *args )
462 libvlc_exception_t ex;
465 if( !PyArg_ParseTuple( args, "i", &i_channel ) )
469 libvlc_audio_set_channel( LIBVLC_INSTANCE->p_instance, i_channel, &ex );
471 Py_INCREF( Py_None );
475 /* vlm_add_broadcast : name, input MRL, output MRL
476 Keywords: options, enable, loop */
478 vlcInstance_vlm_add_broadcast( PyObject *self, PyObject *args, PyObject *kwds )
480 libvlc_exception_t ex;
481 static char *kwlist[] = { "name", "input", "output",
482 "options", "enable", "loop", NULL};
483 char* psz_name = NULL;
484 char* psz_input = NULL;
485 char* psz_output = NULL;
486 PyObject* py_options = NULL;
490 char** ppsz_args = NULL;
492 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
494 &psz_input, &psz_output,
495 &py_options, &i_enable, &i_loop ) )
500 i_size = pyoptions_to_args( py_options, &ppsz_args );
504 libvlc_vlm_add_broadcast( LIBVLC_INSTANCE->p_instance,
505 psz_name, psz_input, psz_output,
506 i_size, ppsz_args, i_enable, i_loop, &ex);
507 free_args( i_size, ppsz_args );
509 Py_INCREF( Py_None );
514 vlcInstance_vlm_del_media( PyObject *self, PyObject *args )
516 libvlc_exception_t ex;
519 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
523 libvlc_vlm_del_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
525 Py_INCREF( Py_None );
530 vlcInstance_vlm_set_enabled( PyObject *self, PyObject *args )
532 libvlc_exception_t ex;
536 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_enabled ) )
540 libvlc_vlm_set_enabled( LIBVLC_INSTANCE->p_instance, psz_name, i_enabled, &ex);
542 Py_INCREF( Py_None );
547 vlcInstance_vlm_set_output( PyObject *self, PyObject *args )
549 libvlc_exception_t ex;
553 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_output ) )
557 libvlc_vlm_set_output( LIBVLC_INSTANCE->p_instance, psz_name, psz_output, &ex);
559 Py_INCREF( Py_None );
564 vlcInstance_vlm_set_input( PyObject *self, PyObject *args )
566 libvlc_exception_t ex;
570 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_input ) )
574 libvlc_vlm_set_input( LIBVLC_INSTANCE->p_instance, psz_name, psz_input, &ex);
576 Py_INCREF( Py_None );
581 vlcInstance_vlm_add_input( PyObject *self, PyObject *args )
583 libvlc_exception_t ex;
587 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_input ) )
591 libvlc_vlm_add_input( LIBVLC_INSTANCE->p_instance, psz_name, psz_input, &ex);
593 Py_INCREF( Py_None );
598 vlcInstance_vlm_set_loop( PyObject *self, PyObject *args )
600 libvlc_exception_t ex;
604 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_loop ) )
608 libvlc_vlm_set_loop( LIBVLC_INSTANCE->p_instance, psz_name, i_loop, &ex);
610 Py_INCREF( Py_None );
615 vlcInstance_vlm_change_media( PyObject *self, PyObject *args, PyObject *kwds )
617 libvlc_exception_t ex;
618 static char *kwlist[] = { "name", "input", "output",
619 "options", "enable", "loop", NULL};
620 char* psz_name = NULL;
621 char* psz_input = NULL;
622 char* psz_output = NULL;
623 PyObject* py_options = NULL;
627 char** ppsz_args = NULL;
629 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
631 &psz_input, &psz_output,
632 &py_options, &i_enable, &i_loop ) )
637 i_size = pyoptions_to_args( py_options, &ppsz_args );
641 libvlc_vlm_change_media( LIBVLC_INSTANCE->p_instance,
642 psz_name, psz_input, psz_output,
643 i_size, ppsz_args, i_enable, i_loop, &ex);
644 free_args( i_size, ppsz_args );
646 Py_INCREF( Py_None );
651 vlcInstance_vlm_play_media( PyObject *self, PyObject *args )
653 libvlc_exception_t ex;
656 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
660 libvlc_vlm_play_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
662 Py_INCREF( Py_None );
667 vlcInstance_vlm_stop_media( PyObject *self, PyObject *args )
669 libvlc_exception_t ex;
672 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
676 libvlc_vlm_stop_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
678 Py_INCREF( Py_None );
683 vlcInstance_vlm_pause_media( PyObject *self, PyObject *args )
685 libvlc_exception_t ex;
688 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
692 libvlc_vlm_pause_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex);
694 Py_INCREF( Py_None );
699 vlcInstance_vlm_seek_media( PyObject *self, PyObject *args )
701 libvlc_exception_t ex;
705 if( !PyArg_ParseTuple( args, "sf", &psz_name, &f_percentage ) )
709 libvlc_vlm_seek_media( LIBVLC_INSTANCE->p_instance, psz_name, f_percentage, &ex);
711 Py_INCREF( Py_None );
716 vlcInstance_vlm_show_media( PyObject *self, PyObject *args )
718 libvlc_exception_t ex;
723 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
726 psz_ret = libvlc_vlm_show_media( LIBVLC_INSTANCE->p_instance, psz_name, &ex );
728 o_ret = Py_BuildValue( "s", psz_ret );
734 vlcInstance_media_descriptor_new( PyObject *self, PyObject *args )
736 libvlc_exception_t ex;
737 libvlc_media_descriptor_t *p_md;
738 char* psz_mrl = NULL;
739 vlcMediaDescriptor *p_ret;
741 if( !PyArg_ParseTuple( args, "s", &psz_mrl ) )
745 p_md = libvlc_media_descriptor_new( LIBVLC_INSTANCE->p_instance, psz_mrl, &ex );
748 p_ret = PyObject_New( vlcMediaDescriptor, &vlcMediaDescriptor_Type );
750 Py_INCREF( p_ret ); /* Ah bon ? */
751 return ( PyObject * )p_ret;
755 static PyMethodDef vlcInstance_methods[] =
757 { "get_vlc_id", vlcInstance_get_vlc_id, METH_VARARGS,
758 "get_vlc_id( ) -> int Get the instance id."},
759 { "playlist_loop", vlcInstance_playlist_loop, METH_VARARGS,
760 "playlist_loop(bool) Set loop variable" },
761 { "playlist_play", vlcInstance_playlist_play, METH_VARARGS,
762 "playlist_play(id=int, options=list) Play the given playlist item (-1 for current item) with optional options (a list of strings)" },
763 { "playlist_pause", vlcInstance_playlist_pause, METH_VARARGS,
764 "playlist_pause() Pause the current stream"},
765 { "playlist_isplaying", vlcInstance_playlist_isplaying, METH_VARARGS,
766 "playlist_isplaying() -> int Return True if the playlist if playing"},
767 { "playlist_items_count", vlcInstance_playlist_items_count, METH_VARARGS,
768 "playlist_items_count() -> int Return the number of items in the playlist"},
769 { "playlist_stop", vlcInstance_playlist_stop, METH_VARARGS,
770 "playlist_stop() Stop the current stream"},
771 { "playlist_next", vlcInstance_playlist_next, METH_VARARGS,
772 "playlist_next() Play the next item"},
773 { "playlist_prev", vlcInstance_playlist_prev, METH_VARARGS,
774 "playlist_prev() Play the previous item"},
775 { "playlist_clear", vlcInstance_playlist_clear, METH_VARARGS,
776 "playlist_clear() Clear the playlist"},
777 { "playlist_add", vlcInstance_playlist_add, METH_VARARGS,
778 "playlist_add(mrl=str, name=str, options=list) -> int Add a new item to the playlist. options is a list of strings."},
779 { "playlist_delete_item", vlcInstance_playlist_delete_item, METH_VARARGS,
780 "playlist_delete_item(id=int) Delete the given item"},
781 { "playlist_get_media_instance", vlcInstance_playlist_get_media_instance, METH_VARARGS,
782 "playlist_get_media_instance() -> object Return the current media instance"},
783 { "video_set_parent", vlcInstance_video_set_parent, METH_VARARGS,
784 "video_set_parent(xid=int) Set the parent xid/HWND/CGrafPort"},
785 { "video_get_parent", vlcInstance_video_get_parent, METH_VARARGS,
786 "video_get_parent(xid=int) Get the parent xid/HWND/CGrafPort"},
787 { "video_set_size", vlcInstance_video_set_size, METH_VARARGS,
788 "video_set_size(width=int, height=int) Set the video width and height"},
789 { "audio_toggle_mute", vlcInstance_audio_toggle_mute, METH_VARARGS,
790 "audio_toggle_mute() Toggle the mute state"},
791 { "audio_get_mute", vlcInstance_audio_get_mute, METH_VARARGS,
792 "audio_get_mute() -> int Get the mute state"},
793 { "audio_set_mute", vlcInstance_audio_set_mute, METH_VARARGS,
794 "audio_set_mute(state=int) Set the mute state"},
795 { "audio_get_volume", vlcInstance_audio_get_volume, METH_VARARGS,
796 "audio_get_volume() -> int Get the audio volume"},
797 { "audio_set_volume", vlcInstance_audio_set_volume, METH_VARARGS,
798 "audio_set_volume(volume=int) Set the audio volume"},
799 { "audio_get_channel", vlcInstance_audio_get_channel, METH_VARARGS,
800 "audio_get_channel() -> int Get current audio channel" },
801 { "audio_set_channel", vlcInstance_audio_set_channel, METH_VARARGS,
802 "audio_set_channel(int) Set current audio channel" },
804 { "media_descriptor_new", vlcInstance_media_descriptor_new, METH_VARARGS,
805 "media_descriptor_new(str) -> object Create a media descriptor with the given mrl."},
807 { "vlm_add_broadcast", vlcInstance_vlm_add_broadcast, METH_VARARGS | METH_KEYWORDS,
808 "vlm_add_broadcast(name=str, input=str, output=str, options=list, enable=int, loop=int) Add a new broadcast" },
809 { "vlm_del_media", vlcInstance_vlm_del_media, METH_VARARGS,
810 "vlm_del_media(name=str) Delete a media" },
811 { "vlm_set_enabled", vlcInstance_vlm_set_enabled, METH_VARARGS,
812 "vlm_set_enabled(name=str, enabled=int) Enable/disable a media" },
813 { "vlm_set_output", vlcInstance_vlm_set_output, METH_VARARGS,
814 "vlm_set_output(name=str, output=str) Set the output" },
815 { "vlm_set_input", vlcInstance_vlm_set_input, METH_VARARGS,
816 "vlm_set_input(name=str, output=str) Set the input" },
817 { "vlm_add_input", vlcInstance_vlm_add_input, METH_VARARGS,
818 "vlm_add_input(name=str, output=str) Add a media's input MRL" },
819 { "vlm_set_loop", vlcInstance_vlm_set_loop, METH_VARARGS,
820 "vlm_set_loop(name=str, loop=int) Change the looping value" },
821 { "vlm_change_media", vlcInstance_vlm_change_media, METH_VARARGS | METH_KEYWORDS,
822 "vlm_change_media(name=str, input=str, output=str, options=list, enable=int, loop=int) Change the broadcast parameters" },
823 { "vlm_play_media", vlcInstance_vlm_play_media, METH_VARARGS,
824 "vlm_play_media(name=str) Plays the named broadcast." },
825 { "vlm_stop_media", vlcInstance_vlm_stop_media, METH_VARARGS,
826 "vlm_stop_media(name=str) Stops the named broadcast." },
827 { "vlm_pause_media", vlcInstance_vlm_pause_media, METH_VARARGS,
828 "vlm_pause_media(name=str) Pauses the named broadcast." },
829 { "vlm_seek_media", vlcInstance_vlm_seek_media, METH_VARARGS,
830 "vlm_seek_media(name=str, percentage=float) Seeks in the named broadcast." },
831 { "vlm_show_media", vlcInstance_vlm_show_media, METH_VARARGS,
832 "vlm_show_media(name=str) Return information of the named broadcast." },
834 { NULL, NULL, 0, NULL },
837 static PyTypeObject vlcInstance_Type =
839 PyObject_HEAD_INIT( NULL )
841 "vlc.Instance", /*tp_name*/
842 sizeof( vlcInstance_Type ), /*tp_basicsize*/
844 ( destructor )vlcInstance_dealloc, /*tp_dealloc*/
851 0, /*tp_as_sequence*/
859 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
860 "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 */
863 0, /* tp_richcompare */
864 0, /* tp_weaklistoffset */
867 vlcInstance_methods, /* tp_methods */
872 0, /* tp_descr_get */
873 0, /* tp_descr_set */
874 0, /* tp_dictoffset */
877 vlcInstance_new, /* tp_new */