code: func (d *Decoder) readHeaders() error {
  	// prevent the headers to be re-read
  	if d.Version > 0 {
  		return nil
  	}
  	var n int64
  	size := 8 // 4 + 2 + 2
  	src := bytes.NewBuffer(make([]byte, 0, size))
  	n, d.err = io.CopyN(src, d.r, int64(size))
  	if n < int64(size) {
  		src.Truncate(int(n))
  	}
  
  	// format
  	if _, d.err = src.Read(d.Format[:]); d.err != nil {
  		return d.err
  	}
  	if d.Format != fileHeaderID {
  		return fmt.Errorf("%s %s", string(d.Format[:]), ErrFmtNotSupported)
  	}
  
  	// version
  	if d.err = binary.Read(src, binary.BigEndian, &d.Version); d.err != nil {
  		return d.err
  	}
  	if d.Version > 1 {
  		return fmt.Errorf("CAF v%d - %v", d.Version, ErrFmtNotSupported)
  	}
  
  	// The Audio Description chunk is required and must appear in a CAF file immediately following the file header. It describes the format of the audio data in the Audio Data chunk.
  	cType, _, err := d.iDnSize()
  	if err != nil {
  		return err
  	}
  	if cType != StreamDescriptionChunkID {
  		return fmt.Errorf("%s - Expected description chunk", ErrUnexpectedData)
  	}
  	if err := d.parseDescChunk(); err != nil {
  		return err
  	}
  
  	return d.err
  }
docs: // readHeaders is safe to call multiple times
  // byte size of the header: 12