; English forum:
; Author: DANILO
; Date: 21. January 2003
; OS: Windows
; Demo: No


; an userlibrary is needed for CallCOM(), look at PureArea.net

;-----------------------------------------
;-----------------------------------------
#CLSCTX_INPROC_SERVER  = $1
#CLSCTX_INPROC_HANDLER = $2
#CLSCTX_LOCAL_SERVER   = $4
#CLSCTX_REMOTE_SERVER  = $10
#CLSCTX_ALL = (#CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER)

Procedure FemaleVoice()
  ; Select Female Voice
  Shared SelectedVoice
  SelectedVoice = 0
EndProcedure

Procedure MaleVoice()
  ; Select Male Voice
  Shared SelectedVoice
  SelectedVoice = 1
EndProcedure

Procedure SetVoiceVolume(Volume)
  ; Set Voice Volume ( 0 - 100 )
  Shared CurrentVolume
  If Volume < 0 Or Volume > 100 : Volume = 100 : EndIf
  CurrentVolume = Volume
EndProcedure

Procedure SetVoiceSpeed(Speed)
  ; Set Speed of Voice
  ;                 0 = default speed
  ; values can be between -10 and 10
  Shared CurrentSpeed
  CurrentSpeed = Speed
EndProcedure

Procedure SetVoicePitch(Pitch)
  ; Set Voice Pitch
  ; values can be between -10 and 10
  Shared CurrentPitch
  If Pitch < -10 : Pitch = -10 : EndIf
  If Pitch >  10 : Pitch =  10 : EndIf
  CurrentPitch = Pitch
EndProcedure

Procedure InitSPEECH()
   Shared VoiceObject
   CoInitialize_(0)
   If CoCreateInstance_(?CLSID_SpVoice, 0, #CLSCTX_ALL, ?IID_ISpVoice, @VoiceObject) = 0
      SetVoiceVolume(100)
      SetVoiceSpeed(0)
      SetVoicePitch(0)
      MaleVoice()
      ProcedureReturn 1
   Else
      ProcedureReturn 0
   EndIf
        DataSection
          CLSID_SpVoice:
            ;96749377-3391-11D2-9EE3-00C04F797396
            Data.l $96749377
            Data.w $3391,$11D2
            Data.b $9E,$E3,$00,$C0,$4F,$79,$73,$96
          IID_ISpVoice:
            ;6C44DF74-72B9-4992-A1EC-EF996E0422D4
            Data.l $6C44DF74
            Data.w $72B9,$4992
            Data.b $A1,$EC,$EF,$99,$6E,$04,$22,$D4
        EndDataSection
EndProcedure

Procedure Speak(String.s)
   Shared VoiceObject, SelectedVoice, CurrentVolume, CurrentSpeed, CurrentPitch
   ; Set Voice (male or female)
   If SelectedVoice = 1
      Text$ = "<voice required="+Chr(34)+"Gender=Male"+Chr(34)+">"+String
   Else
      Text$ = "<voice required="+Chr(34)+"Gender=Female"+Chr(34)+">"+String
   EndIf
   ; Set Volume
   Text$ = "<volume level="+Chr(34)+Str(CurrentVolume)+Chr(34)+"/>"+Text$
   ; Set Speed
   Text$ = "<rate absspeed="+Chr(34)+Str(CurrentSpeed)+Chr(34)+">"+Text$
   ; Set Pitch
   Text$ = "<pitch absmiddle="+Chr(34)+Str(CurrentPitch)+Chr(34)+"/>"+Text$

   length = Len(Text$)*2+10
   ;*mem = AllocateMemory(1,length,0); old PB-version
   *mem = AllocateMemory(length)     ;changed by Falko
   MultiByteToWideChar_(#CP_ACP ,0,Text$,-1,*mem,length)
   CallCOM(80,VoiceObject,*mem,0,0)
EndProcedure

Procedure CloseSPEECH()
   Shared VoiceObject
   CallCOM(08,VoiceObject)
   CoUninitialize_()
EndProcedure

; Voices
Procedure Speaker_DANILO()
  MaleVoice()
  SetVoiceSpeed(-2)
  SetVoicePitch(3)
EndProcedure

Procedure Speaker_Jennifer()
  FemaleVoice()
  SetVoiceSpeed(-2)
  SetVoicePitch(10)
EndProcedure

Procedure Speaker_Mother()
  FemaleVoice()
  SetVoicePitch(-10)
  SetVoiceSpeed(0)
EndProcedure


; start code
If InitSPEECH()
  Speaker_DANILO()
      Speak("Hello everybody!")               : Delay(100)
      Speak("my girlfriend is here too now") : Delay(100)
      Speak("Say hello - babe") : Delay(100)
  Speaker_Jennifer()
      Speak("Hi e b s - my name is Jennifer")
  Speaker_DANILO()
      Speak("Hey, my mother just returned from supermarket"): Delay(50)
      Speak("Say hello mom"): Delay(50)
  Speaker_Mother()
      Speak("Hi, iam the big mother")
  Speaker_DANILO()
      Speak("Greetings...")
     SetVoiceSpeed(-10)
     SetVoicePitch(-10)
      Speak("DANILO")
  CloseSPEECH()
Else
   MessageRequester("ERROR","MS SPEECH API not installed",0)
EndIf
;-----------------------------------------
;-----------------------------------------

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = --
; DisableDebugger