/* ******************************************************************** */
/* C code generated by:							*/
/* Visual Arts Version 2.1						*/
/* Copyright 1994-95 Danny Y. Wong  All rights reserved			*/
/* Calgary, Alberta (CANADA)                        			*/
/* Partial of the code is copyright by Jaba Development			*/
/* ******************************************************************** */

/*  this program demostrates the speech features and how easily it can
    be done using Visual Arts

    When ever you see '-->' this tells you that the codes are custom and
    inserted by me.
    
    When using the speech you always need to call the following routines.
    
    1. InitSpeech()     --somewhere in your main()
    2. DeInitSpeech()   --before you exit the program.
    
    Speak(text, volume, rate, sex) -- to speak the text
    
    eg: Speak("Speak is as easy as 1 2 3", 64, 150, 0)
    
*/

#include <VisualArts.h> 

#define ID_quit                           			0
#define ID_sentence                       			1
#define ID_sex                            			2
#define ID_volume                         			3
#define ID_rate                           			4

#define SpeechNumGads						5

/* --> add this struct to keep tack of the paramters */
struct speechInfo
{
   short volume;
   short rate;
   short sex;
}SpeechInfo = {32, 150, 0};     //default values

#include "Speech_func.c" 

int quitObj(struct VAobject VAObject);
int sentenceObj(struct VAobject VAObject);
int sexObj(struct VAobject VAObject);
int volumeObj(struct VAobject VAObject);
int rateObj(struct VAobject VAObject);

int SpeechIDCMP_MOUSEMOVE (struct VAobject VAObject);
int GetPubScreen(void);
void ClosePubScreen(void);
int OpenSpeechWindow(char windtitle[]);
void CloseSpeechWindow(void);
int SpeechHandler(void);
int SpeechMainHandler(void);
void DrawSpeechObjs(void);
int main(int argc, char *argv[]);

UBYTE				*PubScrName = "Workbench";
struct DrawInfo			*ScrDrawInfo = NULL;
APTR				 VisualInfo = NULL;
struct Screen			*Scr = NULL;
struct Window			*SpeechWnd = NULL;
struct Gadget			*SpeechGList = NULL;
struct Gadget			*SpeechGadgets[SpeechNumGads];
struct IntuiMessage		 SpeechMsg;
UWORD				 SpeechLeft = 69;
UWORD				 SpeechTop = 54;
UWORD				 SpeechWidth = 430;
UWORD				 SpeechHeight = 57;

/* stringinfo for WB 1.x style string/integer gadgets */

struct StringExtend			SpeechStrExt;	/* Extend String Gadget */
struct TextAttr topaz8 = { (STRPTR)"topaz.font", 8, 0x00, 0x01 };
struct TextAttr topaz800 = { (STRPTR)"topaz.font", 8, 0x00, 0x00 };

UBYTE *SexLabels[] = {
	(UBYTE *)"Male", 
	(UBYTE *)"Female", 
	NULL
};

WORD SpeechGadTypes[] = {
	BUTTON_KIND,
	STRING_KIND,
	MX_KIND,
	SLIDER_KIND,
	SLIDER_KIND,
};

struct NewGadget SpeechNGads[] = {
	340, 24, 70, 12, (UBYTE *)"_Quit",&topaz800, ID_quit, PLACETEXT_IN, NULL, (APTR)quitObj,
	84, 3, 327, 13, (UBYTE *)"Sentence", &topaz800, ID_sentence, PLACETEXT_LEFT, NULL, (APTR)sentenceObj,
	294, 20, 17, 9, (UBYTE *)"", &topaz800, ID_sex, PLACETEXT_LEFT, NULL, (APTR)sexObj,
	84, 19, 143, 10, (UBYTE *)"Volume   ", &topaz800, ID_volume, PLACETEXT_LEFT, NULL, (APTR)volumeObj,
	84, 30, 143, 10, (UBYTE *)"Rate    ", &topaz800, ID_rate, PLACETEXT_LEFT, NULL, (APTR)rateObj,
};

