docs: private DeviceUpdate buildUpdate(DatagramPacket packet) {
          final int length = packet.getLength();
          final Util.PacketType kind = Util.validateHeader(packet, UPDATE_PORT);
  
          if (kind == null) {
              logger.warn("Ignoring unrecognized packet sent to update port.");
              return null;
          }
  
          switch (kind) {
              case MIXER_STATUS:
                  if (length != 56) {
                      logger.warn("Processing a Mixer Status packet with unexpected length " + length + ", expected 56 bytes.");
                  }
                  if (length >= 56) {
                      return new MixerStatus(packet);
                  } else {
                      logger.warn("Ignoring too-short Mixer Status packet.");
                      return null;
                  }
  
              case CDJ_STATUS:
                  if (length >= CdjStatus.MINIMUM_PACKET_SIZE) {
                      return new CdjStatus(packet);
  
                  } else {
                      logger.warn("Ignoring too-short CDJ Status packet with length " + length + " (we need " + CdjStatus.MINIMUM_PACKET_SIZE +
                              " bytes).");
                      return null;
                  }
  
              case LOAD_TRACK_ACK:
                  logger.info("Received track load acknowledgment from player " + packet.getData()[0x21]);
                  return null;
  
              case MEDIA_QUERY:
                  logger.warn("Received a media query packet, we don’t yet support responding to this.");
                  return null;
  
              case MEDIA_RESPONSE:
                  deliverMediaDetailsUpdate(new MediaDetails(packet));
                  return null;
  
              default:
                  logger.warn("Ignoring " + kind.name + " packet sent to update port.");
                  return null;
          }
      }