config.c: add MacOS module

macosmodule.c: lots of updates (though playing sound can still hang :-( )
This commit is contained in:
Guido van Rossum 1994-09-29 10:02:56 +00:00
parent 14ed0b2cd3
commit e433c974bc
2 changed files with 53 additions and 39 deletions

View file

@ -165,6 +165,7 @@ extern void initarray();
extern void initmath(); extern void initmath();
extern void initparser(); extern void initparser();
extern void initmac(); extern void initmac();
extern void MacOS_Init();
extern void initregex(); extern void initregex();
extern void initstrop(); extern void initstrop();
extern void initstruct(); extern void initstruct();
@ -215,6 +216,7 @@ struct {
{"math", initmath}, {"math", initmath},
{"parser", initparser}, {"parser", initparser},
{"mac", initmac}, {"mac", initmac},
{"MacOS", MacOS_Init},
{"regex", initregex}, {"regex", initregex},
{"strop", initstrop}, {"strop", initstrop},
{"struct", initstruct}, {"struct", initstruct},

View file

@ -56,7 +56,7 @@ Err(OSErr err)
return NULL; return NULL;
} }
/* Check for a ResType argument */ /* Convert a ResType argument */
static int static int
GetOSType(PyObject *v, ResType *pr) GetOSType(PyObject *v, ResType *pr)
{ {
@ -69,14 +69,14 @@ GetOSType(PyObject *v, ResType *pr)
return 1; return 1;
} }
/* Check for a Str255 argument */ /* Convert a Str255 argument */
static int static int
GetStr255(PyObject *v, Str255 pbuf) GetStr255(PyObject *v, Str255 pbuf)
{ {
int len; int len;
if (!PyString_Check(v) || (len = PyString_Size(v)) > 255) { if (!PyString_Check(v) || (len = PyString_Size(v)) > 255) {
PyErr_SetString(MacOS_Error, PyErr_SetString(MacOS_Error,
"Str255 arg must be string <= 255 chars"); "Str255 arg must be string of at most 255 chars");
return 0; return 0;
} }
pbuf[0] = len; pbuf[0] = len;
@ -94,7 +94,7 @@ typedef struct {
staticforward PyTypeObject RsrcType; staticforward PyTypeObject RsrcType;
#define RsrcObject_Check(r) ((r)->ob_type == &RsrcType) #define Rsrc_Check(r) ((r)->ob_type == &RsrcType)
static RsrcObject * static RsrcObject *
Rsrc_FromHandle(Handle h) Rsrc_FromHandle(Handle h)
@ -184,7 +184,7 @@ MacOS_GetNamedResource(PyObject *self, PyObject *args)
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
/* SoundChannel objects */ /* SoundChannel objects */
/* Check for a SndCommand argument */ /* Convert a SndCommand argument */
static int static int
GetSndCommand(PyObject *v, SndCommand *pc) GetSndCommand(PyObject *v, SndCommand *pc)
{ {
@ -217,7 +217,7 @@ typedef struct {
staticforward PyTypeObject SndChType; staticforward PyTypeObject SndChType;
#define SndChObject_Check(s) ((s)->ob_type == &SndChType) #define SndCh_Check(s) ((s)->ob_type == &SndChType)
static SndChObject * static SndChObject *
SndCh_FromSndChannelPtr(SndChannelPtr chan) SndCh_FromSndChannelPtr(SndChannelPtr chan)
@ -228,51 +228,61 @@ SndCh_FromSndChannelPtr(SndChannelPtr chan)
return s; return s;
} }
static void
SndCh_Cleanup(SndChObject *s, int quitNow)
{
SndChannelPtr chan = s->chan;
if (chan != NULL) {
void *userInfo = (void *)chan->userInfo;
s->chan = NULL;
SndDisposeChannel(chan, quitNow);
if (userInfo != 0)
DEL(userInfo);
}
}
static void static void
SndCh_Dealloc(SndChObject *s) SndCh_Dealloc(SndChObject *s)
{ {
if (s->chan != NULL) { SndCh_Cleanup(s, 1);
SndDisposeChannel(s->chan, 1);
if (s->chan->userInfo != 0)
DEL((void *)s->chan->userInfo);
s->chan = NULL;
}
PyMem_DEL(s); PyMem_DEL(s);
} }
static PyObject * static PyObject *
SndCh_Close(SndChObject *s, PyObject *args) SndCh_DisposeChannel(SndChObject *s, PyObject *args)
{ {
int quietNow = 1; int quitNow = 1;
if (args != NULL) { if (PyTuple_Size(args) > 0) {
if (!PyArg_Parse(args, "i", &quietNow)) if (!PyArg_Parse(args, "(i)", &quitNow))
return NULL; return NULL;
} }
if (s->chan != NULL) { SndCh_Cleanup(s, quitNow);
SndDisposeChannel(s->chan, quietNow);
if (s->chan->userInfo != 0)
DEL((void *)s->chan->userInfo);
s->chan = NULL;
}
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
static int
SndCh_OK(SndChObject *s)
{
if (s->chan == NULL) {
PyErr_SetString(MacOS_Error, "channel is closed");
return 0;
}
return 1;
}
static PyObject * static PyObject *
SndCh_SndPlay(SndChObject *s, PyObject *args) SndCh_SndPlay(SndChObject *s, PyObject *args)
{ {
RsrcObject *r; RsrcObject *r;
int async = 0; int async = 0;
if (!PyArg_Parse(args, "(O)", &r)) { if (!PyArg_Parse(args, "(O!)", RsrcType, &r)) {
PyErr_Clear(); PyErr_Clear();
if (!PyArg_Parse(args, "(Oi)", &r, &async)) if (!PyArg_Parse(args, "(O&i)", RsrcType, &r, &async))
return NULL; return NULL;
} }
if (!RsrcObject_Check(r)) { if (!SndCh_OK(s))
PyErr_SetString(MacOS_Error,
"SndPlay argument must be resource");
return NULL; return NULL;
}
SndPlay(s->chan, r->h, async); SndPlay(s->chan, r->h, async);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
@ -287,8 +297,10 @@ SndCh_SndDoCommand(SndChObject *s, PyObject *args)
if (!PyArg_Parse(args, "(O&)", GetSndCommand, &c)) { if (!PyArg_Parse(args, "(O&)", GetSndCommand, &c)) {
PyErr_Clear(); PyErr_Clear();
if (!PyArg_Parse(args, "(O&i)", GetSndCommand, &c, &noWait)) if (!PyArg_Parse(args, "(O&i)", GetSndCommand, &c, &noWait))
return 0; return NULL;
} }
if (!SndCh_OK(s))
return NULL;
err = SndDoCommand(s->chan, &c, noWait); err = SndDoCommand(s->chan, &c, noWait);
return Err(err); return Err(err);
} }
@ -300,13 +312,15 @@ SndCh_SndDoImmediate(SndChObject *s, PyObject *args)
OSErr err; OSErr err;
if (!PyArg_Parse(args, "(O&)", GetSndCommand, &c)) if (!PyArg_Parse(args, "(O&)", GetSndCommand, &c))
return 0; return 0;
if (!SndCh_OK(s))
return NULL;
err = SndDoImmediate(s->chan, &c); err = SndDoImmediate(s->chan, &c);
return Err(err); return Err(err);
} }
static PyMethodDef SndCh_Methods[] = { static PyMethodDef SndCh_Methods[] = {
{"close", (PyCFunction)SndCh_Close}, {"close", (PyCFunction)SndCh_DisposeChannel, 1},
{"SndDisposeChannel", (PyCFunction)SndCh_Close}, {"SndDisposeChannel", (PyCFunction)SndCh_DisposeChannel, 1},
{"SndPlay", (PyCFunction)SndCh_SndPlay, 1}, {"SndPlay", (PyCFunction)SndCh_SndPlay, 1},
{"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1}, {"SndDoCommand", (PyCFunction)SndCh_SndDoCommand, 1},
{"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1}, {"SndDoImmediate", (PyCFunction)SndCh_SndDoImmediate, 1},
@ -356,8 +370,7 @@ MySafeCallback(arg)
PyObject *args; PyObject *args;
PyObject *res; PyObject *res;
args = Py_BuildValue("(O(hhl))", args = Py_BuildValue("(O(hhl))",
p->channel, p->channel, p->cmd.cmd, p->cmd.param1, p->cmd.param2);
p->cmd.cmd, p->cmd.param1, p->cmd.param2);
res = PyEval_CallObject(p->callback, args); res = PyEval_CallObject(p->callback, args);
Py_DECREF(args); Py_DECREF(args);
if (res == NULL) if (res == NULL)
@ -391,8 +404,7 @@ MacOS_SndNewChannel(PyObject *self, PyObject *args)
PyErr_Clear(); PyErr_Clear();
if (!PyArg_Parse(args, "(hl)", &synth, &init)) { if (!PyArg_Parse(args, "(hl)", &synth, &init)) {
PyErr_Clear(); PyErr_Clear();
if (!PyArg_Parse(args, "(hlO)", if (!PyArg_Parse(args, "(hlO)", &synth, &init, &callback))
&synth, &init, &callback))
return NULL; return NULL;
} }
} }
@ -411,14 +423,15 @@ MacOS_SndNewChannel(PyObject *self, PyObject *args)
DEL(p); DEL(p);
return Err(err); return Err(err);
} }
chan->userInfo = (long)p;
res = (PyObject *)SndCh_FromSndChannelPtr(chan); res = (PyObject *)SndCh_FromSndChannelPtr(chan);
if (res == NULL) { if (res == NULL) {
SndDisposeChannel(chan, 1); SndDisposeChannel(chan, 1);
DEL(p); DEL(p);
} }
else else {
chan->userInfo = (long)p;
p->channel = res; p->channel = res;
}
return res; return res;
} }
@ -467,7 +480,6 @@ MacOS_Init()
/* Initialize MacOS.Error exception */ /* Initialize MacOS.Error exception */
MacOS_Error = PyString_FromString("MacOS.Error"); MacOS_Error = PyString_FromString("MacOS.Error");
if (MacOS_Error == NULL || if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Py_FatalError("can't define MacOS.Error"); Py_FatalError("can't define MacOS.Error");
} }