1 #include <Python.h> 2 #include "ogg.h" 3 4 /******************************************************** 5 Audio Tools, a module and set of tools for manipulating audio data 6 Copyright (C) 2007-2014 Brian Langenberger 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, write to the Free Software 20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 *******************************************************/ 22 23 PyMethodDef module_methods[] = { 24 {NULL} 25 }; 26 27 typedef struct { 28 PyObject_HEAD 29 30 struct ogg_page page; 31 } ogg_Page; 32 33 static PyObject* 34 Page_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 35 36 int 37 Page_init(ogg_Page *self, PyObject *args, PyObject *keywds); 38 39 void 40 Page_dealloc(ogg_Page *self); 41 42 43 44 static PyObject * 45 Page_get_packet_continuation(ogg_Page *self, void *closure); 46 47 static int 48 Page_set_packet_continuation(ogg_Page *self, PyObject *value, void *closure); 49 50 static PyObject * 51 Page_get_stream_beginning(ogg_Page *self, void *closure); 52 53 static int 54 Page_set_stream_beginning(ogg_Page *self, PyObject *value, void *closure); 55 56 static PyObject * 57 Page_get_stream_end(ogg_Page *self, void *closure); 58 59 static int 60 Page_set_stream_end(ogg_Page *self, PyObject *value, void *closure); 61 62 static PyObject * 63 Page_get_granule_position(ogg_Page *self, void *closure); 64 65 static int 66 Page_set_granule_position(ogg_Page *self, PyObject *value, void *closure); 67 68 static PyObject * 69 Page_get_bitstream_serial_number(ogg_Page *self, void *closure); 70 71 static int 72 Page_set_bitstream_serial_number(ogg_Page *self, PyObject *value, 73 void *closure); 74 75 static PyObject * 76 Page_get_sequence_number(ogg_Page *self, void *closure); 77 78 static int 79 Page_set_sequence_number(ogg_Page *self, PyObject *value, void *closure); 80 81 PyGetSetDef Page_getseters[] = { 82 {"packet_continuation", 83 (getter)Page_get_packet_continuation, 84 (setter)Page_set_packet_continuation, 85 "packet continuation", NULL}, 86 {"stream_beginning", 87 (getter)Page_get_stream_beginning, 88 (setter)Page_set_stream_beginning, 89 "stream beginning", NULL}, 90 {"stream_end", 91 (getter)Page_get_stream_end, 92 (setter)Page_set_stream_end, 93 "stream ending", NULL}, 94 {"granule_position", 95 (getter)Page_get_granule_position, 96 (setter)Page_set_granule_position, 97 "granule position", NULL}, 98 {"bitstream_serial_number", 99 (getter)Page_get_bitstream_serial_number, 100 (setter)Page_set_bitstream_serial_number, 101 "bitstream serial number", NULL}, 102 {"sequence_number", 103 (getter)Page_get_sequence_number, 104 (setter)Page_set_sequence_number, 105 "page sequence number", NULL}, 106 {NULL} 107 }; 108 109 static Py_ssize_t 110 Page_len(ogg_Page *self); 111 112 static PyObject* 113 Page_GetItem(ogg_Page *self, Py_ssize_t i); 114 115 static PySequenceMethods ogg_PageType_as_sequence = { 116 (lenfunc)Page_len, /* sq_length */ 117 (binaryfunc)NULL, /* sq_concat */ 118 (ssizeargfunc)NULL, /* sq_repeat */ 119 (ssizeargfunc)Page_GetItem, /* sq_item */ 120 (ssizessizeargfunc)NULL, /* sq_slice */ 121 (ssizeobjargproc)NULL, /* sq_ass_item */ 122 (ssizessizeobjargproc)NULL, /* sq_ass_slice */ 123 (objobjproc)NULL, /* sq_contains */ 124 (binaryfunc)NULL, /* sq_inplace_concat */ 125 (ssizeargfunc)NULL, /* sq_inplace_repeat */ 126 }; 127 128 129 static PyObject* 130 Page_append(ogg_Page *self, PyObject *args); 131 132 static PyObject* 133 Page_full(ogg_Page *self, PyObject *args); 134 135 static PyObject* 136 Page_size(ogg_Page *self, PyObject *args); 137 138 PyMethodDef Page_methods[] = { 139 {"append", (PyCFunction)Page_append, 140 METH_VARARGS, "append(segment)"}, 141 {"full", (PyCFunction)Page_full, 142 METH_NOARGS, "full() -> True if Page can hold no more segments"}, 143 {"size", (PyCFunction)Page_size, 144 METH_NOARGS, "size() -> total size of Ogg page in bytes"}, 145 {NULL} 146 }; 147 148 PyTypeObject ogg_PageType = { 149 PyVarObject_HEAD_INIT(NULL, 0) 150 "_ogg.Page", /*tp_name*/ 151 sizeof(ogg_Page), /*tp_basicsize*/ 152 0, /*tp_itemsize*/ 153 (destructor)Page_dealloc, /*tp_dealloc*/ 154 0, /*tp_print*/ 155 0, /*tp_getattr*/ 156 0, /*tp_setattr*/ 157 0, /*tp_compare*/ 158 0, /*tp_repr*/ 159 0, /*tp_as_number*/ 160 &ogg_PageType_as_sequence, /*tp_as_sequence*/ 161 0, /*tp_as_mapping*/ 162 0, /*tp_hash */ 163 0, /*tp_call*/ 164 0, /*tp_str*/ 165 0, /*tp_getattro*/ 166 0, /*tp_setattro*/ 167 0, /*tp_as_buffer*/ 168 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 169 "Ogg Page objects", /* tp_doc */ 170 0, /* tp_traverse */ 171 0, /* tp_clear */ 172 0, /* tp_richcompare */ 173 0, /* tp_weaklistoffset */ 174 0, /* tp_iter */ 175 0, /* tp_iternext */ 176 Page_methods, /* tp_methods */ 177 0, /* tp_members */ 178 Page_getseters, /* tp_getset */ 179 0, /* tp_base */ 180 0, /* tp_dict */ 181 0, /* tp_descr_get */ 182 0, /* tp_descr_set */ 183 0, /* tp_dictoffset */ 184 (initproc)Page_init, /* tp_init */ 185 0, /* tp_alloc */ 186 Page_new, /* tp_new */ 187 }; 188 189 190 typedef struct { 191 PyObject_HEAD 192 193 BitstreamReader *reader; 194 } ogg_PageReader; 195 196 static PyObject* 197 PageReader_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 198 199 int 200 PageReader_init(ogg_PageReader *self, PyObject *args, PyObject *kwds); 201 202 void 203 PageReader_dealloc(ogg_PageReader *self); 204 205 static PyObject* 206 PageReader_read(ogg_PageReader *self, PyObject *args); 207 208 static PyObject* 209 PageReader_close(ogg_PageReader *self, PyObject *args); 210 211 static PyObject* 212 PageReader_enter(ogg_PageReader *self, PyObject *args); 213 214 static PyObject* 215 PageReader_exit(ogg_PageReader *self, PyObject *args); 216 217 PyMethodDef PageReader_methods[] = { 218 {"read", (PyCFunction)PageReader_read, 219 METH_NOARGS, "read() -> Page"}, 220 {"close", (PyCFunction)PageReader_close, 221 METH_NOARGS, "close()"}, 222 {"__enter__", (PyCFunction)PageReader_enter, 223 METH_NOARGS, "__enter__() -> self"}, 224 {"__exit__", (PyCFunction)PageReader_exit, 225 METH_VARARGS, "__exit__(exc_type, exc_value, traceback) -> None"}, 226 {NULL} 227 }; 228 229 PyTypeObject ogg_PageReaderType = { 230 PyVarObject_HEAD_INIT(NULL, 0) 231 "_ogg.PageReader", /*tp_name*/ 232 sizeof(ogg_PageReader), /*tp_basicsize*/ 233 0, /*tp_itemsize*/ 234 (destructor)PageReader_dealloc, /*tp_dealloc*/ 235 0, /*tp_print*/ 236 0, /*tp_getattr*/ 237 0, /*tp_setattr*/ 238 0, /*tp_compare*/ 239 0, /*tp_repr*/ 240 0, /*tp_as_number*/ 241 0, /*tp_as_sequence*/ 242 0, /*tp_as_mapping*/ 243 0, /*tp_hash */ 244 0, /*tp_call*/ 245 0, /*tp_str*/ 246 0, /*tp_getattro*/ 247 0, /*tp_setattro*/ 248 0, /*tp_as_buffer*/ 249 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 250 "Ogg PageReader object", /* tp_doc */ 251 0, /* tp_traverse */ 252 0, /* tp_clear */ 253 0, /* tp_richcompare */ 254 0, /* tp_weaklistoffset */ 255 0, /* tp_iter */ 256 0, /* tp_iternext */ 257 PageReader_methods, /* tp_methods */ 258 0, /* tp_members */ 259 0, /* tp_getset */ 260 0, /* tp_base */ 261 0, /* tp_dict */ 262 0, /* tp_descr_get */ 263 0, /* tp_descr_set */ 264 0, /* tp_dictoffset */ 265 (initproc)PageReader_init, /* tp_init */ 266 0, /* tp_alloc */ 267 PageReader_new, /* tp_new */ 268 }; 269 270 271 typedef struct { 272 PyObject_HEAD 273 274 BitstreamWriter *writer; 275 } ogg_PageWriter; 276 277 static PyObject* 278 PageWriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 279 280 int 281 PageWriter_init(ogg_PageWriter *self, PyObject *args, PyObject *kwds); 282 283 void 284 PageWriter_dealloc(ogg_PageWriter *self); 285 286 static PyObject* 287 PageWriter_write(ogg_PageWriter *self, PyObject *args); 288 289 static PyObject* 290 PageWriter_flush(ogg_PageWriter *self, PyObject *args); 291 292 static PyObject* 293 PageWriter_close(ogg_PageWriter *self, PyObject *args); 294 295 static PyObject* 296 PageWriter_enter(ogg_PageWriter *self, PyObject *args); 297 298 static PyObject* 299 PageWriter_exit(ogg_PageWriter *self, PyObject *args); 300 301 PyMethodDef PageWriter_methods[] = { 302 {"write", (PyCFunction)PageWriter_write, 303 METH_VARARGS, "write(Page)"}, 304 {"flush", (PyCFunction)PageWriter_flush, 305 METH_NOARGS, "flush()"}, 306 {"close", (PyCFunction)PageWriter_close, 307 METH_NOARGS, "close()"}, 308 {"__enter__", (PyCFunction)PageWriter_enter, 309 METH_NOARGS, "__enter__() -> self"}, 310 {"__exit__", (PyCFunction)PageWriter_exit, 311 METH_VARARGS, "__exit__(exc_type, exc_value, traceback) -> None"}, 312 {NULL} 313 }; 314 315 PyTypeObject ogg_PageWriterType = { 316 PyVarObject_HEAD_INIT(NULL, 0) 317 "_ogg.PageWriter", /*tp_name*/ 318 sizeof(ogg_PageWriter), /*tp_basicsize*/ 319 0, /*tp_itemsize*/ 320 (destructor)PageWriter_dealloc, /*tp_dealloc*/ 321 0, /*tp_print*/ 322 0, /*tp_getattr*/ 323 0, /*tp_setattr*/ 324 0, /*tp_compare*/ 325 0, /*tp_repr*/ 326 0, /*tp_as_number*/ 327 0, /*tp_as_sequence*/ 328 0, /*tp_as_mapping*/ 329 0, /*tp_hash */ 330 0, /*tp_call*/ 331 0, /*tp_str*/ 332 0, /*tp_getattro*/ 333 0, /*tp_setattro*/ 334 0, /*tp_as_buffer*/ 335 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 336 "Ogg PageWriter object", /* tp_doc */ 337 0, /* tp_traverse */ 338 0, /* tp_clear */ 339 0, /* tp_richcompare */ 340 0, /* tp_weaklistoffset */ 341 0, /* tp_iter */ 342 0, /* tp_iternext */ 343 PageWriter_methods, /* tp_methods */ 344 0, /* tp_members */ 345 0, /* tp_getset */ 346 0, /* tp_base */ 347 0, /* tp_dict */ 348 0, /* tp_descr_get */ 349 0, /* tp_descr_set */ 350 0, /* tp_dictoffset */ 351 (initproc)PageWriter_init, /* tp_init */ 352 0, /* tp_alloc */ 353 PageWriter_new, /* tp_new */ 354 }; 355