blob: a7cfb5428a97295cc4e326cd6f39720d47f7d6be [file] [log] [blame]
Guido van Rossum16b8f301992-04-13 18:22:53 +00001/**********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum16b8f301992-04-13 18:22:53 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum16b8f301992-04-13 18:22:53 +00009******************************************************************/
10
11/* CD module -- interface to Mark Callow's and Roger Chickering's */
12 /* CD Audio Library (CD). */
13
14#include <sys/types.h>
15#include <cdaudio.h>
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000016#include "Python.h"
Guido van Rossum16b8f301992-04-13 18:22:53 +000017
18#define NCALLBACKS 8
19
20typedef struct {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000021 PyObject_HEAD
Guido van Rossum16b8f301992-04-13 18:22:53 +000022 CDPLAYER *ob_cdplayer;
23} cdplayerobject;
24
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000025static PyObject *CdError; /* exception cd.error */
Sjoerd Mullender46927ba1992-09-24 10:48:40 +000026
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000027static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000028CD_allowremoval(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000029{
Guido van Rossum43713e52000-02-29 13:59:29 +000030 if (!PyArg_ParseTuple(args, ":allowremoval"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000031 return NULL;
32
33 CDallowremoval(self->ob_cdplayer);
34
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000035 Py_INCREF(Py_None);
36 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000037}
38
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000039static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000040CD_preventremoval(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000041{
Guido van Rossum43713e52000-02-29 13:59:29 +000042 if (!PyArg_ParseTuple(args, ":preventremoval"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000043 return NULL;
44
45 CDpreventremoval(self->ob_cdplayer);
46
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000047 Py_INCREF(Py_None);
48 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000049}
50
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000051static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000052CD_bestreadsize(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000053{
Guido van Rossum43713e52000-02-29 13:59:29 +000054 if (!PyArg_ParseTuple(args, ":bestreadsize"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000055 return NULL;
56
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000057 return PyInt_FromLong((long) CDbestreadsize(self->ob_cdplayer));
Guido van Rossum16b8f301992-04-13 18:22:53 +000058}
59
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000060static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000061CD_close(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000062{
Guido van Rossum43713e52000-02-29 13:59:29 +000063 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000064 return NULL;
65
66 if (!CDclose(self->ob_cdplayer)) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000067 PyErr_SetFromErrno(CdError); /* XXX - ??? */
Guido van Rossum16b8f301992-04-13 18:22:53 +000068 return NULL;
69 }
70 self->ob_cdplayer = NULL;
71
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000072 Py_INCREF(Py_None);
73 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000074}
75
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000076static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000077CD_eject(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000078{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000079 CDSTATUS status;
80
Guido van Rossum43713e52000-02-29 13:59:29 +000081 if (!PyArg_ParseTuple(args, ":eject"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000082 return NULL;
83
84 if (!CDeject(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000085 if (CDgetstatus(self->ob_cdplayer, &status) &&
86 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000087 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000088 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000089 PyErr_SetString(CdError, "eject failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +000090 return NULL;
91 }
92
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000093 Py_INCREF(Py_None);
94 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000095}
96
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000097static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +000098CD_getstatus(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +000099{
100 CDSTATUS status;
101
Guido van Rossum43713e52000-02-29 13:59:29 +0000102 if (!PyArg_ParseTuple(args, ":getstatus"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000103 return NULL;
104
105 if (!CDgetstatus(self->ob_cdplayer, &status)) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000106 PyErr_SetFromErrno(CdError); /* XXX - ??? */
Guido van Rossum16b8f301992-04-13 18:22:53 +0000107 return NULL;
108 }
109
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000110 return Py_BuildValue("(ii(iii)(iii)(iii)iiii)", status.state,
Guido van Rossumece6efe1992-04-15 15:56:11 +0000111 status.track, status.min, status.sec, status.frame,
112 status.abs_min, status.abs_sec, status.abs_frame,
113 status.total_min, status.total_sec, status.total_frame,
114 status.first, status.last, status.scsi_audio,
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000115 status.cur_block);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000116}
117
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000118static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000119CD_gettrackinfo(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000120{
121 int track;
122 CDTRACKINFO info;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000123 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000124
Guido van Rossum43713e52000-02-29 13:59:29 +0000125 if (!PyArg_ParseTuple(args, "i:gettrackinfo", &track))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000126 return NULL;
127
128 if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000129 if (CDgetstatus(self->ob_cdplayer, &status) &&
130 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000131 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000132 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000133 PyErr_SetString(CdError, "gettrackinfo failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000134 return NULL;
135 }
136
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000137 return Py_BuildValue("((iii)(iii))",
Guido van Rossum16b8f301992-04-13 18:22:53 +0000138 info.start_min, info.start_sec, info.start_frame,
139 info.total_min, info.total_sec, info.total_frame);
140}
141
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000142static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000143CD_msftoblock(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000144{
145 int min, sec, frame;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000146
Guido van Rossum43713e52000-02-29 13:59:29 +0000147 if (!PyArg_ParseTuple(args, "iii:msftoblock", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000148 return NULL;
149
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000150 return PyInt_FromLong((long) CDmsftoblock(self->ob_cdplayer,
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000151 min, sec, frame));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000152}
153
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000154static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000155CD_play(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000156{
157 int start, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000158 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000159
Guido van Rossum43713e52000-02-29 13:59:29 +0000160 if (!PyArg_ParseTuple(args, "ii:play", &start, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000161 return NULL;
162
163 if (!CDplay(self->ob_cdplayer, start, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000164 if (CDgetstatus(self->ob_cdplayer, &status) &&
165 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000166 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000167 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000168 PyErr_SetString(CdError, "play failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000169 return NULL;
170 }
171
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000172 Py_INCREF(Py_None);
173 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000174}
175
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000176static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000177CD_playabs(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000178{
179 int min, sec, frame, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000180 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000181
Guido van Rossum43713e52000-02-29 13:59:29 +0000182 if (!PyArg_ParseTuple(args, "iiii:playabs", &min, &sec, &frame, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000183 return NULL;
184
185 if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000186 if (CDgetstatus(self->ob_cdplayer, &status) &&
187 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000188 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000189 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000190 PyErr_SetString(CdError, "playabs failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000191 return NULL;
192 }
193
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000194 Py_INCREF(Py_None);
195 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000196}
197
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000198static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000199CD_playtrack(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000200{
201 int start, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000202 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000203
Guido van Rossum43713e52000-02-29 13:59:29 +0000204 if (!PyArg_ParseTuple(args, "ii:playtrack", &start, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000205 return NULL;
206
207 if (!CDplaytrack(self->ob_cdplayer, start, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000208 if (CDgetstatus(self->ob_cdplayer, &status) &&
209 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000210 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000211 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000212 PyErr_SetString(CdError, "playtrack failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000213 return NULL;
214 }
215
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000216 Py_INCREF(Py_None);
217 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000218}
219
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000220static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000221CD_playtrackabs(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000222{
223 int track, min, sec, frame, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000224 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000225
Guido van Rossum43713e52000-02-29 13:59:29 +0000226 if (!PyArg_ParseTuple(args, "iiiii:playtrackabs", &track, &min, &sec,
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000227 &frame, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000228 return NULL;
229
230 if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000231 if (CDgetstatus(self->ob_cdplayer, &status) &&
232 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000233 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000234 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000235 PyErr_SetString(CdError, "playtrackabs failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000236 return NULL;
237 }
238
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000239 Py_INCREF(Py_None);
240 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000241}
242
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000243static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000244CD_readda(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000245{
246 int numframes, n;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000247 PyObject *result;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000248
Guido van Rossum43713e52000-02-29 13:59:29 +0000249 if (!PyArg_ParseTuple(args, "i:readda", &numframes))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000250 return NULL;
251
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000252 result = PyString_FromStringAndSize(NULL, numframes * sizeof(CDFRAME));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000253 if (result == NULL)
254 return NULL;
255
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000256 n = CDreadda(self->ob_cdplayer,
257 (CDFRAME *) PyString_AsString(result), numframes);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000258 if (n == -1) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000259 Py_DECREF(result);
260 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000261 return NULL;
262 }
263 if (n < numframes)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000264 if (_PyString_Resize(&result, n * sizeof(CDFRAME)))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000265 return NULL;
266
267 return result;
268}
269
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000270static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000271CD_seek(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000272{
273 int min, sec, frame;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000274 long PyTryBlock;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000275
Guido van Rossum43713e52000-02-29 13:59:29 +0000276 if (!PyArg_ParseTuple(args, "iii:seek", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000277 return NULL;
278
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000279 PyTryBlock = CDseek(self->ob_cdplayer, min, sec, frame);
280 if (PyTryBlock == -1) {
281 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000282 return NULL;
283 }
284
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000285 return PyInt_FromLong(PyTryBlock);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000286}
287
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000288static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000289CD_seektrack(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000290{
291 int track;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000292 long PyTryBlock;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000293
Guido van Rossum43713e52000-02-29 13:59:29 +0000294 if (!PyArg_ParseTuple(args, "i:seektrack", &track))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000295 return NULL;
296
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000297 PyTryBlock = CDseektrack(self->ob_cdplayer, track);
298 if (PyTryBlock == -1) {
299 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000300 return NULL;
301 }
302
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000303 return PyInt_FromLong(PyTryBlock);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000304}
305
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000306static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000307CD_seekblock(cdplayerobject *self, PyObject *args)
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000308{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000309 unsigned long PyTryBlock;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000310
Guido van Rossum43713e52000-02-29 13:59:29 +0000311 if (!PyArg_ParseTuple(args, "l:seekblock", &PyTryBlock))
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000312 return NULL;
313
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000314 PyTryBlock = CDseekblock(self->ob_cdplayer, PyTryBlock);
315 if (PyTryBlock == (unsigned long) -1) {
316 PyErr_SetFromErrno(CdError);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000317 return NULL;
318 }
319
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000320 return PyInt_FromLong(PyTryBlock);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000321}
322
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000323static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000324CD_stop(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000325{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000326 CDSTATUS status;
327
Guido van Rossum43713e52000-02-29 13:59:29 +0000328 if (!PyArg_ParseTuple(args, ":stop"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000329 return NULL;
330
331 if (!CDstop(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000332 if (CDgetstatus(self->ob_cdplayer, &status) &&
333 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000334 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000335 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000336 PyErr_SetString(CdError, "stop failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000337 return NULL;
338 }
339
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000340 Py_INCREF(Py_None);
341 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000342}
343
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000344static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000345CD_togglepause(cdplayerobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000346{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000347 CDSTATUS status;
348
Guido van Rossum43713e52000-02-29 13:59:29 +0000349 if (!PyArg_ParseTuple(args, ":togglepause"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000350 return NULL;
351
352 if (!CDtogglepause(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000353 if (CDgetstatus(self->ob_cdplayer, &status) &&
354 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000355 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000356 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000357 PyErr_SetString(CdError, "togglepause failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000358 return NULL;
359 }
360
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000361 Py_INCREF(Py_None);
362 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000363}
364
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000365static PyMethodDef cdplayer_methods[] = {
366 {"allowremoval", (PyCFunction)CD_allowremoval, 1},
367 {"bestreadsize", (PyCFunction)CD_bestreadsize, 1},
368 {"close", (PyCFunction)CD_close, 1},
369 {"eject", (PyCFunction)CD_eject, 1},
370 {"getstatus", (PyCFunction)CD_getstatus, 1},
371 {"gettrackinfo", (PyCFunction)CD_gettrackinfo, 1},
372 {"msftoblock", (PyCFunction)CD_msftoblock, 1},
373 {"play", (PyCFunction)CD_play, 1},
374 {"playabs", (PyCFunction)CD_playabs, 1},
375 {"playtrack", (PyCFunction)CD_playtrack, 1},
376 {"playtrackabs", (PyCFunction)CD_playtrackabs, 1},
377 {"preventremoval", (PyCFunction)CD_preventremoval, 1},
378 {"readda", (PyCFunction)CD_readda, 1},
379 {"seek", (PyCFunction)CD_seek, 1},
380 {"seekblock", (PyCFunction)CD_seekblock, 1},
381 {"seektrack", (PyCFunction)CD_seektrack, 1},
382 {"stop", (PyCFunction)CD_stop, 1},
383 {"togglepause", (PyCFunction)CD_togglepause, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000384 {NULL, NULL} /* sentinel */
385};
386
387static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000388cdplayer_dealloc(cdplayerobject *self)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000389{
390 if (self->ob_cdplayer != NULL)
391 CDclose(self->ob_cdplayer);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000392 PyObject_Del(self);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000393}
394
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000395static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000396cdplayer_getattr(cdplayerobject *self, char *name)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000397{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000398 if (self->ob_cdplayer == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000399 PyErr_SetString(PyExc_RuntimeError, "no player active");
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000400 return NULL;
401 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000402 return Py_FindMethod(cdplayer_methods, (PyObject *)self, name);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000403}
404
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000405PyTypeObject CdPlayertype = {
406 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000407 0, /*ob_size*/
408 "cdplayer", /*tp_name*/
409 sizeof(cdplayerobject), /*tp_size*/
410 0, /*tp_itemsize*/
411 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000412 (destructor)cdplayer_dealloc, /*tp_dealloc*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000413 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000414 (getattrfunc)cdplayer_getattr, /*tp_getattr*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000415 0, /*tp_setattr*/
416 0, /*tp_compare*/
417 0, /*tp_repr*/
418};
419
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000420static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000421newcdplayerobject(CDPLAYER *cdp)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000422{
423 cdplayerobject *p;
424
Guido van Rossumb18618d2000-05-03 23:44:39 +0000425 p = PyObject_New(cdplayerobject, &CdPlayertype);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000426 if (p == NULL)
427 return NULL;
428 p->ob_cdplayer = cdp;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000429 return (PyObject *) p;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000430}
431
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000432static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000433CD_open(PyObject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000434{
435 char *dev, *direction;
436 CDPLAYER *cdp;
437
438 /*
439 * Variable number of args.
440 * First defaults to "None", second defaults to "r".
441 */
442 dev = NULL;
443 direction = "r";
Guido van Rossum43713e52000-02-29 13:59:29 +0000444 if (!PyArg_ParseTuple(args, "|zs:open", &dev, &direction))
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000445 return NULL;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000446
447 cdp = CDopen(dev, direction);
448 if (cdp == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000449 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000450 return NULL;
451 }
452
453 return newcdplayerobject(cdp);
454}
455
456typedef struct {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000457 PyObject_HEAD
Guido van Rossum16b8f301992-04-13 18:22:53 +0000458 CDPARSER *ob_cdparser;
459 struct {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000460 PyObject *ob_cdcallback;
461 PyObject *ob_cdcallbackarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000462 } ob_cdcallbacks[NCALLBACKS];
463} cdparserobject;
464
465static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000466CD_callback(void *arg, CDDATATYPES type, void *data)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000467{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000468 PyObject *result, *args, *v = NULL;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000469 char *p;
470 int i;
471 cdparserobject *self;
472
473 self = (cdparserobject *) arg;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000474 args = PyTuple_New(3);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000475 if (args == NULL)
476 return;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000477 Py_INCREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
478 PyTuple_SetItem(args, 0, self->ob_cdcallbacks[type].ob_cdcallbackarg);
479 PyTuple_SetItem(args, 1, PyInt_FromLong((long) type));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000480 switch (type) {
481 case cd_audio:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000482 v = PyString_FromStringAndSize(data, CDDA_DATASIZE);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000483 break;
484 case cd_pnum:
485 case cd_index:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000486 v = PyInt_FromLong(((CDPROGNUM *) data)->value);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000487 break;
488 case cd_ptime:
489 case cd_atime:
Guido van Rossumece6efe1992-04-15 15:56:11 +0000490#define ptr ((struct cdtimecode *) data)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000491 v = Py_BuildValue("(iii)",
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000492 ptr->mhi * 10 + ptr->mlo,
Guido van Rossumece6efe1992-04-15 15:56:11 +0000493 ptr->shi * 10 + ptr->slo,
494 ptr->fhi * 10 + ptr->flo);
495#undef ptr
Guido van Rossum16b8f301992-04-13 18:22:53 +0000496 break;
497 case cd_catalog:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000498 v = PyString_FromStringAndSize(NULL, 13);
499 p = PyString_AsString(v);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000500 for (i = 0; i < 13; i++)
501 *p++ = ((char *) data)[i] + '0';
502 break;
503 case cd_ident:
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000504#define ptr ((struct cdident *) data)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000505 v = PyString_FromStringAndSize(NULL, 12);
506 p = PyString_AsString(v);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000507 CDsbtoa(p, ptr->country, 2);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000508 p += 2;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000509 CDsbtoa(p, ptr->owner, 3);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000510 p += 3;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000511 *p++ = ptr->year[0] + '0';
512 *p++ = ptr->year[1] + '0';
513 *p++ = ptr->serial[0] + '0';
514 *p++ = ptr->serial[1] + '0';
515 *p++ = ptr->serial[2] + '0';
516 *p++ = ptr->serial[3] + '0';
517 *p++ = ptr->serial[4] + '0';
518#undef ptr
Guido van Rossum16b8f301992-04-13 18:22:53 +0000519 break;
520 case cd_control:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000521 v = PyInt_FromLong((long) *((unchar *) data));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000522 break;
523 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000524 PyTuple_SetItem(args, 2, v);
525 if (PyErr_Occurred()) {
526 Py_DECREF(args);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000527 return;
528 }
529
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000530 result = PyEval_CallObject(self->ob_cdcallbacks[type].ob_cdcallback,
531 args);
532 Py_DECREF(args);
533 Py_XDECREF(result);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000534}
535
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000536static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000537CD_deleteparser(cdparserobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000538{
539 int i;
540
Guido van Rossum43713e52000-02-29 13:59:29 +0000541 if (!PyArg_ParseTuple(args, ":deleteparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000542 return NULL;
543
544 CDdeleteparser(self->ob_cdparser);
545 self->ob_cdparser = NULL;
546
547 /* no sense in keeping the callbacks, so remove them */
548 for (i = 0; i < NCALLBACKS; i++) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000549 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000550 self->ob_cdcallbacks[i].ob_cdcallback = NULL;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000551 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000552 self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
553 }
554
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000555 Py_INCREF(Py_None);
556 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000557}
558
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000559static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000560CD_parseframe(cdparserobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000561{
562 char *cdfp;
563 int length;
564 CDFRAME *p;
565
Guido van Rossum43713e52000-02-29 13:59:29 +0000566 if (!PyArg_ParseTuple(args, "s#:parseframe", &cdfp, &length))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000567 return NULL;
568
569 if (length % sizeof(CDFRAME) != 0) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000570 PyErr_SetString(PyExc_TypeError, "bad length");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000571 return NULL;
572 }
573
574 p = (CDFRAME *) cdfp;
575 while (length > 0) {
576 CDparseframe(self->ob_cdparser, p);
577 length -= sizeof(CDFRAME);
578 p++;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000579 if (PyErr_Occurred())
Guido van Rossum16b8f301992-04-13 18:22:53 +0000580 return NULL;
581 }
582
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000583 Py_INCREF(Py_None);
584 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000585}
586
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000587static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000588CD_removecallback(cdparserobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000589{
590 int type;
591
Guido van Rossum43713e52000-02-29 13:59:29 +0000592 if (!PyArg_ParseTuple(args, "i:removecallback", &type))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000593 return NULL;
594
Guido van Rossumf16eda51992-08-03 19:06:59 +0000595 if (type < 0 || type >= NCALLBACKS) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000596 PyErr_SetString(PyExc_TypeError, "bad type");
Guido van Rossumf16eda51992-08-03 19:06:59 +0000597 return NULL;
598 }
599
Guido van Rossum16b8f301992-04-13 18:22:53 +0000600 CDremovecallback(self->ob_cdparser, (CDDATATYPES) type);
601
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000602 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000603 self->ob_cdcallbacks[type].ob_cdcallback = NULL;
604
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000605 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000606 self->ob_cdcallbacks[type].ob_cdcallbackarg = NULL;
607
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000608 Py_INCREF(Py_None);
609 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000610}
611
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000612static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000613CD_resetparser(cdparserobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000614{
Guido van Rossum43713e52000-02-29 13:59:29 +0000615 if (!PyArg_ParseTuple(args, ":resetparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000616 return NULL;
617
618 CDresetparser(self->ob_cdparser);
619
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000620 Py_INCREF(Py_None);
621 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000622}
623
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000624static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000625CD_addcallback(cdparserobject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000626{
627 int type;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000628 PyObject *func, *funcarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000629
Guido van Rossum16b8f301992-04-13 18:22:53 +0000630 /* XXX - more work here */
Guido van Rossum43713e52000-02-29 13:59:29 +0000631 if (!PyArg_ParseTuple(args, "iOO:addcallback", &type, &func, &funcarg))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000632 return NULL;
633
634 if (type < 0 || type >= NCALLBACKS) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000635 PyErr_SetString(PyExc_TypeError, "argument out of range");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000636 return NULL;
637 }
638
Sjoerd Mullender7c4eb401992-09-25 11:15:58 +0000639#ifdef CDsetcallback
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000640 CDaddcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback,
641 (void *) self);
Guido van Rossumf16eda51992-08-03 19:06:59 +0000642#else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000643 CDsetcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback,
644 (void *) self);
Guido van Rossumf16eda51992-08-03 19:06:59 +0000645#endif
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000646 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback);
647 Py_INCREF(func);
Guido van Rossum234f9421993-06-17 12:35:49 +0000648 self->ob_cdcallbacks[type].ob_cdcallback = func;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000649 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
650 Py_INCREF(funcarg);
Guido van Rossum234f9421993-06-17 12:35:49 +0000651 self->ob_cdcallbacks[type].ob_cdcallbackarg = funcarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000652
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000653/*
654 if (type == cd_audio) {
655 sigfpe_[_UNDERFL].repls = _ZERO;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000656 handle_sigfpes(_ON, _EN_UNDERFL, NULL,
657 _ABORT_ON_ERROR, NULL);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000658 }
659*/
660
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000661 Py_INCREF(Py_None);
662 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000663}
664
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000665static PyMethodDef cdparser_methods[] = {
666 {"addcallback", (PyCFunction)CD_addcallback, 1},
667 {"deleteparser", (PyCFunction)CD_deleteparser, 1},
668 {"parseframe", (PyCFunction)CD_parseframe, 1},
669 {"removecallback", (PyCFunction)CD_removecallback, 1},
670 {"resetparser", (PyCFunction)CD_resetparser, 1},
671 /* backward compatibility */
672 {"setcallback", (PyCFunction)CD_addcallback, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000673 {NULL, NULL} /* sentinel */
674};
675
676static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000677cdparser_dealloc(cdparserobject *self)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000678{
679 int i;
680
681 for (i = 0; i < NCALLBACKS; i++) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000682 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000683 self->ob_cdcallbacks[i].ob_cdcallback = NULL;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000684 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000685 self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
686 }
687 CDdeleteparser(self->ob_cdparser);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000688 PyObject_Del(self);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000689}
690
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000691static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000692cdparser_getattr(cdparserobject *self, char *name)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000693{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000694 if (self->ob_cdparser == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000695 PyErr_SetString(PyExc_RuntimeError, "no parser active");
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000696 return NULL;
697 }
698
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000699 return Py_FindMethod(cdparser_methods, (PyObject *)self, name);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000700}
701
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000702PyTypeObject CdParsertype = {
703 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000704 0, /*ob_size*/
705 "cdparser", /*tp_name*/
706 sizeof(cdparserobject), /*tp_size*/
707 0, /*tp_itemsize*/
708 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000709 (destructor)cdparser_dealloc, /*tp_dealloc*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000710 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000711 (getattrfunc)cdparser_getattr, /*tp_getattr*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000712 0, /*tp_setattr*/
713 0, /*tp_compare*/
714 0, /*tp_repr*/
715};
716
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000717static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000718newcdparserobject(CDPARSER *cdp)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000719{
720 cdparserobject *p;
721 int i;
722
Guido van Rossumb18618d2000-05-03 23:44:39 +0000723 p = PyObject_New(cdparserobject, &CdParsertype);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000724 if (p == NULL)
725 return NULL;
726 p->ob_cdparser = cdp;
727 for (i = 0; i < NCALLBACKS; i++) {
728 p->ob_cdcallbacks[i].ob_cdcallback = NULL;
729 p->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
730 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000731 return (PyObject *) p;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000732}
733
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000734static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000735CD_createparser(PyObject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000736{
737 CDPARSER *cdp;
738
Guido van Rossum43713e52000-02-29 13:59:29 +0000739 if (!PyArg_ParseTuple(args, ":createparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000740 return NULL;
741 cdp = CDcreateparser();
742 if (cdp == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000743 PyErr_SetString(CdError, "createparser failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000744 return NULL;
745 }
746
747 return newcdparserobject(cdp);
748}
749
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000750static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000751CD_msftoframe(PyObject *self, PyObject *args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000752{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000753 int min, sec, frame;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000754
Guido van Rossum43713e52000-02-29 13:59:29 +0000755 if (!PyArg_ParseTuple(args, "iii:msftoframe", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000756 return NULL;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000757
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000758 return PyInt_FromLong((long) CDmsftoframe(min, sec, frame));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000759}
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000760
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000761static PyMethodDef CD_methods[] = {
762 {"open", (PyCFunction)CD_open, 1},
763 {"createparser", (PyCFunction)CD_createparser, 1},
764 {"msftoframe", (PyCFunction)CD_msftoframe, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000765 {NULL, NULL} /* Sentinel */
766};
767
768void
769initcd()
770{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000771 PyObject *m, *d;
Sjoerd Mullender46927ba1992-09-24 10:48:40 +0000772
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000773 m = Py_InitModule("cd", CD_methods);
774 d = PyModule_GetDict(m);
Sjoerd Mullender46927ba1992-09-24 10:48:40 +0000775
Guido van Rossum88d8bee1997-10-01 04:43:39 +0000776 CdError = PyErr_NewException("cd.error", NULL, NULL);
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000777 PyDict_SetItemString(d, "error", CdError);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000778
779 /* Identifiers for the different types of callbacks from the parser */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000780 PyDict_SetItemString(d, "audio", PyInt_FromLong((long) cd_audio));
781 PyDict_SetItemString(d, "pnum", PyInt_FromLong((long) cd_pnum));
782 PyDict_SetItemString(d, "index", PyInt_FromLong((long) cd_index));
783 PyDict_SetItemString(d, "ptime", PyInt_FromLong((long) cd_ptime));
784 PyDict_SetItemString(d, "atime", PyInt_FromLong((long) cd_atime));
785 PyDict_SetItemString(d, "catalog", PyInt_FromLong((long) cd_catalog));
786 PyDict_SetItemString(d, "ident", PyInt_FromLong((long) cd_ident));
787 PyDict_SetItemString(d, "control", PyInt_FromLong((long) cd_control));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000788
789 /* Block size information for digital audio data */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000790 PyDict_SetItemString(d, "DATASIZE",
791 PyInt_FromLong((long) CDDA_DATASIZE));
792 PyDict_SetItemString(d, "BLOCKSIZE",
793 PyInt_FromLong((long) CDDA_BLOCKSIZE));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000794
795 /* Possible states for the cd player */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000796 PyDict_SetItemString(d, "ERROR", PyInt_FromLong((long) CD_ERROR));
797 PyDict_SetItemString(d, "NODISC", PyInt_FromLong((long) CD_NODISC));
798 PyDict_SetItemString(d, "READY", PyInt_FromLong((long) CD_READY));
799 PyDict_SetItemString(d, "PLAYING", PyInt_FromLong((long) CD_PLAYING));
800 PyDict_SetItemString(d, "PAUSED", PyInt_FromLong((long) CD_PAUSED));
801 PyDict_SetItemString(d, "STILL", PyInt_FromLong((long) CD_STILL));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000802#ifdef CD_CDROM /* only newer versions of the library */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000803 PyDict_SetItemString(d, "CDROM", PyInt_FromLong((long) CD_CDROM));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000804#endif
805
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000806 if (PyErr_Occurred())
807 Py_FatalError("can't initialize module cd");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000808}