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;