| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 1 | /* CD module -- interface to Mark Callow's and Roger Chickering's */ | 
 | 2 |  /* CD Audio Library (CD). */ | 
 | 3 |  | 
 | 4 | #include <sys/types.h> | 
 | 5 | #include <cdaudio.h> | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 6 | #include "Python.h" | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 7 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 8 | #define NCALLBACKS      8 | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 9 |  | 
 | 10 | typedef struct { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 11 |     PyObject_HEAD | 
 | 12 |     CDPLAYER *ob_cdplayer; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 13 | } cdplayerobject; | 
 | 14 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 15 | static PyObject *CdError;               /* exception cd.error */ | 
| Sjoerd Mullender | 46927ba | 1992-09-24 10:48:40 +0000 | [diff] [blame] | 16 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 17 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 18 | CD_allowremoval(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 19 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 20 |     if (!PyArg_ParseTuple(args, ":allowremoval")) | 
 | 21 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 22 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 23 |     CDallowremoval(self->ob_cdplayer); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 24 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 25 |     Py_INCREF(Py_None); | 
 | 26 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 27 | } | 
 | 28 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 29 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 30 | CD_preventremoval(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 31 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 32 |     if (!PyArg_ParseTuple(args, ":preventremoval")) | 
 | 33 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 34 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 35 |     CDpreventremoval(self->ob_cdplayer); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 36 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 37 |     Py_INCREF(Py_None); | 
 | 38 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 39 | } | 
 | 40 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 41 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 42 | CD_bestreadsize(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 43 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 44 |     if (!PyArg_ParseTuple(args, ":bestreadsize")) | 
 | 45 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 46 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 47 |     return PyInt_FromLong((long) CDbestreadsize(self->ob_cdplayer)); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 48 | } | 
 | 49 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 50 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 51 | CD_close(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 52 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 53 |     if (!PyArg_ParseTuple(args, ":close")) | 
 | 54 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 55 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 56 |     if (!CDclose(self->ob_cdplayer)) { | 
 | 57 |         PyErr_SetFromErrno(CdError); /* XXX - ??? */ | 
 | 58 |         return NULL; | 
 | 59 |     } | 
 | 60 |     self->ob_cdplayer = NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 61 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 62 |     Py_INCREF(Py_None); | 
 | 63 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 64 | } | 
 | 65 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 66 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 67 | CD_eject(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 68 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 69 |     CDSTATUS status; | 
| Guido van Rossum | c3c7ac8 | 1992-05-06 09:48:30 +0000 | [diff] [blame] | 70 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 71 |     if (!PyArg_ParseTuple(args, ":eject")) | 
 | 72 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 73 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 74 |     if (!CDeject(self->ob_cdplayer)) { | 
 | 75 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 76 |             status.state == CD_NODISC) | 
 | 77 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 78 |         else | 
 | 79 |             PyErr_SetString(CdError, "eject failed"); | 
 | 80 |         return NULL; | 
 | 81 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 82 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 83 |     Py_INCREF(Py_None); | 
 | 84 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 85 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 86 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 87 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 88 | CD_getstatus(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 89 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 90 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 91 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 92 |     if (!PyArg_ParseTuple(args, ":getstatus")) | 
 | 93 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 94 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 95 |     if (!CDgetstatus(self->ob_cdplayer, &status)) { | 
 | 96 |         PyErr_SetFromErrno(CdError); /* XXX - ??? */ | 
 | 97 |         return NULL; | 
 | 98 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 99 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 100 |     return Py_BuildValue("(ii(iii)(iii)(iii)iiii)", status.state, | 
 | 101 |                    status.track, status.min, status.sec, status.frame, | 
 | 102 |                    status.abs_min, status.abs_sec, status.abs_frame, | 
 | 103 |                    status.total_min, status.total_sec, status.total_frame, | 
 | 104 |                    status.first, status.last, status.scsi_audio, | 
 | 105 |                    status.cur_block); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 106 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 107 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 108 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 109 | CD_gettrackinfo(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 110 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 111 |     int track; | 
 | 112 |     CDTRACKINFO info; | 
 | 113 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 114 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 115 |     if (!PyArg_ParseTuple(args, "i:gettrackinfo", &track)) | 
 | 116 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 117 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 118 |     if (!CDgettrackinfo(self->ob_cdplayer, track, &info)) { | 
 | 119 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 120 |             status.state == CD_NODISC) | 
 | 121 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 122 |         else | 
 | 123 |             PyErr_SetString(CdError, "gettrackinfo failed"); | 
 | 124 |         return NULL; | 
 | 125 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 126 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 127 |     return Py_BuildValue("((iii)(iii))", | 
 | 128 |                    info.start_min, info.start_sec, info.start_frame, | 
 | 129 |                    info.total_min, info.total_sec, info.total_frame); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 130 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 131 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 132 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 133 | CD_msftoblock(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 134 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 135 |     int min, sec, frame; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 136 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 137 |     if (!PyArg_ParseTuple(args, "iii:msftoblock", &min, &sec, &frame)) | 
 | 138 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 139 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 140 |     return PyInt_FromLong((long) CDmsftoblock(self->ob_cdplayer, | 
 | 141 |                                             min, sec, frame)); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 142 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 143 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 144 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 145 | CD_play(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 146 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 147 |     int start, play; | 
 | 148 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 149 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 150 |     if (!PyArg_ParseTuple(args, "ii:play", &start, &play)) | 
 | 151 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 152 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 153 |     if (!CDplay(self->ob_cdplayer, start, play)) { | 
 | 154 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 155 |             status.state == CD_NODISC) | 
 | 156 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 157 |         else | 
 | 158 |             PyErr_SetString(CdError, "play failed"); | 
 | 159 |         return NULL; | 
 | 160 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 161 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 162 |     Py_INCREF(Py_None); | 
 | 163 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 164 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 165 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 166 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 167 | CD_playabs(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 168 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 169 |     int min, sec, frame, play; | 
 | 170 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 171 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 172 |     if (!PyArg_ParseTuple(args, "iiii:playabs", &min, &sec, &frame, &play)) | 
 | 173 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 174 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 175 |     if (!CDplayabs(self->ob_cdplayer, min, sec, frame, play)) { | 
 | 176 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 177 |             status.state == CD_NODISC) | 
 | 178 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 179 |         else | 
 | 180 |             PyErr_SetString(CdError, "playabs failed"); | 
 | 181 |         return NULL; | 
 | 182 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 183 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 184 |     Py_INCREF(Py_None); | 
 | 185 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 186 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 187 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 188 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 189 | CD_playtrack(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 190 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 191 |     int start, play; | 
 | 192 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 193 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 194 |     if (!PyArg_ParseTuple(args, "ii:playtrack", &start, &play)) | 
 | 195 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 196 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 197 |     if (!CDplaytrack(self->ob_cdplayer, start, play)) { | 
 | 198 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 199 |             status.state == CD_NODISC) | 
 | 200 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 201 |         else | 
 | 202 |             PyErr_SetString(CdError, "playtrack failed"); | 
 | 203 |         return NULL; | 
 | 204 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 205 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 206 |     Py_INCREF(Py_None); | 
 | 207 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 208 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 209 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 210 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 211 | CD_playtrackabs(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 212 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 213 |     int track, min, sec, frame, play; | 
 | 214 |     CDSTATUS status; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 215 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 216 |     if (!PyArg_ParseTuple(args, "iiiii:playtrackabs", &track, &min, &sec, | 
 | 217 |                           &frame, &play)) | 
 | 218 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 219 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 220 |     if (!CDplaytrackabs(self->ob_cdplayer, track, min, sec, frame, play)) { | 
 | 221 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 222 |             status.state == CD_NODISC) | 
 | 223 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 224 |         else | 
 | 225 |             PyErr_SetString(CdError, "playtrackabs failed"); | 
 | 226 |         return NULL; | 
 | 227 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 228 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 229 |     Py_INCREF(Py_None); | 
 | 230 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 231 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 232 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 233 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 234 | CD_readda(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 235 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 236 |     int numframes, n; | 
 | 237 |     PyObject *result; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 238 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 239 |     if (!PyArg_ParseTuple(args, "i:readda", &numframes)) | 
 | 240 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 241 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 242 |     result = PyString_FromStringAndSize(NULL, numframes * sizeof(CDFRAME)); | 
 | 243 |     if (result == NULL) | 
 | 244 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 245 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 246 |     n = CDreadda(self->ob_cdplayer, | 
 | 247 |                    (CDFRAME *) PyString_AsString(result), numframes); | 
 | 248 |     if (n == -1) { | 
 | 249 |         Py_DECREF(result); | 
 | 250 |         PyErr_SetFromErrno(CdError); | 
 | 251 |         return NULL; | 
 | 252 |     } | 
 | 253 |     if (n < numframes) | 
 | 254 |         _PyString_Resize(&result, n * sizeof(CDFRAME)); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 255 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 256 |     return result; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 257 | } | 
 | 258 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 259 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 260 | CD_seek(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 261 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 262 |     int min, sec, frame; | 
 | 263 |     long PyTryBlock; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 264 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 265 |     if (!PyArg_ParseTuple(args, "iii:seek", &min, &sec, &frame)) | 
 | 266 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 267 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 268 |     PyTryBlock = CDseek(self->ob_cdplayer, min, sec, frame); | 
 | 269 |     if (PyTryBlock == -1) { | 
 | 270 |         PyErr_SetFromErrno(CdError); | 
 | 271 |         return NULL; | 
 | 272 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 273 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 274 |     return PyInt_FromLong(PyTryBlock); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 275 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 276 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 277 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 278 | CD_seektrack(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 279 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 280 |     int track; | 
 | 281 |     long PyTryBlock; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 282 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 283 |     if (!PyArg_ParseTuple(args, "i:seektrack", &track)) | 
 | 284 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 285 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 286 |     PyTryBlock = CDseektrack(self->ob_cdplayer, track); | 
 | 287 |     if (PyTryBlock == -1) { | 
 | 288 |         PyErr_SetFromErrno(CdError); | 
 | 289 |         return NULL; | 
 | 290 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 291 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 292 |     return PyInt_FromLong(PyTryBlock); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 293 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 294 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 295 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 296 | CD_seekblock(cdplayerobject *self, PyObject *args) | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 297 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 298 |     unsigned long PyTryBlock; | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 299 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 300 |     if (!PyArg_ParseTuple(args, "l:seekblock", &PyTryBlock)) | 
 | 301 |         return NULL; | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 302 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 303 |     PyTryBlock = CDseekblock(self->ob_cdplayer, PyTryBlock); | 
 | 304 |     if (PyTryBlock == (unsigned long) -1) { | 
 | 305 |         PyErr_SetFromErrno(CdError); | 
 | 306 |         return NULL; | 
 | 307 |     } | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 308 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 309 |     return PyInt_FromLong(PyTryBlock); | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 310 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 311 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 312 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 313 | CD_stop(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 314 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 315 |     CDSTATUS status; | 
| Guido van Rossum | c3c7ac8 | 1992-05-06 09:48:30 +0000 | [diff] [blame] | 316 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 317 |     if (!PyArg_ParseTuple(args, ":stop")) | 
 | 318 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 319 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 320 |     if (!CDstop(self->ob_cdplayer)) { | 
 | 321 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 322 |             status.state == CD_NODISC) | 
 | 323 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 324 |         else | 
 | 325 |             PyErr_SetString(CdError, "stop failed"); | 
 | 326 |         return NULL; | 
 | 327 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 328 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 329 |     Py_INCREF(Py_None); | 
 | 330 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 331 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 332 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 333 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 334 | CD_togglepause(cdplayerobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 335 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 336 |     CDSTATUS status; | 
| Guido van Rossum | c3c7ac8 | 1992-05-06 09:48:30 +0000 | [diff] [blame] | 337 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 338 |     if (!PyArg_ParseTuple(args, ":togglepause")) | 
 | 339 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 340 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 341 |     if (!CDtogglepause(self->ob_cdplayer)) { | 
 | 342 |         if (CDgetstatus(self->ob_cdplayer, &status) && | 
 | 343 |             status.state == CD_NODISC) | 
 | 344 |             PyErr_SetString(CdError, "no disc in player"); | 
 | 345 |         else | 
 | 346 |             PyErr_SetString(CdError, "togglepause failed"); | 
 | 347 |         return NULL; | 
 | 348 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 349 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 350 |     Py_INCREF(Py_None); | 
 | 351 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 352 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 353 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 354 | static PyMethodDef cdplayer_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 355 |     {"allowremoval",            (PyCFunction)CD_allowremoval,   METH_VARARGS}, | 
 | 356 |     {"bestreadsize",            (PyCFunction)CD_bestreadsize,   METH_VARARGS}, | 
 | 357 |     {"close",                   (PyCFunction)CD_close,          METH_VARARGS}, | 
 | 358 |     {"eject",                   (PyCFunction)CD_eject,          METH_VARARGS}, | 
 | 359 |     {"getstatus",               (PyCFunction)CD_getstatus,              METH_VARARGS}, | 
 | 360 |     {"gettrackinfo",            (PyCFunction)CD_gettrackinfo,   METH_VARARGS}, | 
 | 361 |     {"msftoblock",              (PyCFunction)CD_msftoblock,             METH_VARARGS}, | 
 | 362 |     {"play",                    (PyCFunction)CD_play,           METH_VARARGS}, | 
 | 363 |     {"playabs",                 (PyCFunction)CD_playabs,                METH_VARARGS}, | 
 | 364 |     {"playtrack",               (PyCFunction)CD_playtrack,              METH_VARARGS}, | 
 | 365 |     {"playtrackabs",            (PyCFunction)CD_playtrackabs,   METH_VARARGS}, | 
 | 366 |     {"preventremoval",          (PyCFunction)CD_preventremoval, METH_VARARGS}, | 
 | 367 |     {"readda",                  (PyCFunction)CD_readda,         METH_VARARGS}, | 
 | 368 |     {"seek",                    (PyCFunction)CD_seek,           METH_VARARGS}, | 
 | 369 |     {"seekblock",               (PyCFunction)CD_seekblock,              METH_VARARGS}, | 
 | 370 |     {"seektrack",               (PyCFunction)CD_seektrack,              METH_VARARGS}, | 
 | 371 |     {"stop",                    (PyCFunction)CD_stop,           METH_VARARGS}, | 
 | 372 |     {"togglepause",             (PyCFunction)CD_togglepause,    METH_VARARGS}, | 
 | 373 |     {NULL,                      NULL}           /* sentinel */ | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 374 | }; | 
 | 375 |  | 
 | 376 | static void | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 377 | cdplayer_dealloc(cdplayerobject *self) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 378 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 379 |     if (self->ob_cdplayer != NULL) | 
 | 380 |         CDclose(self->ob_cdplayer); | 
 | 381 |     PyObject_Del(self); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 382 | } | 
 | 383 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 384 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 385 | cdplayer_getattr(cdplayerobject *self, char *name) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 386 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 387 |     if (self->ob_cdplayer == NULL) { | 
 | 388 |         PyErr_SetString(PyExc_RuntimeError, "no player active"); | 
 | 389 |         return NULL; | 
 | 390 |     } | 
 | 391 |     return Py_FindMethod(cdplayer_methods, (PyObject *)self, name); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 392 | } | 
 | 393 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 394 | PyTypeObject CdPlayertype = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 395 |     PyObject_HEAD_INIT(&PyType_Type) | 
 | 396 |     0,                          /*ob_size*/ | 
 | 397 |     "cd.cdplayer",      /*tp_name*/ | 
 | 398 |     sizeof(cdplayerobject),     /*tp_size*/ | 
 | 399 |     0,                          /*tp_itemsize*/ | 
 | 400 |     /* methods */ | 
 | 401 |     (destructor)cdplayer_dealloc, /*tp_dealloc*/ | 
 | 402 |     0,                          /*tp_print*/ | 
 | 403 |     (getattrfunc)cdplayer_getattr, /*tp_getattr*/ | 
 | 404 |     0,                          /*tp_setattr*/ | 
 | 405 |     0,                          /*tp_compare*/ | 
 | 406 |     0,                          /*tp_repr*/ | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 407 | }; | 
 | 408 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 409 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 410 | newcdplayerobject(CDPLAYER *cdp) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 411 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 412 |     cdplayerobject *p; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 413 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 414 |     p = PyObject_New(cdplayerobject, &CdPlayertype); | 
 | 415 |     if (p == NULL) | 
 | 416 |         return NULL; | 
 | 417 |     p->ob_cdplayer = cdp; | 
 | 418 |     return (PyObject *) p; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 419 | } | 
 | 420 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 421 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 422 | CD_open(PyObject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 423 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 424 |     char *dev, *direction; | 
 | 425 |     CDPLAYER *cdp; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 426 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 427 |     /* | 
 | 428 |      * Variable number of args. | 
 | 429 |      * First defaults to "None", second defaults to "r". | 
 | 430 |      */ | 
 | 431 |     dev = NULL; | 
 | 432 |     direction = "r"; | 
 | 433 |     if (!PyArg_ParseTuple(args, "|zs:open", &dev, &direction)) | 
 | 434 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 435 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 436 |     cdp = CDopen(dev, direction); | 
 | 437 |     if (cdp == NULL) { | 
 | 438 |         PyErr_SetFromErrno(CdError); | 
 | 439 |         return NULL; | 
 | 440 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 441 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 442 |     return newcdplayerobject(cdp); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 443 | } | 
 | 444 |  | 
 | 445 | typedef struct { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 446 |     PyObject_HEAD | 
 | 447 |     CDPARSER *ob_cdparser; | 
 | 448 |     struct { | 
 | 449 |         PyObject *ob_cdcallback; | 
 | 450 |         PyObject *ob_cdcallbackarg; | 
 | 451 |     } ob_cdcallbacks[NCALLBACKS]; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 452 | } cdparserobject; | 
 | 453 |  | 
 | 454 | static void | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 455 | CD_callback(void *arg, CDDATATYPES type, void *data) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 456 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 457 |     PyObject *result, *args, *v = NULL; | 
 | 458 |     char *p; | 
 | 459 |     int i; | 
 | 460 |     cdparserobject *self; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 461 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 462 |     self = (cdparserobject *) arg; | 
 | 463 |     args = PyTuple_New(3); | 
 | 464 |     if (args == NULL) | 
 | 465 |         return; | 
 | 466 |     Py_INCREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); | 
 | 467 |     PyTuple_SetItem(args, 0, self->ob_cdcallbacks[type].ob_cdcallbackarg); | 
 | 468 |     PyTuple_SetItem(args, 1, PyInt_FromLong((long) type)); | 
 | 469 |     switch (type) { | 
 | 470 |     case cd_audio: | 
 | 471 |         v = PyString_FromStringAndSize(data, CDDA_DATASIZE); | 
 | 472 |         break; | 
 | 473 |     case cd_pnum: | 
 | 474 |     case cd_index: | 
 | 475 |         v = PyInt_FromLong(((CDPROGNUM *) data)->value); | 
 | 476 |         break; | 
 | 477 |     case cd_ptime: | 
 | 478 |     case cd_atime: | 
| Guido van Rossum | ece6efe | 1992-04-15 15:56:11 +0000 | [diff] [blame] | 479 | #define ptr ((struct cdtimecode *) data) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 480 |         v = Py_BuildValue("(iii)", | 
 | 481 |                     ptr->mhi * 10 + ptr->mlo, | 
 | 482 |                     ptr->shi * 10 + ptr->slo, | 
 | 483 |                     ptr->fhi * 10 + ptr->flo); | 
| Guido van Rossum | ece6efe | 1992-04-15 15:56:11 +0000 | [diff] [blame] | 484 | #undef ptr | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 485 |         break; | 
 | 486 |     case cd_catalog: | 
 | 487 |         v = PyString_FromStringAndSize(NULL, 13); | 
 | 488 |         p = PyString_AsString(v); | 
 | 489 |         for (i = 0; i < 13; i++) | 
 | 490 |             *p++ = ((char *) data)[i] + '0'; | 
 | 491 |         break; | 
 | 492 |     case cd_ident: | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 493 | #define ptr ((struct cdident *) data) | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 494 |         v = PyString_FromStringAndSize(NULL, 12); | 
 | 495 |         p = PyString_AsString(v); | 
 | 496 |         CDsbtoa(p, ptr->country, 2); | 
 | 497 |         p += 2; | 
 | 498 |         CDsbtoa(p, ptr->owner, 3); | 
 | 499 |         p += 3; | 
 | 500 |         *p++ = ptr->year[0] + '0'; | 
 | 501 |         *p++ = ptr->year[1] + '0'; | 
 | 502 |         *p++ = ptr->serial[0] + '0'; | 
 | 503 |         *p++ = ptr->serial[1] + '0'; | 
 | 504 |         *p++ = ptr->serial[2] + '0'; | 
 | 505 |         *p++ = ptr->serial[3] + '0'; | 
 | 506 |         *p++ = ptr->serial[4] + '0'; | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 507 | #undef ptr | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 508 |         break; | 
 | 509 |     case cd_control: | 
 | 510 |         v = PyInt_FromLong((long) *((unchar *) data)); | 
 | 511 |         break; | 
 | 512 |     } | 
 | 513 |     PyTuple_SetItem(args, 2, v); | 
 | 514 |     if (PyErr_Occurred()) { | 
 | 515 |         Py_DECREF(args); | 
 | 516 |         return; | 
 | 517 |     } | 
 | 518 |  | 
 | 519 |     result = PyEval_CallObject(self->ob_cdcallbacks[type].ob_cdcallback, | 
 | 520 |                                args); | 
 | 521 |     Py_DECREF(args); | 
 | 522 |     Py_XDECREF(result); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 523 | } | 
 | 524 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 525 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 526 | CD_deleteparser(cdparserobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 527 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 528 |     int i; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 529 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 530 |     if (!PyArg_ParseTuple(args, ":deleteparser")) | 
 | 531 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 532 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 533 |     CDdeleteparser(self->ob_cdparser); | 
 | 534 |     self->ob_cdparser = NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 535 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 536 |     /* no sense in keeping the callbacks, so remove them */ | 
 | 537 |     for (i = 0; i < NCALLBACKS; i++) { | 
 | 538 |         Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback); | 
 | 539 |         self->ob_cdcallbacks[i].ob_cdcallback = NULL; | 
 | 540 |         Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg); | 
 | 541 |         self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; | 
 | 542 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 543 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 544 |     Py_INCREF(Py_None); | 
 | 545 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 546 | } | 
 | 547 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 548 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 549 | CD_parseframe(cdparserobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 550 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 551 |     char *cdfp; | 
 | 552 |     int length; | 
 | 553 |     CDFRAME *p; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 554 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 555 |     if (!PyArg_ParseTuple(args, "s#:parseframe", &cdfp, &length)) | 
 | 556 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 557 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 558 |     if (length % sizeof(CDFRAME) != 0) { | 
 | 559 |         PyErr_SetString(PyExc_TypeError, "bad length"); | 
 | 560 |         return NULL; | 
 | 561 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 562 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 563 |     p = (CDFRAME *) cdfp; | 
 | 564 |     while (length > 0) { | 
 | 565 |         CDparseframe(self->ob_cdparser, p); | 
 | 566 |         length -= sizeof(CDFRAME); | 
 | 567 |         p++; | 
 | 568 |         if (PyErr_Occurred()) | 
 | 569 |             return NULL; | 
 | 570 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 571 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 572 |     Py_INCREF(Py_None); | 
 | 573 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 574 | } | 
 | 575 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 576 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 577 | CD_removecallback(cdparserobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 578 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 579 |     int type; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 580 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 581 |     if (!PyArg_ParseTuple(args, "i:removecallback", &type)) | 
 | 582 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 583 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 584 |     if (type < 0 || type >= NCALLBACKS) { | 
 | 585 |         PyErr_SetString(PyExc_TypeError, "bad type"); | 
 | 586 |         return NULL; | 
 | 587 |     } | 
| Guido van Rossum | f16eda5 | 1992-08-03 19:06:59 +0000 | [diff] [blame] | 588 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 589 |     CDremovecallback(self->ob_cdparser, (CDDATATYPES) type); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 590 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 591 |     Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback); | 
 | 592 |     self->ob_cdcallbacks[type].ob_cdcallback = NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 593 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 594 |     Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); | 
 | 595 |     self->ob_cdcallbacks[type].ob_cdcallbackarg = NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 596 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 597 |     Py_INCREF(Py_None); | 
 | 598 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 599 | } | 
 | 600 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 601 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 602 | CD_resetparser(cdparserobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 603 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 604 |     if (!PyArg_ParseTuple(args, ":resetparser")) | 
 | 605 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 606 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 607 |     CDresetparser(self->ob_cdparser); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 608 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 609 |     Py_INCREF(Py_None); | 
 | 610 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 611 | } | 
 | 612 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 613 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 614 | CD_addcallback(cdparserobject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 615 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 616 |     int type; | 
 | 617 |     PyObject *func, *funcarg; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 618 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 619 |     /* XXX - more work here */ | 
 | 620 |     if (!PyArg_ParseTuple(args, "iOO:addcallback", &type, &func, &funcarg)) | 
 | 621 |         return NULL; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 622 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 623 |     if (type < 0 || type >= NCALLBACKS) { | 
 | 624 |         PyErr_SetString(PyExc_TypeError, "argument out of range"); | 
 | 625 |         return NULL; | 
 | 626 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 627 |  | 
| Sjoerd Mullender | 7c4eb40 | 1992-09-25 11:15:58 +0000 | [diff] [blame] | 628 | #ifdef CDsetcallback | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 629 |     CDaddcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback, | 
 | 630 |                   (void *) self); | 
| Guido van Rossum | f16eda5 | 1992-08-03 19:06:59 +0000 | [diff] [blame] | 631 | #else | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 632 |     CDsetcallback(self->ob_cdparser, (CDDATATYPES) type, CD_callback, | 
 | 633 |                   (void *) self); | 
| Guido van Rossum | f16eda5 | 1992-08-03 19:06:59 +0000 | [diff] [blame] | 634 | #endif | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 635 |     Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallback); | 
 | 636 |     Py_INCREF(func); | 
 | 637 |     self->ob_cdcallbacks[type].ob_cdcallback = func; | 
 | 638 |     Py_XDECREF(self->ob_cdcallbacks[type].ob_cdcallbackarg); | 
 | 639 |     Py_INCREF(funcarg); | 
 | 640 |     self->ob_cdcallbacks[type].ob_cdcallbackarg = funcarg; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 641 |  | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 642 | /* | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 643 |     if (type == cd_audio) { | 
 | 644 |         sigfpe_[_UNDERFL].repls = _ZERO; | 
 | 645 |         handle_sigfpes(_ON, _EN_UNDERFL, NULL, | 
 | 646 |                                 _ABORT_ON_ERROR, NULL); | 
 | 647 |     } | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 648 | */ | 
 | 649 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 650 |     Py_INCREF(Py_None); | 
 | 651 |     return Py_None; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 652 | } | 
 | 653 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 654 | static PyMethodDef cdparser_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 655 |     {"addcallback",             (PyCFunction)CD_addcallback,    METH_VARARGS}, | 
 | 656 |     {"deleteparser",            (PyCFunction)CD_deleteparser,   METH_VARARGS}, | 
 | 657 |     {"parseframe",              (PyCFunction)CD_parseframe,     METH_VARARGS}, | 
 | 658 |     {"removecallback",          (PyCFunction)CD_removecallback, METH_VARARGS}, | 
 | 659 |     {"resetparser",             (PyCFunction)CD_resetparser,    METH_VARARGS}, | 
 | 660 |                                             /* backward compatibility */ | 
 | 661 |     {"setcallback",             (PyCFunction)CD_addcallback,    METH_VARARGS}, | 
 | 662 |     {NULL,                      NULL}           /* sentinel */ | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 663 | }; | 
 | 664 |  | 
 | 665 | static void | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 666 | cdparser_dealloc(cdparserobject *self) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 667 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 668 |     int i; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 669 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 670 |     for (i = 0; i < NCALLBACKS; i++) { | 
 | 671 |         Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallback); | 
 | 672 |         self->ob_cdcallbacks[i].ob_cdcallback = NULL; | 
 | 673 |         Py_XDECREF(self->ob_cdcallbacks[i].ob_cdcallbackarg); | 
 | 674 |         self->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; | 
 | 675 |     } | 
 | 676 |     CDdeleteparser(self->ob_cdparser); | 
 | 677 |     PyObject_Del(self); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 678 | } | 
 | 679 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 680 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 681 | cdparser_getattr(cdparserobject *self, char *name) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 682 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 683 |     if (self->ob_cdparser == NULL) { | 
 | 684 |         PyErr_SetString(PyExc_RuntimeError, "no parser active"); | 
 | 685 |         return NULL; | 
 | 686 |     } | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 687 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 688 |     return Py_FindMethod(cdparser_methods, (PyObject *)self, name); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 689 | } | 
 | 690 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 691 | PyTypeObject CdParsertype = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 692 |     PyObject_HEAD_INIT(&PyType_Type) | 
 | 693 |     0,                          /*ob_size*/ | 
 | 694 |     "cd.cdparser",              /*tp_name*/ | 
 | 695 |     sizeof(cdparserobject),     /*tp_size*/ | 
 | 696 |     0,                          /*tp_itemsize*/ | 
 | 697 |     /* methods */ | 
 | 698 |     (destructor)cdparser_dealloc, /*tp_dealloc*/ | 
 | 699 |     0,                          /*tp_print*/ | 
 | 700 |     (getattrfunc)cdparser_getattr, /*tp_getattr*/ | 
 | 701 |     0,                          /*tp_setattr*/ | 
 | 702 |     0,                          /*tp_compare*/ | 
 | 703 |     0,                          /*tp_repr*/ | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 704 | }; | 
 | 705 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 706 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 707 | newcdparserobject(CDPARSER *cdp) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 708 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 709 |     cdparserobject *p; | 
 | 710 |     int i; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 711 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 712 |     p = PyObject_New(cdparserobject, &CdParsertype); | 
 | 713 |     if (p == NULL) | 
 | 714 |         return NULL; | 
 | 715 |     p->ob_cdparser = cdp; | 
 | 716 |     for (i = 0; i < NCALLBACKS; i++) { | 
 | 717 |         p->ob_cdcallbacks[i].ob_cdcallback = NULL; | 
 | 718 |         p->ob_cdcallbacks[i].ob_cdcallbackarg = NULL; | 
 | 719 |     } | 
 | 720 |     return (PyObject *) p; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 721 | } | 
 | 722 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 723 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 724 | CD_createparser(PyObject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 725 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 726 |     CDPARSER *cdp; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 727 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 728 |     if (!PyArg_ParseTuple(args, ":createparser")) | 
 | 729 |         return NULL; | 
 | 730 |     cdp = CDcreateparser(); | 
 | 731 |     if (cdp == NULL) { | 
 | 732 |         PyErr_SetString(CdError, "createparser failed"); | 
 | 733 |         return NULL; | 
 | 734 |     } | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 735 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 736 |     return newcdparserobject(cdp); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 737 | } | 
 | 738 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 739 | static PyObject * | 
| Peter Schneider-Kamp | 6a85027 | 2000-07-10 17:04:33 +0000 | [diff] [blame] | 740 | CD_msftoframe(PyObject *self, PyObject *args) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 741 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 742 |     int min, sec, frame; | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 743 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 744 |     if (!PyArg_ParseTuple(args, "iii:msftoframe", &min, &sec, &frame)) | 
 | 745 |         return NULL; | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 746 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 747 |     return PyInt_FromLong((long) CDmsftoframe(min, sec, frame)); | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 748 | } | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 749 |  | 
