blob: 344be9af844617cb5d0c2bdf81e607042881e72b [file] [log] [blame]
Guido van Rossum2d167031994-09-16 10:54:21 +00001/***********************************************************
Guido van Rossum99546991995-01-08 14:33:34 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum2d167031994-09-16 10:54:21 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Macintosh OS-specific interface */
26
27#include "Python.h"
Jack Jansen97ce3611994-12-14 14:02:24 +000028#include "macglue.h"
Guido van Rossum2d167031994-09-16 10:54:21 +000029
Guido van Rossum2d167031994-09-16 10:54:21 +000030#include <errno.h>
31
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +000032#include <OSUtils.h> /* for Set(Current)A5 */
Guido van Rossum2d167031994-09-16 10:54:21 +000033#include <Resources.h>
Jack Jansen97ce3611994-12-14 14:02:24 +000034#include <Memory.h>
Guido van Rossum2d167031994-09-16 10:54:21 +000035#include <Sound.h>
36
Jack Jansen97ce3611994-12-14 14:02:24 +000037#ifndef __MWERKS__
38#define SndCallBackUPP ProcPtr
39#define NewSndCallBackProc(x) (x)
40#endif
41
Guido van Rossum2d167031994-09-16 10:54:21 +000042/*----------------------------------------------------------------------*/
43/* General tools */
44
45static PyObject *MacOS_Error; /* Exception MacOS.Error */
46
Guido van Rossum2d167031994-09-16 10:54:21 +000047/*----------------------------------------------------------------------*/
48/* Resource objects */
49
50typedef struct {
Guido van Rossumfffb8bb1995-01-12 12:37:24 +000051 PyObject_HEAD
Guido van Rossum2d167031994-09-16 10:54:21 +000052 Handle h;
53} RsrcObject;
54
55staticforward PyTypeObject RsrcType;
56
Guido van Rossume433c971994-09-29 10:02:56 +000057#define Rsrc_Check(r) ((r)->ob_type == &RsrcType)
Guido van Rossum2d167031994-09-16 10:54:21 +000058
59static RsrcObject *
60Rsrc_FromHandle(Handle h)
61{
62 RsrcObject *r;
63 if (h == NULL)
Jack Jansen97ce3611994-12-14 14:02:24 +000064 return (RsrcObject *)PyErr_Mac(MacOS_Error, (int)ResError());
Guido van Rossum2d167031994-09-16 10:54:21 +000065 r = PyObject_NEW(RsrcObject, &RsrcType);
66 if (r != NULL)
67 r->h = h;
68 return r;
69}
70
71static void
72Rsrc_Dealloc(RsrcObject *r)
73{
Jack Jansen97ce3611994-12-14 14:02:24 +000074 /* XXXX Note by Jack: shouldn't we ReleaseResource here? */
Guido van Rossum2d167031994-09-16 10:54:21 +000075 PyMem_DEL(r);
76}
77
78static PyObject *
79Rsrc_GetResInfo(RsrcObject *r, PyObject *args)
80{
81 short id;
82 ResType type;
83 Str255 name;
Guido van Rossume791c2e1995-01-09 13:20:04 +000084 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum2d167031994-09-16 10:54:21 +000085 return NULL;
86 GetResInfo(r->h, &id, &type, name);
87 return Py_BuildValue("(is#s#)",
88 (int)id, (char *)&type, 4, name+1, (int)name[0]);
89}
90
Jack Jansen97ce3611994-12-14 14:02:24 +000091static PyObject *
92Rsrc_AsBytes(RsrcObject *r, PyObject *args)
93{
94 long len;
95 PyObject *rv;
96 char *cp;
97
Guido van Rossume791c2e1995-01-09 13:20:04 +000098 if (!PyArg_ParseTuple(args, "l", &len))
Jack Jansen97ce3611994-12-14 14:02:24 +000099 return NULL;
100 HLock(r->h);
101 cp = (char *)*r->h;
102 rv = PyString_FromStringAndSize(cp, len);
103 HUnlock(r->h);
104 return rv;
105}
106
107static PyObject *
108Rsrc_AsString(RsrcObject *r, PyObject *args)
109{
110 PyObject *rv;
111 unsigned char *cp;
112
Guido van Rossume791c2e1995-01-09 13:20:04 +0000113 if (!PyArg_ParseTuple(args, ""))
Jack Jansen97ce3611994-12-14 14:02:24 +0000114 return NULL;
115 HLock(r->h);
116 cp = (unsigned char *)*r->h;
117 rv = PyString_FromStringAndSize((char *)cp+1, cp[0]);
118 HUnlock(r->h);
119 return rv;
120}
121
Guido van Rossum2d167031994-09-16 10:54:21 +0000122static PyMethodDef Rsrc_Methods[] = {
123 {"GetResInfo", (PyCFunction)Rsrc_GetResInfo, 1},
Jack Jansen97ce3611994-12-14 14:02:24 +0000124 {"AsString", (PyCFunction)Rsrc_AsString, 1},
125 {"AsBytes", (PyCFunction)Rsrc_AsBytes, 1},
Guido van Rossum2d167031994-09-16 10:54:21 +0000126 {NULL, NULL} /* Sentinel */
127};
128
129static PyObject *
130Rsrc_GetAttr(PyObject *r, char *name)
131{
132 return Py_FindMethod(Rsrc_Methods, r, name);
133}
134
135static PyTypeObject RsrcType = {
136 PyObject_HEAD_INIT(&PyType_Type)
137 0,
138 "Resource", /*tp_name*/
139 sizeof(RsrcObject), /*tp_basicsize*/
140 0, /*tp_itemsize*/
141 /* methods */
142 (destructor)Rsrc_Dealloc, /*tp_dealloc*/
143 0, /*tp_print*/
144 (getattrfunc)Rsrc_GetAttr, /*tp_getattr*/
145 0, /*tp_setattr*/
146 0, /*tp_compare*/
147 0, /*tp_repr*/
148 0, /*tp_as_number*/
149 0, /*tp_as_sequence*/
150 0, /*tp_as_mapping*/
151 0, /*tp_hash*/
152};
153
154static PyObject *
155MacOS_GetResource(PyObject *self, PyObject *args)
156{
157 ResType rt;
158 int id;
159 Handle h;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000160 if (!PyArg_ParseTuple(args, "O&i", GetOSType, &rt, &id))
Guido van Rossum2d167031994-09-16 10:54:21 +0000161 return NULL;
162 h = GetResource(rt, id);
163 return (PyObject *)Rsrc_FromHandle(h);
164}
165
166static PyObject *
167MacOS_GetNamedResource(PyObject *self, PyObject *args)
168{
169 ResType rt;
170 Str255 name;
171 Handle h;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000172 if (!PyArg_ParseTuple(args, "O&O&", GetOSType, &rt, GetStr255, &name))
Guido van Rossum2d167031994-09-16 10:54:21 +0000173 return NULL;
174 h = GetNamedResource(rt, name);
175 return (PyObject *)Rsrc_FromHandle(h);
176}
177
178/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000179/* Miscellaneous File System Operations */
180
181static PyObject *
182MacOS_GetFileType(PyObject *self, PyObject *args)
183{
184 Str255 name;
185 FInfo info;
186 PyObject *type, *creator, *res;
187 OSErr err;
188
189 if (!PyArg_ParseTuple(args, "O&", GetStr255, &name))
190 return NULL;
191 if ((err = GetFInfo(name, 0, &info)) != noErr) {
192 errno = err;
193 PyErr_SetFromErrno(MacOS_Error);
194 return NULL;
195 }
196 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
197 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
198 res = Py_BuildValue("OO", type, creator);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000199 Py_DECREF(type);
200 Py_DECREF(creator);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000201 return res;
202}
203
204static PyObject *
205MacOS_SetFileType(PyObject *self, PyObject *args)
206{
207 Str255 name;
208 ResType type, creator;
209 FInfo info;
210 OSErr err;
211
212 if (!PyArg_ParseTuple(args, "O&O&O&",
213 GetStr255, &name, GetOSType, &type, GetOSType, &creator))
214 return NULL;
215 if ((err = GetFInfo(name, 0, &info)) != noErr) {
216 errno = err;
217 PyErr_SetFromErrno(MacOS_Error);
218 return NULL;
219 }
220 info.fdType = type;
221 info.fdCreator = creator;
222 if ((err = SetFInfo(name, 0, &info)) != noErr) {
223 errno = err;
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000224 PyErr_SetFromErrno(MacOS_Error);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000225 return NULL;
226 }
227 Py_INCREF(Py_None);
228 return Py_None;
229}
230
231/*----------------------------------------------------------------------*/
Guido van Rossum2d167031994-09-16 10:54:21 +0000232/* SoundChannel objects */
233
Guido van Rossume433c971994-09-29 10:02:56 +0000234/* Convert a SndCommand argument */
Guido van Rossum2d167031994-09-16 10:54:21 +0000235static int
236GetSndCommand(PyObject *v, SndCommand *pc)
237{
238 int len;
239 pc->param1 = 0;
240 pc->param2 = 0;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000241 if (PyTuple_Check(v)) {
242 if (PyArg_ParseTuple(v, "h|hl", &pc->cmd, &pc->param1, &pc->param2))
243 return 1;
244 PyErr_Clear();
245 return PyArg_ParseTuple(v, "hhs#", &pc->cmd, &pc->param1, &pc->param2, &len);
246 }
247 return PyArg_Parse(v, "h", &pc->cmd);
Guido van Rossum2d167031994-09-16 10:54:21 +0000248}
249
250typedef struct {
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000251 PyObject_HEAD
Guido van Rossum2d167031994-09-16 10:54:21 +0000252 SndChannelPtr chan;
253} SndChObject;
254
255staticforward PyTypeObject SndChType;
256
Guido van Rossume433c971994-09-29 10:02:56 +0000257#define SndCh_Check(s) ((s)->ob_type == &SndChType)
Guido van Rossum2d167031994-09-16 10:54:21 +0000258
259static SndChObject *
260SndCh_FromSndChannelPtr(SndChannelPtr chan)
261{
262 SndChObject *s = PyObject_NEW(SndChObject, &SndChType);
263 if (s != NULL)
264 s->chan = chan;
265 return s;
266}
267
268static void
Guido van Rossume433c971994-09-29 10:02:56 +0000269SndCh_Cleanup(SndChObject *s, int quitNow)
270{
271 SndChannelPtr chan = s->chan;
272 if (chan != NULL) {
273 void *userInfo = (void *)chan->userInfo;
274 s->chan = NULL;
275 SndDisposeChannel(chan, quitNow);
276 if (userInfo != 0)
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000277 PyMem_DEL(userInfo);
Guido van Rossume433c971994-09-29 10:02:56 +0000278 }
279}
280
281static void
Guido van Rossum2d167031994-09-16 10:54:21 +0000282SndCh_Dealloc(SndChObject *s)
283{
Guido van Rossume433c971994-09-29 10:02:56 +0000284 SndCh_Cleanup(s, 1);
Guido van Rossum2d167031994-09-16 10:54:21 +0000285 PyMem_DEL(s);
286}
287
288static PyObject *
Guido van Rossume433c971994-09-29 10:02:56 +0000289SndCh_DisposeChannel(SndChObject *s, PyObject *args)
Guido van Rossum2d167031994-09-16 10:54:21 +0000290{
Guido van Rossume433c971994-09-29 10:02:56 +0000291 int quitNow = 1;
292 if (PyTuple_Size(args) > 0) {
Guido van Rossume791c2e1995-01-09 13:20:04 +0000293 if (!PyArg_ParseTuple(args, "i", &quitNow))
Guido van Rossum2d167031994-09-16 10:54:21 +0000294 return NULL;
295 }
Guido van Rossume433c971994-09-29 10:02:56 +0000296 SndCh_Cleanup(s, quitNow);
Guido van Rossum2d167031994-09-16 10:54:21 +0000297 Py_INCREF(Py_None);
298 return Py_None;
299}
300
Guido van Rossume433c971994-09-29 10:02:56 +0000301static int
302SndCh_OK(SndChObject *s)
303{
304 if (s->chan == NULL) {
305 PyErr_SetString(MacOS_Error, "channel is closed");
306 return 0;
307 }
308 return 1;
309}
310
Guido van Rossum2d167031994-09-16 10:54:21 +0000311static PyObject *
312SndCh_SndPlay(SndChObject *s, PyObject *args)
313{
314 RsrcObject *r;
315 int async = 0;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000316 if (!PyArg_ParseTuple(args, "O!|i", RsrcType, &r, &async))
317 return NULL;
Guido van Rossume433c971994-09-29 10:02:56 +0000318 if (!SndCh_OK(s))
Guido van Rossum2d167031994-09-16 10:54:21 +0000319 return NULL;
Guido van Rossum2d167031994-09-16 10:54:21 +0000320 SndPlay(s->chan, r->h, async);
321 Py_INCREF(Py_None);
322 return Py_None;
323}
324
325static PyObject *
326SndCh_SndDoCommand(SndChObject *s, PyObject *args)
327{
328 SndCommand c;
329 int noWait = 0;
330 OSErr err;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000331 if (!PyArg_ParseTuple(args, "O&|i", GetSndCommand, &c, &noWait))
332 return NULL;
Guido van Rossume433c971994-09-29 10:02:56 +0000333 if (!SndCh_OK(s))
334 return NULL;
Guido van Rossum2d167031994-09-16 10:54:21 +0000335 err = SndDoCommand(s->chan, &c, noWait);
Jack Jansen97ce3611994-12-14 14:02:24 +0000336 return PyErr_Mac(MacOS_Error, (int)err);
Guido van Rossum2d167031994-09-16 10:54:21 +0000337}
338
339static PyObject *
340SndCh_SndDoImmediate(SndChObject *s, PyObject *args)
341{
342 SndCommand c;
343 OSErr err;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000344 if (!PyArg_ParseTuple(args, "O&", GetSndCommand, &c))
Guido van Rossum2d167031994-09-16 10:54:21 +0000345 return 0;
Guido van Rossume433c971994-09-29 10:02:56 +0000346 if (!SndCh_OK(s))
347 return NULL;
Guido van Rossum2d167031994-09-16 10:54:21 +0000348 err = SndDoImmediate(s->chan, &c);
Jack Jansen97ce3611994-12-14 14:02:24 +0000349 return PyErr_Mac(MacOS_Error, (int)err);
Guido van Rossum2d167031994-09-16 10:54:21 +0000350}
351
352static PyMethodDef SndCh_Methods[] = {
Guido van Rossume433c971994-09-29 10:02:56 +0000353 {"close", (PyCFunction)SndCh_DisposeChannel, 1},
354 {"SndDisposeChannel", (PyCFunction)SndCh_DisposeChannel, 1},
Guido van Rossum2d167031994-09-16 10:54:21 +0000355 {"SndPlay", (PyCFunction)SndCh_SndPlay, 1},
356 {"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1},
357 {"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1},
358 {NULL, NULL} /* Sentinel */
359};
360
361static PyObject *
362SndCh_GetAttr(PyObject *s, char *name)
363{
364 return Py_FindMethod(SndCh_Methods, s, name);
365}
366
367static PyTypeObject SndChType = {
368 PyObject_HEAD_INIT(&PyType_Type)
369 0,
370 "SoundChannel", /*tp_name*/
371 sizeof(SndChObject), /*tp_basicsize*/
372 0, /*tp_itemsize*/
373 /* methods */
374 (destructor)SndCh_Dealloc, /*tp_dealloc*/
375 0, /*tp_print*/
376 (getattrfunc)SndCh_GetAttr, /*tp_getattr*/
377 0, /*tp_setattr*/
378 0, /*tp_compare*/
379 0, /*tp_repr*/
380 0, /*tp_as_number*/
381 0, /*tp_as_sequence*/
382 0, /*tp_as_mapping*/
383 0, /*tp_hash*/
384};
385
386/*----------------------------------------------------------------------*/
387/* Module */
388
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000389typedef struct {
390 long A5;
391 PyObject *callback;
392 PyObject *channel;
393 SndCommand cmd;
394} cbinfo;
395
396static int
397MySafeCallback(arg)
398 void *arg;
399{
400 cbinfo *p = (cbinfo *)arg;
401 PyObject *args;
402 PyObject *res;
403 args = Py_BuildValue("(O(hhl))",
Guido van Rossume433c971994-09-29 10:02:56 +0000404 p->channel, p->cmd.cmd, p->cmd.param1, p->cmd.param2);
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000405 res = PyEval_CallObject(p->callback, args);
406 Py_DECREF(args);
407 if (res == NULL)
408 return -1;
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000409 Py_DECREF(res);
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000410 return 0;
411}
412
413static pascal void
Jack Jansen97ce3611994-12-14 14:02:24 +0000414#ifdef __MWERKS__
415MyUserRoutine(SndChannelPtr chan, SndCommand *cmd)
416#else
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000417MyUserRoutine(SndChannelPtr chan, SndCommand cmd)
Jack Jansen97ce3611994-12-14 14:02:24 +0000418#endif
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000419{
420 cbinfo *p = (cbinfo *)chan->userInfo;
421 long A5 = SetA5(p->A5);
Jack Jansen97ce3611994-12-14 14:02:24 +0000422#ifdef __MWERKS__
423 p->cmd = *cmd;
424#else
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000425 p->cmd = cmd;
Jack Jansen97ce3611994-12-14 14:02:24 +0000426#endif
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000427 Py_AddPendingCall(MySafeCallback, (void *)p);
428 SetA5(A5);
429}
430
Guido van Rossum2d167031994-09-16 10:54:21 +0000431static PyObject *
432MacOS_SndNewChannel(PyObject *self, PyObject *args)
433{
434 SndChannelPtr chan;
435 short synth;
436 long init = 0;
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000437 PyObject *callback = NULL;
438 cbinfo *p = NULL;
Jack Jansen97ce3611994-12-14 14:02:24 +0000439 SndCallBackUPP userroutine = 0;
Guido van Rossum2d167031994-09-16 10:54:21 +0000440 OSErr err;
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000441 PyObject *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000442 if (!PyArg_ParseTuple(args, "h|lO", &synth, &init, &callback))
443 return NULL;
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000444 if (callback != NULL) {
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000445 p = PyMem_NEW(cbinfo, 1);
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000446 if (p == NULL)
447 return PyErr_NoMemory();
448 p->A5 = SetCurrentA5();
449 p->callback = callback;
Jack Jansen97ce3611994-12-14 14:02:24 +0000450 userroutine = NewSndCallBackProc(MyUserRoutine);
Guido van Rossum2d167031994-09-16 10:54:21 +0000451 }
452 chan = NULL;
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000453 err = SndNewChannel(&chan, synth, init, userroutine);
454 if (err) {
455 if (p)
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000456 PyMem_DEL(p);
Jack Jansen97ce3611994-12-14 14:02:24 +0000457 return PyErr_Mac(MacOS_Error, (int)err);
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000458 }
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000459 res = (PyObject *)SndCh_FromSndChannelPtr(chan);
460 if (res == NULL) {
461 SndDisposeChannel(chan, 1);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000462 PyMem_DEL(p);
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000463 }
Guido van Rossume433c971994-09-29 10:02:56 +0000464 else {
465 chan->userInfo = (long)p;
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000466 p->channel = res;
Guido van Rossume433c971994-09-29 10:02:56 +0000467 }
Guido van Rossumdf1c4ee1994-09-16 12:48:59 +0000468 return res;
Guido van Rossum2d167031994-09-16 10:54:21 +0000469}
470
471static PyObject *
472MacOS_SndPlay(PyObject *self, PyObject *args)
473{
474 RsrcObject *r;
475 OSErr err;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000476 if (!PyArg_ParseTuple(args, "O!", &RsrcType, &r))
Guido van Rossum2d167031994-09-16 10:54:21 +0000477 return NULL;
478 err = SndPlay((SndChannelPtr)NULL, r->h, 0);
Jack Jansen97ce3611994-12-14 14:02:24 +0000479 return PyErr_Mac(MacOS_Error, (int)err);
Guido van Rossum2d167031994-09-16 10:54:21 +0000480}
481
482static PyObject *
483MacOS_SndControl(PyObject *self, PyObject *args)
484{
485 int id;
486 SndCommand c;
487 OSErr err;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000488 if (!PyArg_ParseTuple(args, "iO&", &id, GetSndCommand, &c))
Guido van Rossum2d167031994-09-16 10:54:21 +0000489 return NULL;
490 err = SndControl(id, &c);
491 if (err)
Jack Jansen97ce3611994-12-14 14:02:24 +0000492 return PyErr_Mac(MacOS_Error, (int)err);
Guido van Rossum2d167031994-09-16 10:54:21 +0000493 return Py_BuildValue("(hhl)", c.cmd, c.param1, c.param2);
494}
495
496static PyMethodDef MacOS_Methods[] = {
497 {"GetResource", MacOS_GetResource, 1},
498 {"GetNamedResource", MacOS_GetNamedResource, 1},
Guido van Rossume791c2e1995-01-09 13:20:04 +0000499 {"GetFileType", MacOS_GetFileType, 1},
500 {"SetFileType", MacOS_SetFileType, 1},
Guido van Rossum2d167031994-09-16 10:54:21 +0000501 {"SndNewChannel", MacOS_SndNewChannel, 1},
502 {"SndPlay", MacOS_SndPlay, 1},
503 {"SndControl", MacOS_SndControl, 1},
504 {NULL, NULL} /* Sentinel */
505};
506
507
508void
509MacOS_Init()
510{
511 PyObject *m, *d;
512
513 m = Py_InitModule("MacOS", MacOS_Methods);
514 d = PyModule_GetDict(m);
515
516 /* Initialize MacOS.Error exception */
517 MacOS_Error = PyString_FromString("MacOS.Error");
Guido van Rossume433c971994-09-29 10:02:56 +0000518 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000519 Py_FatalError("can't define MacOS.Error");
520}