I suspect that while dleyna/renderer builds on amd64, it may not actually
*run*.

This diff incorporates a pull request someone proposed for upstream
to make it work with gupnp>=1.2.0

This gets it to build on sparc64, and presumably other ld.bfd arches.

I'm guessing it might also run now on ld.lld arches.

I've bumped REVISION accordingly.

ok?

--Kurt

Index: Makefile
===================================================================
RCS file: /cvs/ports/net/dleyna/renderer/Makefile,v
retrieving revision 1.5
diff -u -p -r1.5 Makefile
--- Makefile    10 Feb 2019 12:57:12 -0000      1.5
+++ Makefile    27 Mar 2020 18:43:37 -0000
@@ -3,7 +3,7 @@
 COMMENT=               service for interacting with DMRs
 
 GH_PROJECT=            dleyna-renderer
-REVISION=              0
+REVISION=              1
 
 SHARED_LIBS += dleyna-renderer-1.0       0.0 # 1.3
 
Index: patches/patch-configure_ac
===================================================================
RCS file: /cvs/ports/net/dleyna/renderer/patches/patch-configure_ac,v
retrieving revision 1.1
diff -u -p -r1.1 patch-configure_ac
--- patches/patch-configure_ac  10 Feb 2019 12:57:13 -0000      1.1
+++ patches/patch-configure_ac  27 Mar 2020 18:43:37 -0000
@@ -1,4 +1,8 @@
-$OpenBSD: patch-configure_ac,v 1.1 2019/02/10 12:57:13 jasper Exp $
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
 
 Index: configure.ac
 --- configure.ac.orig
@@ -9,8 +13,8 @@ Index: configure.ac
  PKG_CHECK_MODULES([GIO], [gio-2.0 >= 2.28])
 -PKG_CHECK_MODULES([GSSDP], [gssdp-1.0 >= 0.13.2])
 -PKG_CHECK_MODULES([GUPNP], [gupnp-1.0 >= 0.20.5])
-+PKG_CHECK_MODULES([GSSDP], [gssdp-1.2 >= 1.1.0])
-+PKG_CHECK_MODULES([GUPNP], [gupnp-1.2 >= 1.1.0])
++PKG_CHECK_MODULES([GSSDP], [gssdp-1.2 >= 1.2.0])
++PKG_CHECK_MODULES([GUPNP], [gupnp-1.2 >= 1.2.0])
  PKG_CHECK_MODULES([GUPNPAV], [gupnp-av-1.0 >= 0.11.5])
  PKG_CHECK_MODULES([GUPNPDLNA], [gupnp-dlna-2.0 >= 0.9.4])
  PKG_CHECK_MODULES([SOUP], [libsoup-2.4 >= 2.28.2])
