code: public List<Message> requestRootMenuFrom(final SlotReference slotReference, final int sortOrder)
              throws Exception {
  
          ConnectionManager.ClientTask<List<Message>> task = new ConnectionManager.ClientTask<List<Message>>() {
              @Override
              public List<Message> useClient(Client client) throws Exception {
                  if (client.tryLockingForMenuOperations(MetadataFinder.MENU_TIMEOUT, TimeUnit.SECONDS)) {
                      try {
                          final MediaDetails details = MetadataFinder.getInstance().getMediaDetailsFor(slotReference);
                          final CdjStatus.TrackType mediaType = details == null? CdjStatus.TrackType.REKORDBOX : details.mediaType;
  
                          final Message response = client.menuRequestTyped(Message.KnownType.ROOT_MENU_REQ, Message.MenuIdentifier.MAIN_MENU, slotReference.slot,
                                  mediaType, new NumberField(sortOrder), new NumberField(0xffffff));
                          return client.renderMenuItems(Message.MenuIdentifier.MAIN_MENU, slotReference.slot, mediaType, response);
                      } finally {
                          client.unlockForMenuOperations();
                      }
                  } else {
                      throw new TimeoutException("Unable to lock player for menu operations.");
                  }
              }
          };
  
          return ConnectionManager.getInstance().invokeWithClientSession(slotReference.player, task, "requesting root menu");
      }
docs: Ask the specified player for its top-level menu of menus. The {@link MetadataFinder} must be running for us to
  know the right kind of message to send, because it depends on whether the slot holds a rekordbox database or not.
  If we can't tell (because it's not running), we will just guess that there is one, and perhaps get back nothing.
  
  @param slotReference the player and slot for which the menu is desired
  @param sortOrder the order in which responses should be sorted, 0 for default, see Section 6.11.1 of the
  <a href="https://github.com/Deep-Symmetry/dysentery/blob/master/doc/Analysis.pdf">Packet Analysis
  document</a> for details, although it does not seem to have an effect on the root menu
  
  @return the entries in the top level menu
  
  @throws Exception if there is a problem obtaining the menu