/* * Copyright 1999-2004 Carnegie Mellon University. * Portions Copyright 2002-2004 Sun Microsystems, Inc. * Portions Copyright 2002-2004 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.tools.audio; import javax.sound.sampled.AudioFormat; import java.io.IOException; import java.io.InputStream; /** Converts an AudioData into an InputStream. */ public class AudioDataInputStream extends InputStream { AudioFormat format; int currentIndex; int markIndex; final short[] shorts; final byte[] bytes; /** * Creates a new AudioDataInputStream for the given AudioData. * * @param audio the AudioData to turn into an AudioDataInputStream */ public AudioDataInputStream(AudioData audio) { shorts = audio.getAudioData(); bytes = new byte[2 * shorts.length]; byte[] sample = new byte[2]; for (int i = 0; i < shorts.length; i++) { Utils.toBytes(shorts[i], sample, true); bytes[i * 2 + 1] = sample[0]; bytes[i * 2] = sample[1]; } } // inherited from InputStream // @Override public int read() throws IOException { if (currentIndex >= bytes.length) { return -1; } else { return bytes[currentIndex++]; } } // inherited from InputStream // @Override public int read(byte[] buf) throws IOException { int count = 0; for (int i = 0; i < buf.length; i++) { if (currentIndex >= bytes.length) { break; } else { buf[i] = bytes[currentIndex++]; count++; } } return (count == 0) ? -1 : count; } // inherited from InputStream // @Override public int read(byte[] buf, int off, int len) throws IOException { int count = 0; for (int i = 0; (i < len) && ((i + off) < buf.length); i++) { if (currentIndex >= bytes.length) { break; } else { buf[i + off] = bytes[currentIndex++]; count++; } } return (count == 0) ? -1 : count; } // inherited from InputStream // public long skip(int n) throws IOException { int actual = n; if ((currentIndex + n) > bytes.length) { actual = bytes.length - currentIndex; } currentIndex += actual; return actual; } // inherited from InputStream // @Override public int available() throws IOException { return bytes.length - currentIndex; } // inherited from InputStream // @Override public void close() throws IOException { super.close(); } // inherited from InputStream // @Override public void mark(int readLimit) { markIndex = currentIndex; } // inherited from AudioInputStream // @Override public boolean markSupported() { return true; } // inherited from AudioInputStream // @Override public void reset() throws IOException { currentIndex = markIndex; } }