Date: Sun, 22 Aug 1993 17:21:29 -0500 From: PAUL M SHELDON <psheldon@utdallas.edu> Subject: simple speech manager translation to pascal code I have little experience in C and was grateful for the posting, in C, of speech manager routine calls. It gave me an opportunity to make a simple exercise to value learning C in the future by the book. In the following, I paste my C to pascal code translation of a submission of a quick hack on this archive by Alan Coopersmith as /info-mac/dev/mac-speech-01.hqx. It was a lot of fun to figure this simple translation with a kid I mentor and then go on late into the night to make the compiling linking and execution work. I tried to comment the code with some of my hard won understanding. Perhaps this brief segment will improve others courage as it has mine. I had a lot of psychological inertia to get moving into enthusiastic momentum. I look forward to translating Alexander W. Kourakos' C demo with Paul Traue, my mentor-kid. Povl H. Pedersen has given me some reassurance. Notice what I am trying to say is this isn't much of a boast for me, just a sense of remarkable joy that I can hook into new system extensions from apple with pinterfaces. A few years ago the only guys I knew about who did real stuff with new rom calls worked in a garage well above my league... A few years later, I thought that was guys who made modula module (managers) who as far as I could see might as well have been also making computers or computer languages. Its in my league now! OK here's the code, part of a larger hidden body of code that I worked through developing in an Apple course called the pascal object oriented animation library (incidentally, their enclosed video movie "How to Create A Monster" ought to have a Galateia sequel): PROCEDURE TTextEntryDialog.GetTextBBAtItemBB(VAR theText:Str255;ItemNo:INTEGER); VAR CharIndex , theType:INTEGER;(* gives the type of the item requested *) theTextHdl:Handle;(* gives a handle to the item *) txtBox:Rect;(* gives the display rectangle of the item *) theChannel: SpeechChannel; theVoiceSpecPtr: VoiceSpecPtr; theVoiceSpec: VoiceSpec; myErr: OSErr; finalTicks,textlen,delayLen: LONGINT; theTextPtr:Ptr; { Comment on string lengths: Pasted from Spinside mac Toolbox utilities: String 'STR ' m bytes The string (1-byte length followed by the characters) THE MEMORY MANAGER Str255 = STRING[255]; My remarks (PMS): 8bits specify 2^8=256 possibilities (less one possibility of string 0 length) or 255 } voiceCount:integer; BEGIN {Standard calls to get text from a dialogue box I made:} GetDItem (fDialog, ItemNo, theType, theTextHdl, txtBox); GetIText (theTextHdl, theText); {Following are speech commands, Put speech.p in Lab 7 folder, so PMake would see it without too much auxiliary scripting:} {Some sort of initialization needed even if not do loop of all:} myErr := CountVoices (voiceCount); {Type transfer from generic pointer:} theVoiceSpecPtr := VoiceSpecPtr(@theVoiceSpec); {Liked the deep voice, most like Schwartznegger's:} myErr := GetIndVoice (6, theVoiceSpecPtr); myErr := NewSpeechChannel (theVoiceSpecPtr, theChannel); {Note: @theText= @theText[0] would tell length of text, since theText:Str255, so we use @theText[1] to start reading where we want to below:} theTextPtr:=Ptr(@theText[1]); {Since we started reading at the right byte, we have the expected text length:} textlen:=Ord4(LENGTH(theText)); {OK now we have set up and it can speak:} myErr := SpeakText (theChannel,theTextPtr,textlen); {The need for the following wait loop shows that statements following speech can happen concurrently, that is, are immediately executed during speech! Don't want to dispose his speech while the speaker is speaking!} while (NOT (SpeechBusy = 0)) do Delay(15, delayLen); myErr := DisposeSpeechChannel (theChannel); END;