diff options
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/ctbmodule.c | 609 | ||||
-rw-r--r-- | Mac/Modules/macspeechmodule.c | 546 |
2 files changed, 0 insertions, 1155 deletions
diff --git a/Mac/Modules/ctbmodule.c b/Mac/Modules/ctbmodule.c deleted file mode 100644 index f8bc25e..0000000 --- a/Mac/Modules/ctbmodule.c +++ /dev/null @@ -1,609 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, -The Netherlands. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -******************************************************************/ - -/* Note: This file is partially converted to the new naming standard */ -/* ctbcm objects */ - - -#include "Python.h" - -#include "macglue.h" - -#include <CommResources.h> -#include <Connections.h> -#include <CTBUtilities.h> -#include <ToolUtils.h> -#include <OSUtils.h> - - -#define _UnimplementedToolTrap 0xA89F -#define _CommToolboxTrap 0x8B -#define _UnimplementedOSTrap 0x9F - -static char *errornames[] = { - "No Error", - "Rejected", /* 1 */ - "Failed", /* 2 */ - "Timeout", /* 3 */ - "Not Open", /* 4 */ - "Not Closed", /* 5 */ - "No Request Pending", /* 6 */ - "Not Supported", /* 7 */ - "No Tools", /* 8 */ - "User Cancel", /* 9 */ - "Error 10", /* 10 */ - "Unknown Error", /* 11 */ -#define MAX_POS_ERROR 11 -}; - -extern PyObject *PyErr_Mac(PyObject *,int); - -static PyObject * -PyCtb_Error(PyObject *errobj, int errcode) -{ - if ( errcode > 0 && errcode <= MAX_POS_ERROR ) { - PyErr_SetString(errobj, errornames[errcode]); - return NULL; - } else { - return PyErr_Mac(errobj, errcode); - } -} - -static PyObject *ErrorObject; - -typedef struct { - PyObject_HEAD - ConnHandle hdl; /* The handle to the connection */ - PyObject *callback; /* Python callback routine */ - int has_callback; /* True if callback not None */ - int err; /* Error to pass to the callback */ -} ctbcmobject; - -static PyTypeObject ctbcmtype; - -#define is_ctbcmobject(v) ((v)->ob_type == &ctbcmtype) - -static -TrapAvailable(short tNumber, TrapType tType) -{ - short unImplemented; - - if (tType == OSTrap) - unImplemented = _UnimplementedOSTrap; - else - unImplemented = _UnimplementedToolTrap; - - return NGetTrapAddress(tNumber, tType) != NGetTrapAddress(unImplemented, tType); -} - -static -initialize_ctb() -{ - OSErr err; - static initialized = -1; - - if ( initialized >= 0 ) - return initialized; - initialized = 0; - - if ( !TrapAvailable(_CommToolboxTrap, OSTrap) ) { - PyErr_SetString(ErrorObject, "CTB not available"); - return 0; - } - if ( (err=InitCTBUtilities()) ) { - PyCtb_Error(ErrorObject, (int)err); - return 0; - } - if ( (err=InitCRM()) ) { - PyCtb_Error(ErrorObject, (int)err); - return 0; - } - if ( (err=InitCM()) ) { - PyCtb_Error(ErrorObject, (int)err); - return 0; - } - initialized = 1; - return 1; -} - -static int -ctbcm_pycallback(arg) - void *arg; -{ - ctbcmobject *self = (ctbcmobject *)arg; - PyObject *args, *rv; - - if ( !self->has_callback ) /* It could have been removed in the meantime */ - return 0; - args = Py_BuildValue("(i)", self->err); - rv = PyEval_CallObject(self->callback, args); - Py_DECREF(args); - if( rv == NULL ) - return -1; - Py_DECREF(rv); - return 0; -} - -/*DBG*/int ncallback; -static pascal void -ctbcm_ctbcallback(hconn) - ConnHandle hconn; -{ - ctbcmobject *self; - - /* XXXX Do I have to do the A5 mumbo-jumbo? */ - ncallback++; /*DBG*/ - self = (ctbcmobject *)CMGetUserData(hconn); - self->err = (int)((*hconn)->errCode); - Py_AddPendingCall(ctbcm_pycallback, (void *)self); -} - -static ctbcmobject * -newctbcmobject(arg) - PyObject *arg; -{ - ctbcmobject *self; - self = PyObject_NEW(ctbcmobject, &ctbcmtype); - if (self == NULL) - return NULL; - self->hdl = NULL; - Py_INCREF(Py_None); - self->callback = Py_None; - self->has_callback = 0; - return self; -} - -/* ctbcm methods */ - -static void -ctbcm_dealloc(self) - ctbcmobject *self; -{ - if ( self->hdl ) { - (void)CMClose(self->hdl, 0, (ConnectionCompletionUPP)0, 0, 1); - /*XXXX Is this safe? */ - CMDispose(self->hdl); - self->hdl = NULL; - } - PyObject_DEL(self); -} - -static PyObject * -ctbcm_open(self, args) - ctbcmobject *self; - PyObject *args; -{ - long timeout; - OSErr err; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "l", &timeout)) - return NULL; - if ( (err=CMOpen(self->hdl, self->has_callback, cb_upp, timeout)) != 0) - return PyCtb_Error(ErrorObject, (int)err); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_listen(self, args) - ctbcmobject *self; - PyObject *args; -{ - long timeout; - OSErr err; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "l", &timeout)) - return NULL; - if ( (err=CMListen(self->hdl,self->has_callback, cb_upp, timeout)) != 0) - return PyCtb_Error(ErrorObject, (int)err); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_accept(self, args) - ctbcmobject *self; - PyObject *args; -{ - int accept; - OSErr err; - - if (!PyArg_Parse(args, "i", &accept)) - return NULL; - if ( (err=CMAccept(self->hdl, accept)) != 0) - return PyCtb_Error(ErrorObject, (int)err); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_close(self, args) - ctbcmobject *self; - PyObject *args; -{ - int now; - long timeout; - OSErr err; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "(li)", &timeout, &now)) - return NULL; - if ( (err=CMClose(self->hdl, self->has_callback, cb_upp, timeout, now)) != 0) - return PyCtb_Error(ErrorObject, (int)err); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_read(self, args) - ctbcmobject *self; - PyObject *args; -{ - long timeout, len; - int chan; - CMFlags flags; - OSErr err; - PyObject *rv, *rrv; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "(lil)", &len, &chan, &timeout)) - return NULL; - if ((rv=PyString_FromStringAndSize(NULL, len)) == NULL) - return NULL; - if ((err=CMRead(self->hdl, (Ptr)PyString_AsString(rv), &len, (CMChannel)chan, - self->has_callback, cb_upp, timeout, &flags)) != 0 && err != cmTimeOut) - return PyCtb_Error(ErrorObject, (int)err); - _PyString_Resize(&rv, len); - rrv = Py_BuildValue("(Oi)", rv, (int)flags); - Py_DECREF(rv); - return rrv; -} - -static PyObject * -ctbcm_write(self, args) - ctbcmobject *self; - PyObject *args; -{ - long timeout, len; - int chan, ilen, flags; - OSErr err; - char *buf; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "(s#ili)", &buf, &ilen, &chan, &timeout, &flags)) - return NULL; - len = ilen; - if ((err=CMWrite(self->hdl, (Ptr)buf, &len, (CMChannel)chan, - self->has_callback, cb_upp, timeout, (CMFlags)flags)) != 0 && err != cmTimeOut) - return PyCtb_Error(ErrorObject, (int)err); - return PyInt_FromLong((int)len); -} - -static PyObject * -ctbcm_status(self, args) - ctbcmobject *self; - PyObject *args; -{ - CMBufferSizes sizes; - CMStatFlags flags; - OSErr err; - PyObject *rv, *rrv; - - if (!PyArg_NoArgs(args)) - return NULL; - if ((err=CMStatus(self->hdl, sizes, &flags)) != 0) - return PyCtb_Error(ErrorObject, (int)err); - rv = Py_BuildValue("(llllll)", sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], sizes[5]); - if ( rv == NULL ) - return NULL; - rrv = Py_BuildValue("(Ol)", rv, (long)flags); - Py_DECREF(rv); - return rrv; -} - -static PyObject * -ctbcm_getconfig(self, args) - ctbcmobject *self; - PyObject *args; -{ - char *rv; - - if (!PyArg_NoArgs(args)) - return NULL; - if ((rv=(char *)CMGetConfig(self->hdl)) == NULL ) { - PyErr_SetString(ErrorObject, "CMGetConfig failed"); - return NULL; - } - return PyString_FromString(rv); -} - -static PyObject * -ctbcm_setconfig(self, args) - ctbcmobject *self; - PyObject *args; -{ - char *cfg; - short rv; - - if (!PyArg_Parse(args, "s", &cfg)) - return NULL; - rv=CMSetConfig(self->hdl, (Ptr)cfg); - return PyInt_FromLong((long)rv); -} - -static PyObject * -ctbcm_choose(self, args) - ctbcmobject *self; - PyObject *args; -{ - int rv; - Point pt; - - if (!PyArg_NoArgs(args)) - return NULL; - pt.v = 40; - pt.h = 40; - rv=CMChoose(&self->hdl, pt, (ConnectionChooseIdleUPP)0); - return PyInt_FromLong(rv); -} - -static PyObject * -ctbcm_idle(self, args) - ctbcmobject *self; - PyObject *args; -{ - if (!PyArg_NoArgs(args)) - return NULL; - CMIdle(self->hdl); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_abort(self, args) - ctbcmobject *self; - PyObject *args; -{ - if (!PyArg_NoArgs(args)) - return NULL; - CMAbort(self->hdl); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_reset(self, args) - ctbcmobject *self; - PyObject *args; -{ - if (!PyArg_NoArgs(args)) - return NULL; - CMReset(self->hdl); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -ctbcm_break(self, args) - ctbcmobject *self; - PyObject *args; -{ - long duration; - ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback); - - if (!PyArg_Parse(args, "l", &duration)) - return NULL; - CMBreak(self->hdl, duration,self->has_callback, cb_upp); - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef ctbcm_methods[] = { - {"Open", (PyCFunction)ctbcm_open}, - {"Close", (PyCFunction)ctbcm_close}, - {"Read", (PyCFunction)ctbcm_read}, - {"Write", (PyCFunction)ctbcm_write}, - {"Status", (PyCFunction)ctbcm_status}, - {"GetConfig", (PyCFunction)ctbcm_getconfig}, - {"SetConfig", (PyCFunction)ctbcm_setconfig}, - {"Choose", (PyCFunction)ctbcm_choose}, - {"Idle", (PyCFunction)ctbcm_idle}, - {"Listen", (PyCFunction)ctbcm_listen}, - {"Accept", (PyCFunction)ctbcm_accept}, - {"Abort", (PyCFunction)ctbcm_abort}, - {"Reset", (PyCFunction)ctbcm_reset}, - {"Break", (PyCFunction)ctbcm_break}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -ctbcm_getattr(self, name) - ctbcmobject *self; - char *name; -{ - if ( strcmp(name, "callback") == 0 ) { - Py_INCREF(self->callback); - return self->callback; - } - return Py_FindMethod(ctbcm_methods, (PyObject *)self, name); -} - -static int -ctbcm_setattr(self, name, v) - ctbcmobject *self; - char *name; - PyObject *v; -{ - if ( strcmp(name, "callback") != 0 ) { - PyErr_SetString(PyExc_AttributeError, "ctbcm objects have callback attr only"); - return -1; - } - if ( v == NULL ) { - v = Py_None; - } - Py_INCREF(v); - self->callback = v; - self->has_callback = (v != Py_None); - return 0; -} - -statichere PyTypeObject ctbcmtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "ctb.CTBConnectionMgr", /*tp_name*/ - sizeof(ctbcmobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)ctbcm_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)ctbcm_getattr, /*tp_getattr*/ - (setattrfunc)ctbcm_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; -/* --------------------------------------------------------------------- */ - -/* Function of no arguments returning new ctbcm object */ - -static PyObject * -ctb_cmnew(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - int strlen; - PyObject *sizes_obj; - char *c_str; - unsigned char p_str[255]; - CMBufferSizes sizes; - short procid; - ConnHandle hdl; - ctbcmobject *rv; - - if (!PyArg_Parse(args, "(s#O)", &c_str, &strlen, &sizes_obj)) - return NULL; - strncpy((char *)p_str+1, c_str, strlen); - p_str[0] = strlen; - if (!initialize_ctb()) - return NULL; - if ( sizes_obj == Py_None ) { - memset(sizes, '\0', sizeof sizes); - } else { - if ( !PyArg_Parse(sizes_obj, "(llllll)", &sizes[0], &sizes[1], &sizes[2], - &sizes[3], &sizes[4], &sizes[5])) - return NULL; - } - if ( (procid=CMGetProcID(p_str)) < 0 ) - return PyCtb_Error(ErrorObject, procid); - hdl = CMNew(procid, cmNoMenus|cmQuiet, sizes, 0, 0); - if ( hdl == NULL ) { - PyErr_SetString(ErrorObject, "CMNew failed"); - return NULL; - } - rv = newctbcmobject(args); - if ( rv == NULL ) - return NULL; /* XXXX Should dispose of hdl */ - rv->hdl = hdl; - CMSetUserData(hdl, (long)rv); - return (PyObject *)rv; -} - -static PyObject * -ctb_available(self, args) - PyObject *self; - PyObject *args; -{ - int ok; - - if (!PyArg_NoArgs(args)) - return NULL; - ok = initialize_ctb(); - PyErr_Clear(); - return PyInt_FromLong(ok); -} - -/* List of functions defined in the module */ - -static struct PyMethodDef ctb_methods[] = { - {"CMNew", ctb_cmnew}, - {"available", ctb_available}, - {NULL, NULL} /* sentinel */ -}; - - -/* Initialization function for the module (*must* be called initctb) */ - -void -initctb() -{ - PyObject *m, *d, *o; - - /* Create the module and add the functions */ - m = Py_InitModule("ctb", ctb_methods); - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - -#define CMCONST(name, value) o = PyInt_FromLong(value); PyDict_SetItemString(d, name, o) - - CMCONST("cmData", 1); - CMCONST("cmCntl", 2); - CMCONST("cmAttn", 3); - - CMCONST("cmFlagsEOM", 1); - - CMCONST("chooseDisaster", -2); - CMCONST("chooseFailed", -1); - CMCONST("chooseAborted", 0); - CMCONST("chooseOKMinor", 1); - CMCONST("chooseOKMajor", 2); - CMCONST("chooseCancel", 3); - - CMCONST("cmStatusOpening", 1); - CMCONST("cmStatusOpen", 2); - CMCONST("cmStatusClosing", 4); - CMCONST("cmStatusDataAvail", 8); - CMCONST("cmStatusCntlAvail", 0x10); - CMCONST("cmStatusAttnAvail", 0x20); - CMCONST("cmStatusDRPend", 0x40); - CMCONST("cmStatusDWPend", 0x80); - CMCONST("cmStatusCWPend", 0x100); - CMCONST("cmStatusCWPend", 0x200); - CMCONST("cmStatusARPend", 0x400); - CMCONST("cmStatusAWPend", 0x800); - CMCONST("cmStatusBreakPending", 0x1000); - CMCONST("cmStatusListenPend", 0x2000); - CMCONST("cmStatusIncomingCallPresent", 0x4000); - - ErrorObject = PyErr_NewException("ctb.error", NULL, NULL); - PyDict_SetItemString(d, "error", ErrorObject); - ctbcmtype.ob_type = &PyType_Type; - Py_INCREF(&ctbcmtype); - PyDict_SetItemString(d, "CTBConnectionMgrType", (PyObject *)&ctbcmtype); -} diff --git a/Mac/Modules/macspeechmodule.c b/Mac/Modules/macspeechmodule.c deleted file mode 100644 index a8388e9..0000000 --- a/Mac/Modules/macspeechmodule.c +++ /dev/null @@ -1,546 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, -The Netherlands. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -******************************************************************/ - - -#include "Python.h" -#include "macglue.h" - -#include <Gestalt.h> -#include "Speech.h" - -#ifdef __MWERKS__ -#define OLDP2C 1 -#include <TextUtils.h> -#ifndef c2pstr -#define c2pstr C2PStr -#endif -#ifndef p2cstr -#define p2cstr P2CStr -#endif -#else -#include "pascal.h" -#endif /* __MWERKS__ */ - -#include <CodeFragments.h> -int lib_available; - -/* Somehow the Apple Fix2X and X2Fix don't do what I expect */ -#define fixed2double(x) (((double)(x))/32768.0) -#define double2fixed(x) ((Fixed)((x)*32768.0)) - -char *CurrentSpeech; -PyObject *ms_error_object; -int speech_available; - -static -init_available() { - OSErr err; - long result; - - lib_available = ((ProcPtr)SpeakString != (ProcPtr)0); - err = Gestalt(gestaltSpeechAttr, &result); - if ( err == noErr && (result & (1<<gestaltSpeechMgrPresent))) - return 1; - return 0; -} - -static -check_available() { - if ( !speech_available ) { - PyErr_SetString(ms_error_object, "Speech Mgr not available"); - return 0; - } - if ( !lib_available ) { - PyErr_SetString(ms_error_object, "Speech Mgr available, but shared lib missing"); - return 0; - } - return 1; -} - -/* ------------- -** -** Part one - the speech channel object -*/ -typedef struct { - PyObject_HEAD - SpeechChannel chan; - PyObject *curtext; /* If non-NULL current text being spoken */ -} scobject; - -static PyTypeObject sctype; - -#define is_scobject(v) ((v)->ob_type == &sctype) - -static scobject * -newscobject(arg) - VoiceSpec *arg; -{ - scobject *self; - OSErr err; - - self = PyObject_NEW(scobject, &sctype); - if (self == NULL) - return NULL; - if ( (err=NewSpeechChannel(arg, &self->chan)) != 0) { - Py_DECREF(self); - return (scobject *)PyErr_Mac(ms_error_object, err); - } - self->curtext = NULL; - return self; -} - -/* sc methods */ - -static void -sc_dealloc(self) - scobject *self; -{ - DisposeSpeechChannel(self->chan); - PyObject_DEL(self); -} - -static PyObject * -sc_Stop(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - - if (!PyArg_NoArgs(args)) - return NULL; - if ((err=StopSpeech(self->chan)) != 0) { - PyErr_Mac(ms_error_object, err); - return NULL; - } - if ( self->curtext ) { - Py_DECREF(self->curtext); - self->curtext = NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sc_SpeakText(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - char *str; - int len; - - if (!PyArg_Parse(args, "s#", &str, &len)) - return NULL; - if ( self->curtext ) { - StopSpeech(self->chan); - Py_DECREF(self->curtext); - self->curtext = NULL; - } - if ((err=SpeakText(self->chan, (Ptr)str, (long)len)) != 0) { - PyErr_Mac(ms_error_object, err); - return 0; - } - (void)PyArg_Parse(args, "O", &self->curtext); /* Or should I check this? */ - Py_INCREF(self->curtext); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sc_GetRate(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - Fixed farg; - - if (!PyArg_NoArgs(args)) - return NULL; - if ((err=GetSpeechRate(self->chan, &farg)) != 0) { - PyErr_Mac(ms_error_object, err); - return 0; - } - return PyFloat_FromDouble(fixed2double(farg)); -} - -static PyObject * -sc_GetPitch(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - Fixed farg; - - if (!PyArg_NoArgs(args)) - return NULL; - if ((err=GetSpeechPitch(self->chan, &farg)) != 0) { - PyErr_Mac(ms_error_object, err); - return 0; - } - return PyFloat_FromDouble(fixed2double(farg)); -} - -static PyObject * -sc_SetRate(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - double darg; - - if (!PyArg_Parse(args, "d", &darg)) - return NULL; - if ((err=SetSpeechRate(self->chan, double2fixed(darg))) != 0) { - PyErr_Mac(ms_error_object, err); - return 0; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -sc_SetPitch(self, args) - scobject *self; - PyObject *args; -{ - OSErr err; - double darg; - - if (!PyArg_Parse(args, "d", &darg)) - return NULL; - if ((err=SetSpeechPitch(self->chan, double2fixed(darg))) != 0) { - PyErr_Mac(ms_error_object, err); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef sc_methods[] = { - {"Stop", (PyCFunction)sc_Stop}, - {"SetRate", (PyCFunction)sc_SetRate}, - {"GetRate", (PyCFunction)sc_GetRate}, - {"SetPitch", (PyCFunction)sc_SetPitch}, - {"GetPitch", (PyCFunction)sc_GetPitch}, - {"SpeakText", (PyCFunction)sc_SpeakText}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -sc_getattr(self, name) - scobject *self; - char *name; -{ - return Py_FindMethod(sc_methods, (PyObject *)self, name); -} - -static PyTypeObject sctype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macspeech.MacSpeechChannel", /*tp_name*/ - sizeof(scobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)sc_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)sc_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; - -/* ------------- -** -** Part two - the voice object -*/ -typedef struct { - PyObject_HEAD - int initialized; - VoiceSpec vs; - VoiceDescription vd; -} mvobject; - -static PyTypeObject mvtype; - -#define is_mvobject(v) ((v)->ob_type == &mvtype) - -static mvobject * -newmvobject() -{ - mvobject *self; - self = PyObject_NEW(mvobject, &mvtype); - if (self == NULL) - return NULL; - self->initialized = 0; - return self; -} - -static int -initmvobject(self, ind) - mvobject *self; - int ind; -{ - OSErr err; - - if ( (err=GetIndVoice((short)ind, &self->vs)) != 0 ) { - PyErr_Mac(ms_error_object, err); - return 0; - } - if ( (err=GetVoiceDescription(&self->vs, &self->vd, sizeof self->vd)) != 0) { - PyErr_Mac(ms_error_object, err); - return 0; - } - self->initialized = 1; - return 1; -} -/* mv methods */ - -static void -mv_dealloc(self) - mvobject *self; -{ - PyObject_DEL(self); -} - -static PyObject * -mv_getgender(self, args) - mvobject *self; - PyObject *args; -{ - PyObject *rv; - - if (!PyArg_NoArgs(args)) - return NULL; - if (!self->initialized) { - PyErr_SetString(ms_error_object, "Uninitialized voice"); - return NULL; - } - rv = PyInt_FromLong(self->vd.gender); - return rv; -} - -static PyObject * -mv_newchannel(self, args) - mvobject *self; - PyObject *args; -{ - if (!PyArg_NoArgs(args)) - return NULL; - if (!self->initialized) { - PyErr_SetString(ms_error_object, "Uninitialized voice"); - return NULL; - } - return (PyObject *)newscobject(&self->vs); -} - -static struct PyMethodDef mv_methods[] = { - {"GetGender", (PyCFunction)mv_getgender}, - {"NewChannel", (PyCFunction)mv_newchannel}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject * -mv_getattr(self, name) - mvobject *self; - char *name; -{ - return Py_FindMethod(mv_methods, (PyObject *)self, name); -} - -static PyTypeObject mvtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macspeech.MacVoice", /*tp_name*/ - sizeof(mvobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mv_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)mv_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ -}; - - -/* ------------- -** -** Part three - The module interface -*/ - -/* See if Speech manager available */ - -static PyObject * -ms_Available(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - - if (!PyArg_NoArgs(args)) - return NULL; - return PyInt_FromLong(speech_available); -} - -/* Count number of busy speeches */ - -static PyObject * -ms_Busy(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - short result; - - if (!PyArg_NoArgs(args)) - return NULL; - if ( !check_available() ) - return NULL; - result = SpeechBusy(); - return PyInt_FromLong(result); -} - -/* Say something */ - -static PyObject * -ms_SpeakString(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - OSErr err; - char *str; - int len; - - if (!PyArg_Parse(args, "s", &str)) - return NULL; - if ( !check_available()) - return NULL; - if (CurrentSpeech) { - /* Free the old speech, after killing it off - ** (note that speach is async and c2pstr works inplace) - */ - SpeakString("\p"); - free(CurrentSpeech); - } - len = strlen(str); - CurrentSpeech = malloc(len+1); - strcpy(CurrentSpeech, str); - err = SpeakString(c2pstr(CurrentSpeech)); - if ( err ) { - PyErr_Mac(ms_error_object, err); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - - -/* Count number of available voices */ - -static PyObject * -ms_CountVoices(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - short result; - - if (!PyArg_NoArgs(args)) - return NULL; - if ( !check_available()) - return NULL; - CountVoices(&result); - return PyInt_FromLong(result); -} - -static PyObject * -ms_GetIndVoice(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - mvobject *rv; - long ind; - - if( !PyArg_Parse(args, "i", &ind)) - return NULL; - if ( !check_available() ) - return NULL; - rv = newmvobject(); - if ( !initmvobject(rv, ind) ) { - Py_DECREF(rv); - return NULL; - } - return (PyObject *)rv; -} - - -static PyObject * -ms_Version(self, args) - PyObject *self; /* Not used */ - PyObject *args; -{ - NumVersion v; - - if (!PyArg_NoArgs(args)) - return NULL; - if ( !check_available()) - return NULL; - v = SpeechManagerVersion(); - return PyInt_FromLong(*(int *)&v); -} - - -/* List of functions defined in the module */ - -static struct PyMethodDef ms_methods[] = { - {"Available", ms_Available}, - {"CountVoices", ms_CountVoices}, - {"Busy", ms_Busy}, - {"SpeakString", ms_SpeakString}, - {"GetIndVoice", ms_GetIndVoice}, - {"Version", ms_Version}, - {NULL, NULL} /* sentinel */ -}; - -/* Initialization function for the module (*must* be called initmacspeech) */ - -void -initmacspeech() -{ - PyObject *m, *d; - - speech_available = init_available(); - /* Create the module and add the functions */ - m = Py_InitModule("macspeech", ms_methods); - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - ms_error_object = PyErr_NewException("macspeech.error", NULL, NULL); - PyDict_SetItemString(d, "error", ms_error_object); -} |