#include #include #include static xine_t *gs_xine = NULL; static xine_audio_port_t *gs_audio_port = NULL; static int gs_audioplayer_count = 0; typedef struct { PyObject_HEAD xine_stream_t *stream; } AudioPlayer; static void AudioPlayer_dealloc(AudioPlayer *self) { gs_audioplayer_count--; if (self->stream) xine_dispose(self->stream); if (gs_audioplayer_count == 0) { xine_close_audio_driver(gs_xine, gs_audio_port); xine_exit(gs_xine); gs_audio_port = NULL; gs_xine = NULL; } self->ob_type->tp_free((PyObject *)self); } static int AudioPlayer_init(AudioPlayer *self, PyObject *args, PyObject *kwds) { gs_audioplayer_count++; if (!gs_xine) { gs_xine = xine_new(); if (!gs_xine) { PyErr_SetString(PyExc_RuntimeError, "Failed to initialise xine engine"); return -1; } xine_init(gs_xine); } if (!gs_audio_port) { gs_audio_port = xine_open_audio_driver(gs_xine, NULL, NULL); if (!gs_audio_port) { PyErr_SetString(PyExc_RuntimeError, "Failed to open an audio driver"); return -1; } } self->stream = xine_stream_new(gs_xine, gs_audio_port, NULL); if (!self->stream) { PyErr_SetString(PyExc_RuntimeError, "Failed to create xine_stream_t* instance"); return -1; } return 0; } static void AudioPlayer_open(AudioPlayer *self, PyObject *_mrl) { int res; char *mrl; mrl = PyString_AsString(_mrl); if (!mrl) { PyErr_BadArgument(); return; } res = xine_open(self->stream, mrl); if (res == 0) { PyErr_SetString(PyExc_RuntimeError, "Failed to open mrl"); } printf("Got here\n"); } static PyMemberDef AudioPlayer_members[] = { {NULL} }; static PyMethodDef AudioPlayer_methods[] = { {"open", (PyCFunction)AudioPlayer_open, METH_O, "Open the given MRL"}, {NULL} }; static PyTypeObject AudioPlayerType = { PyObject_HEAD_INIT(NULL) 0, /* ob_size */ "miniplay.audioplayer.AudioPlayer", /* tp_name */ sizeof(AudioPlayer), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) AudioPlayer_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, /* tp_flags */ "Plays audio using libxine", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ AudioPlayer_methods, /* tp_methods */ AudioPlayer_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ (initproc) AudioPlayer_init /* tp_init */ }; static PyMethodDef methods[] = { {NULL} }; #ifndef PyMODINIT_FUNC #define PyMODINIT_FUNC void #endif PyMODINIT_FUNC initaudioplayer(void) { PyObject *module; AudioPlayerType.tp_new = PyType_GenericNew; if (PyType_Ready(&AudioPlayerType) < 0) return; module = Py_InitModule3("audioplayer", methods, "Implements the AudioPlayer type"); Py_INCREF(&AudioPlayerType); PyModule_AddObject(module, "AudioPlayer", (PyObject *)&AudioPlayerType); }