package speech;

import java.io.*;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import javax.speech.*;
//import javax.speech.recognition.*;
import javax.speech.synthesis.*;

public class TTS {
    protected static boolean _DEBUG = true; // debug


    static Synthesizer synth;
    static ResourceBundle resources;

    public TTS() {
	    try {
	    // locale, resources
	    //if (args.length>0) Locale.setDefault(new Locale(args[0], ""));
	    //if (args.length>1) Locale.setDefault(new Locale(args[0], args[1]));
	    // dbg("locale is " + Locale.getDefault());
        // create a synthesizer, speak a greeting
        synth = Central.createSynthesizer(null);

        // myEngineListener listener = new myEngineListener();
        // synth.addEngineListener(listener);
         synth.allocate();
        } catch (Exception e) {
            e.printStackTrace();
	        // System.exit(-1);
	    }
         
    } // end ctor
    
    public static void main(String args[]) {
        TTS aTTS =  new TTS();
        aTTS.say("hello this is a test");
    } // end main
    
    // Cancel output of this Synthesizer and remove all items from the speaking queue.
    public void cancelAll() {
        synth.cancelAll();
    }
    
    public void say(String msg) {
        int chunkSize = 100;
        int startPos = 0;
        int endPos = 0;
        int pos = 0;
        while (pos <= msg.length()) {
            endPos = pos + chunkSize;
            if (endPos>msg.length()) endPos = msg.length();
            sayChunk(msg.substring(pos,endPos));
            pos = endPos+1;
        }
    }
        
    private void sayChunk(String msg) {
        
        try {
            // synthesizer.speak(resources.getString("greeting"), null);
            if (_DEBUG )System.out.println("SAY > "+msg); 
            mySpeakableListener aSpeakableListener = new mySpeakableListener();
            synth.speak(msg, aSpeakableListener);
            //synth.waitQueueEmpty();
            //System.out.println("after"+synth.isQueueEmpty());
            //synth.deallocate();

        } catch (Exception e) {
            e.printStackTrace();
	    System.exit(-1);

        }
    }

    static void dbg(String s) {
        System.out.println(s);
    }

}

class myEngineListener implements EngineListener {
    public void engineAllocated(EngineEvent e) {System.out.println("engineAllocated");}
    public void engineDeallocated(EngineEvent e) {System.out.println("engineDeallocated");}
    public void enginePaused(EngineEvent e) {System.out.println("enginePaused");}
    public void engineResumed(EngineEvent e) {System.out.println("engineResumed");}
}



class mySpeakableListener implements SpeakableListener {
    
  public void beginSpeakable(SpeakableEvent ev){
    System.out.println( "BEGIN_SPEAKABLE event has occurred");}
    
  public void cancelSpeakable(SpeakableEvent ev) {
    System.out.println( "CANCEL_SPEAKABLE event has occurred");}
    
  public void endSpeakable(SpeakableEvent ev) {
    System.out.println( "END_SPEAKABLE event has occurred");}
    
  public void markerReached(SpeakableEvent ev) {
    System.out.println( "MARKER_REACHED event has occurred");}
    
  public void pauseSpeakable(SpeakableEvent ev) {
    System.out.println( "PAUSE_SPEAKABLE event has occurred");}
    
  public void resumeSpeakable(SpeakableEvent ev) {
    System.out.println( "RESUME_SPEAKABLE event has occurred");}
    
  public void startWord(SpeakableEvent ev) {
    System.out.println( "START_WORD event has occurred");}
    
  public void topOfQueue(SpeakableEvent ev) {
    System.out.println( "TOP_OF_QUEUE event has occurred");}
    
} // end class

