/** * 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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import javax.swing.JFrame; import marytts.signalproc.display.FunctionGraph; import marytts.util.MaryUtils; public class AudioDestination { private OutputStream os; private File f; private boolean ram; /** * Create an AudioDestination to which the audio data can be written. * * @param isInRam * whether to hold the data in RAM or write it into a file. The calling code is responsible for administering this * AudioDestination. * @throws IOException * if the underlying OutputStream could not be created. */ public AudioDestination(boolean isInRam) throws IOException { this.ram = isInRam; if (ram) { os = new ByteArrayOutputStream(); f = null; } else { f = MaryUtils.createSelfDeletingTempFile(3600); os = new FileOutputStream(f); } } public boolean isInRam() { return ram; } public boolean isFile() { return !ram; } public void write(byte[] b) throws IOException { os.write(b); } public void write(byte[] b, int off, int len) throws IOException { os.write(b, off, len); } /** * Convert the audio data into an AudioInputStream of the proper AudioFormat. * * @param audioFormat * the format of the audio data. * @return an AudioInputStream from which the synthesised audio data can be read. * @throws IOException * if a problem occurred with the temporary file (only applies when using files as temporary storage). */ public AudioInputStream convertToAudioInputStream(AudioFormat audioFormat) throws IOException { if (ram) { assert os instanceof ByteArrayOutputStream; assert f == null; byte[] audioData = ((ByteArrayOutputStream) os).toByteArray(); // logger.debug("Total of " + audioData.length + " bytes of audio data for this section."); return new AudioInputStream(new ByteArrayInputStream(audioData), audioFormat, audioData.length / audioFormat.getFrameSize()); } else { assert os instanceof FileOutputStream; assert f != null; os.close(); long byteLength = f.length(); return new AudioInputStream(new FileInputStream(f), audioFormat, byteLength / audioFormat.getFrameSize()); } } /** * Convert the audio data into an AudioInputStream of the proper AudioFormat. This method assumes that the audio data starts * with a valid audio file header, so the audio format is read from the data. * * @return an AudioInputStream from which the synthesized audio data can be read. * @throws IOException * if a problem occurred with the temporary file (only applies when using files as temporary storage). * @throws UnsupportedAudioFileException * UnsupportedAudioFileException */ public AudioInputStream convertToAudioInputStream() throws IOException, UnsupportedAudioFileException { if (ram) { assert os instanceof ByteArrayOutputStream; assert f == null; byte[] audioData = ((ByteArrayOutputStream) os).toByteArray(); // logger.debug("Total of " + audioData.length + " bytes of audio data for this section."); return AudioSystem.getAudioInputStream(new ByteArrayInputStream(audioData)); } else { assert os instanceof FileOutputStream; assert f != null; os.close(); long byteLength = f.length(); return AudioSystem.getAudioInputStream(f); } } public static void plot(double[] x) { plot(x, false); } public static void plot(double[] x, boolean bAutoClose) { plot(x, bAutoClose, 3000); } // Plots the values in x // If bAutoClose is specified, the figure is closed after milliSecondsToClose milliseconds // milliSecondsToClose: has no effect if bAutoClose is false public static void plot(double[] x, boolean bAutoClose, int milliSecondsToClose) { FunctionGraph graph = new FunctionGraph(400, 200, 0, 1, x); JFrame frame = graph.showInJFrame("wgt2", 500, 300, true, false); if (bAutoClose) { try { Thread.sleep(milliSecondsToClose); } catch (InterruptedException e) { } frame.dispose(); } } }