protected void doWrite(ByteBuffer out) {
    super.doWrite(out);

    out.putShort(version);
    out.putShort(revision);
    out.putInt(vendor);

    if (version < 2) {
      out.putShort(channelCount);
      if (version == 0) out.putShort(sampleSize);
      else out.putShort((short) 16);

      out.putShort((short) compressionId);
      out.putShort((short) pktSize);

      out.putInt((int) Math.round(sampleRate * 65536d));

      if (version == 1) {
        out.putInt(samplesPerPkt);
        out.putInt(bytesPerPkt);
        out.putInt(bytesPerFrame);
        out.putInt(bytesPerSample);
      }
    } else if (version == 2) {
      out.putShort((short) 3);
      out.putShort((short) 16);
      out.putShort((short) -2);
      out.putShort((short) 0);
      out.putInt(65536);
      out.putInt(72);
      out.putLong(Double.doubleToLongBits(sampleRate));
      out.putInt(channelCount);
      out.putInt(0x7F000000);
      out.putInt(sampleSize);
      out.putInt(lpcmFlags);
      out.putInt(bytesPerFrame);
      out.putInt(samplesPerPkt);
    }
    writeExtensions(out);
  }