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