Index: patches/patch-libdleyna_renderer_Makefile_am
===================================================================
RCS file: patches/patch-libdleyna_renderer_Makefile_am
diff -N patches/patch-libdleyna_renderer_Makefile_am
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_Makefile_am        27 Mar 2020 18:43:37 
-0000
@@ -0,0 +1,25 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/Makefile.am
+--- libdleyna/renderer/Makefile.am.orig
++++ libdleyna/renderer/Makefile.am
+@@ -22,6 +22,7 @@ libdleyna_renderer_1_0_la_LDFLAGS =  -version-info $(DL
+ libdleyna_renderer_1_0_la_SOURCES =   $(libdleyna_rendererinc_HEADERS) \
+                                       async.c                          \
+                                       device.c                         \
++                                      gasync-task.c                    \
+                                       host-service.c                   \
+                                       manager.c                        \
+                                       server.c                         \
+@@ -53,6 +54,7 @@ sysconf_DATA = dleyna-renderer-service.conf
+ EXTRA_DIST =  $(sysconf_DATA)                 \
+               async.h                         \
+               device.h                        \
++              gasync-task.h                    \
+               host-service.h                  \
+               prop-defs.h                     \
+               manager.h                       \
Index: patches/patch-libdleyna_renderer_device_c
===================================================================
RCS file: patches/patch-libdleyna_renderer_device_c
diff -N patches/patch-libdleyna_renderer_device_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_device_c   27 Mar 2020 18:43:37 -0000
@@ -0,0 +1,558 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/device.c
+--- libdleyna/renderer/device.c.orig
++++ libdleyna/renderer/device.c
+@@ -26,15 +26,16 @@
+ 
+ #include <libsoup/soup.h>
+ #include <libgupnp/gupnp-control-point.h>
++#include <libgupnp/gupnp-service-proxy.h>
+ #include <libgupnp-av/gupnp-av.h>
+ 
+ #include <libdleyna/core/core.h>
+ #include <libdleyna/core/error.h>
+ #include <libdleyna/core/log.h>
+-#include <libdleyna/core/service-task.h>
+ 
+ #include "async.h"
+ #include "device.h"
++#include "gasync-task.h"
+ #include "prop-defs.h"
+ #include "server.h"
+ 
+@@ -675,21 +676,30 @@ static void prv_process_protocol_info(dlr_device_t *de
+       DLEYNA_LOG_DEBUG("Exit");
+ }
+ 
+-static void prv_get_protocol_info_cb(GUPnPServiceProxy *proxy,
+-                                   GUPnPServiceProxyAction *action,
++static void prv_get_protocol_info_cb(GObject *target,
++                                     GAsyncResult *res,
+                                    gpointer user_data)
+ {
+       gchar *result = NULL;
+       gboolean end;
+       GError *error = NULL;
+       prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
++      GUPnPServiceProxyAction *action;
+ 
+       DLEYNA_LOG_DEBUG("Enter");
+ 
+       priv_t->dev->construct_step++;
+ 
+-      end = gupnp_service_proxy_end_action(proxy, action, &error, "Sink",
+-                                           G_TYPE_STRING, &result, NULL);
++      action = 
gupnp_service_proxy_call_action_finish(GUPNP_SERVICE_PROXY(target), res, 
&error);
++
++      if (action == NULL || (error != NULL)) {
++              DLEYNA_LOG_WARNING("GetProtocolInfo operation failed: %s",
++                                 ((error != NULL) ? error->message
++                                                  : "Invalid result"));
++              goto on_error;
++      }
++
++      end = gupnp_service_proxy_action_get_result (action, &error, "Sink", 
G_TYPE_STRING, &result, NULL);
+       if (!end || (result == NULL)) {
+               DLEYNA_LOG_WARNING("GetProtocolInfo operation failed: %s",
+                                  ((error != NULL) ? error->message
+@@ -701,6 +711,10 @@ static void prv_get_protocol_info_cb(GUPnPServiceProxy
+ 
+ on_error:
+ 
++      if (action) {
++              gupnp_service_proxy_action_unref(action);
++      }
++
+       if (error)
+               g_error_free(error);
+ 
+@@ -709,53 +723,193 @@ on_error:
+       DLEYNA_LOG_DEBUG("Exit");
+ }
+ 
+-static GUPnPServiceProxyAction *prv_get_protocol_info(
+-                                              dleyna_service_task_t *task,
+-                                              GUPnPServiceProxy *proxy,
+-                                              gboolean *failed)
++static void prv_introspection_wrap_cb (GUPnPServiceInfo *info,
++                                GUPnPServiceIntrospection *introspection,
++                                const GError *error,
++                                gpointer user_data)
+ {
+-      *failed = FALSE;
++      if (error != NULL) {
++              g_task_return_error (G_TASK (user_data),
++                              g_error_copy (error));
++      } else {
++              g_task_return_pointer (G_TASK (user_data),
++                              introspection,
++                              g_object_unref);
++      }
+ 
+-      return gupnp_service_proxy_begin_action(
+-                                      proxy, "GetProtocolInfo",
+-                                      dleyna_service_task_begin_action_cb,
+-                                      task, NULL);
++      g_object_unref (G_OBJECT (user_data));
+ }
+ 
+-static GUPnPServiceProxyAction *prv_subscribe(dleyna_service_task_t *task,
+-                                            GUPnPServiceProxy *proxy,
+-                                            gboolean *failed)
++void prv_introspect_async (GUPnPServiceInfo    *info,
++                         GCancellable        *cancellable,
++                         GAsyncReadyCallback  callback,
++                         gpointer             user_data)
+ {
++      GTask *task = g_task_new (info, cancellable, callback, user_data);
++
++      gupnp_service_info_get_introspection_async_full (info,
++                      prv_introspection_wrap_cb,
++                      cancellable,
++                      task);
++}
++
++static GUPnPServiceIntrospection *prv_introspect_finish
++              (GUPnPServiceInfo   *info,
++               GAsyncResult       *res,
++               GError            **error)
++{
++      g_return_val_if_fail (g_task_is_valid (res, info), NULL);
++
++      return g_task_propagate_pointer (G_TASK (res), error);
++}
++
++static gint compare_speeds(gconstpointer a, gconstpointer b);
++
++static void prv_introspect_av_cb (GObject *target,
++                                GAsyncResult *res,
++                                gpointer user_data)
++{
++      prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
++      GError *error = NULL;
++      GUPnPServiceIntrospection *introspection;
++      const GUPnPServiceStateVariableInfo *svi;
++      GList *allowed_values;
++      GVariant *speeds = NULL;
++      const GUPnPServiceActionInfo *sai;
++
++      DLEYNA_LOG_DEBUG("Enter");
++
++      priv_t->dev->construct_step++;
++
++      introspection = prv_introspect_finish (GUPNP_SERVICE_INFO (target), 
res, &error);
++
++      if (introspection == NULL || (error != NULL)) {
++              DLEYNA_LOG_WARNING("GetProtocolInfo operation failed: %s",
++                                 ((error != NULL) ? error->message
++                                                  : "Invalid result"));
++              goto on_error;
++      }
++
++      svi = gupnp_service_introspection_get_state_variable(
++                                                      introspection,
++                                                      "TransportPlaySpeed");
++
++      if (svi && svi->allowed_values) {
++              allowed_values = svi->allowed_values;
++
++              allowed_values = g_list_sort(allowed_values, compare_speeds);
++
++              prv_get_rates_values(allowed_values, &speeds,
++                                   &priv_t->dev->transport_play_speeds,
++                                   &priv_t->dev->min_rate,
++                                   &priv_t->dev->max_rate);
++
++              priv_t->dev->mpris_transport_play_speeds = 
g_variant_ref_sink(speeds);
++      }
++
++      sai = gupnp_service_introspection_get_action(
++                                              introspection,
++                                              "X_DLNA_GetBytePositionInfo");
++
++      priv_t->dev->can_get_byte_position = (sai != NULL);
++
++on_error:
++      g_clear_object(&introspection);
++
++      g_clear_error(&error);
++
++      DLEYNA_LOG_DEBUG("Exit");
++}
++
++static void prv_introspect_rc_cb (GObject *target,
++                                GAsyncResult *res,
++                                gpointer user_data)
++{
++      prv_new_device_ct_t *priv_t = (prv_new_device_ct_t *)user_data;
++      GError *error = NULL;
++      GUPnPServiceIntrospection *introspection;
++      const GUPnPServiceStateVariableInfo *svi;
++
++      DLEYNA_LOG_DEBUG("Enter");
++
++      priv_t->dev->construct_step++;
++
++      introspection = prv_introspect_finish (GUPNP_SERVICE_INFO (target), 
res, &error);
++
++      if (introspection == NULL || (error != NULL)) {
++              DLEYNA_LOG_WARNING("GetProtocolInfo operation failed: %s",
++                                 ((error != NULL) ? error->message
++                                                  : "Invalid result"));
++              goto on_error;
++      }
++
++      svi = gupnp_service_introspection_get_state_variable(introspection,
++                                                           "Volume");
++      if (svi != NULL)
++              priv_t->dev->max_volume = g_value_get_uint(&svi->maximum);
++
++on_error:
++      g_clear_object(&introspection);
++
++      g_clear_error(&error);
++
++      DLEYNA_LOG_DEBUG("Exit");
++}
++
++static gboolean prv_get_protocol_info(
++                              dleyna_gasync_task_t *task,
++                        GObject *target)
++{
++    GUPnPServiceProxyAction *action;
++
++    action = gupnp_service_proxy_action_new("GetProtocolInfo", NULL);
++
++    gupnp_service_proxy_call_action_async(GUPNP_SERVICE_PROXY (target), 
action,
++            dleyna_gasync_task_get_cancellable (task),
++            dleyna_gasync_task_ready_cb,
++            task);
++
++    return FALSE;
++}
++
++static gboolean prv_introspect(dleyna_gasync_task_t *task, GObject *target)
++{
++      prv_introspect_async (GUPNP_SERVICE_INFO (target),
++                            dleyna_gasync_task_get_cancellable (task),
++                            dleyna_gasync_task_ready_cb,
++                            task);
++
++      return FALSE;
++}
++
++static gboolean prv_subscribe(dleyna_gasync_task_t *task, GObject *target)
++{
+       dlr_device_t *device;
+ 
+       DLEYNA_LOG_DEBUG("Enter");
+ 
+-      device = (dlr_device_t *)dleyna_service_task_get_user_data(task);
++      device = (dlr_device_t *)dleyna_gasync_task_get_user_data(task);
+ 
+       device->construct_step++;
+       prv_device_subscribe_context(device);
+ 
+-      *failed = FALSE;
+-
+       DLEYNA_LOG_DEBUG("Exit");
+ 
+-      return NULL;
++      return FALSE;
+ }
+ 
+-static GUPnPServiceProxyAction *prv_declare(dleyna_service_task_t *task,
+-                                          GUPnPServiceProxy *proxy,
+-                                          gboolean *failed)
++static gboolean prv_declare(dleyna_gasync_task_t *task,
++                                          GObject *target)
+ {
+       unsigned int i;
+       dlr_device_t *device;
+       prv_new_device_ct_t *priv_t;
+       const dleyna_connector_dispatch_cb_t *table;
++    gboolean result = FALSE;
+ 
+       DLEYNA_LOG_DEBUG("Enter");
+ 
+-      *failed = FALSE;
+-
+-      priv_t = (prv_new_device_ct_t *)dleyna_service_task_get_user_data(task);
++      priv_t = (prv_new_device_ct_t *)dleyna_gasync_task_get_user_data(task);
+       device = priv_t->dev;
+       device->construct_step++;
+ 
+@@ -770,16 +924,16 @@ static GUPnPServiceProxyAction *prv_declare(dleyna_ser
+                               table + i);
+ 
+               if (!device->ids[i]) {
+-                      *failed = TRUE;
++                      result = TRUE;
+                       goto on_error;
+               }
+       }
+ 
+ on_error:
+ 
+-DLEYNA_LOG_DEBUG("Exit");
++      DLEYNA_LOG_DEBUG("Exit");
+ 
+-      return NULL;
++      return result;
+ }
+ 
+ static void prv_free_rc_event(gpointer user_data)
+@@ -800,6 +954,9 @@ void dlr_device_construct(
+ {
+       prv_new_device_ct_t *priv_t;
+       GUPnPServiceProxy *s_proxy;
++      GUPnPServiceProxy *av_proxy;
++      GUPnPServiceProxy *rc_proxy;
++      GCancellable *cancellable;
+ 
+       DLEYNA_LOG_DEBUG("Current step: %d", dev->construct_step);
+ 
+@@ -809,19 +966,52 @@ void dlr_device_construct(
+       priv_t->dispatch_table = dispatch_table;
+ 
+       s_proxy = context->service_proxies.cm_proxy;
++      cancellable = g_cancellable_new ();
+ 
+       if (dev->construct_step < 1)
+-              dleyna_service_task_add(queue_id, prv_get_protocol_info,
+-                                      s_proxy, prv_get_protocol_info_cb,
+-                                      NULL, priv_t);
++              dleyna_gasync_task_add(queue_id,
++                                     prv_get_protocol_info,
++                                     G_OBJECT(s_proxy),
++                                     prv_get_protocol_info_cb,
++                                     cancellable,
++                                     NULL, priv_t);
+ 
++      av_proxy = context->service_proxies.av_proxy;
++      if (dev->construct_step < 2) {
++              if (av_proxy == NULL) {
++                      dev->construct_step++;
++              } else {
++                      dleyna_gasync_task_add(queue_id,
++                                             prv_introspect,
++                                             G_OBJECT(av_proxy),
++                                             prv_introspect_av_cb,
++                                             cancellable,
++                                             NULL, priv_t);
++              }
++      }
++
++      rc_proxy = context->service_proxies.rc_proxy;
++      if (dev->construct_step < 3) {
++              if (rc_proxy == NULL) {
++                      dev->construct_step++;
++              } else {
++                      dleyna_gasync_task_add(queue_id,
++                                             prv_introspect,
++                                             G_OBJECT(rc_proxy),
++                                             prv_introspect_rc_cb,
++                                             cancellable,
++                                             NULL, priv_t);
++              }
++      }
++
++
+       /* The following task should always be completed */
+-      dleyna_service_task_add(queue_id, prv_subscribe, s_proxy,
+-                              NULL, NULL, dev);
++      dleyna_gasync_task_add(queue_id, prv_subscribe, G_OBJECT(s_proxy),
++                              NULL, NULL, NULL, dev);
+ 
+-      if (dev->construct_step < 3)
+-              dleyna_service_task_add(queue_id, prv_declare, s_proxy,
+-                                      NULL, g_free, priv_t);
++      if (dev->construct_step < 5)
++              dleyna_gasync_task_add(queue_id, prv_declare, G_OBJECT(s_proxy),
++                                      NULL, NULL, g_free, priv_t);
+ 
+       dleyna_task_queue_start(queue_id);
+ 
+@@ -1201,7 +1391,7 @@ static void prv_add_actions(dlr_device_t *device,
+                               continue;
+                       }
+ 
+-                      DLEYNA_LOG_DEBUG("DLNA version ≥ 1.50 pour %s",
++                      DLEYNA_LOG_DEBUG("DLNA version ≥ 1.50 for %s",
+                                        device->path);
+                       timeseek_missing = TRUE;
+                       g_free(dlna_device_class);
+@@ -2121,133 +2311,6 @@ exit:
+       return;
+ }
+ 
+-static gboolean prv_get_av_service_states_values(GUPnPServiceProxy *av_proxy,
+-                                               GVariant **mpris_tp_speeds,
+-                                               GPtrArray **upnp_tp_speeds,
+-                                               double *min_rate,
+-                                               double *max_rate,
+-                                               gboolean *can_get_byte_pos)
+-{
+-      const GUPnPServiceStateVariableInfo *svi;
+-      const GUPnPServiceActionInfo *sai;
+-      GUPnPServiceIntrospection *introspection;
+-      GError *error = NULL;
+-      GVariant *speeds = NULL;
+-      GList *allowed_values;
+-      gpointer weak_ref = NULL;
+-      gboolean  device_alive = TRUE;
+-
+-      /* TODO: this weak_ref hack is needed as
+-         gupnp_service_info_get_introspection iterates the main loop.
+-         This can result in our device getting deleted before this
+-         function returns.  Ultimately, this code needs to be re-written
+-         to use gupnp_service_info_get_introspection_async but this cannot
+-         really be done until GUPnP provides a way to cancel this function. */
+-
+-      weak_ref = av_proxy;
+-      g_object_add_weak_pointer(G_OBJECT(av_proxy), &weak_ref);
+-
+-      introspection = gupnp_service_info_get_introspection(
+-              GUPNP_SERVICE_INFO(av_proxy),
+-              &error);
+-
+-      if (!weak_ref) {
+-              DLEYNA_LOG_WARNING("Lost device during introspection call");
+-              device_alive = FALSE;
+-              goto exit;
+-      }
+-
+-      g_object_remove_weak_pointer(G_OBJECT(av_proxy), &weak_ref);
+-
+-      if (error != NULL) {
+-              DLEYNA_LOG_DEBUG(
+-                      "failed to fetch AV service introspection file");
+-
+-              g_error_free(error);
+-
+-              goto exit;
+-      }
+-
+-      svi = gupnp_service_introspection_get_state_variable(
+-                                                      introspection,
+-                                                      "TransportPlaySpeed");
+-
+-      if (svi && svi->allowed_values) {
+-              allowed_values = svi->allowed_values;
+-
+-              allowed_values = g_list_sort(allowed_values, compare_speeds);
+-
+-              prv_get_rates_values(allowed_values, &speeds, upnp_tp_speeds,
+-                                   min_rate, max_rate);
+-
+-              *mpris_tp_speeds = g_variant_ref_sink(speeds);
+-      }
+-
+-      sai = gupnp_service_introspection_get_action(
+-                                              introspection,
+-                                              "X_DLNA_GetBytePositionInfo");
+-
+-      *can_get_byte_pos = (sai != NULL);
+-
+-      g_object_unref(introspection);
+-
+-exit:
+-
+-      return device_alive;
+-}
+-
+-static gboolean prv_get_rc_service_states_values(GUPnPServiceProxy *rc_proxy,
+-                                               guint *max_volume)
+-{
+-      const GUPnPServiceStateVariableInfo *svi;
+-      GUPnPServiceIntrospection *introspection;
+-      GError *error = NULL;
+-      gpointer weak_ref = NULL;
+-      gboolean device_alive = TRUE;
+-
+-      /* TODO: this weak_ref hack is needed as
+-         gupnp_service_info_get_introspection iterates the main loop.
+-         This can result in our device getting deleted before this
+-         function returns.  Ultimately, this code needs to be re-written
+-         to use gupnp_service_info_get_introspection_async but this cannot
+-         really be done until GUPnP provides a way to cancel this function. */
+-
+-      weak_ref = rc_proxy;
+-      g_object_add_weak_pointer(G_OBJECT(rc_proxy), &weak_ref);
+-
+-      introspection = gupnp_service_info_get_introspection(
+-              GUPNP_SERVICE_INFO(rc_proxy),
+-              &error);
+-
+-      if (!weak_ref) {
+-              DLEYNA_LOG_WARNING("Lost device during introspection call");
+-              device_alive = FALSE;
+-              goto exit;
+-      }
+-
+-      g_object_remove_weak_pointer(G_OBJECT(rc_proxy), &weak_ref);
+-
+-      if (error != NULL) {
+-              DLEYNA_LOG_DEBUG(
+-                      "failed to fetch RC service introspection file");
+-
+-              g_error_free(error);
+-
+-              goto exit;
+-      }
+-
+-      svi = gupnp_service_introspection_get_state_variable(introspection,
+-                                                           "Volume");
+-      if (svi != NULL)
+-              *max_volume = g_value_get_uint(&svi->maximum);
+-
+-      g_object_unref(introspection);
+-
+-exit:
+-
+-      return device_alive;
+-}
+-
+ static void prv_update_device_props(GUPnPDeviceInfo *proxy, GHashTable *props)
+ {
+       GVariant *val;
+@@ -2377,34 +2440,6 @@ static gboolean prv_props_update(dlr_device_t *device,
+                           g_variant_ref(val));
+ 
+       service_proxies = &context->service_proxies;
+-
+-      /* TODO: We should not retrieve these values here.  They should be
+-         retrieved during device construction. */
+-
+-      if (service_proxies->av_proxy)
+-              if (!prv_get_av_service_states_values(
+-                          service_proxies->av_proxy,
+-                          &device->mpris_transport_play_speeds,
+-                          &device->transport_play_speeds,
+-                          &device->min_rate,
+-                          &device->max_rate,
+-                          &device->can_get_byte_position)) {
+-                      DLEYNA_LOG_DEBUG("Lost Device AV");
+-
+-                      device_alive = FALSE;
+-                      goto on_lost_device;
+-              }
+-
+-      /* TODO: We should not retrieve these values here.  They should be
+-         retrieved during device construction. */
+-
+-      if (service_proxies->rc_proxy)
+-              if (!prv_get_rc_service_states_values(service_proxies->rc_proxy,
+-                                                    &device->max_volume)) {
+-                      DLEYNA_LOG_DEBUG("Lost Device RC");
+-                      device_alive = FALSE;
+-                      goto on_lost_device;
+-              }
+ 
+       changed_props_vb = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+ 
Index: patches/patch-libdleyna_renderer_gasync-task_c
===================================================================
RCS file: patches/patch-libdleyna_renderer_gasync-task_c
diff -N patches/patch-libdleyna_renderer_gasync-task_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_gasync-task_c      27 Mar 2020 18:43:37 
-0000
@@ -0,0 +1,145 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/gasync-task.c
+--- libdleyna/renderer/gasync-task.c.orig
++++ libdleyna/renderer/gasync-task.c
+@@ -0,0 +1,135 @@
++/*
++ * dLeyna
++ *
++ * Copyright (c) 2019 Jens Georg <m...@jensge.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU Lesser General Public License,
++ * version 2.1, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public 
License
++ * for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software Foundation, 
Inc.,
++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ */
++
++#include "gasync-task.h"
++#include <libdleyna/core/task-processor.h>
++
++struct dleyna_gasync_task_t_ {
++      dleyna_task_atom_t base;
++      dleyna_gasync_task_action action;
++      GObject *target;
++      GAsyncReadyCallback callback;
++      GCancellable *cancellable;
++      GDestroyNotify free_func;
++      gpointer cb_user_data;
++};
++
++const char *dleyna_gasync_task_create_source(void)
++{
++      static unsigned int cpt = 1;
++      static char source[27];
++
++      g_snprintf(source, 27, "gasync-source-%d", cpt);
++      cpt++;
++
++      return source;
++}
++
++void dleyna_gasync_task_add(const dleyna_task_queue_key_t *queue_id,
++              dleyna_gasync_task_action action,
++              GObject *target,
++              GAsyncReadyCallback callback,
++              GCancellable *cancellable,
++              GDestroyNotify free_func,
++              gpointer cb_user_data)
++{
++      dleyna_gasync_task_t *task;
++
++      task = g_new0(dleyna_gasync_task_t, 1);
++
++      task->action = action;
++      task->callback = callback;
++      task->cancellable = cancellable;
++      task->free_func = free_func;
++      task->cb_user_data = cb_user_data;
++      task->target = target;
++
++      if (target != NULL) {
++              g_object_add_weak_pointer (target, (gpointer *)(&task->target));
++      }
++
++      dleyna_task_queue_add_task(queue_id, &task->base);
++}
++
++void dleyna_gasync_task_ready_cb(GObject *source, GAsyncResult *res, gpointer 
user_data)
++{
++      dleyna_gasync_task_t *task = (dleyna_gasync_task_t *)user_data;
++
++      task->callback(source, res, task->cb_user_data);
++
++      dleyna_task_queue_task_completed(task->base.queue_id);
++}
++
++void dleyna_gasync_task_process_cb(dleyna_task_atom_t *atom,
++              gpointer user_data)
++{
++      gboolean failed = FALSE;
++
++      dleyna_gasync_task_t *task = (dleyna_gasync_task_t *)atom;
++
++      failed = task->action(task, task->target);
++
++      if (failed) {
++              dleyna_task_processor_cancel_queue(task->base.queue_id);
++              dleyna_task_queue_task_completed(task->base.queue_id);
++      }
++
++      if (task->callback == NULL) {
++              dleyna_task_queue_task_completed(task->base.queue_id);
++      }
++}
++
++void dleyna_gasync_task_cancel_cb(dleyna_task_atom_t *atom,
++              gpointer user_data)
++{
++      dleyna_gasync_task_t *task = (dleyna_gasync_task_t *)atom;
++
++      if (task->cancellable) {
++              g_cancellable_cancel (task->cancellable);
++              task->cancellable = NULL;
++
++              dleyna_task_queue_task_completed(task->base.queue_id);
++      }
++}
++
++void dleyna_gasync_task_delete_cb(dleyna_task_atom_t *atom,
++              gpointer user_data)
++{
++      dleyna_gasync_task_t *task = (dleyna_gasync_task_t *)atom;
++
++      if (task->free_func != NULL)
++              task->free_func(task->cb_user_data);
++
++      if (task->target != NULL) {
++              g_object_remove_weak_pointer(task->target, (gpointer 
*)&task->target);
++      }
++
++      g_free(task);
++}
++
++gpointer dleyna_gasync_task_get_user_data(dleyna_gasync_task_t *task)
++{
++      return task->cb_user_data;
++}
++
++GCancellable *dleyna_gasync_task_get_cancellable(dleyna_gasync_task_t *task)
++{
++      return task->cancellable;
++}
Index: patches/patch-libdleyna_renderer_gasync-task_h
===================================================================
RCS file: patches/patch-libdleyna_renderer_gasync-task_h
diff -N patches/patch-libdleyna_renderer_gasync-task_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_gasync-task_h      27 Mar 2020 18:43:37 
-0000
@@ -0,0 +1,67 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/gasync-task.h
+--- libdleyna/renderer/gasync-task.h.orig
++++ libdleyna/renderer/gasync-task.h
+@@ -0,0 +1,57 @@
++/*
++ * dLeyna
++ *
++ * Copyright (c) 2019 Jens Georg <m...@jensge.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU Lesser General Public License,
++ * version 2.1, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public 
License
++ * for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program; if not, write to the Free Software Foundation, 
Inc.,
++ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ */
++
++#pragma once
++
++#include <libdleyna/core/task-atom.h>
++
++#include <glib.h>
++#include <gio/gio.h>
++
++typedef struct dleyna_gasync_task_t_ dleyna_gasync_task_t;
++
++typedef gboolean (*dleyna_gasync_task_action)
++      (dleyna_gasync_task_t *task,
++       GObject *target);
++
++const char *dleyna_gasync_task_create_source(void);
++
++void dleyna_gasync_task_add(const dleyna_task_queue_key_t *queue_id,
++              dleyna_gasync_task_action action,
++              GObject *target,
++              GAsyncReadyCallback callback,
++              GCancellable *cancellable,
++              GDestroyNotify free_func,
++              gpointer cb_user_data);
++
++void dleyna_gasync_task_ready_cb(GObject *source, GAsyncResult *res, gpointer 
user_data);
++
++void dleyna_gasync_task_process_cb(dleyna_task_atom_t *atom,
++              gpointer user_data);
++
++void dleyna_gasync_task_cancel_cb(dleyna_task_atom_t *atom,
++              gpointer user_data);
++
++void dleyna_gasync_task_delete_cb(dleyna_task_atom_t *atom,
++              gpointer user_data);
++
++gpointer dleyna_gasync_task_get_user_data(dleyna_gasync_task_t *task);
++
++GCancellable *dleyna_gasync_task_get_cancellable(dleyna_gasync_task_t *task);
Index: patches/patch-libdleyna_renderer_manager_c
===================================================================
RCS file: patches/patch-libdleyna_renderer_manager_c
diff -N patches/patch-libdleyna_renderer_manager_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_manager_c  27 Mar 2020 18:43:37 -0000
@@ -0,0 +1,17 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/manager.c
+--- libdleyna/renderer/manager.c.orig
++++ libdleyna/renderer/manager.c
+@@ -25,7 +25,6 @@
+ 
+ #include <libdleyna/core/error.h>
+ #include <libdleyna/core/log.h>
+-#include <libdleyna/core/service-task.h>
+ #include <libdleyna/core/white-list.h>
+ 
+ #include "async.h"
Index: patches/patch-libdleyna_renderer_upnp_c
===================================================================
RCS file: patches/patch-libdleyna_renderer_upnp_c
diff -N patches/patch-libdleyna_renderer_upnp_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libdleyna_renderer_upnp_c     27 Mar 2020 18:43:37 -0000
@@ -0,0 +1,49 @@
+$OpenBSD$
+
+Make dleyna-renderer work with gupnp >= 1.1.0
+
+https://patch-diff.githubusercontent.com/raw/intel/dleyna-renderer/pull/167
+
+Index: libdleyna/renderer/upnp.c
+--- libdleyna/renderer/upnp.c.orig
++++ libdleyna/renderer/upnp.c
+@@ -28,10 +28,10 @@
+ 
+ #include <libdleyna/core/error.h>
+ #include <libdleyna/core/log.h>
+-#include <libdleyna/core/service-task.h>
+ 
+ #include "async.h"
+ #include "device.h"
++#include "gasync-task.h"
+ #include "host-service.h"
+ #include "prop-defs.h"
+ #include "upnp.h"
+@@ -116,12 +116,12 @@ static const dleyna_task_queue_key_t *prv_create_devic
+ 
+       queue_id = dleyna_task_processor_add_queue(
+                       dlr_renderer_service_get_task_processor(),
+-                      dleyna_service_task_create_source(),
++                      dleyna_gasync_task_create_source(),
+                       DLR_RENDERER_SINK,
+                       DLEYNA_TASK_QUEUE_FLAG_AUTO_REMOVE,
+-                      dleyna_service_task_process_cb,
+-                      dleyna_service_task_cancel_cb,
+-                      dleyna_service_task_delete_cb);
++                      dleyna_gasync_task_process_cb,
++                      dleyna_gasync_task_cancel_cb,
++                      dleyna_gasync_task_delete_cb);
+       dleyna_task_queue_set_finally(queue_id, prv_device_chain_end);
+       dleyna_task_queue_set_user_data(queue_id, *priv_t);
+ 
+@@ -243,8 +243,8 @@ static void prv_server_unavailable_cb(GUPnPControlPoin
+ 
+       udn = gupnp_device_info_get_udn((GUPnPDeviceInfo *)proxy);
+ 
+-      ip_address = gupnp_context_get_host_ip(
+-              gupnp_control_point_get_context(cp));
++      ip_address = gssdp_client_get_host_ip(
++              GSSDP_CLIENT(gupnp_control_point_get_context(cp)));
+ 
+       if (!udn || !ip_address)
+               goto on_error;

Reply via email to