blob: 9f5c24dda45014161d3165f057e7b9f11cb92820 [file] [log] [blame]
Guido van Rossum17448e21995-01-30 11:53:55 +00001
2/* =========================== Module Snd =========================== */
3
4#include "Python.h"
5
6
7
8#define SystemSevenOrLater 1
9
10#include "macglue.h"
11#include <Memory.h>
12#include <Dialogs.h>
13#include <Menus.h>
14#include <Controls.h>
15
16extern PyObject *ResObj_New(Handle);
17extern int ResObj_Convert(PyObject *, Handle *);
18
19extern PyObject *WinObj_New(WindowPtr);
20extern int WinObj_Convert(PyObject *, WindowPtr *);
21
22extern PyObject *DlgObj_New(DialogPtr);
23extern int DlgObj_Convert(PyObject *, DialogPtr *);
24extern PyTypeObject Dialog_Type;
25#define DlgObj_Check(x) ((x)->ob_type == &Dialog_Type)
26
27extern PyObject *MenuObj_New(MenuHandle);
28extern int MenuObj_Convert(PyObject *, MenuHandle *);
29
30extern PyObject *CtlObj_New(ControlHandle);
31extern int CtlObj_Convert(PyObject *, ControlHandle *);
32
Guido van Rossum97842951995-02-19 15:59:49 +000033extern PyObject *WinObj_WhichWindow(WindowPtr);
34
Guido van Rossum17448e21995-01-30 11:53:55 +000035#include <Sound.h>
36
Guido van Rossum97842951995-02-19 15:59:49 +000037#ifndef HAVE_UNIVERSAL_HEADERS
Guido van Rossum17448e21995-01-30 11:53:55 +000038#define SndCallBackUPP ProcPtr
Guido van Rossum6fc5aec1995-02-19 23:32:59 +000039#define NewSndCallBackProc(x) ((SndCallBackProcPtr)(x))
Guido van Rossum17448e21995-01-30 11:53:55 +000040#define SndListHandle Handle
41#endif
42
43#include <OSUtils.h> /* for Set(Current)A5 */
44
45/* Create a SndCommand object (an (int, int, int) tuple) */
46static PyObject *
47SndCmd_New(SndCommand *pc)
48{
49 return Py_BuildValue("hhl", pc->cmd, pc->param1, pc->param2);
50}
51
52/* Convert a SndCommand argument */
53static int
54SndCmd_Convert(PyObject *v, SndCommand *pc)
55{
56 int len;
57 pc->param1 = 0;
58 pc->param2 = 0;
59 if (PyTuple_Check(v)) {
60 if (PyArg_ParseTuple(v, "h|hl", &pc->cmd, &pc->param1, &pc->param2))
61 return 1;
62 PyErr_Clear();
63 return PyArg_ParseTuple(v, "hhs#", &pc->cmd, &pc->param1, &pc->param2, &len);
64 }
65 return PyArg_Parse(v, "h", &pc->cmd);
66}
67
68/* Create a NumVersion object (a quintuple of integers) */
69static PyObject *
70NumVer_New(NumVersion nv)
71{
72 return Py_BuildValue("iiiii",
73 nv.majorRev,
Guido van Rossum0818a4c1995-02-05 16:53:45 +000074#ifdef THINK_C
Guido van Rossum17448e21995-01-30 11:53:55 +000075 nv.minorRev,
76 nv.bugFixRev,
Guido van Rossum0818a4c1995-02-05 16:53:45 +000077#else
78 (nv.minorAndBugRev>>4) & 0xf,
79 nv.minorAndBugRev & 0xf,
80#endif
Guido van Rossum17448e21995-01-30 11:53:55 +000081 nv.stage,
82 nv.nonRelRev);
83}
84
85static pascal void SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd); /* Forward */
86
87static PyObject *Snd_Error;
88
89/* --------------------- Object type SndChannel --------------------- */
90
91staticforward PyTypeObject SndChannel_Type;
92
93#define SndCh_Check(x) ((x)->ob_type == &SndChannel_Type)
94
95typedef struct SndChannelObject {
96 PyObject_HEAD
97 SndChannelPtr ob_itself;
98 /* Members used to implement callbacks: */
99 PyObject *ob_callback;
100 long ob_A5;
101 SndCommand ob_cmd;
102} SndChannelObject;
103
104static PyObject *SndCh_New(itself)
Guido van Rossum97842951995-02-19 15:59:49 +0000105 SndChannelPtr itself;
Guido van Rossum17448e21995-01-30 11:53:55 +0000106{
107 SndChannelObject *it;
108 it = PyObject_NEW(SndChannelObject, &SndChannel_Type);
109 if (it == NULL) return NULL;
110 it->ob_itself = itself;
111 it->ob_callback = NULL;
112 it->ob_A5 = SetCurrentA5();
113 return (PyObject *)it;
114}
115static SndCh_Convert(v, p_itself)
116 PyObject *v;
117 SndChannelPtr *p_itself;
118{
119 if (!SndCh_Check(v))
120 {
121 PyErr_SetString(PyExc_TypeError, "SndChannel required");
122 return 0;
123 }
124 *p_itself = ((SndChannelObject *)v)->ob_itself;
125 return 1;
126}
127
128static void SndCh_dealloc(self)
129 SndChannelObject *self;
130{
131 SndDisposeChannel(self->ob_itself, 1);
132 Py_XDECREF(self->ob_callback);
133 PyMem_DEL(self);
134}
135
136static PyObject *SndCh_SndDoCommand(_self, _args)
137 SndChannelObject *_self;
138 PyObject *_args;
139{
140 PyObject *_res = NULL;
141 OSErr _err;
142 SndCommand cmd;
143 Boolean noWait;
144 if (!PyArg_ParseTuple(_args, "O&b",
145 SndCmd_Convert, &cmd,
146 &noWait))
147 return NULL;
148 _err = SndDoCommand(_self->ob_itself,
149 &cmd,
150 noWait);
151 if (_err != noErr) return PyMac_Error(_err);
152 Py_INCREF(Py_None);
153 _res = Py_None;
154 return _res;
155}
156
157static PyObject *SndCh_SndDoImmediate(_self, _args)
158 SndChannelObject *_self;
159 PyObject *_args;
160{
161 PyObject *_res = NULL;
162 OSErr _err;
163 SndCommand cmd;
164 if (!PyArg_ParseTuple(_args, "O&",
165 SndCmd_Convert, &cmd))
166 return NULL;
167 _err = SndDoImmediate(_self->ob_itself,
168 &cmd);
169 if (_err != noErr) return PyMac_Error(_err);
170 Py_INCREF(Py_None);
171 _res = Py_None;
172 return _res;
173}
174
175static PyObject *SndCh_SndPlay(_self, _args)
176 SndChannelObject *_self;
177 PyObject *_args;
178{
179 PyObject *_res = NULL;
180 OSErr _err;
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000181 SndListHandle sndHdl;
Guido van Rossum17448e21995-01-30 11:53:55 +0000182 Boolean async;
183 if (!PyArg_ParseTuple(_args, "O&b",
184 ResObj_Convert, &sndHdl,
185 &async))
186 return NULL;
187 _err = SndPlay(_self->ob_itself,
188 sndHdl,
189 async);
190 if (_err != noErr) return PyMac_Error(_err);
191 Py_INCREF(Py_None);
192 _res = Py_None;
193 return _res;
194}
195
196static PyObject *SndCh_SndStartFilePlay(_self, _args)
197 SndChannelObject *_self;
198 PyObject *_args;
199{
200 PyObject *_res = NULL;
201 OSErr _err;
202 short fRefNum;
203 short resNum;
204 long bufferSize;
205 Boolean async;
206 if (!PyArg_ParseTuple(_args, "hhlb",
207 &fRefNum,
208 &resNum,
209 &bufferSize,
210 &async))
211 return NULL;
212 _err = SndStartFilePlay(_self->ob_itself,
213 fRefNum,
214 resNum,
215 bufferSize,
216 0,
217 0,
218 0,
219 async);
220 if (_err != noErr) return PyMac_Error(_err);
221 Py_INCREF(Py_None);
222 _res = Py_None;
223 return _res;
224}
225
226static PyObject *SndCh_SndPauseFilePlay(_self, _args)
227 SndChannelObject *_self;
228 PyObject *_args;
229{
230 PyObject *_res = NULL;
231 OSErr _err;
232 if (!PyArg_ParseTuple(_args, ""))
233 return NULL;
234 _err = SndPauseFilePlay(_self->ob_itself);
235 if (_err != noErr) return PyMac_Error(_err);
236 Py_INCREF(Py_None);
237 _res = Py_None;
238 return _res;
239}
240
241static PyObject *SndCh_SndStopFilePlay(_self, _args)
242 SndChannelObject *_self;
243 PyObject *_args;
244{
245 PyObject *_res = NULL;
246 OSErr _err;
247 Boolean async;
248 if (!PyArg_ParseTuple(_args, "b",
249 &async))
250 return NULL;
251 _err = SndStopFilePlay(_self->ob_itself,
252 async);
253 if (_err != noErr) return PyMac_Error(_err);
254 Py_INCREF(Py_None);
255 _res = Py_None;
256 return _res;
257}
258
259static PyObject *SndCh_SndChannelStatus(_self, _args)
260 SndChannelObject *_self;
261 PyObject *_args;
262{
263 PyObject *_res = NULL;
264 OSErr _err;
265 short theLength;
266 SCStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000267 if (!PyArg_ParseTuple(_args, "h",
268 &theLength))
269 return NULL;
270 _err = SndChannelStatus(_self->ob_itself,
271 theLength,
272 &theStatus__out__);
273 if (_err != noErr) return PyMac_Error(_err);
274 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000275 (char *)&theStatus__out__, (int)sizeof(SCStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000276 theStatus__error__: ;
277 return _res;
278}
279
280static PyMethodDef SndCh_methods[] = {
281 {"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1,
282 "(SndCommand cmd, Boolean noWait) -> None"},
283 {"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1,
284 "(SndCommand cmd) -> None"},
285 {"SndPlay", (PyCFunction)SndCh_SndPlay, 1,
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000286 "(SndListHandle sndHdl, Boolean async) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000287 {"SndStartFilePlay", (PyCFunction)SndCh_SndStartFilePlay, 1,
288 "(short fRefNum, short resNum, long bufferSize, Boolean async) -> None"},
289 {"SndPauseFilePlay", (PyCFunction)SndCh_SndPauseFilePlay, 1,
290 "() -> None"},
291 {"SndStopFilePlay", (PyCFunction)SndCh_SndStopFilePlay, 1,
292 "(Boolean async) -> None"},
293 {"SndChannelStatus", (PyCFunction)SndCh_SndChannelStatus, 1,
294 "(short theLength) -> (SCStatus theStatus)"},
295 {NULL, NULL, 0}
296};
297
298static PyMethodChain SndCh_chain = { SndCh_methods, NULL };
299
300static PyObject *SndCh_getattr(self, name)
301 SndChannelObject *self;
302 char *name;
303{
304 return Py_FindMethodInChain(&SndCh_chain, (PyObject *)self, name);
305}
306
307#define SndCh_setattr NULL
308
Guido van Rossum97842951995-02-19 15:59:49 +0000309staticforward PyTypeObject SndChannel_Type = {
Guido van Rossum17448e21995-01-30 11:53:55 +0000310 PyObject_HEAD_INIT(&PyType_Type)
311 0, /*ob_size*/
312 "SndChannel", /*tp_name*/
313 sizeof(SndChannelObject), /*tp_basicsize*/
314 0, /*tp_itemsize*/
315 /* methods */
316 (destructor) SndCh_dealloc, /*tp_dealloc*/
317 0, /*tp_print*/
318 (getattrfunc) SndCh_getattr, /*tp_getattr*/
319 (setattrfunc) SndCh_setattr, /*tp_setattr*/
320};
321
322/* ------------------- End object type SndChannel ------------------- */
323
324
325static PyObject *Snd_SndNewChannel(_self, _args)
326 PyObject *_self;
327 PyObject *_args;
328{
329 PyObject *_res = NULL;
330 OSErr _err;
331 SndChannelPtr chan = 0;
332 short synth;
333 long init;
334 PyObject* userRoutine;
335 if (!PyArg_ParseTuple(_args, "hlO",
336 &synth,
337 &init,
338 &userRoutine))
339 return NULL;
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000340 if (userRoutine != Py_None && !PyCallable_Check(userRoutine))
Guido van Rossum17448e21995-01-30 11:53:55 +0000341 {
342 PyErr_SetString(PyExc_TypeError, "callback must be callable");
343 goto userRoutine__error__;
344 }
345 _err = SndNewChannel(&chan,
346 synth,
347 init,
Guido van Rossum97842951995-02-19 15:59:49 +0000348 NewSndCallBackProc(SndCh_UserRoutine));
Guido van Rossum17448e21995-01-30 11:53:55 +0000349 if (_err != noErr) return PyMac_Error(_err);
350 _res = Py_BuildValue("O&",
351 SndCh_New, chan);
352 if (_res != NULL && userRoutine != Py_None)
353 {
354 SndChannelObject *p = (SndChannelObject *)_res;
355 p->ob_itself->userInfo = (long)p;
356 Py_INCREF(userRoutine);
357 p->ob_callback = userRoutine;
358 }
359 userRoutine__error__: ;
360 return _res;
361}
362
363static PyObject *Snd_SndControl(_self, _args)
364 PyObject *_self;
365 PyObject *_args;
366{
367 PyObject *_res = NULL;
368 OSErr _err;
369 short id;
370 SndCommand cmd;
371 if (!PyArg_ParseTuple(_args, "h",
372 &id))
373 return NULL;
374 _err = SndControl(id,
375 &cmd);
376 if (_err != noErr) return PyMac_Error(_err);
377 _res = Py_BuildValue("O&",
378 SndCmd_New, &cmd);
379 return _res;
380}
381
Guido van Rossum17448e21995-01-30 11:53:55 +0000382static PyObject *Snd_SndSoundManagerVersion(_self, _args)
383 PyObject *_self;
384 PyObject *_args;
385{
386 PyObject *_res = NULL;
387 NumVersion _rv;
388 if (!PyArg_ParseTuple(_args, ""))
389 return NULL;
390 _rv = SndSoundManagerVersion();
391 _res = Py_BuildValue("O&",
392 NumVer_New, _rv);
393 return _res;
394}
395
396static PyObject *Snd_SndManagerStatus(_self, _args)
397 PyObject *_self;
398 PyObject *_args;
399{
400 PyObject *_res = NULL;
401 OSErr _err;
402 short theLength;
403 SMStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000404 if (!PyArg_ParseTuple(_args, "h",
405 &theLength))
406 return NULL;
407 _err = SndManagerStatus(theLength,
408 &theStatus__out__);
409 if (_err != noErr) return PyMac_Error(_err);
410 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000411 (char *)&theStatus__out__, (int)sizeof(SMStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000412 theStatus__error__: ;
413 return _res;
414}
415
416static PyObject *Snd_SndGetSysBeepState(_self, _args)
417 PyObject *_self;
418 PyObject *_args;
419{
420 PyObject *_res = NULL;
421 short sysBeepState;
422 if (!PyArg_ParseTuple(_args, ""))
423 return NULL;
424 SndGetSysBeepState(&sysBeepState);
425 _res = Py_BuildValue("h",
426 sysBeepState);
427 return _res;
428}
429
430static PyObject *Snd_SndSetSysBeepState(_self, _args)
431 PyObject *_self;
432 PyObject *_args;
433{
434 PyObject *_res = NULL;
435 OSErr _err;
436 short sysBeepState;
437 if (!PyArg_ParseTuple(_args, "h",
438 &sysBeepState))
439 return NULL;
440 _err = SndSetSysBeepState(sysBeepState);
441 if (_err != noErr) return PyMac_Error(_err);
442 Py_INCREF(Py_None);
443 _res = Py_None;
444 return _res;
445}
446
447static PyObject *Snd_MACEVersion(_self, _args)
448 PyObject *_self;
449 PyObject *_args;
450{
451 PyObject *_res = NULL;
452 NumVersion _rv;
453 if (!PyArg_ParseTuple(_args, ""))
454 return NULL;
455 _rv = MACEVersion();
456 _res = Py_BuildValue("O&",
457 NumVer_New, _rv);
458 return _res;
459}
460
461static PyObject *Snd_Comp3to1(_self, _args)
462 PyObject *_self;
463 PyObject *_args;
464{
465 PyObject *_res = NULL;
466 char *buffer__in__;
467 char *buffer__out__;
468 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000469 int buffer__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000470 char *state__in__;
471 char state__out__[128];
472 int state__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000473 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000474 unsigned long numChannels;
475 unsigned long whichChannel;
476 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000477 &buffer__in__, &buffer__in_len__,
478 &state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000479 &numChannels,
480 &whichChannel))
481 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000482 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000483 {
484 PyErr_NoMemory();
485 goto buffer__error__;
486 }
Guido van Rossum97842951995-02-19 15:59:49 +0000487 buffer__len__ = buffer__in_len__;
488 if (state__in_len__ != 128)
Guido van Rossum17448e21995-01-30 11:53:55 +0000489 {
490 PyErr_SetString(PyExc_TypeError, "buffer length should be 128");
491 goto state__error__;
492 }
Guido van Rossum97842951995-02-19 15:59:49 +0000493 state__len__ = state__in_len__;
494 Comp3to1(buffer__in__, buffer__out__, (long)buffer__len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000495 state__in__, state__out__,
496 numChannels,
497 whichChannel);
498 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000499 buffer__out__, (int)buffer__len__,
500 state__out__, (int)128);
Guido van Rossum17448e21995-01-30 11:53:55 +0000501 state__error__: ;
502 free(buffer__out__);
503 buffer__error__: ;
504 return _res;
505}
506
507static PyObject *Snd_Exp1to3(_self, _args)
508 PyObject *_self;
509 PyObject *_args;
510{
511 PyObject *_res = NULL;
512 char *buffer__in__;
513 char *buffer__out__;
514 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000515 int buffer__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000516 char *state__in__;
517 char state__out__[128];
518 int state__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000519 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000520 unsigned long numChannels;
521 unsigned long whichChannel;
522 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000523 &buffer__in__, &buffer__in_len__,
524 &state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000525 &numChannels,
526 &whichChannel))
527 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000528 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000529 {
530 PyErr_NoMemory();
531 goto buffer__error__;
532 }
Guido van Rossum97842951995-02-19 15:59:49 +0000533 buffer__len__ = buffer__in_len__;
534 if (state__in_len__ != 128)
Guido van Rossum17448e21995-01-30 11:53:55 +0000535 {
536 PyErr_SetString(PyExc_TypeError, "buffer length should be 128");
537 goto state__error__;
538 }
Guido van Rossum97842951995-02-19 15:59:49 +0000539 state__len__ = state__in_len__;
540 Exp1to3(buffer__in__, buffer__out__, (long)buffer__len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000541 state__in__, state__out__,
542 numChannels,
543 whichChannel);
544 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000545 buffer__out__, (int)buffer__len__,
546 state__out__, (int)128);
Guido van Rossum17448e21995-01-30 11:53:55 +0000547 state__error__: ;
548 free(buffer__out__);
549 buffer__error__: ;
550 return _res;
551}
552
553static PyObject *Snd_Comp6to1(_self, _args)
554 PyObject *_self;
555 PyObject *_args;
556{
557 PyObject *_res = NULL;
558 char *buffer__in__;
559 char *buffer__out__;
560 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000561 int buffer__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000562 char *state__in__;
563 char state__out__[128];
564 int state__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000565 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000566 unsigned long numChannels;
567 unsigned long whichChannel;
568 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000569 &buffer__in__, &buffer__in_len__,
570 &state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000571 &numChannels,
572 &whichChannel))
573 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000574 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000575 {
576 PyErr_NoMemory();
577 goto buffer__error__;
578 }
Guido van Rossum97842951995-02-19 15:59:49 +0000579 buffer__len__ = buffer__in_len__;
580 if (state__in_len__ != 128)
Guido van Rossum17448e21995-01-30 11:53:55 +0000581 {
582 PyErr_SetString(PyExc_TypeError, "buffer length should be 128");
583 goto state__error__;
584 }
Guido van Rossum97842951995-02-19 15:59:49 +0000585 state__len__ = state__in_len__;
586 Comp6to1(buffer__in__, buffer__out__, (long)buffer__len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000587 state__in__, state__out__,
588 numChannels,
589 whichChannel);
590 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000591 buffer__out__, (int)buffer__len__,
592 state__out__, (int)128);
Guido van Rossum17448e21995-01-30 11:53:55 +0000593 state__error__: ;
594 free(buffer__out__);
595 buffer__error__: ;
596 return _res;
597}
598
599static PyObject *Snd_Exp1to6(_self, _args)
600 PyObject *_self;
601 PyObject *_args;
602{
603 PyObject *_res = NULL;
604 char *buffer__in__;
605 char *buffer__out__;
606 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000607 int buffer__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000608 char *state__in__;
609 char state__out__[128];
610 int state__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000611 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000612 unsigned long numChannels;
613 unsigned long whichChannel;
614 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000615 &buffer__in__, &buffer__in_len__,
616 &state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000617 &numChannels,
618 &whichChannel))
619 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000620 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000621 {
622 PyErr_NoMemory();
623 goto buffer__error__;
624 }
Guido van Rossum97842951995-02-19 15:59:49 +0000625 buffer__len__ = buffer__in_len__;
626 if (state__in_len__ != 128)
Guido van Rossum17448e21995-01-30 11:53:55 +0000627 {
628 PyErr_SetString(PyExc_TypeError, "buffer length should be 128");
629 goto state__error__;
630 }
Guido van Rossum97842951995-02-19 15:59:49 +0000631 state__len__ = state__in_len__;
632 Exp1to6(buffer__in__, buffer__out__, (long)buffer__len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000633 state__in__, state__out__,
634 numChannels,
635 whichChannel);
636 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000637 buffer__out__, (int)buffer__len__,
638 state__out__, (int)128);
Guido van Rossum17448e21995-01-30 11:53:55 +0000639 state__error__: ;
640 free(buffer__out__);
641 buffer__error__: ;
642 return _res;
643}
644
645static PyMethodDef Snd_methods[] = {
646 {"SndNewChannel", (PyCFunction)Snd_SndNewChannel, 1,
647 "(short synth, long init, PyObject* userRoutine) -> (SndChannelPtr chan)"},
648 {"SndControl", (PyCFunction)Snd_SndControl, 1,
649 "(short id) -> (SndCommand cmd)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000650 {"SndSoundManagerVersion", (PyCFunction)Snd_SndSoundManagerVersion, 1,
651 "() -> (NumVersion _rv)"},
652 {"SndManagerStatus", (PyCFunction)Snd_SndManagerStatus, 1,
653 "(short theLength) -> (SMStatus theStatus)"},
654 {"SndGetSysBeepState", (PyCFunction)Snd_SndGetSysBeepState, 1,
655 "() -> (short sysBeepState)"},
656 {"SndSetSysBeepState", (PyCFunction)Snd_SndSetSysBeepState, 1,
657 "(short sysBeepState) -> None"},
658 {"MACEVersion", (PyCFunction)Snd_MACEVersion, 1,
659 "() -> (NumVersion _rv)"},
660 {"Comp3to1", (PyCFunction)Snd_Comp3to1, 1,
661 "(Buffer buffer, Buffer state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, Buffer state)"},
662 {"Exp1to3", (PyCFunction)Snd_Exp1to3, 1,
663 "(Buffer buffer, Buffer state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, Buffer state)"},
664 {"Comp6to1", (PyCFunction)Snd_Comp6to1, 1,
665 "(Buffer buffer, Buffer state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, Buffer state)"},
666 {"Exp1to6", (PyCFunction)Snd_Exp1to6, 1,
667 "(Buffer buffer, Buffer state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, Buffer state)"},
668 {NULL, NULL, 0}
669};
670
671
672
673/* Routine passed to Py_AddPendingCall -- call the Python callback */
674static int
675SndCh_CallCallBack(arg)
676 void *arg;
677{
678 SndChannelObject *p = (SndChannelObject *)arg;
679 PyObject *args;
680 PyObject *res;
681 args = Py_BuildValue("(O(hhl))",
682 p, p->ob_cmd.cmd, p->ob_cmd.param1, p->ob_cmd.param2);
683 res = PyEval_CallObject(p->ob_callback, args);
684 Py_DECREF(args);
685 if (res == NULL)
686 return -1;
687 Py_DECREF(res);
688 return 0;
689}
690
691/* Routine passed to NewSndChannel -- schedule a call to SndCh_CallCallBack */
692static pascal void
693SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd)
694{
695 SndChannelObject *p = (SndChannelObject *)(chan->userInfo);
696 if (p->ob_callback != NULL) {
697 long A5 = SetA5(p->ob_A5);
698 p->ob_cmd = *cmd;
699 Py_AddPendingCall(SndCh_CallCallBack, (void *)p);
700 SetA5(A5);
701 }
702}
703
704
705void initSnd()
706{
707 PyObject *m;
708 PyObject *d;
709
710
711
712
713
714 m = Py_InitModule("Snd", Snd_methods);
715 d = PyModule_GetDict(m);
716 Snd_Error = PyMac_GetOSErrException();
717 if (Snd_Error == NULL ||
718 PyDict_SetItemString(d, "Error", Snd_Error) != 0)
719 Py_FatalError("can't initialize Snd.Error");
720}
721
722/* ========================= End module Snd ========================= */
723