@Override
 public int read(ByteBuffer buf) throws IOException {
   ShortBuffer sbuf = buf.asShortBuffer();
   int total = 0;
   while (sbuf.hasRemaining() && _header != null) {
     if (_buffer == null) {
       try {
         _buffer = (SampleBuffer) _decoder.decodeFrame(_header, _istream);
         _istream.closeFrame();
         _header = _istream.readFrame();
       } catch (JavaLayerException e) {
         throw new IOException(e.toString());
       }
     }
     int blen = _buffer.getBufferLength(), length = Math.min(sbuf.remaining(), blen - _offset);
     sbuf.put(_buffer.getBuffer(), _offset, length);
     if ((_offset += length) >= blen) {
       _offset = 0;
       _buffer = null;
     }
     total += (length * 2);
   }
   buf.position(buf.position() + total);
   return total;
 }
 @Override
 public void init(InputStream in) throws IOException {
   _istream = new Bitstream(in);
   try {
     _header = _istream.readFrame();
   } catch (JavaLayerException e) {
     throw new IOException(e.toString());
   }
   _decoder = new Decoder();
 }