ULONG SpeechNTags[] = {
	(GT_Underscore), '_', TAG_DONE,
	(GTST_String), (ULONG)"Hello, this is Amiga speaking", GTST_MaxChars, 255, (STRINGA_Justification), GACT_STRINGLEFT, TAG_DONE,
	(GTMX_Labels), (ULONG)&SexLabels[0], (GTMX_Active), 0, (GTMX_Spacing), 2, TAG_DONE,
	(GTSL_Min), 0, (GTSL_Max), 64, (GTSL_Level), 32, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_MaxLevelLen), 0, (GTSL_LevelPlace), PLACETEXT_LEFT, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_HORIZ, TAG_DONE,
	(GTSL_Min), 40, (GTSL_Max), 400, (GTSL_Level), 150, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_MaxLevelLen), 0, (GTSL_LevelPlace), PLACETEXT_LEFT, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (PGA_Freedom), LORIENT_HORIZ, TAG_DONE,
};


int GetPubScreen(void)
{
  if (!(Scr = LockPubScreen(PubScrName)))
	return(1L);

  if (!(VisualInfo = GetVisualInfo(Scr, TAG_DONE)))
	return(2L);

  if (!(ScrDrawInfo = GetScreenDrawInfo(Scr)))
	return(3L);
  return(0L);
}

void ClosePubScreen(void)
{
  if (VisualInfo)
    FreeVisualInfo(VisualInfo);
  if (Scr)
    UnlockPubScreen(NULL,  Scr);
  if (ScrDrawInfo)
    FreeScreenDrawInfo(Scr,  ScrDrawInfo);
}

int OpenSpeechWindow(char windtitle[80])
{
  struct NewGadget	NewGad;
  struct Gadget   	*Gad;
  register UWORD i, j;
  UWORD offsetx = Scr->WBorLeft;
  UWORD offsety = Scr->WBorTop + Scr->RastPort.TxHeight + 1;


  SpeechStrExt.Font = NULL;
  SpeechStrExt.Pens[0] = 2;
  SpeechStrExt.Pens[1] = 0;
  SpeechStrExt.ActivePens[0] = 3;
  SpeechStrExt.ActivePens[1] = 2;
  SpeechStrExt.InitialModes  = 0;
  SpeechStrExt.EditHook = NULL;
  SpeechStrExt.WorkBuffer = NULL;

  if (!(Gad = CreateContext(&SpeechGList)))
  	return(1L);

  for (i=0, j=0; i < SpeechNumGads; i++)
  {
    CopyMem((char *)&SpeechNGads[i], (char *)&NewGad, (long)sizeof(struct NewGadget));

    NewGad.ng_VisualInfo = VisualInfo;
    NewGad.ng_LeftEdge += offsetx;
    NewGad.ng_TopEdge  += offsety;

    SpeechGadgets[i] = Gad = CreateGadgetA((ULONG)SpeechGadTypes[i], Gad, &NewGad,
	(struct TagItem *)&SpeechNTags[j]);
    if (SpeechGadTypes[i] == STRING_KIND || SpeechGadTypes[i] == INTEGER_KIND)
    {
	SpeechGadgets[i]->Flags |= GFLG_STRINGEXTEND;
	((struct StringInfo *)SpeechGadgets[i]->SpecialInfo)->Extension = &SpeechStrExt;
    }
    while (SpeechNTags[j])
        j +=2;
    j++;
    if (!Gad)
       return(2L);
  }
  if (!(SpeechWnd = OpenWindowTags(NULL,
  	WA_Left,	SpeechLeft,
  	WA_Top, 	SpeechTop,
  	WA_Width,	SpeechWidth,
  	WA_Height,	SpeechHeight,
  	WA_NewLookMenus, TRUE,
  	WA_IDCMP,	IDCMP_CLOSEWINDOW |  IDCMP_NEWSIZE | IDCMP_MOUSEMOVE | IDCMP_GADGETUP | IDCMP_GADGETDOWN | IDCMP_VANILLAKEY ,
  	WA_Flags,	WFLG_CLOSEGADGET | WFLG_DEPTHGADGET  |  WFLG_SMART_REFRESH | 
			 WFLG_ACTIVATE |  WFLG_DRAGBAR ,
  	WA_Gadgets,	SpeechGList,
  	WA_Title,	windtitle,
  	WA_ScreenTitle,	"Visual Arts V2.1 Copyright 1994-95 Danny Y. Wong  All Rights Reserved.",
  	WA_PubScreen,	Scr,
  	WA_MinWidth,	160,
  	WA_MinHeight,	50,
  	WA_MaxWidth,	640,
  	WA_MaxHeight,	200,
  	TAG_DONE)))
  	    return(3L);

  CreateSpeechLists();
  GT_RefreshWindow(SpeechWnd, NULL);
  RefreshGadgets(SpeechGadgets[0], SpeechWnd, NULL);
  return(0L);
}

