2010年4月7日水曜日

サイト上にあるサウンドデータをSourceDataLineで再生2

【機能概要】
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 件のコメント:

コメントを投稿