/**
 * Copyright 2000-2009 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 *
 * Permission is hereby granted, free of charge, to use and distribute
 * this software and its documentation without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of this work, and to
 * permit persons to whom this work is furnished to do so, subject to
 * the following conditions:
 *
 * 1. The code must retain the above copyright notice, this list of
 *    conditions and the following disclaimer.
 * 2. Any modifications must be clearly marked as such.
 * 3. Original authors' names are not deleted.
 * 4. The authors' names are not used to endorse or promote products
 *    derived from this software without specific prior written
 *    permission.
 *
 * DFKI GMBH AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DFKI GMBH NOR THE
 * CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 * THIS SOFTWARE.
 */
package javakurs.musterloesung.uebung05;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;

import marytts.client.MaryClient;
import marytts.client.http.Address;
import marytts.util.data.audio.AudioPlayer;

/**
 * Derived from Marc Schroeder's MaryClientUser.java A demo class illustrating
 * how to use the MaryClient class. This will connect to a MARY server, version
 * 4.x. It requires maryclient.jar from MARY 4.0. This works transparently with
 * MARY servers in both http and socket server mode.
 *
 * @author marc
 *
 */
public final class MaryTtsClient {

  /**
   * This contains an instance of the Mary client.
   */
  private static MaryClient mary;
  
  
  /**
   * This would create a new instance of {@link MaryTtsClient}. Not to be used.
   */
  private MaryTtsClient() {

    // private constructor to enforce noninstantiability
  }


  /**
   * This creates a speech output of the given string using the MARY system.
   *
   * @param text a {@link String} with text to say
   */
  public static void say(String text) {
    // throws IOException, UnknownHostException,
    // UnsupportedAudioFileException, InterruptedException
    try {
      if (null == mary) {
        String serverHost = System.getProperty("server.host", "localhost");
        int serverPort = Integer.getInteger("server.port", 59125).intValue();

        mary = MaryClient.getMaryClient(new Address(serverHost, serverPort));
      }
      // or US English (en-US), Telugu (te), Turkish (tr),
      String locale = "de";
      String inputType = "TEXT";
      String outputType = "AUDIO";
      String audioType = "WAVE";
      String defaultVoiceName = null;
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      mary.process(text, inputType, outputType, locale, audioType,
          defaultVoiceName, baos);
      // The byte array constitutes a full wave file, including the headers.
      // And now, play the audio data:
      AudioInputStream ais = AudioSystem
          .getAudioInputStream(new ByteArrayInputStream(baos.toByteArray()));
      AudioPlayer ap = new AudioPlayer(ais);
      ap.run();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (UnsupportedAudioFileException e) {
      e.printStackTrace();
    }
  }
}
