1 #include <Python.h> 2 #include <dvd-audio.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 static PyMethodDef dvdaMethods[] = { 24 {NULL, NULL, 0, NULL} /*sentinel*/ 25 }; 26 27 /******************************* 28 * DVD object * 29 *******************************/ 30 31 typedef struct dvda_DVDA_s { 32 PyObject_HEAD 33 34 DVDA *dvda; 35 } dvda_DVDA; 36 37 static PyObject* 38 DVDA_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 39 40 static int 41 DVDA_init(dvda_DVDA *self, PyObject *args, PyObject *kwds); 42 43 static void 44 DVDA_dealloc(dvda_DVDA *self); 45 46 static PyObject* 47 DVDA_titleset(dvda_DVDA *self, PyObject *args); 48 49 static PyMethodDef DVDA_methods[] = { 50 {"titleset", (PyCFunction)DVDA_titleset, 51 METH_VARARGS, "titleset(number) -> Titleset"}, 52 {NULL} 53 }; 54 55 static PyObject* 56 DVDA_titlesets(dvda_DVDA *self, void *closure); 57 58 static PyGetSetDef DVDA_getseters[] = { 59 {"titlesets", 60 (getter)DVDA_titlesets, NULL, "title sets", NULL}, 61 {NULL} 62 }; 63 64 static PyTypeObject dvda_DVDAType = { 65 PyVarObject_HEAD_INIT(NULL, 0) 66 "dvda.DVDA", /*tp_name*/ 67 sizeof(dvda_DVDA), /*tp_basicsize*/ 68 0, /*tp_itemsize*/ 69 (destructor)DVDA_dealloc, /*tp_dealloc*/ 70 0, /*tp_print*/ 71 0, /*tp_getattr*/ 72 0, /*tp_setattr*/ 73 0, /*tp_compare*/ 74 0, /*tp_repr*/ 75 0, /*tp_as_number*/ 76 0, /*tp_as_sequence*/ 77 0, /*tp_as_mapping*/ 78 0, /*tp_hash */ 79 0, /*tp_call*/ 80 0, /*tp_str*/ 81 0, /*tp_getattro*/ 82 0, /*tp_setattro*/ 83 0, /*tp_as_buffer*/ 84 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 85 "DVDA objects", /* tp_doc */ 86 0, /* tp_traverse */ 87 0, /* tp_clear */ 88 0, /* tp_richcompare */ 89 0, /* tp_weaklistoffset */ 90 0, /* tp_iter */ 91 0, /* tp_iternext */ 92 DVDA_methods, /* tp_methods */ 93 0, /* tp_members */ 94 DVDA_getseters, /* tp_getset */ 95 0, /* tp_base */ 96 0, /* tp_dict */ 97 0, /* tp_descr_get */ 98 0, /* tp_descr_set */ 99 0, /* tp_dictoffset */ 100 (initproc)DVDA_init, /* tp_init */ 101 0, /* tp_alloc */ 102 DVDA_new, /* tp_new */ 103 }; 104 105 /******************************* 106 * Titleset object * 107 *******************************/ 108 109 typedef struct dvda_Titleset_s { 110 PyObject_HEAD 111 112 DVDA_Titleset *titleset; 113 } dvda_Titleset; 114 115 static PyObject* 116 Titleset_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 117 118 static int 119 Titleset_init(dvda_Titleset *self, PyObject *args, PyObject *kwds); 120 121 static void 122 Titleset_dealloc(dvda_Titleset *self); 123 124 static PyObject* 125 Titleset_title(dvda_Titleset *self, PyObject *args); 126 127 static PyMethodDef Titleset_methods[] = { 128 {"title", (PyCFunction)Titleset_title, 129 METH_VARARGS, "title(number) -> Title"}, 130 {NULL} 131 }; 132 133 static PyObject* 134 Titleset_number(dvda_Titleset *self, void *closure); 135 136 static PyObject* 137 Titleset_titles(dvda_Titleset *self, void *closure); 138 139 static PyGetSetDef Titleset_getseters[] = { 140 {"number", 141 (getter)Titleset_number, NULL, "title set number", NULL}, 142 {"titles", 143 (getter)Titleset_titles, NULL, "titles", NULL}, 144 {NULL} 145 }; 146 147 static PyTypeObject dvda_TitlesetType = { 148 PyVarObject_HEAD_INIT(NULL, 0) 149 "dvda.Titleset", /*tp_name*/ 150 sizeof(dvda_Titleset), /*tp_basicsize*/ 151 0, /*tp_itemsize*/ 152 (destructor)Titleset_dealloc, /*tp_dealloc*/ 153 0, /*tp_print*/ 154 0, /*tp_getattr*/ 155 0, /*tp_setattr*/ 156 0, /*tp_compare*/ 157 0, /*tp_repr*/ 158 0, /*tp_as_number*/ 159 0, /*tp_as_sequence*/ 160 0, /*tp_as_mapping*/ 161 0, /*tp_hash */ 162 0, /*tp_call*/ 163 0, /*tp_str*/ 164 0, /*tp_getattro*/ 165 0, /*tp_setattro*/ 166 0, /*tp_as_buffer*/ 167 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 168 "Titleset objects", /* tp_doc */ 169 0, /* tp_traverse */ 170 0, /* tp_clear */ 171 0, /* tp_richcompare */ 172 0, /* tp_weaklistoffset */ 173 0, /* tp_iter */ 174 0, /* tp_iternext */ 175 Titleset_methods, /* tp_methods */ 176 0, /* tp_members */ 177 Titleset_getseters, /* tp_getset */ 178 0, /* tp_base */ 179 0, /* tp_dict */ 180 0, /* tp_descr_get */ 181 0, /* tp_descr_set */ 182 0, /* tp_dictoffset */ 183 (initproc)Titleset_init, /* tp_init */ 184 0, /* tp_alloc */ 185 Titleset_new, /* tp_new */ 186 }; 187 188 /******************************* 189 * Title object * 190 *******************************/ 191 192 typedef struct dvda_Title_s { 193 PyObject_HEAD 194 195 DVDA_Title *title; 196 } dvda_Title; 197 198 static PyObject* 199 Title_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 200 201 static int 202 Title_init(dvda_Title *self, PyObject *args, PyObject *kwds); 203 204 static void 205 Title_dealloc(dvda_Title *self); 206 207 static PyObject* 208 Title_track(dvda_Title *self, PyObject *args); 209 210 static PyMethodDef Title_methods[] = { 211 {"track", (PyCFunction)Title_track, 212 METH_VARARGS, "track(number) -> Track"}, 213 {NULL} 214 }; 215 216 static PyObject* 217 Title_number(dvda_Title *self, void *closure); 218 219 static PyObject* 220 Title_tracks(dvda_Title *self, void *closure); 221 222 static PyObject* 223 Title_pts_length(dvda_Title *self, void *closure); 224 225 static PyGetSetDef Title_getseters[] = { 226 {"number", 227 (getter)Title_number, NULL, "title's number", NULL}, 228 {"tracks", 229 (getter)Title_tracks, NULL, "tracks", NULL}, 230 {"pts_length", 231 (getter)Title_pts_length, NULL, "length in PTS ticks", NULL}, 232 {NULL} 233 }; 234 235 static PyTypeObject dvda_TitleType = { 236 PyVarObject_HEAD_INIT(NULL, 0) 237 "dvda.Title", /*tp_name*/ 238 sizeof(dvda_Title), /*tp_basicsize*/ 239 0, /*tp_itemsize*/ 240 (destructor)Title_dealloc, /*tp_dealloc*/ 241 0, /*tp_print*/ 242 0, /*tp_getattr*/ 243 0, /*tp_setattr*/ 244 0, /*tp_compare*/ 245 0, /*tp_repr*/ 246 0, /*tp_as_number*/ 247 0, /*tp_as_sequence*/ 248 0, /*tp_as_mapping*/ 249 0, /*tp_hash */ 250 0, /*tp_call*/ 251 0, /*tp_str*/ 252 0, /*tp_getattro*/ 253 0, /*tp_setattro*/ 254 0, /*tp_as_buffer*/ 255 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 256 "Title objects", /* tp_doc */ 257 0, /* tp_traverse */ 258 0, /* tp_clear */ 259 0, /* tp_richcompare */ 260 0, /* tp_weaklistoffset */ 261 0, /* tp_iter */ 262 0, /* tp_iternext */ 263 Title_methods, /* tp_methods */ 264 0, /* tp_members */ 265 Title_getseters, /* tp_getset */ 266 0, /* tp_base */ 267 0, /* tp_dict */ 268 0, /* tp_descr_get */ 269 0, /* tp_descr_set */ 270 0, /* tp_dictoffset */ 271 (initproc)Title_init, /* tp_init */ 272 0, /* tp_alloc */ 273 Title_new, /* tp_new */ 274 }; 275 276 /******************************* 277 * Track object * 278 *******************************/ 279 280 typedef struct dvda_Track_s { 281 PyObject_HEAD 282 283 DVDA_Track *track; 284 } dvda_Track; 285 286 static PyObject* 287 Track_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 288 289 static int 290 Track_init(dvda_Track *self, PyObject *args, PyObject *kwds); 291 292 static void 293 Track_dealloc(dvda_Track *self); 294 295 static PyObject* 296 Track_reader(dvda_Track *self, PyObject *args); 297 298 static PyMethodDef Track_methods[] = { 299 {"reader", (PyCFunction)Track_reader, 300 METH_NOARGS, "reader() -> TrackReader"}, 301 {NULL} 302 }; 303 304 static PyObject* 305 Track_number(dvda_Track *self, void *closure); 306 307 static PyObject* 308 Track_pts_index(dvda_Track *self, void *closure); 309 310 static PyObject* 311 Track_pts_length(dvda_Track *self, void *closure); 312 313 static PyObject* 314 Track_first_sector(dvda_Track *self, void *closure); 315 316 static PyObject* 317 Track_last_sector(dvda_Track *self, void *closure); 318 319 static PyGetSetDef Track_getseters[] = { 320 {"number", 321 (getter)Track_number, NULL, "track's number", NULL}, 322 {"pts_index", 323 (getter)Track_pts_index, NULL, "PTS index", NULL}, 324 {"pts_length", 325 (getter)Track_pts_length, NULL, "PTS length", NULL}, 326 {"first_sector", 327 (getter)Track_first_sector, NULL, "first sector", NULL}, 328 {"last_sector", 329 (getter)Track_last_sector, NULL, "last sector", NULL}, 330 {NULL} 331 }; 332 333 static PyTypeObject dvda_TrackType = { 334 PyVarObject_HEAD_INIT(NULL, 0) 335 "dvda.Track", /*tp_name*/ 336 sizeof(dvda_Track), /*tp_basicsize*/ 337 0, /*tp_itemsize*/ 338 (destructor)Track_dealloc, /*tp_dealloc*/ 339 0, /*tp_print*/ 340 0, /*tp_getattr*/ 341 0, /*tp_setattr*/ 342 0, /*tp_compare*/ 343 0, /*tp_repr*/ 344 0, /*tp_as_number*/ 345 0, /*tp_as_sequence*/ 346 0, /*tp_as_mapping*/ 347 0, /*tp_hash */ 348 0, /*tp_call*/ 349 0, /*tp_str*/ 350 0, /*tp_getattro*/ 351 0, /*tp_setattro*/ 352 0, /*tp_as_buffer*/ 353 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 354 "Track objects", /* tp_doc */ 355 0, /* tp_traverse */ 356 0, /* tp_clear */ 357 0, /* tp_richcompare */ 358 0, /* tp_weaklistoffset */ 359 0, /* tp_iter */ 360 0, /* tp_iternext */ 361 Track_methods, /* tp_methods */ 362 0, /* tp_members */ 363 Track_getseters, /* tp_getset */ 364 0, /* tp_base */ 365 0, /* tp_dict */ 366 0, /* tp_descr_get */ 367 0, /* tp_descr_set */ 368 0, /* tp_dictoffset */ 369 (initproc)Track_init, /* tp_init */ 370 0, /* tp_alloc */ 371 Track_new, /* tp_new */ 372 }; 373 374 /******************************* 375 * TrackReader object * 376 *******************************/ 377 378 typedef struct dvda_TrackReader_s { 379 PyObject_HEAD 380 381 int closed; 382 DVDA_Track_Reader *reader; 383 PyObject *audiotools_pcm; 384 } dvda_TrackReader; 385 386 static PyObject* 387 TrackReader_new(PyTypeObject *type, PyObject *args, PyObject *kwds); 388 389 static int 390 TrackReader_init(dvda_TrackReader *self, PyObject *args, PyObject *kwds); 391 392 static void 393 TrackReader_dealloc(dvda_TrackReader *self); 394 395 static PyObject* 396 TrackReader_read(dvda_TrackReader *self, PyObject *args); 397 398 static PyObject* 399 TrackReader_close(dvda_TrackReader *self, PyObject *args); 400 401 static PyObject* 402 TrackReader_enter(dvda_TrackReader* self, PyObject *args); 403 404 static PyObject* 405 TrackReader_exit(dvda_TrackReader* self, PyObject *args); 406 407 static PyMethodDef TrackReader_methods[] = { 408 {"read", (PyCFunction)TrackReader_read, 409 METH_VARARGS, "read(pcm_frames) -> FrameList"}, 410 {"close", (PyCFunction)TrackReader_close, 411 METH_NOARGS, "close()"}, 412 {"__enter__", (PyCFunction)TrackReader_enter, 413 METH_NOARGS, "enter() -> self"}, 414 {"__exit__", (PyCFunction)TrackReader_exit, 415 METH_VARARGS, "exit(exc_type, exc_value, traceback) -> None"}, 416 {NULL} 417 }; 418 419 static PyObject* 420 TrackReader_sample_rate(dvda_TrackReader *self, void *closure); 421 422 static PyObject* 423 TrackReader_bits_per_sample(dvda_TrackReader *self, void *closure); 424 425 static PyObject* 426 TrackReader_channels(dvda_TrackReader *self, void *closure); 427 428 static PyObject* 429 TrackReader_channel_mask(dvda_TrackReader *self, void *closure); 430 431 static PyObject* 432 TrackReader_codec(dvda_TrackReader *self, void *closure); 433 434 static PyGetSetDef TrackReader_getseters[] = { 435 {"sample_rate", 436 (getter)TrackReader_sample_rate, NULL, "sample rate", NULL}, 437 {"bits_per_sample", 438 (getter)TrackReader_bits_per_sample, NULL, "bits per sample", NULL}, 439 {"channels", 440 (getter)TrackReader_channels, NULL, "channels", NULL}, 441 {"channel_mask", 442 (getter)TrackReader_channel_mask, NULL, "channel mask", NULL}, 443 {"codec", 444 (getter)TrackReader_codec, NULL, "codec", NULL}, 445 {NULL} 446 }; 447 448 static PyTypeObject dvda_TrackReaderType = { 449 PyVarObject_HEAD_INIT(NULL, 0) 450 "dvda.TrackReader", /*tp_name*/ 451 sizeof(dvda_TrackReader), /*tp_basicsize*/ 452 0, /*tp_itemsize*/ 453 (destructor)TrackReader_dealloc, /*tp_dealloc*/ 454 0, /*tp_print*/ 455 0, /*tp_getattr*/ 456 0, /*tp_setattr*/ 457 0, /*tp_compare*/ 458 0, /*tp_repr*/ 459 0, /*tp_as_number*/ 460 0, /*tp_as_sequence*/ 461 0, /*tp_as_mapping*/ 462 0, /*tp_hash */ 463 0, /*tp_call*/ 464 0, /*tp_str*/ 465 0, /*tp_getattro*/ 466 0, /*tp_setattro*/ 467 0, /*tp_as_buffer*/ 468 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ 469 "TrackReader objects", /* tp_doc */ 470 0, /* tp_traverse */ 471 0, /* tp_clear */ 472 0, /* tp_richcompare */ 473 0, /* tp_weaklistoffset */ 474 0, /* tp_iter */ 475 0, /* tp_iternext */ 476 TrackReader_methods, /* tp_methods */ 477 0, /* tp_members */ 478 TrackReader_getseters, /* tp_getset */ 479 0, /* tp_base */ 480 0, /* tp_dict */ 481 0, /* tp_descr_get */ 482 0, /* tp_descr_set */ 483 0, /* tp_dictoffset */ 484 (initproc)TrackReader_init, /* tp_init */ 485 0, /* tp_alloc */ 486 TrackReader_new, /* tp_new */ 487 }; 488