void CloseSpeechWindow(void)
{
  if (SpeechWnd)
	CloseWindow(SpeechWnd);
  if (SpeechGList)
	FreeGadgets(SpeechGList);
}

int SpeechHandler(void)
{
  struct IntuiMessage	*msg;
  struct VAobject	VAObject;
  int running	= 1;
  int (*func)(struct VAobject VAObject);
  ULONG class;
  UWORD code;

  while (msg=GT_GetIMsg(SpeechWnd->UserPort))
  {
    CopyMem((char *)msg, (char *)&SpeechMsg, (long)sizeof(struct IntuiMessage));
    class = msg->Class;
    code  = msg->Code;

    VAObject.va_Window = (struct Window *)SpeechWnd;
    VAObject.va_Gadget = (struct Gadget *)msg->IAddress;
    VAObject.va_IntuiMsg = (struct IntuiMessage *)msg;
    VAObject.va_Flags = 0;
    VAObject.va_UserData = 0;

    GT_ReplyIMsg(msg);
    switch(class)
    {

	  case IDCMP_MOUSEMOVE :
	    running = SpeechIDCMP_MOUSEMOVE (VAObject);
	    break;

	  case IDCMP_NEWSIZE:
	   break;

	  case IDCMP_CLOSEWINDOW:
	     return(0);
	     break;

	  case IDCMP_GADGETUP:
	    func = (void *)((struct Gadget *)SpeechMsg.IAddress)->UserData;
	    if (func != NULL)
	      running =  func(VAObject);
	    break;


	  case   IDCMP_VANILLAKEY:
	    switch(code)
	    {
	      case 'Q':
	        ButtonSelected(SpeechWnd, SpeechGadgets[0]);
                return(-1);
	        break;
	    }
	    break;
    }
  }
  return(running);
}

int SpeechMainHandler(void)
{
  int running = 1;
  ULONG windsig, signals;

  windsig = 1L << SpeechWnd->UserPort->mp_SigBit;
  while (running == 1)
  {
    signals = Wait( windsig );
    if (signals & windsig)
    {
	  running = SpeechHandler();
    }
  }
  return(running);
}

int main(int argc, char *argv[])
{
  int rc;

  if (!(GetPubScreen()))
  {
        InitSpeech();   /* --> initialize the speech */
	for (rc=0; rc < 1; rc++)
	  SpeechLists[rc]=GetNewList();
	if (!(OpenSpeechWindow("Speech Demo")))
	{
	  rc = SpeechMainHandler();
	  CloseSpeechWindow();
	}
	for (rc=0; rc < 1; rc++)
	  FreeList(SpeechLists[rc]);
        DeInitSpeech(); /* --> deinitial the speech and free memory */
	ClosePubScreen();
  }
  return(0L);
}
