blob: 74951ce0726dfe2062b8f2a145e8666173685854 [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 *);
Jack Jansen425e9eb1995-12-12 15:02:03 +000018extern PyObject *OptResObj_New(Handle);
19extern int OptResObj_Convert(PyObject *, Handle *);
Guido van Rossum17448e21995-01-30 11:53:55 +000020
21extern PyObject *WinObj_New(WindowPtr);
22extern int WinObj_Convert(PyObject *, WindowPtr *);
Jack Jansen425e9eb1995-12-12 15:02:03 +000023extern PyTypeObject Window_Type;
24#define WinObj_Check(x) ((x)->ob_type == &Window_Type)
Guido van Rossum17448e21995-01-30 11:53:55 +000025
26extern PyObject *DlgObj_New(DialogPtr);
27extern int DlgObj_Convert(PyObject *, DialogPtr *);
28extern PyTypeObject Dialog_Type;
29#define DlgObj_Check(x) ((x)->ob_type == &Dialog_Type)
30
31extern PyObject *MenuObj_New(MenuHandle);
32extern int MenuObj_Convert(PyObject *, MenuHandle *);
33
34extern PyObject *CtlObj_New(ControlHandle);
35extern int CtlObj_Convert(PyObject *, ControlHandle *);
36
Jack Jansen425e9eb1995-12-12 15:02:03 +000037extern PyObject *GrafObj_New(GrafPtr);
38extern int GrafObj_Convert(PyObject *, GrafPtr *);
39
40extern PyObject *BMObj_New(BitMapPtr);
41extern int BMObj_Convert(PyObject *, BitMapPtr *);
42
Guido van Rossum97842951995-02-19 15:59:49 +000043extern PyObject *WinObj_WhichWindow(WindowPtr);
44
Guido van Rossum17448e21995-01-30 11:53:55 +000045#include <Sound.h>
46
Guido van Rossum97842951995-02-19 15:59:49 +000047#ifndef HAVE_UNIVERSAL_HEADERS
Guido van Rossum17448e21995-01-30 11:53:55 +000048#define SndCallBackUPP ProcPtr
Guido van Rossum6fc5aec1995-02-19 23:32:59 +000049#define NewSndCallBackProc(x) ((SndCallBackProcPtr)(x))
Guido van Rossum17448e21995-01-30 11:53:55 +000050#define SndListHandle Handle
51#endif
52
53#include <OSUtils.h> /* for Set(Current)A5 */
54
55/* Create a SndCommand object (an (int, int, int) tuple) */
56static PyObject *
57SndCmd_New(SndCommand *pc)
58{
59 return Py_BuildValue("hhl", pc->cmd, pc->param1, pc->param2);
60}
61
62/* Convert a SndCommand argument */
63static int
64SndCmd_Convert(PyObject *v, SndCommand *pc)
65{
66 int len;
67 pc->param1 = 0;
68 pc->param2 = 0;
69 if (PyTuple_Check(v)) {
70 if (PyArg_ParseTuple(v, "h|hl", &pc->cmd, &pc->param1, &pc->param2))
71 return 1;
72 PyErr_Clear();
73 return PyArg_ParseTuple(v, "hhs#", &pc->cmd, &pc->param1, &pc->param2, &len);
74 }
75 return PyArg_Parse(v, "h", &pc->cmd);
76}
77
Guido van Rossum17448e21995-01-30 11:53:55 +000078static pascal void SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd); /* Forward */
79
80static PyObject *Snd_Error;
81
82/* --------------------- Object type SndChannel --------------------- */
83
84staticforward PyTypeObject SndChannel_Type;
85
86#define SndCh_Check(x) ((x)->ob_type == &SndChannel_Type)
87
88typedef struct SndChannelObject {
89 PyObject_HEAD
90 SndChannelPtr ob_itself;
91 /* Members used to implement callbacks: */
92 PyObject *ob_callback;
93 long ob_A5;
94 SndCommand ob_cmd;
95} SndChannelObject;
96
97static PyObject *SndCh_New(itself)
Guido van Rossum97842951995-02-19 15:59:49 +000098 SndChannelPtr itself;
Guido van Rossum17448e21995-01-30 11:53:55 +000099{
100 SndChannelObject *it;
101 it = PyObject_NEW(SndChannelObject, &SndChannel_Type);
102 if (it == NULL) return NULL;
103 it->ob_itself = itself;
104 it->ob_callback = NULL;
105 it->ob_A5 = SetCurrentA5();
106 return (PyObject *)it;
107}
108static SndCh_Convert(v, p_itself)
109 PyObject *v;
110 SndChannelPtr *p_itself;
111{
112 if (!SndCh_Check(v))
113 {
114 PyErr_SetString(PyExc_TypeError, "SndChannel required");
115 return 0;
116 }
117 *p_itself = ((SndChannelObject *)v)->ob_itself;
118 return 1;
119}
120
121static void SndCh_dealloc(self)
122 SndChannelObject *self;
123{
124 SndDisposeChannel(self->ob_itself, 1);
125 Py_XDECREF(self->ob_callback);
126 PyMem_DEL(self);
127}
128
129static PyObject *SndCh_SndDoCommand(_self, _args)
130 SndChannelObject *_self;
131 PyObject *_args;
132{
133 PyObject *_res = NULL;
134 OSErr _err;
135 SndCommand cmd;
136 Boolean noWait;
137 if (!PyArg_ParseTuple(_args, "O&b",
138 SndCmd_Convert, &cmd,
139 &noWait))
140 return NULL;
141 _err = SndDoCommand(_self->ob_itself,
142 &cmd,
143 noWait);
144 if (_err != noErr) return PyMac_Error(_err);
145 Py_INCREF(Py_None);
146 _res = Py_None;
147 return _res;
148}
149
150static PyObject *SndCh_SndDoImmediate(_self, _args)
151 SndChannelObject *_self;
152 PyObject *_args;
153{
154 PyObject *_res = NULL;
155 OSErr _err;
156 SndCommand cmd;
157 if (!PyArg_ParseTuple(_args, "O&",
158 SndCmd_Convert, &cmd))
159 return NULL;
160 _err = SndDoImmediate(_self->ob_itself,
161 &cmd);
162 if (_err != noErr) return PyMac_Error(_err);
163 Py_INCREF(Py_None);
164 _res = Py_None;
165 return _res;
166}
167
168static PyObject *SndCh_SndPlay(_self, _args)
169 SndChannelObject *_self;
170 PyObject *_args;
171{
172 PyObject *_res = NULL;
173 OSErr _err;
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000174 SndListHandle sndHdl;
Guido van Rossum17448e21995-01-30 11:53:55 +0000175 Boolean async;
176 if (!PyArg_ParseTuple(_args, "O&b",
177 ResObj_Convert, &sndHdl,
178 &async))
179 return NULL;
180 _err = SndPlay(_self->ob_itself,
181 sndHdl,
182 async);
183 if (_err != noErr) return PyMac_Error(_err);
184 Py_INCREF(Py_None);
185 _res = Py_None;
186 return _res;
187}
188
189static PyObject *SndCh_SndStartFilePlay(_self, _args)
190 SndChannelObject *_self;
191 PyObject *_args;
192{
193 PyObject *_res = NULL;
194 OSErr _err;
195 short fRefNum;
196 short resNum;
197 long bufferSize;
198 Boolean async;
199 if (!PyArg_ParseTuple(_args, "hhlb",
200 &fRefNum,
201 &resNum,
202 &bufferSize,
203 &async))
204 return NULL;
205 _err = SndStartFilePlay(_self->ob_itself,
206 fRefNum,
207 resNum,
208 bufferSize,
209 0,
210 0,
211 0,
212 async);
213 if (_err != noErr) return PyMac_Error(_err);
214 Py_INCREF(Py_None);
215 _res = Py_None;
216 return _res;
217}
218
219static PyObject *SndCh_SndPauseFilePlay(_self, _args)
220 SndChannelObject *_self;
221 PyObject *_args;
222{
223 PyObject *_res = NULL;
224 OSErr _err;
225 if (!PyArg_ParseTuple(_args, ""))
226 return NULL;
227 _err = SndPauseFilePlay(_self->ob_itself);
228 if (_err != noErr) return PyMac_Error(_err);
229 Py_INCREF(Py_None);
230 _res = Py_None;
231 return _res;
232}
233
234static PyObject *SndCh_SndStopFilePlay(_self, _args)
235 SndChannelObject *_self;
236 PyObject *_args;
237{
238 PyObject *_res = NULL;
239 OSErr _err;
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000240 Boolean quietNow;
Guido van Rossum17448e21995-01-30 11:53:55 +0000241 if (!PyArg_ParseTuple(_args, "b",
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000242 &quietNow))
Guido van Rossum17448e21995-01-30 11:53:55 +0000243 return NULL;
244 _err = SndStopFilePlay(_self->ob_itself,
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000245 quietNow);
Guido van Rossum17448e21995-01-30 11:53:55 +0000246 if (_err != noErr) return PyMac_Error(_err);
247 Py_INCREF(Py_None);
248 _res = Py_None;
249 return _res;
250}
251
252static PyObject *SndCh_SndChannelStatus(_self, _args)
253 SndChannelObject *_self;
254 PyObject *_args;
255{
256 PyObject *_res = NULL;
257 OSErr _err;
258 short theLength;
259 SCStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000260 if (!PyArg_ParseTuple(_args, "h",
261 &theLength))
262 return NULL;
263 _err = SndChannelStatus(_self->ob_itself,
264 theLength,
265 &theStatus__out__);
266 if (_err != noErr) return PyMac_Error(_err);
267 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000268 (char *)&theStatus__out__, (int)sizeof(SCStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000269 theStatus__error__: ;
270 return _res;
271}
272
273static PyMethodDef SndCh_methods[] = {
274 {"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1,
275 "(SndCommand cmd, Boolean noWait) -> None"},
276 {"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1,
277 "(SndCommand cmd) -> None"},
278 {"SndPlay", (PyCFunction)SndCh_SndPlay, 1,
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000279 "(SndListHandle sndHdl, Boolean async) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000280 {"SndStartFilePlay", (PyCFunction)SndCh_SndStartFilePlay, 1,
281 "(short fRefNum, short resNum, long bufferSize, Boolean async) -> None"},
282 {"SndPauseFilePlay", (PyCFunction)SndCh_SndPauseFilePlay, 1,
283 "() -> None"},
284 {"SndStopFilePlay", (PyCFunction)SndCh_SndStopFilePlay, 1,
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000285 "(Boolean quietNow) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000286 {"SndChannelStatus", (PyCFunction)SndCh_SndChannelStatus, 1,
287 "(short theLength) -> (SCStatus theStatus)"},
288 {NULL, NULL, 0}
289};
290
291static PyMethodChain SndCh_chain = { SndCh_methods, NULL };
292
293static PyObject *SndCh_getattr(self, name)
294 SndChannelObject *self;
295 char *name;
296{
297 return Py_FindMethodInChain(&SndCh_chain, (PyObject *)self, name);
298}
299
300#define SndCh_setattr NULL
301
Guido van Rossum97842951995-02-19 15:59:49 +0000302staticforward PyTypeObject SndChannel_Type = {
Guido van Rossum17448e21995-01-30 11:53:55 +0000303 PyObject_HEAD_INIT(&PyType_Type)
304 0, /*ob_size*/
305 "SndChannel", /*tp_name*/
306 sizeof(SndChannelObject), /*tp_basicsize*/
307 0, /*tp_itemsize*/
308 /* methods */
309 (destructor) SndCh_dealloc, /*tp_dealloc*/
310 0, /*tp_print*/
311 (getattrfunc) SndCh_getattr, /*tp_getattr*/
312 (setattrfunc) SndCh_setattr, /*tp_setattr*/
313};
314
315/* ------------------- End object type SndChannel ------------------- */
316
317
318static PyObject *Snd_SndNewChannel(_self, _args)
319 PyObject *_self;
320 PyObject *_args;
321{
322 PyObject *_res = NULL;
323 OSErr _err;
324 SndChannelPtr chan = 0;
325 short synth;
326 long init;
327 PyObject* userRoutine;
328 if (!PyArg_ParseTuple(_args, "hlO",
329 &synth,
330 &init,
331 &userRoutine))
332 return NULL;
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000333 if (userRoutine != Py_None && !PyCallable_Check(userRoutine))
Guido van Rossum17448e21995-01-30 11:53:55 +0000334 {
335 PyErr_SetString(PyExc_TypeError, "callback must be callable");
336 goto userRoutine__error__;
337 }
338 _err = SndNewChannel(&chan,
339 synth,
340 init,
Guido van Rossum97842951995-02-19 15:59:49 +0000341 NewSndCallBackProc(SndCh_UserRoutine));
Guido van Rossum17448e21995-01-30 11:53:55 +0000342 if (_err != noErr) return PyMac_Error(_err);
343 _res = Py_BuildValue("O&",
344 SndCh_New, chan);
345 if (_res != NULL && userRoutine != Py_None)
346 {
347 SndChannelObject *p = (SndChannelObject *)_res;
348 p->ob_itself->userInfo = (long)p;
349 Py_INCREF(userRoutine);
350 p->ob_callback = userRoutine;
351 }
352 userRoutine__error__: ;
353 return _res;
354}
355
356static PyObject *Snd_SndControl(_self, _args)
357 PyObject *_self;
358 PyObject *_args;
359{
360 PyObject *_res = NULL;
361 OSErr _err;
362 short id;
363 SndCommand cmd;
364 if (!PyArg_ParseTuple(_args, "h",
365 &id))
366 return NULL;
367 _err = SndControl(id,
368 &cmd);
369 if (_err != noErr) return PyMac_Error(_err);
370 _res = Py_BuildValue("O&",
371 SndCmd_New, &cmd);
372 return _res;
373}
374
Guido van Rossum17448e21995-01-30 11:53:55 +0000375static PyObject *Snd_SndSoundManagerVersion(_self, _args)
376 PyObject *_self;
377 PyObject *_args;
378{
379 PyObject *_res = NULL;
Jack Jansen5674e4e1996-08-01 15:26:05 +0000380 NumVersion _rv;
Guido van Rossum17448e21995-01-30 11:53:55 +0000381 if (!PyArg_ParseTuple(_args, ""))
382 return NULL;
383 _rv = SndSoundManagerVersion();
Jack Jansen5674e4e1996-08-01 15:26:05 +0000384 _res = Py_BuildValue("O&",
385 PyMac_BuildNumVersion, _rv);
Guido van Rossum17448e21995-01-30 11:53:55 +0000386 return _res;
387}
388
389static PyObject *Snd_SndManagerStatus(_self, _args)
390 PyObject *_self;
391 PyObject *_args;
392{
393 PyObject *_res = NULL;
394 OSErr _err;
395 short theLength;
396 SMStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000397 if (!PyArg_ParseTuple(_args, "h",
398 &theLength))
399 return NULL;
400 _err = SndManagerStatus(theLength,
401 &theStatus__out__);
402 if (_err != noErr) return PyMac_Error(_err);
403 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000404 (char *)&theStatus__out__, (int)sizeof(SMStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000405 theStatus__error__: ;
406 return _res;
407}
408
409static PyObject *Snd_SndGetSysBeepState(_self, _args)
410 PyObject *_self;
411 PyObject *_args;
412{
413 PyObject *_res = NULL;
414 short sysBeepState;
415 if (!PyArg_ParseTuple(_args, ""))
416 return NULL;
417 SndGetSysBeepState(&sysBeepState);
418 _res = Py_BuildValue("h",
419 sysBeepState);
420 return _res;
421}
422
423static PyObject *Snd_SndSetSysBeepState(_self, _args)
424 PyObject *_self;
425 PyObject *_args;
426{
427 PyObject *_res = NULL;
428 OSErr _err;
429 short sysBeepState;
430 if (!PyArg_ParseTuple(_args, "h",
431 &sysBeepState))
432 return NULL;
433 _err = SndSetSysBeepState(sysBeepState);
434 if (_err != noErr) return PyMac_Error(_err);
435 Py_INCREF(Py_None);
436 _res = Py_None;
437 return _res;
438}
439
440static PyObject *Snd_MACEVersion(_self, _args)
441 PyObject *_self;
442 PyObject *_args;
443{
444 PyObject *_res = NULL;
Jack Jansen5674e4e1996-08-01 15:26:05 +0000445 NumVersion _rv;
Guido van Rossum17448e21995-01-30 11:53:55 +0000446 if (!PyArg_ParseTuple(_args, ""))
447 return NULL;
448 _rv = MACEVersion();
Jack Jansen5674e4e1996-08-01 15:26:05 +0000449 _res = Py_BuildValue("O&",
450 PyMac_BuildNumVersion, _rv);
Guido van Rossum17448e21995-01-30 11:53:55 +0000451 return _res;
452}
453
454static PyObject *Snd_Comp3to1(_self, _args)
455 PyObject *_self;
456 PyObject *_args;
457{
458 PyObject *_res = NULL;
459 char *buffer__in__;
460 char *buffer__out__;
461 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000462 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000463 StateBlock *state__in__;
464 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000465 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000466 unsigned long numChannels;
467 unsigned long whichChannel;
468 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000469 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000470 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000471 &numChannels,
472 &whichChannel))
473 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000474 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000475 {
476 PyErr_NoMemory();
477 goto buffer__error__;
478 }
Guido van Rossum97842951995-02-19 15:59:49 +0000479 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000480 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000481 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000482 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000483 goto state__error__;
484 }
Guido van Rossum97842951995-02-19 15:59:49 +0000485 Comp3to1(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000486 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000487 numChannels,
488 whichChannel);
489 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000490 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000491 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000492 state__error__: ;
493 free(buffer__out__);
494 buffer__error__: ;
495 return _res;
496}
497
498static PyObject *Snd_Exp1to3(_self, _args)
499 PyObject *_self;
500 PyObject *_args;
501{
502 PyObject *_res = NULL;
503 char *buffer__in__;
504 char *buffer__out__;
505 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000506 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000507 StateBlock *state__in__;
508 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000509 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000510 unsigned long numChannels;
511 unsigned long whichChannel;
512 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000513 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000514 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000515 &numChannels,
516 &whichChannel))
517 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000518 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000519 {
520 PyErr_NoMemory();
521 goto buffer__error__;
522 }
Guido van Rossum97842951995-02-19 15:59:49 +0000523 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000524 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000525 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000526 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000527 goto state__error__;
528 }
Guido van Rossum97842951995-02-19 15:59:49 +0000529 Exp1to3(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000530 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000531 numChannels,
532 whichChannel);
533 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000534 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000535 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000536 state__error__: ;
537 free(buffer__out__);
538 buffer__error__: ;
539 return _res;
540}
541
542static PyObject *Snd_Comp6to1(_self, _args)
543 PyObject *_self;
544 PyObject *_args;
545{
546 PyObject *_res = NULL;
547 char *buffer__in__;
548 char *buffer__out__;
549 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000550 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000551 StateBlock *state__in__;
552 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000553 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000554 unsigned long numChannels;
555 unsigned long whichChannel;
556 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000557 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000558 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000559 &numChannels,
560 &whichChannel))
561 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000562 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000563 {
564 PyErr_NoMemory();
565 goto buffer__error__;
566 }
Guido van Rossum97842951995-02-19 15:59:49 +0000567 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000568 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000569 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000570 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000571 goto state__error__;
572 }
Guido van Rossum97842951995-02-19 15:59:49 +0000573 Comp6to1(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000574 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000575 numChannels,
576 whichChannel);
577 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000578 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000579 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000580 state__error__: ;
581 free(buffer__out__);
582 buffer__error__: ;
583 return _res;
584}
585
586static PyObject *Snd_Exp1to6(_self, _args)
587 PyObject *_self;
588 PyObject *_args;
589{
590 PyObject *_res = NULL;
591 char *buffer__in__;
592 char *buffer__out__;
593 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000594 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000595 StateBlock *state__in__;
596 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000597 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000598 unsigned long numChannels;
599 unsigned long whichChannel;
600 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000601 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000602 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000603 &numChannels,
604 &whichChannel))
605 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000606 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000607 {
608 PyErr_NoMemory();
609 goto buffer__error__;
610 }
Guido van Rossum97842951995-02-19 15:59:49 +0000611 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000612 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000613 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000614 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000615 goto state__error__;
616 }
Guido van Rossum97842951995-02-19 15:59:49 +0000617 Exp1to6(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000618 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000619 numChannels,
620 whichChannel);
621 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000622 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000623 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000624 state__error__: ;
625 free(buffer__out__);
626 buffer__error__: ;
627 return _res;
628}
629
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000630static PyObject *Snd_GetSysBeepVolume(_self, _args)
631 PyObject *_self;
632 PyObject *_args;
633{
634 PyObject *_res = NULL;
635 OSErr _err;
636 long level;
637 if (!PyArg_ParseTuple(_args, ""))
638 return NULL;
639 _err = GetSysBeepVolume(&level);
640 if (_err != noErr) return PyMac_Error(_err);
641 _res = Py_BuildValue("l",
642 level);
643 return _res;
644}
645
646static PyObject *Snd_SetSysBeepVolume(_self, _args)
647 PyObject *_self;
648 PyObject *_args;
649{
650 PyObject *_res = NULL;
651 OSErr _err;
652 long level;
653 if (!PyArg_ParseTuple(_args, "l",
654 &level))
655 return NULL;
656 _err = SetSysBeepVolume(level);
657 if (_err != noErr) return PyMac_Error(_err);
658 Py_INCREF(Py_None);
659 _res = Py_None;
660 return _res;
661}
662
663static PyObject *Snd_GetDefaultOutputVolume(_self, _args)
664 PyObject *_self;
665 PyObject *_args;
666{
667 PyObject *_res = NULL;
668 OSErr _err;
669 long level;
670 if (!PyArg_ParseTuple(_args, ""))
671 return NULL;
672 _err = GetDefaultOutputVolume(&level);
673 if (_err != noErr) return PyMac_Error(_err);
674 _res = Py_BuildValue("l",
675 level);
676 return _res;
677}
678
679static PyObject *Snd_SetDefaultOutputVolume(_self, _args)
680 PyObject *_self;
681 PyObject *_args;
682{
683 PyObject *_res = NULL;
684 OSErr _err;
685 long level;
686 if (!PyArg_ParseTuple(_args, "l",
687 &level))
688 return NULL;
689 _err = SetDefaultOutputVolume(level);
690 if (_err != noErr) return PyMac_Error(_err);
691 Py_INCREF(Py_None);
692 _res = Py_None;
693 return _res;
694}
695
696static PyObject *Snd_GetSoundHeaderOffset(_self, _args)
697 PyObject *_self;
698 PyObject *_args;
699{
700 PyObject *_res = NULL;
701 OSErr _err;
702 SndListHandle sndHandle;
703 long offset;
704 if (!PyArg_ParseTuple(_args, "O&",
705 ResObj_Convert, &sndHandle))
706 return NULL;
707 _err = GetSoundHeaderOffset(sndHandle,
708 &offset);
709 if (_err != noErr) return PyMac_Error(_err);
710 _res = Py_BuildValue("l",
711 offset);
712 return _res;
713}
714
Guido van Rossum17448e21995-01-30 11:53:55 +0000715static PyMethodDef Snd_methods[] = {
716 {"SndNewChannel", (PyCFunction)Snd_SndNewChannel, 1,
717 "(short synth, long init, PyObject* userRoutine) -> (SndChannelPtr chan)"},
718 {"SndControl", (PyCFunction)Snd_SndControl, 1,
719 "(short id) -> (SndCommand cmd)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000720 {"SndSoundManagerVersion", (PyCFunction)Snd_SndSoundManagerVersion, 1,
Jack Jansen5674e4e1996-08-01 15:26:05 +0000721 "() -> (NumVersion _rv)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000722 {"SndManagerStatus", (PyCFunction)Snd_SndManagerStatus, 1,
723 "(short theLength) -> (SMStatus theStatus)"},
724 {"SndGetSysBeepState", (PyCFunction)Snd_SndGetSysBeepState, 1,
725 "() -> (short sysBeepState)"},
726 {"SndSetSysBeepState", (PyCFunction)Snd_SndSetSysBeepState, 1,
727 "(short sysBeepState) -> None"},
728 {"MACEVersion", (PyCFunction)Snd_MACEVersion, 1,
Jack Jansen5674e4e1996-08-01 15:26:05 +0000729 "() -> (NumVersion _rv)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000730 {"Comp3to1", (PyCFunction)Snd_Comp3to1, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000731 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000732 {"Exp1to3", (PyCFunction)Snd_Exp1to3, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000733 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000734 {"Comp6to1", (PyCFunction)Snd_Comp6to1, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000735 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000736 {"Exp1to6", (PyCFunction)Snd_Exp1to6, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000737 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000738 {"GetSysBeepVolume", (PyCFunction)Snd_GetSysBeepVolume, 1,
739 "() -> (long level)"},
740 {"SetSysBeepVolume", (PyCFunction)Snd_SetSysBeepVolume, 1,
741 "(long level) -> None"},
742 {"GetDefaultOutputVolume", (PyCFunction)Snd_GetDefaultOutputVolume, 1,
743 "() -> (long level)"},
744 {"SetDefaultOutputVolume", (PyCFunction)Snd_SetDefaultOutputVolume, 1,
745 "(long level) -> None"},
746 {"GetSoundHeaderOffset", (PyCFunction)Snd_GetSoundHeaderOffset, 1,
747 "(SndListHandle sndHandle) -> (long offset)"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000748 {NULL, NULL, 0}
749};
750
751
752
753/* Routine passed to Py_AddPendingCall -- call the Python callback */
754static int
755SndCh_CallCallBack(arg)
756 void *arg;
757{
758 SndChannelObject *p = (SndChannelObject *)arg;
759 PyObject *args;
760 PyObject *res;
761 args = Py_BuildValue("(O(hhl))",
762 p, p->ob_cmd.cmd, p->ob_cmd.param1, p->ob_cmd.param2);
763 res = PyEval_CallObject(p->ob_callback, args);
764 Py_DECREF(args);
765 if (res == NULL)
766 return -1;
767 Py_DECREF(res);
768 return 0;
769}
770
771/* Routine passed to NewSndChannel -- schedule a call to SndCh_CallCallBack */
772static pascal void
773SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd)
774{
775 SndChannelObject *p = (SndChannelObject *)(chan->userInfo);
776 if (p->ob_callback != NULL) {
777 long A5 = SetA5(p->ob_A5);
778 p->ob_cmd = *cmd;
779 Py_AddPendingCall(SndCh_CallCallBack, (void *)p);
780 SetA5(A5);
781 }
782}
783
784
785void initSnd()
786{
787 PyObject *m;
788 PyObject *d;
789
790
791
792
793
794 m = Py_InitModule("Snd", Snd_methods);
795 d = PyModule_GetDict(m);
796 Snd_Error = PyMac_GetOSErrException();
797 if (Snd_Error == NULL ||
798 PyDict_SetItemString(d, "Error", Snd_Error) != 0)
799 Py_FatalError("can't initialize Snd.Error");
800}
801
802/* ========================= End module Snd ========================= */
803