diff options
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/macosmodule.c | 82 |
1 files changed, 57 insertions, 25 deletions
diff --git a/Mac/Modules/macosmodule.c b/Mac/Modules/macosmodule.c index 9472a98..b7907b1 100644 --- a/Mac/Modules/macosmodule.c +++ b/Mac/Modules/macosmodule.c @@ -25,6 +25,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* Macintosh OS-specific interface */ #include "Python.h" +#include "macglue.h" #include <stdio.h> #include <string.h> @@ -32,30 +33,19 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include <OSUtils.h> /* for Set(Current)A5 */ #include <Resources.h> +#include <Memory.h> #include <Sound.h> +#ifndef __MWERKS__ +#define SndCallBackUPP ProcPtr +#define NewSndCallBackProc(x) (x) +#endif + /*----------------------------------------------------------------------*/ /* General tools */ static PyObject *MacOS_Error; /* Exception MacOS.Error */ -/* Set a MAC-specific error from errno, and return NULL; return None if no error */ -static PyObject * -Err(OSErr err) -{ - char buf[100]; - PyObject *v; - if (err == 0) { - Py_INCREF(Py_None); - return Py_None; - } - sprintf(buf, "Mac OS error code %d", (int)err); - v = Py_BuildValue("(is)", (int)err, buf); - PyErr_SetObject(MacOS_Error, v); - Py_DECREF(v); - return NULL; -} - /* Convert a ResType argument */ static int GetOSType(PyObject *v, ResType *pr) @@ -101,7 +91,7 @@ Rsrc_FromHandle(Handle h) { RsrcObject *r; if (h == NULL) - return (RsrcObject *)Err(ResError()); + return (RsrcObject *)PyErr_Mac(MacOS_Error, (int)ResError()); r = PyObject_NEW(RsrcObject, &RsrcType); if (r != NULL) r->h = h; @@ -111,6 +101,7 @@ Rsrc_FromHandle(Handle h) static void Rsrc_Dealloc(RsrcObject *r) { + /* XXXX Note by Jack: shouldn't we ReleaseResource here? */ PyMem_DEL(r); } @@ -127,8 +118,41 @@ Rsrc_GetResInfo(RsrcObject *r, PyObject *args) (int)id, (char *)&type, 4, name+1, (int)name[0]); } +static PyObject * +Rsrc_AsBytes(RsrcObject *r, PyObject *args) +{ + long len; + PyObject *rv; + char *cp; + + if (!PyArg_Parse(args, "(l)", &len)) + return NULL; + HLock(r->h); + cp = (char *)*r->h; + rv = PyString_FromStringAndSize(cp, len); + HUnlock(r->h); + return rv; +} + +static PyObject * +Rsrc_AsString(RsrcObject *r, PyObject *args) +{ + PyObject *rv; + unsigned char *cp; + + if (!PyArg_Parse(args, "()")) + return NULL; + HLock(r->h); + cp = (unsigned char *)*r->h; + rv = PyString_FromStringAndSize((char *)cp+1, cp[0]); + HUnlock(r->h); + return rv; +} + static PyMethodDef Rsrc_Methods[] = { {"GetResInfo", (PyCFunction)Rsrc_GetResInfo, 1}, + {"AsString", (PyCFunction)Rsrc_AsString, 1}, + {"AsBytes", (PyCFunction)Rsrc_AsBytes, 1}, {NULL, NULL} /* Sentinel */ }; @@ -302,7 +326,7 @@ SndCh_SndDoCommand(SndChObject *s, PyObject *args) if (!SndCh_OK(s)) return NULL; err = SndDoCommand(s->chan, &c, noWait); - return Err(err); + return PyErr_Mac(MacOS_Error, (int)err); } static PyObject * @@ -315,7 +339,7 @@ SndCh_SndDoImmediate(SndChObject *s, PyObject *args) if (!SndCh_OK(s)) return NULL; err = SndDoImmediate(s->chan, &c); - return Err(err); + return PyErr_Mac(MacOS_Error, (int)err); } static PyMethodDef SndCh_Methods[] = { @@ -380,11 +404,19 @@ MySafeCallback(arg) } static pascal void +#ifdef __MWERKS__ +MyUserRoutine(SndChannelPtr chan, SndCommand *cmd) +#else MyUserRoutine(SndChannelPtr chan, SndCommand cmd) +#endif { cbinfo *p = (cbinfo *)chan->userInfo; long A5 = SetA5(p->A5); +#ifdef __MWERKS__ + p->cmd = *cmd; +#else p->cmd = cmd; +#endif Py_AddPendingCall(MySafeCallback, (void *)p); SetA5(A5); } @@ -397,7 +429,7 @@ MacOS_SndNewChannel(PyObject *self, PyObject *args) long init = 0; PyObject *callback = NULL; cbinfo *p = NULL; - SndCallBackProcPtr userroutine = 0; + SndCallBackUPP userroutine = 0; OSErr err; PyObject *res; if (!PyArg_Parse(args, "(h)", &synth)) { @@ -414,14 +446,14 @@ MacOS_SndNewChannel(PyObject *self, PyObject *args) return PyErr_NoMemory(); p->A5 = SetCurrentA5(); p->callback = callback; - userroutine = MyUserRoutine; + userroutine = NewSndCallBackProc(MyUserRoutine); } chan = NULL; err = SndNewChannel(&chan, synth, init, userroutine); if (err) { if (p) DEL(p); - return Err(err); + return PyErr_Mac(MacOS_Error, (int)err); } res = (PyObject *)SndCh_FromSndChannelPtr(chan); if (res == NULL) { @@ -443,7 +475,7 @@ MacOS_SndPlay(PyObject *self, PyObject *args) if (!PyArg_Parse(args, "(O!)", &RsrcType, &r)) return NULL; err = SndPlay((SndChannelPtr)NULL, r->h, 0); - return Err(err); + return PyErr_Mac(MacOS_Error, (int)err); } static PyObject * @@ -456,7 +488,7 @@ MacOS_SndControl(PyObject *self, PyObject *args) return NULL; err = SndControl(id, &c); if (err) - return Err(err); + return PyErr_Mac(MacOS_Error, (int)err); return Py_BuildValue("(hhl)", c.cmd, c.param1, c.param2); } |