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());
        }
    }