blob: 614eca1b06f555b3332c23c94157fd4c559f96d0 [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 *
Guido van Rossum16b8f301992-04-13 18:22:53 +000028CD_allowremoval(self, args)
29 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000030 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +000031{
Guido van Rossum43713e52000-02-29 13:59:29 +000032 if (!PyArg_ParseTuple(args, ":allowremoval"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000033 return NULL;
34
35 CDallowremoval(self->ob_cdplayer);
36
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000037 Py_INCREF(Py_None);
38 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000039}
40
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000041static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +000042CD_preventremoval(self, args)
43 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000044 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +000045{
Guido van Rossum43713e52000-02-29 13:59:29 +000046 if (!PyArg_ParseTuple(args, ":preventremoval"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000047 return NULL;
48
49 CDpreventremoval(self->ob_cdplayer);
50
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000051 Py_INCREF(Py_None);
52 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000053}
54
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000055static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +000056CD_bestreadsize(self, args)
57 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000058 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +000059{
Guido van Rossum43713e52000-02-29 13:59:29 +000060 if (!PyArg_ParseTuple(args, ":bestreadsize"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000061 return NULL;
62
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000063 return PyInt_FromLong((long) CDbestreadsize(self->ob_cdplayer));
Guido van Rossum16b8f301992-04-13 18:22:53 +000064}
65
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000066static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +000067CD_close(self, args)
68 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000069 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +000070{
Guido van Rossum43713e52000-02-29 13:59:29 +000071 if (!PyArg_ParseTuple(args, ":close"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000072 return NULL;
73
74 if (!CDclose(self->ob_cdplayer)) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000075 PyErr_SetFromErrno(CdError); /* XXX - ??? */
Guido van Rossum16b8f301992-04-13 18:22:53 +000076 return NULL;
77 }
78 self->ob_cdplayer = NULL;
79
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000080 Py_INCREF(Py_None);
81 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +000082}
83
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000084static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +000085CD_eject(self, args)
86 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000087 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +000088{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000089 CDSTATUS status;
90
Guido van Rossum43713e52000-02-29 13:59:29 +000091 if (!PyArg_ParseTuple(args, ":eject"))
Guido van Rossum16b8f301992-04-13 18:22:53 +000092 return NULL;
93
94 if (!CDeject(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000095 if (CDgetstatus(self->ob_cdplayer, &status) &&
96 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000097 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +000098 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +000099 PyErr_SetString(CdError, "eject failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000100 return NULL;
101 }
102
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000103 Py_INCREF(Py_None);
104 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000105}
106
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000107static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000108CD_getstatus(self, args)
109 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000110 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000111{
112 CDSTATUS status;
113
Guido van Rossum43713e52000-02-29 13:59:29 +0000114 if (!PyArg_ParseTuple(args, ":getstatus"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000115 return NULL;
116
117 if (!CDgetstatus(self->ob_cdplayer, &status)) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000118 PyErr_SetFromErrno(CdError); /* XXX - ??? */
Guido van Rossum16b8f301992-04-13 18:22:53 +0000119 return NULL;
120 }
121
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000122 return Py_BuildValue("(ii(iii)(iii)(iii)iiii)", status.state,
Guido van Rossumece6efe1992-04-15 15:56:11 +0000123 status.track, status.min, status.sec, status.frame,
124 status.abs_min, status.abs_sec, status.abs_frame,
125 status.total_min, status.total_sec, status.total_frame,
126 status.first, status.last, status.scsi_audio,
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000127 status.cur_block);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000128}
129
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000130static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000131CD_gettrackinfo(self, args)
132 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000133 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000134{
135 int track;
136 CDTRACKINFO info;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000137 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000138
Guido van Rossum43713e52000-02-29 13:59:29 +0000139 if (!PyArg_ParseTuple(args, "i:gettrackinfo", &track))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000140 return NULL;
141
142 if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000143 if (CDgetstatus(self->ob_cdplayer, &status) &&
144 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000145 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000146 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000147 PyErr_SetString(CdError, "gettrackinfo failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000148 return NULL;
149 }
150
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000151 return Py_BuildValue("((iii)(iii))",
Guido van Rossum16b8f301992-04-13 18:22:53 +0000152 info.start_min, info.start_sec, info.start_frame,
153 info.total_min, info.total_sec, info.total_frame);
154}
155
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000156static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000157CD_msftoblock(self, args)
158 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000159 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000160{
161 int min, sec, frame;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000162
Guido van Rossum43713e52000-02-29 13:59:29 +0000163 if (!PyArg_ParseTuple(args, "iii:msftoblock", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000164 return NULL;
165
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000166 return PyInt_FromLong((long) CDmsftoblock(self->ob_cdplayer,
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000167 min, sec, frame));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000168}
169
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000170static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000171CD_play(self, args)
172 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000173 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000174{
175 int start, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000176 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000177
Guido van Rossum43713e52000-02-29 13:59:29 +0000178 if (!PyArg_ParseTuple(args, "ii:play", &start, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000179 return NULL;
180
181 if (!CDplay(self->ob_cdplayer, start, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000182 if (CDgetstatus(self->ob_cdplayer, &status) &&
183 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000184 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000185 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000186 PyErr_SetString(CdError, "play failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000187 return NULL;
188 }
189
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000190 Py_INCREF(Py_None);
191 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000192}
193
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000194static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000195CD_playabs(self, args)
196 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000197 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000198{
199 int min, sec, frame, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000200 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000201
Guido van Rossum43713e52000-02-29 13:59:29 +0000202 if (!PyArg_ParseTuple(args, "iiii:playabs", &min, &sec, &frame, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000203 return NULL;
204
205 if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000206 if (CDgetstatus(self->ob_cdplayer, &status) &&
207 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000208 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000209 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000210 PyErr_SetString(CdError, "playabs failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000211 return NULL;
212 }
213
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000214 Py_INCREF(Py_None);
215 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000216}
217
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000218static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000219CD_playtrack(self, args)
220 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000221 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000222{
223 int start, 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, "ii:playtrack", &start, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000227 return NULL;
228
229 if (!CDplaytrack(self->ob_cdplayer, start, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000230 if (CDgetstatus(self->ob_cdplayer, &status) &&
231 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000232 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000233 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000234 PyErr_SetString(CdError, "playtrack failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000235 return NULL;
236 }
237
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000238 Py_INCREF(Py_None);
239 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000240}
241
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000242static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000243CD_playtrackabs(self, args)
244 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000245 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000246{
247 int track, min, sec, frame, play;
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000248 CDSTATUS status;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000249
Guido van Rossum43713e52000-02-29 13:59:29 +0000250 if (!PyArg_ParseTuple(args, "iiiii:playtrackabs", &track, &min, &sec,
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000251 &frame, &play))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000252 return NULL;
253
254 if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000255 if (CDgetstatus(self->ob_cdplayer, &status) &&
256 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000257 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000258 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000259 PyErr_SetString(CdError, "playtrackabs failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000260 return NULL;
261 }
262
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000263 Py_INCREF(Py_None);
264 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000265}
266
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000267static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000268CD_readda(self, args)
269 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000270 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000271{
272 int numframes, n;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000273 PyObject *result;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000274
Guido van Rossum43713e52000-02-29 13:59:29 +0000275 if (!PyArg_ParseTuple(args, "i:readda", &numframes))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000276 return NULL;
277
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000278 result = PyString_FromStringAndSize(NULL, numframes * sizeof(CDFRAME));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000279 if (result == NULL)
280 return NULL;
281
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000282 n = CDreadda(self->ob_cdplayer,
283 (CDFRAME *) PyString_AsString(result), numframes);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000284 if (n == -1) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000285 Py_DECREF(result);
286 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000287 return NULL;
288 }
289 if (n < numframes)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000290 if (_PyString_Resize(&result, n * sizeof(CDFRAME)))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000291 return NULL;
292
293 return result;
294}
295
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000296static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000297CD_seek(self, args)
298 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000299 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000300{
301 int min, sec, frame;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000302 long PyTryBlock;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000303
Guido van Rossum43713e52000-02-29 13:59:29 +0000304 if (!PyArg_ParseTuple(args, "iii:seek", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000305 return NULL;
306
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000307 PyTryBlock = CDseek(self->ob_cdplayer, min, sec, frame);
308 if (PyTryBlock == -1) {
309 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000310 return NULL;
311 }
312
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000313 return PyInt_FromLong(PyTryBlock);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000314}
315
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000316static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000317CD_seektrack(self, args)
318 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000319 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000320{
321 int track;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000322 long PyTryBlock;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000323
Guido van Rossum43713e52000-02-29 13:59:29 +0000324 if (!PyArg_ParseTuple(args, "i:seektrack", &track))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000325 return NULL;
326
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000327 PyTryBlock = CDseektrack(self->ob_cdplayer, track);
328 if (PyTryBlock == -1) {
329 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000330 return NULL;
331 }
332
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000333 return PyInt_FromLong(PyTryBlock);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000334}
335
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000336static PyObject *
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000337CD_seekblock(self, args)
338 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000339 PyObject *args;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000340{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000341 unsigned long PyTryBlock;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000342
Guido van Rossum43713e52000-02-29 13:59:29 +0000343 if (!PyArg_ParseTuple(args, "l:seekblock", &PyTryBlock))
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000344 return NULL;
345
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000346 PyTryBlock = CDseekblock(self->ob_cdplayer, PyTryBlock);
347 if (PyTryBlock == (unsigned long) -1) {
348 PyErr_SetFromErrno(CdError);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000349 return NULL;
350 }
351
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000352 return PyInt_FromLong(PyTryBlock);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000353}
354
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000355static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000356CD_stop(self, args)
357 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000358 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000359{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000360 CDSTATUS status;
361
Guido van Rossum43713e52000-02-29 13:59:29 +0000362 if (!PyArg_ParseTuple(args, ":stop"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000363 return NULL;
364
365 if (!CDstop(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000366 if (CDgetstatus(self->ob_cdplayer, &status) &&
367 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000368 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000369 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000370 PyErr_SetString(CdError, "stop failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000371 return NULL;
372 }
373
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000374 Py_INCREF(Py_None);
375 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000376}
377
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000378static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000379CD_togglepause(self, args)
380 cdplayerobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000381 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000382{
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000383 CDSTATUS status;
384
Guido van Rossum43713e52000-02-29 13:59:29 +0000385 if (!PyArg_ParseTuple(args, ":togglepause"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000386 return NULL;
387
388 if (!CDtogglepause(self->ob_cdplayer)) {
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000389 if (CDgetstatus(self->ob_cdplayer, &status) &&
390 status.state == CD_NODISC)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000391 PyErr_SetString(CdError, "no disc in player");
Guido van Rossumc3c7ac81992-05-06 09:48:30 +0000392 else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000393 PyErr_SetString(CdError, "togglepause failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000394 return NULL;
395 }
396
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000397 Py_INCREF(Py_None);
398 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000399}
400
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000401static PyMethodDef cdplayer_methods[] = {
402 {"allowremoval", (PyCFunction)CD_allowremoval, 1},
403 {"bestreadsize", (PyCFunction)CD_bestreadsize, 1},
404 {"close", (PyCFunction)CD_close, 1},
405 {"eject", (PyCFunction)CD_eject, 1},
406 {"getstatus", (PyCFunction)CD_getstatus, 1},
407 {"gettrackinfo", (PyCFunction)CD_gettrackinfo, 1},
408 {"msftoblock", (PyCFunction)CD_msftoblock, 1},
409 {"play", (PyCFunction)CD_play, 1},
410 {"playabs", (PyCFunction)CD_playabs, 1},
411 {"playtrack", (PyCFunction)CD_playtrack, 1},
412 {"playtrackabs", (PyCFunction)CD_playtrackabs, 1},
413 {"preventremoval", (PyCFunction)CD_preventremoval, 1},
414 {"readda", (PyCFunction)CD_readda, 1},
415 {"seek", (PyCFunction)CD_seek, 1},
416 {"seekblock", (PyCFunction)CD_seekblock, 1},
417 {"seektrack", (PyCFunction)CD_seektrack, 1},
418 {"stop", (PyCFunction)CD_stop, 1},
419 {"togglepause", (PyCFunction)CD_togglepause, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000420 {NULL, NULL} /* sentinel */
421};
422
423static void
424cdplayer_dealloc(self)
425 cdplayerobject *self;
426{
427 if (self->ob_cdplayer != NULL)
428 CDclose(self->ob_cdplayer);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000429 PyObject_Del(self);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000430}
431
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000432static PyObject *
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000433cdplayer_getattr(self, name)
434 cdplayerobject *self;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000435 char *name;
436{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000437 if (self->ob_cdplayer == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000438 PyErr_SetString(PyExc_RuntimeError, "no player active");
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000439 return NULL;
440 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000441 return Py_FindMethod(cdplayer_methods, (PyObject *)self, name);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000442}
443
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000444PyTypeObject CdPlayertype = {
445 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000446 0, /*ob_size*/
447 "cdplayer", /*tp_name*/
448 sizeof(cdplayerobject), /*tp_size*/
449 0, /*tp_itemsize*/
450 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000451 (destructor)cdplayer_dealloc, /*tp_dealloc*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000452 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000453 (getattrfunc)cdplayer_getattr, /*tp_getattr*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000454 0, /*tp_setattr*/
455 0, /*tp_compare*/
456 0, /*tp_repr*/
457};
458
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000459static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000460newcdplayerobject(cdp)
461 CDPLAYER *cdp;
462{
463 cdplayerobject *p;
464
Guido van Rossumb18618d2000-05-03 23:44:39 +0000465 p = PyObject_New(cdplayerobject, &CdPlayertype);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000466 if (p == NULL)
467 return NULL;
468 p->ob_cdplayer = cdp;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000469 return (PyObject *) p;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000470}
471
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000472static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000473CD_open(self, args)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000474 PyObject *self, *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000475{
476 char *dev, *direction;
477 CDPLAYER *cdp;
478
479 /*
480 * Variable number of args.
481 * First defaults to "None", second defaults to "r".
482 */
483 dev = NULL;
484 direction = "r";
Guido van Rossum43713e52000-02-29 13:59:29 +0000485 if (!PyArg_ParseTuple(args, "|zs:open", &dev, &direction))
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000486 return NULL;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000487
488 cdp = CDopen(dev, direction);
489 if (cdp == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000490 PyErr_SetFromErrno(CdError);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000491 return NULL;
492 }
493
494 return newcdplayerobject(cdp);
495}
496
497typedef struct {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000498 PyObject_HEAD
Guido van Rossum16b8f301992-04-13 18:22:53 +0000499 CDPARSER *ob_cdparser;
500 struct {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000501 PyObject *ob_cdcallback;
502 PyObject *ob_cdcallbackarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000503 } ob_cdcallbacks[NCALLBACKS];
504} cdparserobject;
505
506static void
507CD_callback(arg, type, data)
508 void *arg;
509 CDDATATYPES type;
510 void *data;
511{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000512 PyObject *result, *args, *v = NULL;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000513 char *p;
514 int i;
515 cdparserobject *self;
516
517 self = (cdparserobject *) arg;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000518 args = PyTuple_New(3);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000519 if (args == NULL)
520 return;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000521 Py_INCREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
522 PyTuple_SetItem(args, 0, self->ob_cdcallbacks[type].ob_cdcallbackarg);
523 PyTuple_SetItem(args, 1, PyInt_FromLong((long) type));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000524 switch (type) {
525 case cd_audio:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000526 v = PyString_FromStringAndSize(data, CDDA_DATASIZE);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000527 break;
528 case cd_pnum:
529 case cd_index:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000530 v = PyInt_FromLong(((CDPROGNUM *) data)->value);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000531 break;
532 case cd_ptime:
533 case cd_atime:
Guido van Rossumece6efe1992-04-15 15:56:11 +0000534#define ptr ((struct cdtimecode *) data)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000535 v = Py_BuildValue("(iii)",
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000536 ptr->mhi * 10 + ptr->mlo,
Guido van Rossumece6efe1992-04-15 15:56:11 +0000537 ptr->shi * 10 + ptr->slo,
538 ptr->fhi * 10 + ptr->flo);
539#undef ptr
Guido van Rossum16b8f301992-04-13 18:22:53 +0000540 break;
541 case cd_catalog:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000542 v = PyString_FromStringAndSize(NULL, 13);
543 p = PyString_AsString(v);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000544 for (i = 0; i < 13; i++)
545 *p++ = ((char *) data)[i] + '0';
546 break;
547 case cd_ident:
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000548#define ptr ((struct cdident *) data)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000549 v = PyString_FromStringAndSize(NULL, 12);
550 p = PyString_AsString(v);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000551 CDsbtoa(p, ptr->country, 2);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000552 p += 2;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000553 CDsbtoa(p, ptr->owner, 3);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000554 p += 3;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000555 *p++ = ptr->year[0] + '0';
556 *p++ = ptr->year[1] + '0';
557 *p++ = ptr->serial[0] + '0';
558 *p++ = ptr->serial[1] + '0';
559 *p++ = ptr->serial[2] + '0';
560 *p++ = ptr->serial[3] + '0';
561 *p++ = ptr->serial[4] + '0';
562#undef ptr
Guido van Rossum16b8f301992-04-13 18:22:53 +0000563 break;
564 case cd_control:
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000565 v = PyInt_FromLong((long) *((unchar *) data));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000566 break;
567 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000568 PyTuple_SetItem(args, 2, v);
569 if (PyErr_Occurred()) {
570 Py_DECREF(args);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000571 return;
572 }
573
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000574 result = PyEval_CallObject(self->ob_cdcallbacks[type].ob_cdcallback,
575 args);
576 Py_DECREF(args);
577 Py_XDECREF(result);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000578}
579
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000580static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000581CD_deleteparser(self, args)
582 cdparserobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000583 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000584{
585 int i;
586
Guido van Rossum43713e52000-02-29 13:59:29 +0000587 if (!PyArg_ParseTuple(args, ":deleteparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000588 return NULL;
589
590 CDdeleteparser(self->ob_cdparser);
591 self->ob_cdparser = NULL;
592
593 /* no sense in keeping the callbacks, so remove them */
594 for (i = 0; i < NCALLBACKS; i++) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000595 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000596 self->ob_cdcallbacks[i].ob_cdcallback = NULL;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000597 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000598 self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
599 }
600
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000601 Py_INCREF(Py_None);
602 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000603}
604
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000605static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000606CD_parseframe(self, args)
607 cdparserobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000608 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000609{
610 char *cdfp;
611 int length;
612 CDFRAME *p;
613
Guido van Rossum43713e52000-02-29 13:59:29 +0000614 if (!PyArg_ParseTuple(args, "s#:parseframe", &cdfp, &length))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000615 return NULL;
616
617 if (length % sizeof(CDFRAME) != 0) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000618 PyErr_SetString(PyExc_TypeError, "bad length");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000619 return NULL;
620 }
621
622 p = (CDFRAME *) cdfp;
623 while (length > 0) {
624 CDparseframe(self->ob_cdparser, p);
625 length -= sizeof(CDFRAME);
626 p++;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000627 if (PyErr_Occurred())
Guido van Rossum16b8f301992-04-13 18:22:53 +0000628 return NULL;
629 }
630
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000631 Py_INCREF(Py_None);
632 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000633}
634
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000635static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000636CD_removecallback(self, args)
637 cdparserobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000638 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000639{
640 int type;
641
Guido van Rossum43713e52000-02-29 13:59:29 +0000642 if (!PyArg_ParseTuple(args, "i:removecallback", &type))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000643 return NULL;
644
Guido van Rossumf16eda51992-08-03 19:06:59 +0000645 if (type < 0 || type >= NCALLBACKS) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000646 PyErr_SetString(PyExc_TypeError, "bad type");
Guido van Rossumf16eda51992-08-03 19:06:59 +0000647 return NULL;
648 }
649
Guido van Rossum16b8f301992-04-13 18:22:53 +0000650 CDremovecallback(self->ob_cdparser, (CDDATATYPES) type);
651
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000652 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000653 self->ob_cdcallbacks[type].ob_cdcallback = NULL;
654
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000655 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000656 self->ob_cdcallbacks[type].ob_cdcallbackarg = NULL;
657
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000658 Py_INCREF(Py_None);
659 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000660}
661
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000662static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000663CD_resetparser(self, args)
664 cdparserobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000665 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000666{
Guido van Rossum43713e52000-02-29 13:59:29 +0000667 if (!PyArg_ParseTuple(args, ":resetparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000668 return NULL;
669
670 CDresetparser(self->ob_cdparser);
671
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000672 Py_INCREF(Py_None);
673 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000674}
675
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000676static PyObject *
Guido van Rossumf16eda51992-08-03 19:06:59 +0000677CD_addcallback(self, args)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000678 cdparserobject *self;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000679 PyObject *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000680{
681 int type;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000682 PyObject *func, *funcarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000683
Guido van Rossum16b8f301992-04-13 18:22:53 +0000684 /* XXX - more work here */
Guido van Rossum43713e52000-02-29 13:59:29 +0000685 if (!PyArg_ParseTuple(args, "iOO:addcallback", &type, &func, &funcarg))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000686 return NULL;
687
688 if (type < 0 || type >= NCALLBACKS) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000689 PyErr_SetString(PyExc_TypeError, "argument out of range");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000690 return NULL;
691 }
692
Sjoerd Mullender7c4eb401992-09-25 11:15:58 +0000693#ifdef CDsetcallback
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000694 CDaddcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback,
695 (void *) self);
Guido van Rossumf16eda51992-08-03 19:06:59 +0000696#else
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000697 CDsetcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback,
698 (void *) self);
Guido van Rossumf16eda51992-08-03 19:06:59 +0000699#endif
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000700 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback);
701 Py_INCREF(func);
Guido van Rossum234f9421993-06-17 12:35:49 +0000702 self->ob_cdcallbacks[type].ob_cdcallback = func;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000703 Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg);
704 Py_INCREF(funcarg);
Guido van Rossum234f9421993-06-17 12:35:49 +0000705 self->ob_cdcallbacks[type].ob_cdcallbackarg = funcarg;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000706
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000707/*
708 if (type == cd_audio) {
709 sigfpe_[_UNDERFL].repls = _ZERO;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000710 handle_sigfpes(_ON, _EN_UNDERFL, NULL,
711 _ABORT_ON_ERROR, NULL);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000712 }
713*/
714
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000715 Py_INCREF(Py_None);
716 return Py_None;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000717}
718
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000719static PyMethodDef cdparser_methods[] = {
720 {"addcallback", (PyCFunction)CD_addcallback, 1},
721 {"deleteparser", (PyCFunction)CD_deleteparser, 1},
722 {"parseframe", (PyCFunction)CD_parseframe, 1},
723 {"removecallback", (PyCFunction)CD_removecallback, 1},
724 {"resetparser", (PyCFunction)CD_resetparser, 1},
725 /* backward compatibility */
726 {"setcallback", (PyCFunction)CD_addcallback, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000727 {NULL, NULL} /* sentinel */
728};
729
730static void
731cdparser_dealloc(self)
732 cdparserobject *self;
733{
734 int i;
735
736 for (i = 0; i < NCALLBACKS; i++) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000737 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000738 self->ob_cdcallbacks[i].ob_cdcallback = NULL;
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000739 Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000740 self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
741 }
742 CDdeleteparser(self->ob_cdparser);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000743 PyObject_Del(self);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000744}
745
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000746static PyObject *
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000747cdparser_getattr(self, name)
748 cdparserobject *self;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000749 char *name;
750{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000751 if (self->ob_cdparser == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000752 PyErr_SetString(PyExc_RuntimeError, "no parser active");
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000753 return NULL;
754 }
755
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000756 return Py_FindMethod(cdparser_methods, (PyObject *)self, name);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000757}
758
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000759PyTypeObject CdParsertype = {
760 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum16b8f301992-04-13 18:22:53 +0000761 0, /*ob_size*/
762 "cdparser", /*tp_name*/
763 sizeof(cdparserobject), /*tp_size*/
764 0, /*tp_itemsize*/
765 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000766 (destructor)cdparser_dealloc, /*tp_dealloc*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000767 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000768 (getattrfunc)cdparser_getattr, /*tp_getattr*/
Guido van Rossum16b8f301992-04-13 18:22:53 +0000769 0, /*tp_setattr*/
770 0, /*tp_compare*/
771 0, /*tp_repr*/
772};
773
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000774static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000775newcdparserobject(cdp)
776 CDPARSER *cdp;
777{
778 cdparserobject *p;
779 int i;
780
Guido van Rossumb18618d2000-05-03 23:44:39 +0000781 p = PyObject_New(cdparserobject, &CdParsertype);
Guido van Rossum16b8f301992-04-13 18:22:53 +0000782 if (p == NULL)
783 return NULL;
784 p->ob_cdparser = cdp;
785 for (i = 0; i < NCALLBACKS; i++) {
786 p->ob_cdcallbacks[i].ob_cdcallback = NULL;
787 p->ob_cdcallbacks[i].ob_cdcallbackarg = NULL;
788 }
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000789 return (PyObject *) p;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000790}
791
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000792static PyObject *
Guido van Rossum16b8f301992-04-13 18:22:53 +0000793CD_createparser(self, args)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000794 PyObject *self, *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000795{
796 CDPARSER *cdp;
797
Guido van Rossum43713e52000-02-29 13:59:29 +0000798 if (!PyArg_ParseTuple(args, ":createparser"))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000799 return NULL;
800 cdp = CDcreateparser();
801 if (cdp == NULL) {
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000802 PyErr_SetString(CdError, "createparser failed");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000803 return NULL;
804 }
805
806 return newcdparserobject(cdp);
807}
808
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000809static PyObject *
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000810CD_msftoframe(self, args)
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000811 PyObject *self, *args;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000812{
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000813 int min, sec, frame;
Guido van Rossum16b8f301992-04-13 18:22:53 +0000814
Guido van Rossum43713e52000-02-29 13:59:29 +0000815 if (!PyArg_ParseTuple(args, "iii:msftoframe", &min, &sec, &frame))
Guido van Rossum16b8f301992-04-13 18:22:53 +0000816 return NULL;
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000817
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000818 return PyInt_FromLong((long) CDmsftoframe(min, sec, frame));
Guido van Rossum16b8f301992-04-13 18:22:53 +0000819}
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000820
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000821static PyMethodDef CD_methods[] = {
822 {"open", (PyCFunction)CD_open, 1},
823 {"createparser", (PyCFunction)CD_createparser, 1},
824 {"msftoframe", (PyCFunction)CD_msftoframe, 1},
Guido van Rossum16b8f301992-04-13 18:22:53 +0000825 {NULL, NULL} /* Sentinel */
826};
827
828void
829initcd()
830{
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000831 PyObject *m, *d;
Sjoerd Mullender46927ba1992-09-24 10:48:40 +0000832
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000833 m = Py_InitModule("cd", CD_methods);
834 d = PyModule_GetDict(m);
Sjoerd Mullender46927ba1992-09-24 10:48:40 +0000835
Guido van Rossum88d8bee1997-10-01 04:43:39 +0000836 CdError = PyErr_NewException("cd.error", NULL, NULL);
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000837 PyDict_SetItemString(d, "error", CdError);
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000838
839 /* Identifiers for the different types of callbacks from the parser */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000840 PyDict_SetItemString(d, "audio", PyInt_FromLong((long) cd_audio));
841 PyDict_SetItemString(d, "pnum", PyInt_FromLong((long) cd_pnum));
842 PyDict_SetItemString(d, "index", PyInt_FromLong((long) cd_index));
843 PyDict_SetItemString(d, "ptime", PyInt_FromLong((long) cd_ptime));
844 PyDict_SetItemString(d, "atime", PyInt_FromLong((long) cd_atime));
845 PyDict_SetItemString(d, "catalog", PyInt_FromLong((long) cd_catalog));
846 PyDict_SetItemString(d, "ident", PyInt_FromLong((long) cd_ident));
847 PyDict_SetItemString(d, "control", PyInt_FromLong((long) cd_control));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000848
849 /* Block size information for digital audio data */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000850 PyDict_SetItemString(d, "DATASIZE",
851 PyInt_FromLong((long) CDDA_DATASIZE));
852 PyDict_SetItemString(d, "BLOCKSIZE",
853 PyInt_FromLong((long) CDDA_BLOCKSIZE));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000854
855 /* Possible states for the cd player */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000856 PyDict_SetItemString(d, "ERROR", PyInt_FromLong((long) CD_ERROR));
857 PyDict_SetItemString(d, "NODISC", PyInt_FromLong((long) CD_NODISC));
858 PyDict_SetItemString(d, "READY", PyInt_FromLong((long) CD_READY));
859 PyDict_SetItemString(d, "PLAYING", PyInt_FromLong((long) CD_PLAYING));
860 PyDict_SetItemString(d, "PAUSED", PyInt_FromLong((long) CD_PAUSED));
861 PyDict_SetItemString(d, "STILL", PyInt_FromLong((long) CD_STILL));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000862#ifdef CD_CDROM /* only newer versions of the library */
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000863 PyDict_SetItemString(d, "CDROM", PyInt_FromLong((long) CD_CDROM));
Sjoerd Mullender542659b1995-03-28 12:06:23 +0000864#endif
865
Roger E. Massebf0c3ca1997-01-03 23:00:51 +0000866 if (PyErr_Occurred())
867 Py_FatalError("can't initialize module cd");
Guido van Rossum16b8f301992-04-13 18:22:53 +0000868}