On Fri, Mar 27, 2020 at 02:53:55PM -0400, Kurt Mosiejczuk wrote:
> 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?

Go ahead, thanks.

> --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;
> 

-- 
Antoine

Reply via email to