| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
package com.sun.media.sound;  | 
 | 
 | 
 | 
import java.io.ByteArrayInputStream;  | 
 | 
import java.io.File;  | 
 | 
import java.io.IOException;  | 
 | 
import java.io.InputStream;  | 
 | 
import java.net.URL;  | 
 | 
 | 
 | 
import javax.sound.sampled.AudioFormat;  | 
 | 
import javax.sound.sampled.AudioInputStream;  | 
 | 
import javax.sound.sampled.AudioSystem;  | 
 | 
import javax.sound.sampled.UnsupportedAudioFileException;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public abstract class AudioFloatInputStream { | 
 | 
 | 
 | 
    private static class BytaArrayAudioFloatInputStream  | 
 | 
            extends AudioFloatInputStream { | 
 | 
 | 
 | 
        private int pos = 0;  | 
 | 
        private int markpos = 0;  | 
 | 
        private final AudioFloatConverter converter;  | 
 | 
        private final AudioFormat format;  | 
 | 
        private final byte[] buffer;  | 
 | 
        private final int buffer_offset;  | 
 | 
        private final int buffer_len;  | 
 | 
        private final int framesize_pc;  | 
 | 
 | 
 | 
        BytaArrayAudioFloatInputStream(AudioFloatConverter converter,  | 
 | 
                byte[] buffer, int offset, int len) { | 
 | 
            this.converter = converter;  | 
 | 
            this.format = converter.getFormat();  | 
 | 
            this.buffer = buffer;  | 
 | 
            this.buffer_offset = offset;  | 
 | 
            framesize_pc = format.getFrameSize() / format.getChannels();  | 
 | 
            this.buffer_len = len / framesize_pc;  | 
 | 
 | 
 | 
        }  | 
 | 
 | 
 | 
        public AudioFormat getFormat() { | 
 | 
            return format;  | 
 | 
        }  | 
 | 
 | 
 | 
        public long getFrameLength() { | 
 | 
            return buffer_len;  | 
 | 
        }  | 
 | 
 | 
 | 
        public int read(float[] b, int off, int len) throws IOException { | 
 | 
            if (b == null)  | 
 | 
                throw new NullPointerException();  | 
 | 
            if (off < 0 || len < 0 || len > b.length - off)  | 
 | 
                throw new IndexOutOfBoundsException();  | 
 | 
            if (pos >= buffer_len)  | 
 | 
                return -1;  | 
 | 
            if (len == 0)  | 
 | 
                return 0;  | 
 | 
            if (pos + len > buffer_len)  | 
 | 
                len = buffer_len - pos;  | 
 | 
            converter.toFloatArray(buffer, buffer_offset + pos * framesize_pc,  | 
 | 
                    b, off, len);  | 
 | 
            pos += len;  | 
 | 
            return len;  | 
 | 
        }  | 
 | 
 | 
 | 
        public long skip(long len) throws IOException { | 
 | 
            if (pos >= buffer_len)  | 
 | 
                return -1;  | 
 | 
            if (len <= 0)  | 
 | 
                return 0;  | 
 | 
            if (pos + len > buffer_len)  | 
 | 
                len = buffer_len - pos;  | 
 | 
            pos += len;  | 
 | 
            return len;  | 
 | 
        }  | 
 | 
 | 
 | 
        public int available() throws IOException { | 
 | 
            return buffer_len - pos;  | 
 | 
        }  | 
 | 
 | 
 | 
        public void close() throws IOException { | 
 | 
        }  | 
 | 
 | 
 | 
        public void mark(int readlimit) { | 
 | 
            markpos = pos;  | 
 | 
        }  | 
 | 
 | 
 | 
        public boolean markSupported() { | 
 | 
            return true;  | 
 | 
        }  | 
 | 
 | 
 | 
        public void reset() throws IOException { | 
 | 
            pos = markpos;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    private static class DirectAudioFloatInputStream  | 
 | 
            extends AudioFloatInputStream { | 
 | 
 | 
 | 
        private final AudioInputStream stream;  | 
 | 
        private AudioFloatConverter converter;  | 
 | 
        private final int framesize_pc;   | 
 | 
        private byte[] buffer;  | 
 | 
 | 
 | 
        DirectAudioFloatInputStream(AudioInputStream stream) { | 
 | 
            converter = AudioFloatConverter.getConverter(stream.getFormat());  | 
 | 
            if (converter == null) { | 
 | 
                AudioFormat format = stream.getFormat();  | 
 | 
                AudioFormat newformat;  | 
 | 
 | 
 | 
                AudioFormat[] formats = AudioSystem.getTargetFormats(  | 
 | 
                        AudioFormat.Encoding.PCM_SIGNED, format);  | 
 | 
                if (formats.length != 0) { | 
 | 
                    newformat = formats[0];  | 
 | 
                } else { | 
 | 
                    float samplerate = format.getSampleRate();  | 
 | 
                    int samplesizeinbits = format.getSampleSizeInBits();  | 
 | 
                    int framesize = format.getFrameSize();  | 
 | 
                    float framerate = format.getFrameRate();  | 
 | 
                    samplesizeinbits = 16;  | 
 | 
                    framesize = format.getChannels() * (samplesizeinbits / 8);  | 
 | 
                    framerate = samplerate;  | 
 | 
 | 
 | 
                    newformat = new AudioFormat(  | 
 | 
                            AudioFormat.Encoding.PCM_SIGNED, samplerate,  | 
 | 
                            samplesizeinbits, format.getChannels(), framesize,  | 
 | 
                            framerate, false);  | 
 | 
                }  | 
 | 
 | 
 | 
                stream = AudioSystem.getAudioInputStream(newformat, stream);  | 
 | 
                converter = AudioFloatConverter.getConverter(stream.getFormat());  | 
 | 
            }  | 
 | 
            framesize_pc = stream.getFormat().getFrameSize()  | 
 | 
                    / stream.getFormat().getChannels();  | 
 | 
            this.stream = stream;  | 
 | 
        }  | 
 | 
 | 
 | 
        public AudioFormat getFormat() { | 
 | 
            return stream.getFormat();  | 
 | 
        }  | 
 | 
 | 
 | 
        public long getFrameLength() { | 
 | 
            return stream.getFrameLength();  | 
 | 
        }  | 
 | 
 | 
 | 
        public int read(float[] b, int off, int len) throws IOException { | 
 | 
            int b_len = len * framesize_pc;  | 
 | 
            if (buffer == null || buffer.length < b_len)  | 
 | 
                buffer = new byte[b_len];  | 
 | 
            int ret = stream.read(buffer, 0, b_len);  | 
 | 
            if (ret == -1)  | 
 | 
                return -1;  | 
 | 
            converter.toFloatArray(buffer, b, off, ret / framesize_pc);  | 
 | 
            return ret / framesize_pc;  | 
 | 
        }  | 
 | 
 | 
 | 
        public long skip(long len) throws IOException { | 
 | 
            long b_len = len * framesize_pc;  | 
 | 
            long ret = stream.skip(b_len);  | 
 | 
            if (ret == -1)  | 
 | 
                return -1;  | 
 | 
            return ret / framesize_pc;  | 
 | 
        }  | 
 | 
 | 
 | 
        public int available() throws IOException { | 
 | 
            return stream.available() / framesize_pc;  | 
 | 
        }  | 
 | 
 | 
 | 
        public void close() throws IOException { | 
 | 
            stream.close();  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mark(int readlimit) { | 
 | 
            stream.mark(readlimit * framesize_pc);  | 
 | 
        }  | 
 | 
 | 
 | 
        public boolean markSupported() { | 
 | 
            return stream.markSupported();  | 
 | 
        }  | 
 | 
 | 
 | 
        public void reset() throws IOException { | 
 | 
            stream.reset();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public static AudioFloatInputStream getInputStream(URL url)  | 
 | 
            throws UnsupportedAudioFileException, IOException { | 
 | 
        return new DirectAudioFloatInputStream(AudioSystem  | 
 | 
                .getAudioInputStream(url));  | 
 | 
    }  | 
 | 
 | 
 | 
    public static AudioFloatInputStream getInputStream(File file)  | 
 | 
            throws UnsupportedAudioFileException, IOException { | 
 | 
        return new DirectAudioFloatInputStream(AudioSystem  | 
 | 
                .getAudioInputStream(file));  | 
 | 
    }  | 
 | 
 | 
 | 
    public static AudioFloatInputStream getInputStream(InputStream stream)  | 
 | 
            throws UnsupportedAudioFileException, IOException { | 
 | 
        return new DirectAudioFloatInputStream(AudioSystem  | 
 | 
                .getAudioInputStream(stream));  | 
 | 
    }  | 
 | 
 | 
 | 
    public static AudioFloatInputStream getInputStream(  | 
 | 
            AudioInputStream stream) { | 
 | 
        return new DirectAudioFloatInputStream(stream);  | 
 | 
    }  | 
 | 
 | 
 | 
    public static AudioFloatInputStream getInputStream(AudioFormat format,  | 
 | 
            byte[] buffer, int offset, int len) { | 
 | 
        AudioFloatConverter converter = AudioFloatConverter  | 
 | 
                .getConverter(format);  | 
 | 
        if (converter != null)  | 
 | 
            return new BytaArrayAudioFloatInputStream(converter, buffer,  | 
 | 
                    offset, len);  | 
 | 
 | 
 | 
        InputStream stream = new ByteArrayInputStream(buffer, offset, len);  | 
 | 
        long aLen = format.getFrameSize() == AudioSystem.NOT_SPECIFIED  | 
 | 
                ? AudioSystem.NOT_SPECIFIED : len / format.getFrameSize();  | 
 | 
        AudioInputStream astream = new AudioInputStream(stream, format, aLen);  | 
 | 
        return getInputStream(astream);  | 
 | 
    }  | 
 | 
 | 
 | 
    public abstract AudioFormat getFormat();  | 
 | 
 | 
 | 
    public abstract long getFrameLength();  | 
 | 
 | 
 | 
    public abstract int read(float[] b, int off, int len) throws IOException;  | 
 | 
 | 
 | 
    public final int read(float[] b) throws IOException { | 
 | 
        return read(b, 0, b.length);  | 
 | 
    }  | 
 | 
 | 
 | 
    public final float read() throws IOException { | 
 | 
        float[] b = new float[1];  | 
 | 
        int ret = read(b, 0, 1);  | 
 | 
        if (ret == -1 || ret == 0)  | 
 | 
            return 0;  | 
 | 
        return b[0];  | 
 | 
    }  | 
 | 
 | 
 | 
    public abstract long skip(long len) throws IOException;  | 
 | 
 | 
 | 
    public abstract int available() throws IOException;  | 
 | 
 | 
 | 
    public abstract void close() throws IOException;  | 
 | 
 | 
 | 
    public abstract void mark(int readlimit);  | 
 | 
 | 
 | 
    public abstract boolean markSupported();  | 
 | 
 | 
 | 
    public abstract void reset() throws IOException;  | 
 | 
}  |