[net.sources.mac] SPEECH.C

ALAN@NCSUVM.BITNET (08/06/85)

Here is an interface for MacIntalk for Aztec C.

Calls are just as defined in the MacIntalk documents.

Posted with permission by  Alan Clegg, ALAN@NCSUVM.BITNET
                       for Michael Hecht

Please resopond to ALAN@NCSUVM.BITNET

Thanks...

-------------------------------------Cut Here----------------------------------
 #define _DRIVER
 #include <memory.h>
 #include <pb.h>
 #include <resource.h>
 #include "speech.h"

 #define NULL    0L

 struct pbRec {
         struct ParamBlkRec *    ioLink;
         short                   ioType;
         short                   ioTrap;
         Ptr                     ioCmdAddr;
         ProcPtr                 ioCompletion;
         short                   ioResult;
         char *                  ioNamePtr;
         short                   ioVRefNum;
         union {
                 struct ioParam          iop;
                 struct cntrlParam       cp;
         } u;
 };

 /*
  *      Internal format of the SpeechRecord structure
  */
 struct iSpeechRecord {
         struct pbRec            pb;             /* 50 bytes */
         int                     junk0;          /* 50 */
         ProcPtr *               rdrH0;          /* 52 */
         long                    junk4;          /* 56 */
         Str255 *                ExcpFile;       /* 60 */
         int                     junk6;          /* 64 */
         ProcPtr *               rdrHandle;      /* 66 */
         int                     DrvrRefNum;     /* 70 */
         int                     junk2;          /* 72 */
         int                     ExcpRefNum;     /* 74 */
         char                    junk1[24];      /* 76 */
 };
 typedef struct iSpeechRecord    iSpeechRecord;
 typedef iSpeechRecord *         iSpeechPtr;
 typedef iSpeechPtr *            iSpeechHandle;

 /* Driver Control Codes */
 #define MODE_CODE               0
 /* Code 1 for language maybe? */
 #define RATE_CODE               2
 #define SEX_CODE                3
 #define PITCH_CODE              4


 #define uTableBase              ((long*)0x011c)

 SpeechErr SpeechOn( ExcpsFile, ptheSpeech )
 Str255 * ExcpsFile;
 SpeechHandle * ptheSpeech;
 {
         static char * DrvrName = "\P.SPEECH";
         static char * DrvrFile = "\PMacinTalk";
         register iSpeechHandle theSpeech;
         register iSpeechPtr isp;
         register int refNum;
         register Handle h;
         register long * utp;
         register int id;
         register OSErr err;


         * ptheSpeech = theSpeech
                 = NewHandle(( Size )( sizeof( iSpeechRecord )));
         if( err = MemError())
                 return err;
         HLock( theSpeech );
         isp = *theSpeech;
         setmem( isp, sizeof( iSpeechRecord ), 0 );
         if(( refNum = OpenResFile( DrvrFile )) < 0 )
                 return ResError();
         isp->ExcpRefNum = refNum;
         SetResLoad( FALSE );
         h = GetNamedResource( 'DRVR', DrvrName );
         if( err = ResError())
                 return err;
         SetResLoad( TRUE );

         utp = uTableBase;
         utp = &(utp[32]);
         id = 32;
         do {
                 --id;
                 if( id<= 18 )
                         return fullUnitT;
         } while( *--utp );
         isp->DrvrRefNum = -(id+1);

         SetResInfo( h, id, NULL );
         LoadResource( h );
         /* err = ResError(); */
         HLock( h );

         isp->ExcpFile = ExcpsFile;
         isp->pb.ioNamePtr = DrvrName;
         isp->pb.ioVRefNum = 0;
         isp->pb.u.iop.ioVersNum = 0;
         isp->pb.u.iop.ioPermssn = 0;
         isp->pb.u.iop.ioMisc = NULL;
         PBOpen( isp, FALSE );
         err = isp->pb.ioResult;
         isp->rdrHandle = isp->rdrH0;
         HUnlock( theSpeech );
         return err;
 }


 void SpeechOff( theSpeech )
 SpeechHandle theSpeech;
 {
         register iSpeechPtr isp;
         register int excpRef;

         HLock( theSpeech );
         isp = *( iSpeechHandle )theSpeech;
         PBClosei( isp );
         if( excpRef = isp->ExcpRefNum )
                 CloseResFile( excpRef );
         HUnlock( theSpeech );
         DisposHandle( theSpeech );
 }


 void SpeechRate( theSpeech, theRate )
 SpeechHandle theSpeech;
 int theRate;
 {
         register iSpeechPtr isp;


         HLock( theSpeech );
         isp = *( iSpeechHandle )theSpeech;
         isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
         isp->pb.u.cp.csCode = RATE_CODE;
         isp->pb.u.cp.csParam.conCtl.sg_flags = theRate;
         PBCntli( isp );
         HUnlock( theSpeech );
 }

 void SpeechPitch( theSpeech, thePitch, theMode )
 SpeechHandle theSpeech;
 int thePitch;
 FOMode theMode;
 {
         register iSpeechPtr isp;


         HLock( theSpeech );
         isp = *( iSpeechHandle )theSpeech;
         isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
         isp->pb.u.cp.csCode = MODE_CODE;
         isp->pb.u.cp.csParam.conCtl.sg_flags = theMode;
         PBCntli( isp );
         isp->pb.u.cp.csCode = PITCH_CODE;
         isp->pb.u.cp.csParam.conCtl.sg_flags = thePitch;
         PBCntli( isp );
         HUnlock( theSpeech );

 }


 void SpeechSex( theSpeech, theSex )
 SpeechHandle theSpeech;
 Sex theSex;
 {
         register iSpeechPtr isp;


         HLock( theSpeech );
         isp = *( iSpeechHandle )theSpeech;
         isp->pb.u.cp.csRefNum = isp->DrvrRefNum;
         isp->pb.u.cp.csCode = SEX_CODE;
         isp->pb.u.cp.csParam.conCtl.sg_flags = theSex;
         PBCntli( isp );
         HUnlock( theSpeech );

 }


 SpeechErr Reader( theSpeech, EnglishInput, InputLength, PhoneticOutput )
 SpeechHandle theSpeech;
 Ptr EnglishInput;
 long InputLength;
 Handle PhoneticOutput;
 {
         register iSpeechPtr isp;
         register ProcPtr * rdr;
         pascal SpeechErr DummyReader();


         HLock( theSpeech );
         isp = *( iSpeechHandle )theSpeech;
         rdr = isp->rdrHandle;
         HLock( rdr );
         return DummyReader( EnglishInput, InputLength, PhoneticOutput, *rdr );
 }

 #asm
 DummyRea_:
         move.l          4(sp),a0        ; a0 <- RealReader
         move.l          (sp)+,(sp)      ; RealReader spot <- ret address
         jmp             (a0)            ; Branch to real reader
 #endasm


     
 SpeechErr MacinTalk( theSpeech, Phonemes )
 SpeechHandle theSpeech;
 Handle Phonemes;
 {
         register Size PhonemeSize;
         register iSpeechPtr isp;
         register OSErr err;

         HLock( theSpeech );
         PhonemeSize = GetHandleSIze( Phonemes );
         isp = *( iSpeechHandle )theSpeech;
         isp->pb.u.iop.ioRefNum = isp->DrvrRefNum;
         isp->pb.u.iop.ioBuffer = Phonemes;
         isp->pb.u.iop.ioReqCount = PhonemeSize;
         err = PBWritei( isp );
         HUnlock( theSpeech );
         return err;
 }

 #asm
 PBClosei_:
         move.l          4(sp),a0        ; isp -> a0
         dc.w            $a201           ; _Close, Immed
         rts

 PBWritei_:
         move.l          4(sp),a0        ; isp -> a0
         dc.w            $a203           ; _Write, Immed
         rts

 PBCntli_:
         move.l          4(sp),a0        ; isp -> a0
         dc.w            $a204           ; _Control, Immed
         rts
 #endasm