| Roger E. Masse | bf0c3ca | 1997-01-03 23:00:51 +0000 | [diff] [blame] | 750 | static PyMethodDef CD_methods[] = { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 751 |     {"open",                    (PyCFunction)CD_open,           METH_VARARGS}, | 
 | 752 |     {"createparser",            (PyCFunction)CD_createparser,   METH_VARARGS}, | 
 | 753 |     {"msftoframe",              (PyCFunction)CD_msftoframe,     METH_VARARGS}, | 
 | 754 |     {NULL,              NULL}   /* Sentinel */ | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 755 | }; | 
 | 756 |  | 
 | 757 | void | 
| Thomas Wouters | f3f33dc | 2000-07-21 06:00:07 +0000 | [diff] [blame] | 758 | initcd(void) | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 759 | { | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 760 |     PyObject *m, *d; | 
| Sjoerd Mullender | 46927ba | 1992-09-24 10:48:40 +0000 | [diff] [blame] | 761 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 762 |     if (PyErr_WarnPy3k("the cd module has been removed in " | 
 | 763 |                        "Python 3.0", 2) < 0) | 
 | 764 |         return; | 
| Sjoerd Mullender | 46927ba | 1992-09-24 10:48:40 +0000 | [diff] [blame] | 765 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 766 |     m = Py_InitModule("cd", CD_methods); | 
 | 767 |     if (m == NULL) | 
 | 768 |         return; | 
 | 769 |     d = PyModule_GetDict(m); | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 770 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 771 |     CdError = PyErr_NewException("cd.error", NULL, NULL); | 
 | 772 |     PyDict_SetItemString(d, "error", CdError); | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 773 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 774 |     /* Identifiers for the different types of callbacks from the parser */ | 
 | 775 |     PyDict_SetItemString(d, "audio", PyInt_FromLong((long) cd_audio)); | 
 | 776 |     PyDict_SetItemString(d, "pnum", PyInt_FromLong((long) cd_pnum)); | 
 | 777 |     PyDict_SetItemString(d, "index", PyInt_FromLong((long) cd_index)); | 
 | 778 |     PyDict_SetItemString(d, "ptime", PyInt_FromLong((long) cd_ptime)); | 
 | 779 |     PyDict_SetItemString(d, "atime", PyInt_FromLong((long) cd_atime)); | 
 | 780 |     PyDict_SetItemString(d, "catalog", PyInt_FromLong((long) cd_catalog)); | 
 | 781 |     PyDict_SetItemString(d, "ident", PyInt_FromLong((long) cd_ident)); | 
 | 782 |     PyDict_SetItemString(d, "control", PyInt_FromLong((long) cd_control)); | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 783 |  | 
| Antoine Pitrou | c83ea13 | 2010-05-09 14:46:46 +0000 | [diff] [blame] | 784 |     /* Block size information for digital audio data */ | 
 | 785 |     PyDict_SetItemString(d, "DATASIZE", | 
 | 786 |                        PyInt_FromLong((long) CDDA_DATASIZE)); | 
 | 787 |     PyDict_SetItemString(d, "BLOCKSIZE", | 
 | 788 |                        PyInt_FromLong((long) CDDA_BLOCKSIZE)); | 
 | 789 |  | 
 | 790 |     /* Possible states for the cd player */ | 
 | 791 |     PyDict_SetItemString(d, "ERROR", PyInt_FromLong((long) CD_ERROR)); | 
 | 792 |     PyDict_SetItemString(d, "NODISC", PyInt_FromLong((long) CD_NODISC)); | 
 | 793 |     PyDict_SetItemString(d, "READY", PyInt_FromLong((long) CD_READY)); | 
 | 794 |     PyDict_SetItemString(d, "PLAYING", PyInt_FromLong((long) CD_PLAYING)); | 
 | 795 |     PyDict_SetItemString(d, "PAUSED", PyInt_FromLong((long) CD_PAUSED)); | 
 | 796 |     PyDict_SetItemString(d, "STILL", PyInt_FromLong((long) CD_STILL)); | 
 | 797 | #ifdef CD_CDROM                 /* only newer versions of the library */ | 
 | 798 |     PyDict_SetItemString(d, "CDROM", PyInt_FromLong((long) CD_CDROM)); | 
| Sjoerd Mullender | 542659b | 1995-03-28 12:06:23 +0000 | [diff] [blame] | 799 | #endif | 
| Guido van Rossum | 16b8f30 | 1992-04-13 18:22:53 +0000 | [diff] [blame] | 800 | } |