samer@0: /* samer@0: * AudioSource.java samer@0: * samer@0: * Copyright (c) 2012, Samer Abdallah samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@46: package ishara.audio; samer@0: import javax.sound.sampled.AudioFormat; samer@0: samer@0: public abstract class AudioSource samer@0: { samer@0: AudioFormat format; samer@0: samer@0: public AudioSource(AudioFormat f) { format=f; } samer@0: samer@0: public AudioFormat getFormat() { return format; } samer@0: samer@0: public abstract void dispose(); samer@0: public abstract void start(); samer@0: public abstract void stop(); samer@0: public abstract int read(byte [] bbuf, int offset, int len) throws Exception; samer@0: samer@0: public Reader reader(int len) { samer@0: return new Reader(len,format.getSampleSizeInBits()/8); samer@0: } samer@0: samer@0: public class Reader { samer@0: byte[] bbuf; samer@0: double[] dbuf; samer@0: int rem, numbytes, bps; samer@0: Converter conv; samer@0: samer@0: public Reader(int numsamples, int bps) { samer@0: this.bps=bps; samer@0: numbytes=bps*numsamples; samer@0: bbuf=new byte[numbytes]; samer@0: dbuf=new double[numsamples]; samer@0: conv=getConverter(bbuf,dbuf,bps); samer@0: rem=0; samer@0: } samer@0: samer@0: public int unread() { return rem; } samer@0: public double[] next() throws Exception { samer@0: int rem=numbytes, pos=0; samer@0: while (rem>0) { samer@0: int bytesRead=read(bbuf, 0, rem); samer@0: if (bytesRead<=0) { this.rem=rem/bps; return dbuf; } samer@0: int count=bytesRead/bps; samer@0: conv.convert(pos,count); samer@0: pos+=count; rem-=bytesRead; samer@0: } samer@0: return dbuf; samer@0: } samer@0: } samer@0: samer@0: protected interface Converter { public void convert(int pos, int count); } samer@0: protected static Converter getConverter(final byte [] bbuf,final double [] dbuf,final int bps) { samer@0: switch (bps) { samer@0: case 1: return new Converter() { public void convert(int pos, int count) { Util.byteToDouble(bbuf,dbuf,pos,count); } }; samer@0: case 2: return new Converter() { public void convert(int pos, int count) { Util.shortToDouble(bbuf,dbuf,pos,count); } }; samer@0: case 3: return new Converter() { public void convert(int pos, int count) { Util.mediumToDouble(bbuf,dbuf,pos,count); } }; samer@0: case 4: return new Converter() { public void convert(int pos, int count) { Util.intToDouble(bbuf,dbuf,pos,count); } }; samer@0: } samer@0: throw new Error("Unrecognised sample format"); samer@0: } samer@0: public static void print(String msg) { System.out.println(msg); } samer@0: } samer@0: