/** * Copyright 2000-2006 DFKI GmbH. * All Rights Reserved. Use is subject to license terms. * * This file is part of MARY TTS. * * MARY TTS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package marytts.util.data.audio; import java.io.IOException; import java.io.InputStream; import marytts.util.MaryUtils; import org.apache.log4j.Logger; /** * An convenience class copying audio data from an input stream (e.g., a MARY module) to an AudioDestination object. Used by * java-external synthesis methods (SynthesisCallerBase and subclasses). * * @author Marc Schröder. * */ public class AudioReader extends Thread { private InputStream from; private AudioDestination audioDestination; private byte[] endMarker; private long latestSeenTime; private Logger logger; public AudioReader(InputStream from, AudioDestination audioDestination) { this(from, audioDestination, null); } public AudioReader(InputStream from, AudioDestination audioDestination, String endMarker) { super(Thread.currentThread().getName() + " reader"); this.from = from; this.audioDestination = audioDestination; this.endMarker = endMarker != null ? endMarker.getBytes() : null; latestSeenTime = System.currentTimeMillis(); logger = MaryUtils.getLogger("Audio reader"); } public void run() { byte[] bytes = new byte[8192]; int nrRead; boolean terminate = false; try { while (!terminate && (nrRead = from.read(bytes)) > -1) { latestSeenTime = System.currentTimeMillis(); logger.debug("Read " + nrRead + " bytes from audio source."); if (endMarker != null) { int start = MaryUtils.indexOf(bytes, endMarker); if (start != -1) { // found the end marker! nrRead = start; // truncate terminate = true; logger.debug("Found end marker at index position " + start); } } audioDestination.write(bytes, 0, nrRead); } logger.info("Finished reading."); from.close(); } catch (IOException e) { logger.warn("Problem reading from module:", e); } } public long latestSeenTime() { return latestSeenTime; } }