code: func (d *Decoder) ReadInfo() {
  	if d == nil || d.SampleRate > 0 {
  		return
  	}
  	if d.err = d.readHeaders(); d.err != nil {
  		d.err = fmt.Errorf("failed to read header - %v", d.err)
  		return
  	}
  
  	var (
  		id          [4]byte
  		size        uint32
  		rewindBytes int64
  	)
  	for d.err != io.EOF {
  		id, size, d.err = d.iDnSize()
  		if d.err != nil {
  			d.err = fmt.Errorf("error reading chunk header - %v", d.err)
  			break
  		}
  		switch id {
  		case COMMID:
  			d.parseCommChunk(size)
  			// if we found other chunks before the COMM,
  			// we need to rewind the reader so we can properly
  			// read the rest later.
  			if rewindBytes > 0 {
  				d.r.Seek(-(rewindBytes + int64(size)), 1)
  				break
  			}
  			return
  		default:
  			// we haven't read the COMM chunk yet, we need to track location to rewind
  			if d.SampleRate == 0 {
  				rewindBytes += int64(size)
  			}
  			if d.err = d.jumpTo(int(size)); d.err != nil {
  				return
  			}
  		}
  	}
  }
docs: // ReadInfo reads the underlying reader until the comm header is parsed.
  // This method is safe to call multiple times.