summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/macspeechmodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Modules/macspeechmodule.c')
-rw-r--r--Mac/Modules/macspeechmodule.c546
1 files changed, 0 insertions, 546 deletions
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);
-}