/* * @(#)AudioStream.java 1.20 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * 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 * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * */ package sun.audio; import java.io.InputStream; import java.io.DataInputStream; import java.io.FilterInputStream; import java.io.IOException; /** * Convert an InputStream to an AudioStream. * * @version 1.16, 08/19/02 */ public class AudioStream extends FilterInputStream { NativeAudioStream audioIn; public AudioStream(InputStream in) throws IOException { super(in); try { audioIn = (new NativeAudioStream(in)); } catch (InvalidAudioFormatException e) { // Not a native audio stream -- use a translator (if available). // If not, let the exception bubble up. audioIn = (new AudioTranslatorStream(in)); } this.in = audioIn; } /** * A blocking read. */ public int read(byte buf[], int pos, int len) throws IOException { int count = 0; while (count < len) { int n = super.read(buf, pos + count, len - count); if (n < 0) { return count; } count += n; Thread.currentThread().yield(); } return count; } /** * Get the data. */ public AudioData getData() throws IOException { byte buffer[] = new byte[audioIn.getLength()]; int gotbytes = read(buffer, 0, audioIn.getLength()); close(); if (gotbytes != audioIn.getLength()) { throw new IOException("audio data read error"); } return new AudioData(buffer); } public int getLength() { return audioIn.getLength(); } }