@Override
 public void eventReceived(GENASubscription subscription) {
   rendererMap.mark(uuid, ACTIVE, true);
   if (subscription.getCurrentValues().containsKey("LastChange")) {
     xml2d(uuid, subscription.getCurrentValues().get("LastChange").toString(), null);
   }
 }
 protected void subscribeAll(Device d, String uuid) {
   String name = getFriendlyName(d);
   int ctrl = 0;
   for (Service s : d.getServices()) {
     String sid = s.getServiceId().getId();
     LOGGER.debug("Subscribing to " + sid + " service on " + name);
     if (sid.contains("AVTransport")) {
       ctrl |= AVT;
     } else if (sid.contains("RenderingControl")) {
       ctrl |= RC;
     }
     upnpService.getControlPoint().execute(new SubscriptionCB(s));
   }
   rendererMap.mark(uuid, RENEW, false);
   rendererMap.mark(uuid, CONTROLS, ctrl);
 }
 protected void rendererUpdated(Device d) {
   String uuid = getUUID(d);
   if (rendererMap.containsKey(uuid)) {
     if (rendererMap.get(uuid, "0").needsRenewal()) {
       LOGGER.debug("Renewing subscriptions to ", getFriendlyName(d));
       subscribeAll(d, uuid);
     }
     rendererMap.mark(uuid, ACTIVE, true);
   }
 }
 protected synchronized boolean addRenderer(Device d) {
   if (d != null) {
     String uuid = getUUID(d);
     if (isMediaRenderer(d) && rendererFound(d, uuid) != null) {
       LOGGER.debug("Adding device: {} {}", d.getType(), d.toString());
       rendererMap.mark(uuid, ACTIVE, true);
       subscribeAll(d, uuid);
       rendererReady(uuid);
       return true;
     }
   }
   return false;
 }
 @Override
 public void ended(GENASubscription sub, CancelReason reason, UpnpResponse response) {
   // Reason should be null, or it didn't end regularly
   if (reason != null) {
     LOGGER.debug(
         "Subscription cancelled: "
             + sub.getService().getServiceId().getId()
             + " on "
             + uuid
             + ": "
             + reason);
   }
   rendererMap.mark(uuid, RENEW, true);
 }