blob: 84d77e1c5fc9097e4c7ed9729afb4e40a1fccf5e [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 */
Jack Jansen52b38b71998-02-25 15:47:51 +000079static pascal void SPB_completion(SPBPtr my_spb); /* Forward */
80static pascal void SPB_interrupt(SPBPtr my_spb); /* Forward */
Guido van Rossum17448e21995-01-30 11:53:55 +000081
82static PyObject *Snd_Error;
83
84/* --------------------- Object type SndChannel --------------------- */
85
86staticforward PyTypeObject SndChannel_Type;
87
88#define SndCh_Check(x) ((x)->ob_type == &SndChannel_Type)
89
90typedef struct SndChannelObject {
91 PyObject_HEAD
92 SndChannelPtr ob_itself;
93 /* Members used to implement callbacks: */
94 PyObject *ob_callback;
95 long ob_A5;
96 SndCommand ob_cmd;
97} SndChannelObject;
98
99static PyObject *SndCh_New(itself)
Guido van Rossum97842951995-02-19 15:59:49 +0000100 SndChannelPtr itself;
Guido van Rossum17448e21995-01-30 11:53:55 +0000101{
102 SndChannelObject *it;
103 it = PyObject_NEW(SndChannelObject, &SndChannel_Type);
104 if (it == NULL) return NULL;
105 it->ob_itself = itself;
106 it->ob_callback = NULL;
107 it->ob_A5 = SetCurrentA5();
108 return (PyObject *)it;
109}
110static SndCh_Convert(v, p_itself)
111 PyObject *v;
112 SndChannelPtr *p_itself;
113{
114 if (!SndCh_Check(v))
115 {
116 PyErr_SetString(PyExc_TypeError, "SndChannel required");
117 return 0;
118 }
119 *p_itself = ((SndChannelObject *)v)->ob_itself;
120 return 1;
121}
122
123static void SndCh_dealloc(self)
124 SndChannelObject *self;
125{
126 SndDisposeChannel(self->ob_itself, 1);
127 Py_XDECREF(self->ob_callback);
128 PyMem_DEL(self);
129}
130
131static PyObject *SndCh_SndDoCommand(_self, _args)
132 SndChannelObject *_self;
133 PyObject *_args;
134{
135 PyObject *_res = NULL;
136 OSErr _err;
137 SndCommand cmd;
138 Boolean noWait;
139 if (!PyArg_ParseTuple(_args, "O&b",
140 SndCmd_Convert, &cmd,
141 &noWait))
142 return NULL;
143 _err = SndDoCommand(_self->ob_itself,
144 &cmd,
145 noWait);
146 if (_err != noErr) return PyMac_Error(_err);
147 Py_INCREF(Py_None);
148 _res = Py_None;
149 return _res;
150}
151
152static PyObject *SndCh_SndDoImmediate(_self, _args)
153 SndChannelObject *_self;
154 PyObject *_args;
155{
156 PyObject *_res = NULL;
157 OSErr _err;
158 SndCommand cmd;
159 if (!PyArg_ParseTuple(_args, "O&",
160 SndCmd_Convert, &cmd))
161 return NULL;
162 _err = SndDoImmediate(_self->ob_itself,
163 &cmd);
164 if (_err != noErr) return PyMac_Error(_err);
165 Py_INCREF(Py_None);
166 _res = Py_None;
167 return _res;
168}
169
170static PyObject *SndCh_SndPlay(_self, _args)
171 SndChannelObject *_self;
172 PyObject *_args;
173{
174 PyObject *_res = NULL;
175 OSErr _err;
Jack Jansen21f96871998-02-20 16:02:09 +0000176 SndListHandle sndHandle;
Guido van Rossum17448e21995-01-30 11:53:55 +0000177 Boolean async;
178 if (!PyArg_ParseTuple(_args, "O&b",
Jack Jansen21f96871998-02-20 16:02:09 +0000179 ResObj_Convert, &sndHandle,
Guido van Rossum17448e21995-01-30 11:53:55 +0000180 &async))
181 return NULL;
182 _err = SndPlay(_self->ob_itself,
Jack Jansen21f96871998-02-20 16:02:09 +0000183 sndHandle,
Guido van Rossum17448e21995-01-30 11:53:55 +0000184 async);
185 if (_err != noErr) return PyMac_Error(_err);
186 Py_INCREF(Py_None);
187 _res = Py_None;
188 return _res;
189}
190
191static PyObject *SndCh_SndStartFilePlay(_self, _args)
192 SndChannelObject *_self;
193 PyObject *_args;
194{
195 PyObject *_res = NULL;
196 OSErr _err;
197 short fRefNum;
198 short resNum;
199 long bufferSize;
200 Boolean async;
201 if (!PyArg_ParseTuple(_args, "hhlb",
202 &fRefNum,
203 &resNum,
204 &bufferSize,
205 &async))
206 return NULL;
207 _err = SndStartFilePlay(_self->ob_itself,
208 fRefNum,
209 resNum,
210 bufferSize,
211 0,
212 0,
213 0,
214 async);
215 if (_err != noErr) return PyMac_Error(_err);
216 Py_INCREF(Py_None);
217 _res = Py_None;
218 return _res;
219}
220
221static PyObject *SndCh_SndPauseFilePlay(_self, _args)
222 SndChannelObject *_self;
223 PyObject *_args;
224{
225 PyObject *_res = NULL;
226 OSErr _err;
227 if (!PyArg_ParseTuple(_args, ""))
228 return NULL;
229 _err = SndPauseFilePlay(_self->ob_itself);
230 if (_err != noErr) return PyMac_Error(_err);
231 Py_INCREF(Py_None);
232 _res = Py_None;
233 return _res;
234}
235
236static PyObject *SndCh_SndStopFilePlay(_self, _args)
237 SndChannelObject *_self;
238 PyObject *_args;
239{
240 PyObject *_res = NULL;
241 OSErr _err;
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000242 Boolean quietNow;
Guido van Rossum17448e21995-01-30 11:53:55 +0000243 if (!PyArg_ParseTuple(_args, "b",
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000244 &quietNow))
Guido van Rossum17448e21995-01-30 11:53:55 +0000245 return NULL;
246 _err = SndStopFilePlay(_self->ob_itself,
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000247 quietNow);
Guido van Rossum17448e21995-01-30 11:53:55 +0000248 if (_err != noErr) return PyMac_Error(_err);
249 Py_INCREF(Py_None);
250 _res = Py_None;
251 return _res;
252}
253
254static PyObject *SndCh_SndChannelStatus(_self, _args)
255 SndChannelObject *_self;
256 PyObject *_args;
257{
258 PyObject *_res = NULL;
259 OSErr _err;
260 short theLength;
261 SCStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000262 if (!PyArg_ParseTuple(_args, "h",
263 &theLength))
264 return NULL;
265 _err = SndChannelStatus(_self->ob_itself,
266 theLength,
267 &theStatus__out__);
268 if (_err != noErr) return PyMac_Error(_err);
269 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000270 (char *)&theStatus__out__, (int)sizeof(SCStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000271 theStatus__error__: ;
272 return _res;
273}
274
275static PyMethodDef SndCh_methods[] = {
276 {"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1,
277 "(SndCommand cmd, Boolean noWait) -> None"},
278 {"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1,
279 "(SndCommand cmd) -> None"},
280 {"SndPlay", (PyCFunction)SndCh_SndPlay, 1,
Jack Jansen21f96871998-02-20 16:02:09 +0000281 "(SndListHandle sndHandle, Boolean async) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000282 {"SndStartFilePlay", (PyCFunction)SndCh_SndStartFilePlay, 1,
283 "(short fRefNum, short resNum, long bufferSize, Boolean async) -> None"},
284 {"SndPauseFilePlay", (PyCFunction)SndCh_SndPauseFilePlay, 1,
285 "() -> None"},
286 {"SndStopFilePlay", (PyCFunction)SndCh_SndStopFilePlay, 1,
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000287 "(Boolean quietNow) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +0000288 {"SndChannelStatus", (PyCFunction)SndCh_SndChannelStatus, 1,
289 "(short theLength) -> (SCStatus theStatus)"},
290 {NULL, NULL, 0}
291};
292
293static PyMethodChain SndCh_chain = { SndCh_methods, NULL };
294
295static PyObject *SndCh_getattr(self, name)
296 SndChannelObject *self;
297 char *name;
298{
299 return Py_FindMethodInChain(&SndCh_chain, (PyObject *)self, name);
300}
301
302#define SndCh_setattr NULL
303
Guido van Rossum97842951995-02-19 15:59:49 +0000304staticforward PyTypeObject SndChannel_Type = {
Guido van Rossum17448e21995-01-30 11:53:55 +0000305 PyObject_HEAD_INIT(&PyType_Type)
306 0, /*ob_size*/
307 "SndChannel", /*tp_name*/
308 sizeof(SndChannelObject), /*tp_basicsize*/
309 0, /*tp_itemsize*/
310 /* methods */
311 (destructor) SndCh_dealloc, /*tp_dealloc*/
312 0, /*tp_print*/
313 (getattrfunc) SndCh_getattr, /*tp_getattr*/
314 (setattrfunc) SndCh_setattr, /*tp_setattr*/
315};
316
317/* ------------------- End object type SndChannel ------------------- */
318
319
Jack Jansen52b38b71998-02-25 15:47:51 +0000320/* ------------------------ Object type SPB ------------------------- */
321
322staticforward PyTypeObject SPB_Type;
323
324#define SPBObj_Check(x) ((x)->ob_type == &SPB_Type)
325
326typedef struct SPBObject {
327 PyObject_HEAD
328 /* Members used to implement callbacks: */
329 PyObject *ob_completion;
330 PyObject *ob_interrupt;
331 PyObject *ob_thiscallback;
332 long ob_A5;
333 SPB ob_spb;
334} SPBObject;
335
336static PyObject *SPBObj_New()
337{
338 SPBObject *it;
339 it = PyObject_NEW(SPBObject, &SPB_Type);
340 if (it == NULL) return NULL;
341 it->ob_completion = NULL;
342 it->ob_interrupt = NULL;
343 it->ob_thiscallback = NULL;
344 it->ob_A5 = SetCurrentA5();
345 memset((char *)&it->ob_spb, 0, sizeof(it->ob_spb));
346 it->ob_spb.userLong = (long)it;
347 return (PyObject *)it;
348}
349static SPBObj_Convert(v, p_itself)
350 PyObject *v;
351 SPBPtr *p_itself;
352{
353 if (!SPBObj_Check(v))
354 {
355 PyErr_SetString(PyExc_TypeError, "SPB required");
356 return 0;
357 }
358 *p_itself = &((SPBObject *)v)->ob_spb;
359 return 1;
360}
361
362static void SPBObj_dealloc(self)
363 SPBObject *self;
364{
365 /* Cleanup of self->ob_itself goes here */
366 self->ob_spb.userLong = 0;
367 self->ob_thiscallback = 0;
368 Py_XDECREF(self->ob_completion);
369 Py_XDECREF(self->ob_interrupt);
370 PyMem_DEL(self);
371}
372
373static PyMethodDef SPBObj_methods[] = {
374 {NULL, NULL, 0}
375};
376
377static PyMethodChain SPBObj_chain = { SPBObj_methods, NULL };
378
379static PyObject *SPBObj_getattr(self, name)
380 SPBObject *self;
381 char *name;
382{
383
384 if (strcmp(name, "inRefNum") == 0)
385 return Py_BuildValue("l", self->ob_spb.inRefNum);
386 else if (strcmp(name, "count") == 0)
387 return Py_BuildValue("l", self->ob_spb.count);
388 else if (strcmp(name, "milliseconds") == 0)
389 return Py_BuildValue("l", self->ob_spb.milliseconds);
390 else if (strcmp(name, "error") == 0)
391 return Py_BuildValue("h", self->ob_spb.error);
392 return Py_FindMethodInChain(&SPBObj_chain, (PyObject *)self, name);
393}
394
395static int SPBObj_setattr(self, name, value)
396 SPBObject *self;
397 char *name;
398 PyObject *value;
399{
400
Jack Jansena239a921998-04-15 14:08:28 +0000401 int rv = 0;
402
403 if (strcmp(name, "inRefNum") == 0)
404 rv = PyArg_Parse(value, "l", &self->ob_spb.inRefNum);
405 else if (strcmp(name, "count") == 0)
406 rv = PyArg_Parse(value, "l", &self->ob_spb.count);
407 else if (strcmp(name, "milliseconds") == 0)
408 rv = PyArg_Parse(value, "l", &self->ob_spb.milliseconds);
409 else if (strcmp(name, "buffer") == 0)
410 rv = PyArg_Parse(value, "w#", &self->ob_spb.bufferPtr, &self->ob_spb.bufferLength);
411 else if (strcmp(name, "completionRoutine") == 0) {
412 self->ob_spb.completionRoutine = NewSICompletionProc(SPB_completion);
413 self->ob_completion = value;
414 Py_INCREF(value);
415 rv = 1;
416 } else if (strcmp(name, "interruptRoutine") == 0) {
417 self->ob_spb.completionRoutine = NewSIInterruptProc(SPB_interrupt);
418 self->ob_interrupt = value;
419 Py_INCREF(value);
420 rv = 1;
421 }
422 if ( rv ) return 0;
423 else return -1;
Jack Jansen52b38b71998-02-25 15:47:51 +0000424}
425
426staticforward PyTypeObject SPB_Type = {
427 PyObject_HEAD_INIT(&PyType_Type)
428 0, /*ob_size*/
429 "SPB", /*tp_name*/
430 sizeof(SPBObject), /*tp_basicsize*/
431 0, /*tp_itemsize*/
432 /* methods */
433 (destructor) SPBObj_dealloc, /*tp_dealloc*/
434 0, /*tp_print*/
435 (getattrfunc) SPBObj_getattr, /*tp_getattr*/
436 (setattrfunc) SPBObj_setattr, /*tp_setattr*/
437};
438
439/* ---------------------- End object type SPB ----------------------- */
440
441
442static PyObject *Snd_SPB(_self, _args)
443 PyObject *_self;
444 PyObject *_args;
445{
446 PyObject *_res = NULL;
447 return SPBObj_New();
448}
449
Jack Jansen21f96871998-02-20 16:02:09 +0000450static PyObject *Snd_SysBeep(_self, _args)
451 PyObject *_self;
452 PyObject *_args;
453{
454 PyObject *_res = NULL;
455 short duration;
456 if (!PyArg_ParseTuple(_args, "h",
457 &duration))
458 return NULL;
459 SysBeep(duration);
460 Py_INCREF(Py_None);
461 _res = Py_None;
462 return _res;
463}
464
Guido van Rossum17448e21995-01-30 11:53:55 +0000465static PyObject *Snd_SndNewChannel(_self, _args)
466 PyObject *_self;
467 PyObject *_args;
468{
469 PyObject *_res = NULL;
470 OSErr _err;
471 SndChannelPtr chan = 0;
472 short synth;
473 long init;
474 PyObject* userRoutine;
475 if (!PyArg_ParseTuple(_args, "hlO",
476 &synth,
477 &init,
478 &userRoutine))
479 return NULL;
Guido van Rossum0818a4c1995-02-05 16:53:45 +0000480 if (userRoutine != Py_None && !PyCallable_Check(userRoutine))
Guido van Rossum17448e21995-01-30 11:53:55 +0000481 {
482 PyErr_SetString(PyExc_TypeError, "callback must be callable");
483 goto userRoutine__error__;
484 }
485 _err = SndNewChannel(&chan,
486 synth,
487 init,
Guido van Rossum97842951995-02-19 15:59:49 +0000488 NewSndCallBackProc(SndCh_UserRoutine));
Guido van Rossum17448e21995-01-30 11:53:55 +0000489 if (_err != noErr) return PyMac_Error(_err);
490 _res = Py_BuildValue("O&",
491 SndCh_New, chan);
492 if (_res != NULL && userRoutine != Py_None)
493 {
494 SndChannelObject *p = (SndChannelObject *)_res;
495 p->ob_itself->userInfo = (long)p;
496 Py_INCREF(userRoutine);
497 p->ob_callback = userRoutine;
498 }
499 userRoutine__error__: ;
500 return _res;
501}
502
503static PyObject *Snd_SndControl(_self, _args)
504 PyObject *_self;
505 PyObject *_args;
506{
507 PyObject *_res = NULL;
508 OSErr _err;
509 short id;
510 SndCommand cmd;
511 if (!PyArg_ParseTuple(_args, "h",
512 &id))
513 return NULL;
514 _err = SndControl(id,
515 &cmd);
516 if (_err != noErr) return PyMac_Error(_err);
517 _res = Py_BuildValue("O&",
518 SndCmd_New, &cmd);
519 return _res;
520}
521
Guido van Rossum17448e21995-01-30 11:53:55 +0000522static PyObject *Snd_SndSoundManagerVersion(_self, _args)
523 PyObject *_self;
524 PyObject *_args;
525{
526 PyObject *_res = NULL;
Jack Jansen5674e4e1996-08-01 15:26:05 +0000527 NumVersion _rv;
Guido van Rossum17448e21995-01-30 11:53:55 +0000528 if (!PyArg_ParseTuple(_args, ""))
529 return NULL;
530 _rv = SndSoundManagerVersion();
Jack Jansen5674e4e1996-08-01 15:26:05 +0000531 _res = Py_BuildValue("O&",
532 PyMac_BuildNumVersion, _rv);
Guido van Rossum17448e21995-01-30 11:53:55 +0000533 return _res;
534}
535
536static PyObject *Snd_SndManagerStatus(_self, _args)
537 PyObject *_self;
538 PyObject *_args;
539{
540 PyObject *_res = NULL;
541 OSErr _err;
542 short theLength;
543 SMStatus theStatus__out__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000544 if (!PyArg_ParseTuple(_args, "h",
545 &theLength))
546 return NULL;
547 _err = SndManagerStatus(theLength,
548 &theStatus__out__);
549 if (_err != noErr) return PyMac_Error(_err);
550 _res = Py_BuildValue("s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000551 (char *)&theStatus__out__, (int)sizeof(SMStatus));
Guido van Rossum17448e21995-01-30 11:53:55 +0000552 theStatus__error__: ;
553 return _res;
554}
555
556static PyObject *Snd_SndGetSysBeepState(_self, _args)
557 PyObject *_self;
558 PyObject *_args;
559{
560 PyObject *_res = NULL;
561 short sysBeepState;
562 if (!PyArg_ParseTuple(_args, ""))
563 return NULL;
564 SndGetSysBeepState(&sysBeepState);
565 _res = Py_BuildValue("h",
566 sysBeepState);
567 return _res;
568}
569
570static PyObject *Snd_SndSetSysBeepState(_self, _args)
571 PyObject *_self;
572 PyObject *_args;
573{
574 PyObject *_res = NULL;
575 OSErr _err;
576 short sysBeepState;
577 if (!PyArg_ParseTuple(_args, "h",
578 &sysBeepState))
579 return NULL;
580 _err = SndSetSysBeepState(sysBeepState);
581 if (_err != noErr) return PyMac_Error(_err);
582 Py_INCREF(Py_None);
583 _res = Py_None;
584 return _res;
585}
586
587static PyObject *Snd_MACEVersion(_self, _args)
588 PyObject *_self;
589 PyObject *_args;
590{
591 PyObject *_res = NULL;
Jack Jansen5674e4e1996-08-01 15:26:05 +0000592 NumVersion _rv;
Guido van Rossum17448e21995-01-30 11:53:55 +0000593 if (!PyArg_ParseTuple(_args, ""))
594 return NULL;
595 _rv = MACEVersion();
Jack Jansen5674e4e1996-08-01 15:26:05 +0000596 _res = Py_BuildValue("O&",
597 PyMac_BuildNumVersion, _rv);
Guido van Rossum17448e21995-01-30 11:53:55 +0000598 return _res;
599}
600
601static PyObject *Snd_Comp3to1(_self, _args)
602 PyObject *_self;
603 PyObject *_args;
604{
605 PyObject *_res = NULL;
606 char *buffer__in__;
607 char *buffer__out__;
608 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000609 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000610 StateBlock *state__in__;
611 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000612 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000613 unsigned long numChannels;
614 unsigned long whichChannel;
615 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000616 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000617 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000618 &numChannels,
619 &whichChannel))
620 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000621 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000622 {
623 PyErr_NoMemory();
624 goto buffer__error__;
625 }
Guido van Rossum97842951995-02-19 15:59:49 +0000626 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000627 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000628 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000629 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000630 goto state__error__;
631 }
Guido van Rossum97842951995-02-19 15:59:49 +0000632 Comp3to1(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000633 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000634 numChannels,
635 whichChannel);
636 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000637 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000638 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000639 state__error__: ;
640 free(buffer__out__);
641 buffer__error__: ;
642 return _res;
643}
644
645static PyObject *Snd_Exp1to3(_self, _args)
646 PyObject *_self;
647 PyObject *_args;
648{
649 PyObject *_res = NULL;
650 char *buffer__in__;
651 char *buffer__out__;
652 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000653 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000654 StateBlock *state__in__;
655 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000656 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000657 unsigned long numChannels;
658 unsigned long whichChannel;
659 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000660 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000661 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000662 &numChannels,
663 &whichChannel))
664 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000665 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000666 {
667 PyErr_NoMemory();
668 goto buffer__error__;
669 }
Guido van Rossum97842951995-02-19 15:59:49 +0000670 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000671 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000672 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000673 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000674 goto state__error__;
675 }
Guido van Rossum97842951995-02-19 15:59:49 +0000676 Exp1to3(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000677 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000678 numChannels,
679 whichChannel);
680 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000681 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000682 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000683 state__error__: ;
684 free(buffer__out__);
685 buffer__error__: ;
686 return _res;
687}
688
689static PyObject *Snd_Comp6to1(_self, _args)
690 PyObject *_self;
691 PyObject *_args;
692{
693 PyObject *_res = NULL;
694 char *buffer__in__;
695 char *buffer__out__;
696 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000697 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000698 StateBlock *state__in__;
699 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000700 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000701 unsigned long numChannels;
702 unsigned long whichChannel;
703 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000704 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000705 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000706 &numChannels,
707 &whichChannel))
708 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000709 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000710 {
711 PyErr_NoMemory();
712 goto buffer__error__;
713 }
Guido van Rossum97842951995-02-19 15:59:49 +0000714 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000715 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000716 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000717 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000718 goto state__error__;
719 }
Guido van Rossum97842951995-02-19 15:59:49 +0000720 Comp6to1(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000721 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000722 numChannels,
723 whichChannel);
724 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000725 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000726 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000727 state__error__: ;
728 free(buffer__out__);
729 buffer__error__: ;
730 return _res;
731}
732
733static PyObject *Snd_Exp1to6(_self, _args)
734 PyObject *_self;
735 PyObject *_args;
736{
737 PyObject *_res = NULL;
738 char *buffer__in__;
739 char *buffer__out__;
740 long buffer__len__;
Guido van Rossum97842951995-02-19 15:59:49 +0000741 int buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000742 StateBlock *state__in__;
743 StateBlock state__out__;
Guido van Rossum97842951995-02-19 15:59:49 +0000744 int state__in_len__;
Guido van Rossum17448e21995-01-30 11:53:55 +0000745 unsigned long numChannels;
746 unsigned long whichChannel;
747 if (!PyArg_ParseTuple(_args, "s#s#ll",
Guido van Rossum97842951995-02-19 15:59:49 +0000748 &buffer__in__, &buffer__in_len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000749 (char **)&state__in__, &state__in_len__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000750 &numChannels,
751 &whichChannel))
752 return NULL;
Guido van Rossum97842951995-02-19 15:59:49 +0000753 if ((buffer__out__ = malloc(buffer__in_len__)) == NULL)
Guido van Rossum17448e21995-01-30 11:53:55 +0000754 {
755 PyErr_NoMemory();
756 goto buffer__error__;
757 }
Guido van Rossum97842951995-02-19 15:59:49 +0000758 buffer__len__ = buffer__in_len__;
Jack Jansen7d0bc831995-06-09 20:56:31 +0000759 if (state__in_len__ != sizeof(StateBlock))
Guido van Rossum17448e21995-01-30 11:53:55 +0000760 {
Jack Jansen7d0bc831995-06-09 20:56:31 +0000761 PyErr_SetString(PyExc_TypeError, "buffer length should be sizeof(StateBlock)");
Guido van Rossum17448e21995-01-30 11:53:55 +0000762 goto state__error__;
763 }
Guido van Rossum97842951995-02-19 15:59:49 +0000764 Exp1to6(buffer__in__, buffer__out__, (long)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000765 state__in__, &state__out__,
Guido van Rossum17448e21995-01-30 11:53:55 +0000766 numChannels,
767 whichChannel);
768 _res = Py_BuildValue("s#s#",
Guido van Rossum97842951995-02-19 15:59:49 +0000769 buffer__out__, (int)buffer__len__,
Jack Jansen7d0bc831995-06-09 20:56:31 +0000770 (char *)&state__out__, (int)sizeof(StateBlock));
Guido van Rossum17448e21995-01-30 11:53:55 +0000771 state__error__: ;
772 free(buffer__out__);
773 buffer__error__: ;
774 return _res;
775}
776
Jack Jansenb81cf9d1995-06-06 13:08:40 +0000777static PyObject *Snd_GetSysBeepVolume(_self, _args)
778 PyObject *_self;
779 PyObject *_args;
780{
781 PyObject *_res = NULL;
782 OSErr _err;
783 long level;
784 if (!PyArg_ParseTuple(_args, ""))
785 return NULL;
786 _err = GetSysBeepVolume(&level);
787 if (_err != noErr) return PyMac_Error(_err);
788 _res = Py_BuildValue("l",
789 level);
790 return _res;
791}
792
793static PyObject *Snd_SetSysBeepVolume(_self, _args)
794 PyObject *_self;
795 PyObject *_args;
796{
797 PyObject *_res = NULL;
798 OSErr _err;
799 long level;
800 if (!PyArg_ParseTuple(_args, "l",
801 &level))
802 return NULL;
803 _err = SetSysBeepVolume(level);
804 if (_err != noErr) return PyMac_Error(_err);
805 Py_INCREF(Py_None);
806 _res = Py_None;
807 return _res;
808}
809
810static PyObject *Snd_GetDefaultOutputVolume(_self, _args)
811 PyObject *_self;
812 PyObject *_args;
813{
814 PyObject *_res = NULL;
815 OSErr _err;
816 long level;
817 if (!PyArg_ParseTuple(_args, ""))
818 return NULL;
819 _err = GetDefaultOutputVolume(&level);
820 if (_err != noErr) return PyMac_Error(_err);
821 _res = Py_BuildValue("l",
822 level);
823 return _res;
824}
825
826static PyObject *Snd_SetDefaultOutputVolume(_self, _args)
827 PyObject *_self;
828 PyObject *_args;
829{
830 PyObject *_res = NULL;
831 OSErr _err;
832 long level;
833 if (!PyArg_ParseTuple(_args, "l",
834 &level))
835 return NULL;
836 _err = SetDefaultOutputVolume(level);
837 if (_err != noErr) return PyMac_Error(_err);
838 Py_INCREF(Py_None);
839 _res = Py_None;
840 return _res;
841}
842
843static PyObject *Snd_GetSoundHeaderOffset(_self, _args)
844 PyObject *_self;
845 PyObject *_args;
846{
847 PyObject *_res = NULL;
848 OSErr _err;
849 SndListHandle sndHandle;
850 long offset;
851 if (!PyArg_ParseTuple(_args, "O&",
852 ResObj_Convert, &sndHandle))
853 return NULL;
854 _err = GetSoundHeaderOffset(sndHandle,
855 &offset);
856 if (_err != noErr) return PyMac_Error(_err);
857 _res = Py_BuildValue("l",
858 offset);
859 return _res;
860}
861
Jack Jansen21f96871998-02-20 16:02:09 +0000862static PyObject *Snd_SPBVersion(_self, _args)
863 PyObject *_self;
864 PyObject *_args;
865{
866 PyObject *_res = NULL;
867 NumVersion _rv;
868 if (!PyArg_ParseTuple(_args, ""))
869 return NULL;
870 _rv = SPBVersion();
871 _res = Py_BuildValue("O&",
872 PyMac_BuildNumVersion, _rv);
873 return _res;
874}
875
876static PyObject *Snd_SPBSignInDevice(_self, _args)
877 PyObject *_self;
878 PyObject *_args;
879{
880 PyObject *_res = NULL;
881 OSErr _err;
882 short deviceRefNum;
883 Str255 deviceName;
884 if (!PyArg_ParseTuple(_args, "hO&",
885 &deviceRefNum,
886 PyMac_GetStr255, deviceName))
887 return NULL;
888 _err = SPBSignInDevice(deviceRefNum,
889 deviceName);
890 if (_err != noErr) return PyMac_Error(_err);
891 Py_INCREF(Py_None);
892 _res = Py_None;
893 return _res;
894}
895
896static PyObject *Snd_SPBSignOutDevice(_self, _args)
897 PyObject *_self;
898 PyObject *_args;
899{
900 PyObject *_res = NULL;
901 OSErr _err;
902 short deviceRefNum;
903 if (!PyArg_ParseTuple(_args, "h",
904 &deviceRefNum))
905 return NULL;
906 _err = SPBSignOutDevice(deviceRefNum);
907 if (_err != noErr) return PyMac_Error(_err);
908 Py_INCREF(Py_None);
909 _res = Py_None;
910 return _res;
911}
912
913static PyObject *Snd_SPBGetIndexedDevice(_self, _args)
914 PyObject *_self;
915 PyObject *_args;
916{
917 PyObject *_res = NULL;
918 OSErr _err;
919 short count;
920 Str255 deviceName;
921 Handle deviceIconHandle;
922 if (!PyArg_ParseTuple(_args, "h",
923 &count))
924 return NULL;
925 _err = SPBGetIndexedDevice(count,
926 deviceName,
927 &deviceIconHandle);
928 if (_err != noErr) return PyMac_Error(_err);
929 _res = Py_BuildValue("O&O&",
930 PyMac_BuildStr255, deviceName,
931 ResObj_New, deviceIconHandle);
932 return _res;
933}
934
935static PyObject *Snd_SPBOpenDevice(_self, _args)
936 PyObject *_self;
937 PyObject *_args;
938{
939 PyObject *_res = NULL;
940 OSErr _err;
941 Str255 deviceName;
942 short permission;
943 long inRefNum;
944 if (!PyArg_ParseTuple(_args, "O&h",
945 PyMac_GetStr255, deviceName,
946 &permission))
947 return NULL;
948 _err = SPBOpenDevice(deviceName,
949 permission,
950 &inRefNum);
951 if (_err != noErr) return PyMac_Error(_err);
952 _res = Py_BuildValue("l",
953 inRefNum);
954 return _res;
955}
956
957static PyObject *Snd_SPBCloseDevice(_self, _args)
958 PyObject *_self;
959 PyObject *_args;
960{
961 PyObject *_res = NULL;
962 OSErr _err;
963 long inRefNum;
964 if (!PyArg_ParseTuple(_args, "l",
965 &inRefNum))
966 return NULL;
967 _err = SPBCloseDevice(inRefNum);
968 if (_err != noErr) return PyMac_Error(_err);
969 Py_INCREF(Py_None);
970 _res = Py_None;
971 return _res;
972}
973
Jack Jansen52b38b71998-02-25 15:47:51 +0000974static PyObject *Snd_SPBRecord(_self, _args)
975 PyObject *_self;
976 PyObject *_args;
977{
978 PyObject *_res = NULL;
979 OSErr _err;
980 SPBPtr inParamPtr;
981 Boolean asynchFlag;
982 if (!PyArg_ParseTuple(_args, "O&b",
983 SPBObj_Convert, &inParamPtr,
984 &asynchFlag))
985 return NULL;
986 _err = SPBRecord(inParamPtr,
987 asynchFlag);
988 if (_err != noErr) return PyMac_Error(_err);
989 Py_INCREF(Py_None);
990 _res = Py_None;
991 return _res;
992}
993
994static PyObject *Snd_SPBRecordToFile(_self, _args)
995 PyObject *_self;
996 PyObject *_args;
997{
998 PyObject *_res = NULL;
999 OSErr _err;
1000 short fRefNum;
1001 SPBPtr inParamPtr;
1002 Boolean asynchFlag;
1003 if (!PyArg_ParseTuple(_args, "hO&b",
1004 &fRefNum,
1005 SPBObj_Convert, &inParamPtr,
1006 &asynchFlag))
1007 return NULL;
1008 _err = SPBRecordToFile(fRefNum,
1009 inParamPtr,
1010 asynchFlag);
1011 if (_err != noErr) return PyMac_Error(_err);
1012 Py_INCREF(Py_None);
1013 _res = Py_None;
1014 return _res;
1015}
1016
Jack Jansen21f96871998-02-20 16:02:09 +00001017static PyObject *Snd_SPBPauseRecording(_self, _args)
1018 PyObject *_self;
1019 PyObject *_args;
1020{
1021 PyObject *_res = NULL;
1022 OSErr _err;
1023 long inRefNum;
1024 if (!PyArg_ParseTuple(_args, "l",
1025 &inRefNum))
1026 return NULL;
1027 _err = SPBPauseRecording(inRefNum);
1028 if (_err != noErr) return PyMac_Error(_err);
1029 Py_INCREF(Py_None);
1030 _res = Py_None;
1031 return _res;
1032}
1033
1034static PyObject *Snd_SPBResumeRecording(_self, _args)
1035 PyObject *_self;
1036 PyObject *_args;
1037{
1038 PyObject *_res = NULL;
1039 OSErr _err;
1040 long inRefNum;
1041 if (!PyArg_ParseTuple(_args, "l",
1042 &inRefNum))
1043 return NULL;
1044 _err = SPBResumeRecording(inRefNum);
1045 if (_err != noErr) return PyMac_Error(_err);
1046 Py_INCREF(Py_None);
1047 _res = Py_None;
1048 return _res;
1049}
1050
1051static PyObject *Snd_SPBStopRecording(_self, _args)
1052 PyObject *_self;
1053 PyObject *_args;
1054{
1055 PyObject *_res = NULL;
1056 OSErr _err;
1057 long inRefNum;
1058 if (!PyArg_ParseTuple(_args, "l",
1059 &inRefNum))
1060 return NULL;
1061 _err = SPBStopRecording(inRefNum);
1062 if (_err != noErr) return PyMac_Error(_err);
1063 Py_INCREF(Py_None);
1064 _res = Py_None;
1065 return _res;
1066}
1067
1068static PyObject *Snd_SPBGetRecordingStatus(_self, _args)
1069 PyObject *_self;
1070 PyObject *_args;
1071{
1072 PyObject *_res = NULL;
1073 OSErr _err;
1074 long inRefNum;
1075 short recordingStatus;
1076 short meterLevel;
1077 unsigned long totalSamplesToRecord;
1078 unsigned long numberOfSamplesRecorded;
1079 unsigned long totalMsecsToRecord;
1080 unsigned long numberOfMsecsRecorded;
1081 if (!PyArg_ParseTuple(_args, "l",
1082 &inRefNum))
1083 return NULL;
1084 _err = SPBGetRecordingStatus(inRefNum,
1085 &recordingStatus,
1086 &meterLevel,
1087 &totalSamplesToRecord,
1088 &numberOfSamplesRecorded,
1089 &totalMsecsToRecord,
1090 &numberOfMsecsRecorded);
1091 if (_err != noErr) return PyMac_Error(_err);
1092 _res = Py_BuildValue("hhllll",
1093 recordingStatus,
1094 meterLevel,
1095 totalSamplesToRecord,
1096 numberOfSamplesRecorded,
1097 totalMsecsToRecord,
1098 numberOfMsecsRecorded);
1099 return _res;
1100}
1101
Jack Jansen52b38b71998-02-25 15:47:51 +00001102static PyObject *Snd_SPBGetDeviceInfo(_self, _args)
1103 PyObject *_self;
1104 PyObject *_args;
1105{
1106 PyObject *_res = NULL;
1107 OSErr _err;
1108 long inRefNum;
1109 OSType infoType;
1110 void * infoData;
1111 if (!PyArg_ParseTuple(_args, "lO&w",
1112 &inRefNum,
1113 PyMac_GetOSType, &infoType,
1114 &infoData))
1115 return NULL;
1116 _err = SPBGetDeviceInfo(inRefNum,
1117 infoType,
1118 infoData);
1119 if (_err != noErr) return PyMac_Error(_err);
1120 Py_INCREF(Py_None);
1121 _res = Py_None;
1122 return _res;
1123}
1124
1125static PyObject *Snd_SPBSetDeviceInfo(_self, _args)
1126 PyObject *_self;
1127 PyObject *_args;
1128{
1129 PyObject *_res = NULL;
1130 OSErr _err;
1131 long inRefNum;
1132 OSType infoType;
1133 void * infoData;
1134 if (!PyArg_ParseTuple(_args, "lO&w",
1135 &inRefNum,
1136 PyMac_GetOSType, &infoType,
1137 &infoData))
1138 return NULL;
1139 _err = SPBSetDeviceInfo(inRefNum,
1140 infoType,
1141 infoData);
1142 if (_err != noErr) return PyMac_Error(_err);
1143 Py_INCREF(Py_None);
1144 _res = Py_None;
1145 return _res;
1146}
1147
Jack Jansen21f96871998-02-20 16:02:09 +00001148static PyObject *Snd_SPBMillisecondsToBytes(_self, _args)
1149 PyObject *_self;
1150 PyObject *_args;
1151{
1152 PyObject *_res = NULL;
1153 OSErr _err;
1154 long inRefNum;
1155 long milliseconds;
1156 if (!PyArg_ParseTuple(_args, "l",
1157 &inRefNum))
1158 return NULL;
1159 _err = SPBMillisecondsToBytes(inRefNum,
1160 &milliseconds);
1161 if (_err != noErr) return PyMac_Error(_err);
1162 _res = Py_BuildValue("l",
1163 milliseconds);
1164 return _res;
1165}
1166
1167static PyObject *Snd_SPBBytesToMilliseconds(_self, _args)
1168 PyObject *_self;
1169 PyObject *_args;
1170{
1171 PyObject *_res = NULL;
1172 OSErr _err;
1173 long inRefNum;
1174 long byteCount;
1175 if (!PyArg_ParseTuple(_args, "l",
1176 &inRefNum))
1177 return NULL;
1178 _err = SPBBytesToMilliseconds(inRefNum,
1179 &byteCount);
1180 if (_err != noErr) return PyMac_Error(_err);
1181 _res = Py_BuildValue("l",
1182 byteCount);
1183 return _res;
1184}
1185
Guido van Rossum17448e21995-01-30 11:53:55 +00001186static PyMethodDef Snd_methods[] = {
Jack Jansen52b38b71998-02-25 15:47:51 +00001187 {"SPB", (PyCFunction)Snd_SPB, 1,
1188 NULL},
Jack Jansen21f96871998-02-20 16:02:09 +00001189 {"SysBeep", (PyCFunction)Snd_SysBeep, 1,
1190 "(short duration) -> None"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001191 {"SndNewChannel", (PyCFunction)Snd_SndNewChannel, 1,
1192 "(short synth, long init, PyObject* userRoutine) -> (SndChannelPtr chan)"},
1193 {"SndControl", (PyCFunction)Snd_SndControl, 1,
1194 "(short id) -> (SndCommand cmd)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001195 {"SndSoundManagerVersion", (PyCFunction)Snd_SndSoundManagerVersion, 1,
Jack Jansen5674e4e1996-08-01 15:26:05 +00001196 "() -> (NumVersion _rv)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001197 {"SndManagerStatus", (PyCFunction)Snd_SndManagerStatus, 1,
1198 "(short theLength) -> (SMStatus theStatus)"},
1199 {"SndGetSysBeepState", (PyCFunction)Snd_SndGetSysBeepState, 1,
1200 "() -> (short sysBeepState)"},
1201 {"SndSetSysBeepState", (PyCFunction)Snd_SndSetSysBeepState, 1,
1202 "(short sysBeepState) -> None"},
1203 {"MACEVersion", (PyCFunction)Snd_MACEVersion, 1,
Jack Jansen5674e4e1996-08-01 15:26:05 +00001204 "() -> (NumVersion _rv)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001205 {"Comp3to1", (PyCFunction)Snd_Comp3to1, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +00001206 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001207 {"Exp1to3", (PyCFunction)Snd_Exp1to3, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +00001208 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001209 {"Comp6to1", (PyCFunction)Snd_Comp6to1, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +00001210 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001211 {"Exp1to6", (PyCFunction)Snd_Exp1to6, 1,
Jack Jansen7d0bc831995-06-09 20:56:31 +00001212 "(Buffer buffer, StateBlock state, unsigned long numChannels, unsigned long whichChannel) -> (Buffer buffer, StateBlock state)"},
Jack Jansenb81cf9d1995-06-06 13:08:40 +00001213 {"GetSysBeepVolume", (PyCFunction)Snd_GetSysBeepVolume, 1,
1214 "() -> (long level)"},
1215 {"SetSysBeepVolume", (PyCFunction)Snd_SetSysBeepVolume, 1,
1216 "(long level) -> None"},
1217 {"GetDefaultOutputVolume", (PyCFunction)Snd_GetDefaultOutputVolume, 1,
1218 "() -> (long level)"},
1219 {"SetDefaultOutputVolume", (PyCFunction)Snd_SetDefaultOutputVolume, 1,
1220 "(long level) -> None"},
1221 {"GetSoundHeaderOffset", (PyCFunction)Snd_GetSoundHeaderOffset, 1,
1222 "(SndListHandle sndHandle) -> (long offset)"},
Jack Jansen21f96871998-02-20 16:02:09 +00001223 {"SPBVersion", (PyCFunction)Snd_SPBVersion, 1,
1224 "() -> (NumVersion _rv)"},
1225 {"SPBSignInDevice", (PyCFunction)Snd_SPBSignInDevice, 1,
1226 "(short deviceRefNum, Str255 deviceName) -> None"},
1227 {"SPBSignOutDevice", (PyCFunction)Snd_SPBSignOutDevice, 1,
1228 "(short deviceRefNum) -> None"},
1229 {"SPBGetIndexedDevice", (PyCFunction)Snd_SPBGetIndexedDevice, 1,
1230 "(short count) -> (Str255 deviceName, Handle deviceIconHandle)"},
1231 {"SPBOpenDevice", (PyCFunction)Snd_SPBOpenDevice, 1,
1232 "(Str255 deviceName, short permission) -> (long inRefNum)"},
1233 {"SPBCloseDevice", (PyCFunction)Snd_SPBCloseDevice, 1,
1234 "(long inRefNum) -> None"},
Jack Jansen52b38b71998-02-25 15:47:51 +00001235 {"SPBRecord", (PyCFunction)Snd_SPBRecord, 1,
1236 "(SPBPtr inParamPtr, Boolean asynchFlag) -> None"},
1237 {"SPBRecordToFile", (PyCFunction)Snd_SPBRecordToFile, 1,
1238 "(short fRefNum, SPBPtr inParamPtr, Boolean asynchFlag) -> None"},
Jack Jansen21f96871998-02-20 16:02:09 +00001239 {"SPBPauseRecording", (PyCFunction)Snd_SPBPauseRecording, 1,
1240 "(long inRefNum) -> None"},
1241 {"SPBResumeRecording", (PyCFunction)Snd_SPBResumeRecording, 1,
1242 "(long inRefNum) -> None"},
1243 {"SPBStopRecording", (PyCFunction)Snd_SPBStopRecording, 1,
1244 "(long inRefNum) -> None"},
1245 {"SPBGetRecordingStatus", (PyCFunction)Snd_SPBGetRecordingStatus, 1,
1246 "(long inRefNum) -> (short recordingStatus, short meterLevel, unsigned long totalSamplesToRecord, unsigned long numberOfSamplesRecorded, unsigned long totalMsecsToRecord, unsigned long numberOfMsecsRecorded)"},
Jack Jansen52b38b71998-02-25 15:47:51 +00001247 {"SPBGetDeviceInfo", (PyCFunction)Snd_SPBGetDeviceInfo, 1,
1248 "(long inRefNum, OSType infoType, void * infoData) -> None"},
1249 {"SPBSetDeviceInfo", (PyCFunction)Snd_SPBSetDeviceInfo, 1,
1250 "(long inRefNum, OSType infoType, void * infoData) -> None"},
Jack Jansen21f96871998-02-20 16:02:09 +00001251 {"SPBMillisecondsToBytes", (PyCFunction)Snd_SPBMillisecondsToBytes, 1,
1252 "(long inRefNum) -> (long milliseconds)"},
1253 {"SPBBytesToMilliseconds", (PyCFunction)Snd_SPBBytesToMilliseconds, 1,
1254 "(long inRefNum) -> (long byteCount)"},
Guido van Rossum17448e21995-01-30 11:53:55 +00001255 {NULL, NULL, 0}
1256};
1257
1258
1259
1260/* Routine passed to Py_AddPendingCall -- call the Python callback */
1261static int
1262SndCh_CallCallBack(arg)
1263 void *arg;
1264{
1265 SndChannelObject *p = (SndChannelObject *)arg;
1266 PyObject *args;
1267 PyObject *res;
1268 args = Py_BuildValue("(O(hhl))",
1269 p, p->ob_cmd.cmd, p->ob_cmd.param1, p->ob_cmd.param2);
1270 res = PyEval_CallObject(p->ob_callback, args);
1271 Py_DECREF(args);
1272 if (res == NULL)
1273 return -1;
1274 Py_DECREF(res);
1275 return 0;
1276}
1277
1278/* Routine passed to NewSndChannel -- schedule a call to SndCh_CallCallBack */
1279static pascal void
1280SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd)
1281{
1282 SndChannelObject *p = (SndChannelObject *)(chan->userInfo);
1283 if (p->ob_callback != NULL) {
1284 long A5 = SetA5(p->ob_A5);
1285 p->ob_cmd = *cmd;
1286 Py_AddPendingCall(SndCh_CallCallBack, (void *)p);
1287 SetA5(A5);
1288 }
1289}
1290
Jack Jansen52b38b71998-02-25 15:47:51 +00001291/* SPB callbacks - Schedule callbacks to Python */
1292static int
1293SPB_CallCallBack(arg)
1294 void *arg;
1295{
1296 SPBObject *p = (SPBObject *)arg;
1297 PyObject *args;
1298 PyObject *res;
1299
1300 if ( p->ob_thiscallback == 0 ) return 0;
1301 args = Py_BuildValue("(O)", p);
1302 res = PyEval_CallObject(p->ob_thiscallback, args);
1303 p->ob_thiscallback = 0;
1304 Py_DECREF(args);
1305 if (res == NULL)
1306 return -1;
1307 Py_DECREF(res);
1308 return 0;
1309}
1310
1311static pascal void
1312SPB_completion(SPBPtr my_spb)
1313{
1314 SPBObject *p = (SPBObject *)(my_spb->userLong);
1315
1316 if (p && p->ob_completion) {
1317 long A5 = SetA5(p->ob_A5);
1318 p->ob_thiscallback = p->ob_completion; /* Hope we cannot get two at the same time */
1319 Py_AddPendingCall(SPB_CallCallBack, (void *)p);
1320 SetA5(A5);
1321 }
1322}
1323
1324static pascal void
1325SPB_interrupt(SPBPtr my_spb)
1326{
1327 SPBObject *p = (SPBObject *)(my_spb->userLong);
1328
1329 if (p && p->ob_interrupt) {
1330 long A5 = SetA5(p->ob_A5);
1331 p->ob_thiscallback = p->ob_interrupt; /* Hope we cannot get two at the same time */
1332 Py_AddPendingCall(SPB_CallCallBack, (void *)p);
1333 SetA5(A5);
1334 }
1335}
1336
Guido van Rossum17448e21995-01-30 11:53:55 +00001337
1338void initSnd()
1339{
1340 PyObject *m;
1341 PyObject *d;
1342
1343
1344
1345
1346
1347 m = Py_InitModule("Snd", Snd_methods);
1348 d = PyModule_GetDict(m);
1349 Snd_Error = PyMac_GetOSErrException();
1350 if (Snd_Error == NULL ||
1351 PyDict_SetItemString(d, "Error", Snd_Error) != 0)
1352 Py_FatalError("can't initialize Snd.Error");
Jack Jansena755e681997-09-20 17:40:22 +00001353 SndChannel_Type.ob_type = &PyType_Type;
1354 Py_INCREF(&SndChannel_Type);
1355 if (PyDict_SetItemString(d, "SndChannelType", (PyObject *)&SndChannel_Type) != 0)
1356 Py_FatalError("can't initialize SndChannelType");
Jack Jansen52b38b71998-02-25 15:47:51 +00001357 SPB_Type.ob_type = &PyType_Type;
1358 Py_INCREF(&SPB_Type);
1359 if (PyDict_SetItemString(d, "SPBType", (PyObject *)&SPB_Type) != 0)
1360 Py_FatalError("can't initialize SPBType");
Guido van Rossum17448e21995-01-30 11:53:55 +00001361}
1362
1363/* ========================= End module Snd ========================= */
1364