【機能概要】
jar内のサウンドデータをSourceDataLineで2回再生
(オーディオデータをリアルタイムにストリーミングしながら再生する)
1回目の再生は、読み込みながら
2回目の再生は、データを溜め込んでから
【補足】
jar内のファイルへのアクセスは、以下のように指定すれば、java.net.URLで読み込むことができる。
jar:http://localhost:8888/SoundTest03.jar!/TESTDATA01.data
【ソース】
・
・
・
省略
・
・
・
public void case010() {
printf("PLAY SOUND \n");
DataInputStream dis = null;
byte[] buffer = new byte[8000];
int off, len, l=0;
AudioFormat.Encoding enc = new AudioFormat.Encoding("PCM_SIGNED");
AudioFormat format2 = new AudioFormat(
enc,
22050.0F,
16,
2,
4,
22050.0F,
false
);
SourceDataLine line = null;
BytePool bp = new BytePool();
String DEF_SRCDATA = "SoundTest03.jar!/sound/TESTDATA01.data";
String srcdata = DEF_SRCDATA;
printf("0.srcdata >>>%s\n", srcdata);
try {
try{
printf("getDocumentBase() >>>%s\n", getDocumentBase().toString());
printf("getCodeBase() >>>%s\n", getCodeBase().toString());
srcdata = getParameter( "DATA_SRC" );
printf("1.srcdata >>>%s\n", srcdata);
printf("getParameter( 'DATA_SRC' ) >>>%s\n",srcdata );
if(srcdata == null){
printf("chk01 \n");
srcdata = "jar:" + getCodeBase().toString() + DEF_SRCDATA;
}
else{
printf("chk02 \n");
}
}
catch(Exception e){
printf("chk03 \n");
}
printf("2.srcdata >>>%s\n", srcdata);
URL url = new URL(srcdata);
dis = new DataInputStream(
url.openStream()
);
// DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format);
DataLine.Info lineInfo = new DataLine.Info(SourceDataLine.class,format2);
line = (SourceDataLine) AudioSystem.getLine(lineInfo);
// line.open(format);
line.open(format2);
line.start();
while ((len = dis.read(buffer)) > 0) {
printf("len >>%d \n",len);
bp.add(buffer,len);
for (off = 0; len > 0; off += l, len -= l) {
try{
// 書き込まれるバイト数] % [フレームサイズのバイト数] == 0
// System.out.printf("[書き込まれるバイト数] % [フレームサイズのバイト数] == 0 \n");
printf("[%d] % [%d] == %d \n",len,4,len % 4);
// System.out.printf("before len >>%d off >>>%d l >>>%d\n",len,off,l);
l = line.write(buffer, off, len);
// System.out.printf("after len >>%d off >>>%d l >>>%d\n",len,off,l);
}
catch(IllegalArgumentException e){
printf("%s\n", e.toString());
}
}
}
printf("all size >>>%d bytes \n",bp.getSize());
byte[] data = bp.getData();
line.write(data, 0, data.length);
} catch (Exception e) {
printf("%s\n", e.toString());
} finally {
if (line != null)line.close();
if (dis != null){
try{ dis.close(); }catch(Exception e){}
}
// System.exit(0);
}
}
public static void main(String[] args) {
SoundTest03 t01 = new SoundTest03();
// t01.case001();
// t01.case002();
// t01.case003();
// t01.case004();
// t01.case005();
// t01.case006();
// t01.case007();
// t01.case008();
// t01.case009();
t01.case010();
}
class BytePool{
// ArrayList<byte []> datalist = new ArrayList<byte []>();
//LinkedList<byte []> datalist = new LinkedList<byte []>();
LinkedList<ByteBuffer> datalist = new LinkedList<ByteBuffer>();
public void add(byte[] b,int len){
ByteBuffer buffer = ByteBuffer.allocate(len);
buffer.put(b,0,len);
datalist.add(buffer);
// printf("%d bytes \n",b.length);
}
public int getSize(){
int size = 0;
for (int i = 0; i < datalist.size(); i++) {
size += datalist.get(i).capacity();
}
return size;
}
public byte[] getData(){
byte[] data = new byte[getSize()];
try{
int off = 0;
int len = 0;
// int ind = 0;
for (int i = 0; i < datalist.size(); i++) {
ByteBuffer buffer = datalist.get(i);
len = buffer.capacity();
buffer.position(0);
buffer.get(data,off,len);
// for(int j=0;j<len;j++){
// data[ind++] = buffer.get();
// }
off += len;
}
}
catch(Exception e){
printf("%s\n", e.toString());
}
return data;
}
}
【実行結果】
別ウィンドウで表示
0 件のコメント:
コメントを投稿