public float[][] decode() throws IOException {
	while(true) {
	    int len = dsp.synthesis_pcmout(pcmp, idxp);
	    if(len > 0) {
		float[][] ret = new float[chn][];
		for(int i = 0; i < chn; i++) {
		    ret[i] = new float[len];
		    System.arraycopy(pcmp[0][i], idxp[i], ret[i], 0, len);
		}
		dsp.synthesis_read(len);
		return(ret);
	    }
	    Packet pkt = in.packet();
	    if(pkt == null)
		return(null);
	    if((blk.synthesis(pkt) != 0) || (dsp.synthesis_blockin(blk) != 0))
		throw(new VorbisException());
	}
    }