1 /*****************************************************************************
2 * vlc_instance.c: vlc.Instance binding
3 *****************************************************************************
4 * Copyright (C) 2006,2007,2008,2009 the VideoLAN team
7 * Authors: Olivier Aubert <olivier.aubert at liris.cnrs.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)
32 Py_INCREF( py_options );
33 if( ! PySequence_Check( py_options ) )
35 PyErr_SetString( PyExc_TypeError, "Parameter must be a sequence." );
38 i_size = PySequence_Size( py_options );
40 char **ppsz_args = *pppsz_args = malloc( ( i_size + 1 ) * sizeof( char * ) );
44 PyErr_SetString( PyExc_MemoryError, "Out of memory" );
48 for ( i_index = 0; i_index < i_size; i_index++ )
51 strdup( PyString_AsString( PyObject_Str(
52 PySequence_GetItem( py_options,
55 ppsz_args[i_size] = NULL;
56 Py_DECREF( py_options );
61 free_args(int i_size, char** ppsz_args)
65 for ( i_index = 0; i_index < i_size; i_index++ )
66 free( ppsz_args[i_index] );
70 /*****************************************************************************
71 * Instance object implementation
72 *****************************************************************************/
75 vlcInstance_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
78 libvlc_exception_t ex;
79 PyObject* py_list = NULL;
80 char** ppsz_args = NULL;
83 fprintf(stderr, "Instantiating\n");
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(self) = 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(self) );
114 PyObject_DEL( self );
118 vlcInstance_get_vlc_id( PyObject *self, PyObject *args )
120 return Py_BuildValue( "i", libvlc_get_vlc_id( LIBVLC_INSTANCE(self) ) );
124 vlcInstance_new_media_player( PyObject *self, PyObject *args )
126 libvlc_exception_t ex;
127 libvlc_media_player_t *p_mp;
128 vlcMediaPlayer *p_ret;
131 p_mp = libvlc_media_player_new( LIBVLC_INSTANCE(self), &ex );
134 p_ret = PyObject_New( vlcMediaPlayer, &vlcMediaPlayer_Type );
136 Py_INCREF( p_ret ); /* Ah bon ? */
137 return ( PyObject * )p_ret;
141 vlcInstance_video_set_parent( PyObject *self, PyObject *args )
143 libvlc_exception_t ex;
146 if( !PyArg_ParseTuple( args, "i", &i_drawable ) )
150 libvlc_video_set_parent( LIBVLC_INSTANCE(self), (libvlc_drawable_t) i_drawable, &ex );
153 Py_INCREF( Py_None );
158 vlcInstance_video_get_parent( PyObject *self, PyObject *args )
160 libvlc_exception_t ex;
161 libvlc_drawable_t i_ret;
164 i_ret = libvlc_video_get_parent( LIBVLC_INSTANCE(self), &ex );
167 return Py_BuildValue( "L", i_ret );
171 vlcInstance_video_set_size( PyObject *self, PyObject *args )
173 libvlc_exception_t ex;
177 if( !PyArg_ParseTuple( args, "ii", &i_width, &i_height ) )
181 libvlc_video_set_size( LIBVLC_INSTANCE(self), i_width, i_height, &ex );
184 Py_INCREF( Py_None );
189 vlcInstance_audio_toggle_mute( PyObject *self, PyObject *args )
191 libvlc_exception_t ex;
193 libvlc_audio_toggle_mute( LIBVLC_INSTANCE(self), &ex );
195 Py_INCREF( Py_None );
200 vlcInstance_audio_get_mute( PyObject *self, PyObject *args )
202 libvlc_exception_t ex;
206 i_ret = libvlc_audio_get_mute( LIBVLC_INSTANCE(self), &ex );
208 return Py_BuildValue( "i", i_ret );
212 vlcInstance_audio_set_mute( PyObject *self, PyObject *args )
214 libvlc_exception_t ex;
217 if( !PyArg_ParseTuple( args, "i", &i_mute ) )
221 libvlc_audio_set_mute( LIBVLC_INSTANCE(self), i_mute, &ex );
223 Py_INCREF( Py_None );
228 vlcInstance_audio_get_volume( PyObject *self, PyObject *args )
230 libvlc_exception_t ex;
234 i_ret = libvlc_audio_get_volume( LIBVLC_INSTANCE(self), &ex );
236 return Py_BuildValue( "i", i_ret );
240 vlcInstance_audio_set_volume( PyObject *self, PyObject *args )
242 libvlc_exception_t ex;
245 if( !PyArg_ParseTuple( args, "i", &i_volume ) )
249 libvlc_audio_set_volume( LIBVLC_INSTANCE(self), i_volume, &ex );
251 Py_INCREF( Py_None );
256 vlcInstance_audio_get_channel( PyObject *self, PyObject *args )
258 libvlc_exception_t ex;
262 i_ret = libvlc_audio_get_channel( LIBVLC_INSTANCE(self), &ex );
264 return Py_BuildValue( "i", i_ret );
268 vlcInstance_audio_set_channel( PyObject *self, PyObject *args )
270 libvlc_exception_t ex;
273 if( !PyArg_ParseTuple( args, "i", &i_channel ) )
277 libvlc_audio_set_channel( LIBVLC_INSTANCE(self), i_channel, &ex );
279 Py_INCREF( Py_None );
283 /* vlm_add_broadcast : name, input MRL, output MRL
284 Keywords: options, enable, loop */
286 vlcInstance_vlm_add_broadcast( PyObject *self, PyObject *args, PyObject *kwds )
288 libvlc_exception_t ex;
289 static char *kwlist[] = { "name", "input", "output",
290 "options", "enable", "loop", NULL};
291 char* psz_name = NULL;
292 char* psz_input = NULL;
293 char* psz_output = NULL;
294 PyObject* py_options = NULL;
298 char** ppsz_args = NULL;
300 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
302 &psz_input, &psz_output,
303 &py_options, &i_enable, &i_loop ) )
308 i_size = pyoptions_to_args( py_options, &ppsz_args );
312 libvlc_vlm_add_broadcast( LIBVLC_INSTANCE(self),
313 psz_name, psz_input, psz_output,
314 i_size, ppsz_args, i_enable, i_loop, &ex);
315 free_args( i_size, ppsz_args );
317 Py_INCREF( Py_None );
322 vlcInstance_vlm_del_media( PyObject *self, PyObject *args )
324 libvlc_exception_t ex;
327 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
331 libvlc_vlm_del_media( LIBVLC_INSTANCE(self), psz_name, &ex);
333 Py_INCREF( Py_None );
338 vlcInstance_vlm_set_enabled( PyObject *self, PyObject *args )
340 libvlc_exception_t ex;
344 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_enabled ) )
348 libvlc_vlm_set_enabled( LIBVLC_INSTANCE(self), psz_name, i_enabled, &ex);
350 Py_INCREF( Py_None );
355 vlcInstance_vlm_set_output( PyObject *self, PyObject *args )
357 libvlc_exception_t ex;
361 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_output ) )
365 libvlc_vlm_set_output( LIBVLC_INSTANCE(self), psz_name, psz_output, &ex);
367 Py_INCREF( Py_None );
372 vlcInstance_vlm_set_input( PyObject *self, PyObject *args )
374 libvlc_exception_t ex;
378 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_input ) )
382 libvlc_vlm_set_input( LIBVLC_INSTANCE(self), psz_name, psz_input, &ex);
384 Py_INCREF( Py_None );
389 vlcInstance_vlm_add_input( PyObject *self, PyObject *args )
391 libvlc_exception_t ex;
395 if( !PyArg_ParseTuple( args, "ss", &psz_name, &psz_input ) )
399 libvlc_vlm_add_input( LIBVLC_INSTANCE(self), psz_name, psz_input, &ex);
401 Py_INCREF( Py_None );
406 vlcInstance_vlm_set_loop( PyObject *self, PyObject *args )
408 libvlc_exception_t ex;
412 if( !PyArg_ParseTuple( args, "si", &psz_name, &i_loop ) )
416 libvlc_vlm_set_loop( LIBVLC_INSTANCE(self), psz_name, i_loop, &ex);
418 Py_INCREF( Py_None );
423 vlcInstance_vlm_change_media( PyObject *self, PyObject *args, PyObject *kwds )
425 libvlc_exception_t ex;
426 static char *kwlist[] = { "name", "input", "output",
427 "options", "enable", "loop", NULL};
428 char* psz_name = NULL;
429 char* psz_input = NULL;
430 char* psz_output = NULL;
431 PyObject* py_options = NULL;
435 char** ppsz_args = NULL;
437 if( !PyArg_ParseTupleAndKeywords( args, kwds, "sss|Oii", kwlist,
439 &psz_input, &psz_output,
440 &py_options, &i_enable, &i_loop ) )
445 i_size = pyoptions_to_args( py_options, &ppsz_args );
449 libvlc_vlm_change_media( LIBVLC_INSTANCE(self),
450 psz_name, psz_input, psz_output,
451 i_size, ppsz_args, i_enable, i_loop, &ex);
452 free_args( i_size, ppsz_args );
454 Py_INCREF( Py_None );
459 vlcInstance_vlm_play_media( PyObject *self, PyObject *args )
461 libvlc_exception_t ex;
464 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
468 libvlc_vlm_play_media( LIBVLC_INSTANCE(self), psz_name, &ex);
470 Py_INCREF( Py_None );
475 vlcInstance_vlm_stop_media( PyObject *self, PyObject *args )
477 libvlc_exception_t ex;
480 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
484 libvlc_vlm_stop_media( LIBVLC_INSTANCE(self), psz_name, &ex);
486 Py_INCREF( Py_None );
491 vlcInstance_vlm_pause_media( PyObject *self, PyObject *args )
493 libvlc_exception_t ex;
496 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
500 libvlc_vlm_pause_media( LIBVLC_INSTANCE(self), psz_name, &ex);
502 Py_INCREF( Py_None );
507 vlcInstance_vlm_seek_media( PyObject *self, PyObject *args )
509 libvlc_exception_t ex;
513 if( !PyArg_ParseTuple( args, "sf", &psz_name, &f_percentage ) )
517 libvlc_vlm_seek_media( LIBVLC_INSTANCE(self), psz_name, f_percentage, &ex);
519 Py_INCREF( Py_None );
524 vlcInstance_vlm_show_media( PyObject *self, PyObject *args )
526 libvlc_exception_t ex;
531 if( !PyArg_ParseTuple( args, "s", &psz_name ) )
534 psz_ret = libvlc_vlm_show_media( LIBVLC_INSTANCE(self), psz_name, &ex );
536 o_ret = Py_BuildValue( "s", psz_ret );
542 vlcInstance_media_new( PyObject *self, PyObject *args )
544 libvlc_exception_t ex;
545 libvlc_media_t *p_media;
546 char* psz_mrl = NULL;
549 if( !PyArg_ParseTuple( args, "s", &psz_mrl ) )
553 p_media = libvlc_media_new( LIBVLC_INSTANCE(self), psz_mrl, &ex );
556 p_ret = PyObject_New( vlcMedia, &vlcMedia_Type );
557 p_ret->p_media = p_media;
558 Py_INCREF( p_ret ); /* Ah bon ? */
559 return ( PyObject * )p_ret;
563 static PyMethodDef vlcInstance_methods[] =
565 { "get_vlc_id", vlcInstance_get_vlc_id, METH_NOARGS,
566 "get_vlc_id( ) -> int Get the instance id."},
567 { "video_set_parent", vlcInstance_video_set_parent, METH_VARARGS,
568 "video_set_parent(xid=int) Set the parent xid/HWND/CGrafPort"},
569 { "video_get_parent", vlcInstance_video_get_parent, METH_NOARGS,
570 "video_get_parent() -> int Get the parent xid/HWND/CGrafPort"},
571 { "video_set_size", vlcInstance_video_set_size, METH_VARARGS,
572 "video_set_size(width=int, height=int) Set the video width and height"},
573 { "audio_toggle_mute", vlcInstance_audio_toggle_mute, METH_NOARGS,
574 "audio_toggle_mute() Toggle the mute state"},
575 { "audio_get_mute", vlcInstance_audio_get_mute, METH_NOARGS,
576 "audio_get_mute() -> int Get the mute state"},
577 { "audio_set_mute", vlcInstance_audio_set_mute, METH_VARARGS,
578 "audio_set_mute(state=int) Set the mute state"},
579 { "audio_get_volume", vlcInstance_audio_get_volume, METH_NOARGS,
580 "audio_get_volume() -> int Get the audio volume"},
581 { "audio_set_volume", vlcInstance_audio_set_volume, METH_VARARGS,
582 "audio_set_volume(volume=int) Set the audio volume"},
583 { "audio_get_channel", vlcInstance_audio_get_channel, METH_NOARGS,
584 "audio_get_channel() -> int Get current audio channel" },
585 { "audio_set_channel", vlcInstance_audio_set_channel, METH_VARARGS,
586 "audio_set_channel(int) Set current audio channel" },
588 { "media_new", vlcInstance_media_new, METH_VARARGS,
589 "media_new(str) -> object Create a media object with the given mrl."},
591 { "mediaplayer_new", vlcInstance_new_media_player, METH_NOARGS,
592 "mediaplayer_new() -> object Create a media player."},
594 { "vlm_add_broadcast", vlcInstance_vlm_add_broadcast, METH_VARARGS | METH_KEYWORDS,
595 "vlm_add_broadcast(name=str, input=str, output=str, options=list, enable=int, loop=int) Add a new broadcast" },
596 { "vlm_del_media", vlcInstance_vlm_del_media, METH_VARARGS,
597 "vlm_del_media(name=str) Delete a media" },
598 { "vlm_set_enabled", vlcInstance_vlm_set_enabled, METH_VARARGS,
599 "vlm_set_enabled(name=str, enabled=int) Enable/disable a media" },
600 { "vlm_set_output", vlcInstance_vlm_set_output, METH_VARARGS,
601 "vlm_set_output(name=str, output=str) Set the output" },
602 { "vlm_set_input", vlcInstance_vlm_set_input, METH_VARARGS,
603 "vlm_set_input(name=str, output=str) Set the input" },
604 { "vlm_add_input", vlcInstance_vlm_add_input, METH_VARARGS,
605 "vlm_add_input(name=str, output=str) Add a media's input MRL" },
606 { "vlm_set_loop", vlcInstance_vlm_set_loop, METH_VARARGS,
607 "vlm_set_loop(name=str, loop=int) Change the looping value" },
608 { "vlm_change_media", vlcInstance_vlm_change_media, METH_VARARGS | METH_KEYWORDS,
609 "vlm_change_media(name=str, input=str, output=str, options=list, enable=int, loop=int) Change the broadcast parameters" },
610 { "vlm_play_media", vlcInstance_vlm_play_media, METH_VARARGS,
611 "vlm_play_media(name=str) Plays the named broadcast." },
612 { "vlm_stop_media", vlcInstance_vlm_stop_media, METH_VARARGS,
613 "vlm_stop_media(name=str) Stops the named broadcast." },
614 { "vlm_pause_media", vlcInstance_vlm_pause_media, METH_VARARGS,
615 "vlm_pause_media(name=str) Pauses the named broadcast." },
616 { "vlm_seek_media", vlcInstance_vlm_seek_media, METH_VARARGS,
617 "vlm_seek_media(name=str, percentage=float) Seeks in the named broadcast." },
618 { "vlm_show_media", vlcInstance_vlm_show_media, METH_VARARGS,
619 "vlm_show_media(name=str) Return information of the named broadcast." },
621 { NULL, NULL, 0, NULL },
624 static PyTypeObject vlcInstance_Type =
626 PyObject_HEAD_INIT( NULL )
628 "vlc.Instance", /*tp_name*/
629 sizeof( vlcInstance_Type ), /*tp_basicsize*/
631 ( destructor )vlcInstance_dealloc, /*tp_dealloc*/
638 0, /*tp_as_sequence*/
646 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
647 "VLC Instance(args)", /* tp_doc */
650 0, /* tp_richcompare */
651 0, /* tp_weaklistoffset */
654 vlcInstance_methods, /* tp_methods */
659 0, /* tp_descr_get */
660 0, /* tp_descr_set */
661 0, /* tp_dictoffset */
664 vlcInstance_new, /* tp_new */