[rhythmbox: 1/2] Port DAAP plugin to libdmapsharing-4.0 API




commit ffbd5ca80e58707518af43f202b710117aadc277
Author: W. Michael Petullo <mike flyn org>
Date:   Tue Jan 18 00:02:54 2022 +0000

    Port DAAP plugin to libdmapsharing-4.0 API

 meson.build                                        |  12 +-
 plugins/daap/meson.build                           |  12 +-
 plugins/daap/rb-daap-compat.h                      |  96 ++++++++++++
 plugins/daap/rb-daap-container-record.c            |  16 +-
 plugins/daap/rb-daap-container-record.h            |  14 +-
 plugins/daap/rb-daap-plugin.c                      | 109 ++++++++-----
 plugins/daap/rb-daap-plugin.h                      |   2 +
 plugins/daap/rb-daap-record-factory.c              |  15 +-
 plugins/daap/rb-daap-record-factory.h              |   4 +-
 plugins/daap/rb-daap-record.c                      |  12 +-
 plugins/daap/rb-daap-record.h                      |  14 +-
 plugins/daap/rb-daap-sharing.c                     |   8 +-
 plugins/daap/rb-daap-sharing.h                     |   3 +
 plugins/daap/rb-daap-source.c                      |  44 +++---
 plugins/daap/rb-daap-source.h                      |   8 +-
 plugins/daap/rb-dacp-compat.h                      |  99 ++++++++++++
 plugins/daap/rb-dacp-pairing-page.c                |  69 ++++----
 plugins/daap/rb-dacp-pairing-page.h                |   9 +-
 plugins/daap/rb-dacp-player.c                      |  61 ++++----
 plugins/daap/rb-dacp-player.h                      |   4 +-
 plugins/daap/rb-dmap-compat.h                      | 173 +++++++++++++++++++++
 plugins/daap/rb-dmap-container-db-adapter.c        |  28 ++--
 plugins/daap/rb-dmap-container-db-adapter.h        |   1 +
 plugins/daap/rb-rhythmdb-dmap-db-adapter.c         |  32 ++--
 .../daap/rb-rhythmdb-query-model-dmap-db-adapter.c |  32 ++--
 25 files changed, 661 insertions(+), 216 deletions(-)
---
diff --git a/meson.build b/meson.build
index 7279198d1..ccb9da28e 100644
--- a/meson.build
+++ b/meson.build
@@ -232,11 +232,17 @@ endif
 
 have_libdmapsharing = false
 if get_option('daap').allowed()
-  libdmapsharing = dependency('libdmapsharing-3.0', version: '>= 2.9.19', required: get_option('daap'))
+  libdmapsharing4 = dependency('libdmapsharing-4.0', version: '>= 3.9.4', required: false)
 
-  if libdmapsharing.found()
-    cdata.set('HAVE_LIBDMAPSHARING', 1)
+  if libdmapsharing4.found()
+    cdata.set('HAVE_LIBDMAPSHARING4', 1)
     have_libdmapsharing = true
+  else
+    libdmapsharing = dependency('libdmapsharing-3.0', version: '>= 2.9.19', required: get_option('daap'))
+    if libdmapsharing.found()
+      cdata.set('HAVE_LIBDMAPSHARING', 1)
+      have_libdmapsharing = true
+    endif
   endif
 endif
 
diff --git a/plugins/daap/meson.build b/plugins/daap/meson.build
index f9e28f2fa..d433b4bb6 100644
--- a/plugins/daap/meson.build
+++ b/plugins/daap/meson.build
@@ -21,7 +21,15 @@ daap_sources = [
   'rb-rhythmdb-query-model-dmap-db-adapter.c',
 ]
 
-daap_dependencies = [rhythmbox_core_dep, libdmapsharing, pango]
+daap_dependencies = [rhythmbox_core_dep, pango]
+args = ['-DHAVE_CONFIG_H']
+
+if libdmapsharing4.found()
+  daap_dependencies += libdmapsharing4
+else
+  args += '-DLIBDMAPSHARING_COMPAT'
+  daap_dependencies += libdmapsharing
+endif
 
 if use_libsecret
   daap_dependencies += libsecret
@@ -29,7 +37,7 @@ endif
 
 shared_module('daap',
   daap_sources,
-  c_args: ['-DHAVE_CONFIG_H'],
+  c_args: args,
   dependencies: daap_dependencies,
   install: true,
   install_dir: daap_plugin_dir)
diff --git a/plugins/daap/rb-daap-compat.h b/plugins/daap/rb-daap-compat.h
new file mode 100644
index 000000000..d5e38c342
--- /dev/null
+++ b/plugins/daap/rb-daap-compat.h
@@ -0,0 +1,96 @@
+/*
+ *  Compatibility layer between libdmapsharing 3.0 and 4.0 APIs
+ *
+ *  Copyright (C) 2020 W. Michael Petullo <mike flyn org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The Rhythmbox authors hereby grant permission for non-GPL compatible
+ *  GStreamer plugins to be used and distributed together with GStreamer
+ *  and Rhythmbox. This permission is above and beyond the permissions granted
+ *  by the GPL license by which Rhythmbox is covered. If you modify this code
+ *  you may extend this exception to your version of the code, but you are not
+ *  obligated to do so. If you do not wish to do so, delete this exception
+ *  statement from your version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU 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.
+ *
+ */
+
+#ifndef __RB_DAAP_COMPAT
+#define __RB_DAAP_COMPAT
+
+#include "rb-dmap-compat.h"
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+/* Building against libdmapsharing 3 API. */
+
+#define dmap_av_connection_new daap_connection_new
+#define DmapAvRecord DAAPRecord
+#define DMAP_AV_RECORD DAAP_RECORD
+#define DmapAvRecordInterface DAAPRecordIface
+#define DmapAvShare DAAPShare
+#define dmap_av_share_new daap_share_new
+#define DMAP_TYPE_AV_RECORD DAAP_TYPE_RECORD
+
+DmapRecord *rb_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
+
+void rb_daap_container_record_add_entry(DmapContainerRecord *container_record,
+                                        DmapRecord *record,
+                                        gint id,
+                                        GError **error);
+
+static inline DmapRecord *
+rb_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data)
+{
+       return rb_daap_record_factory_create (factory, user_data, NULL);
+}
+
+static inline void
+rb_daap_container_record_add_entry_compat(DmapContainerRecord *container_record,
+                                          DmapRecord *record,
+                                          gint id)
+{
+       rb_daap_container_record_add_entry(container_record, record, id, NULL);
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+void rb_daap_container_record_add_entry(DmapContainerRecord *container_record,
+                                        DmapRecord *record,
+                                        gint id,
+                                        GError **error);
+
+DmapRecord *rb_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
+
+static inline DmapRecord *
+rb_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error)
+{
+       return rb_daap_record_factory_create (factory, user_data, error);
+}
+
+static inline void
+rb_daap_container_record_add_entry_compat(DmapContainerRecord *container_record,
+                                          DmapRecord *record,
+                                          gint id,
+                                          GError **error)
+{
+       rb_daap_container_record_add_entry(container_record, record, id, error);
+}
+
+#endif
+
+#endif /* __RB_DAAP_COMPAT */
diff --git a/plugins/daap/rb-daap-container-record.c b/plugins/daap/rb-daap-container-record.c
index fe972ded0..e9088565d 100644
--- a/plugins/daap/rb-daap-container-record.c
+++ b/plugins/daap/rb-daap-container-record.c
@@ -89,20 +89,20 @@ rb_daap_container_record_get_property (GObject *object,
 }
 
 guint
-rb_daap_container_record_get_id (DMAPContainerRecord *record)
+rb_daap_container_record_get_id (DmapContainerRecord *record)
 {
        return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (RB_DAAP_CONTAINER_RECORD 
(record)->priv->source), "daap_id"));
 }
 
 void
-rb_daap_container_record_add_entry (DMAPContainerRecord *container_record,
-                                       DMAPRecord *record, gint id)
+rb_daap_container_record_add_entry (DmapContainerRecord *container_record,
+                                    DmapRecord *record, gint id, GError **error)
 {
        g_error ("Unimplemented");
 }
 
 guint64
-rb_daap_container_record_get_entry_count (DMAPContainerRecord *record)
+rb_daap_container_record_get_entry_count (DmapContainerRecord *record)
 {
        RhythmDBQueryModel *model;
        guint64 count;
@@ -115,8 +115,8 @@ rb_daap_container_record_get_entry_count (DMAPContainerRecord *record)
        return count;
 }
 
-DMAPDb *
-rb_daap_container_record_get_entries (DMAPContainerRecord *record)
+DmapDb *
+rb_daap_container_record_get_entries (DmapContainerRecord *record)
 {
        RhythmDBQueryModel *model;
        g_object_get (RB_DAAP_CONTAINER_RECORD (record)->priv->source,
@@ -154,12 +154,12 @@ rb_daap_container_record_class_finalize (RBDAAPContainerRecordClass *klass)
 static void
 rb_daap_container_record_daap_iface_init (gpointer iface, gpointer data)
 {
-       DMAPContainerRecordIface *dmap_container_record = iface;
+       DmapContainerRecordInterface *dmap_container_record = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (dmap_container_record) == DMAP_TYPE_CONTAINER_RECORD);
 
        dmap_container_record->get_id = rb_daap_container_record_get_id;
-       dmap_container_record->add_entry = rb_daap_container_record_add_entry;
+       dmap_container_record->add_entry = rb_daap_container_record_add_entry_compat;
        dmap_container_record->get_entry_count = rb_daap_container_record_get_entry_count;
        dmap_container_record->get_entries = rb_daap_container_record_get_entries;
 }
diff --git a/plugins/daap/rb-daap-container-record.h b/plugins/daap/rb-daap-container-record.h
index fc068b321..4ce53830f 100644
--- a/plugins/daap/rb-daap-container-record.h
+++ b/plugins/daap/rb-daap-container-record.h
@@ -32,6 +32,7 @@
 
 #include <libdmapsharing/dmap.h>
 
+#include "rb-daap-compat.h"
 #include "rb-playlist-source.h"
 
 G_BEGIN_DECLS
@@ -57,15 +58,16 @@ typedef struct {
 
 GType rb_daap_container_record_get_type (void);
 
-guint         rb_daap_container_record_get_id          (DMAPContainerRecord *record);
+guint         rb_daap_container_record_get_id          (DmapContainerRecord *record);
 
-void         rb_daap_container_record_add_entry       (DMAPContainerRecord *container_record,
-                                                       DMAPRecord *record,
-                                                       gint id);
+void         rb_daap_container_record_add_entry       (DmapContainerRecord *container_record,
+                                                       DmapRecord *record,
+                                                       gint id,
+                                                       GError **error);
 
-guint64       rb_daap_container_record_get_entry_count (DMAPContainerRecord *record);
+guint64       rb_daap_container_record_get_entry_count (DmapContainerRecord *record);
 
-DMAPDb *rb_daap_container_record_get_entries     (DMAPContainerRecord *record);
+DmapDb *rb_daap_container_record_get_entries     (DmapContainerRecord *record);
 
 RBDAAPContainerRecord *rb_daap_container_record_new (char *name,
                                                     RBPlaylistSource *model);
diff --git a/plugins/daap/rb-daap-plugin.c b/plugins/daap/rb-daap-plugin.c
index d0ac4e622..f0570b100 100644
--- a/plugins/daap/rb-daap-plugin.c
+++ b/plugins/daap/rb-daap-plugin.c
@@ -94,9 +94,9 @@ struct _RBDaapPlugin
 
        GSimpleAction *new_share_action;
 
-       DMAPMdnsBrowser *mdns_browser;
+       DmapMdnsBrowser *mdns_browser;
 
-       DACPShare *dacp_share;
+       DmapControlShare *dacp_share;
 
        GHashTable *source_lookup;
 
@@ -206,7 +206,8 @@ impl_activate (PeasActivatable *bplugin)
 
        plugin->dacp_share = rb_daap_create_dacp_share (G_OBJECT (plugin));
        if (g_settings_get_boolean (plugin->dacp_settings, "enable-remote")) {
-               dacp_share_start_lookup (plugin->dacp_share);
+               GError *error = NULL;
+               dmap_control_share_start_lookup_compat (plugin->dacp_share, &error);
        }
 
        register_daap_dbus_iface (plugin);
@@ -270,48 +271,65 @@ find_source_by_service_name (RBDaapPlugin *plugin,
 }
 
 static void
-mdns_service_added (DMAPMdnsBrowser *browser,
-                   DMAPMdnsBrowserService *service,
+mdns_service_added (DmapMdnsBrowser *browser,
+                   DmapMdnsService *service,
                    RBDaapPlugin *plugin)
 {
        RBSource *source;
        g_autoptr(RBShell) shell = NULL;
+       gchar *service_name = NULL;
+       gchar *name         = NULL;
+       gchar *host         = NULL;
+       guint port;
+       gboolean password_protected;
+
+       rb_dmap_mdns_service_get_compat(service,
+                                       &service_name,
+                                       &name,
+                                       &host,
+                                       &port,
+                                       &password_protected);
+
 
        rb_debug ("New service: %s name=%s host=%s port=%u password=%d",
-                  service->service_name,
-                  service->name,
-                  service->host,
-                  service->port,
-                  service->password_protected);
+                  service_name,
+                  name,
+                  host,
+                  port,
+                  password_protected);
 
-       source = find_source_by_service_name (plugin, service->service_name);
+       source = find_source_by_service_name (plugin, service_name);
 
        if (source == NULL) {
                g_object_get (plugin, "object", &shell, NULL);
 
                source = rb_daap_source_new (shell,
                                             G_OBJECT (plugin),
-                                            service->service_name,
-                                            service->name,
-                                            service->host,
-                                            service->port,
-                                            service->password_protected);
-               g_hash_table_insert (plugin->source_lookup, g_strdup (service->service_name), source);
+                                            service_name,
+                                            name,
+                                            host,
+                                            port,
+                                            password_protected);
+               g_hash_table_insert (plugin->source_lookup, g_strdup (service_name), source);
                rb_shell_append_display_page (shell,
                                              RB_DISPLAY_PAGE (source),
                                              RB_DISPLAY_PAGE_GROUP_SHARED);
        } else {
                g_object_set (source,
-                             "name", service->name,
-                             "host", service->host,
-                             "port", service->port,
-                             "password-protected", service->password_protected,
+                             "name", name,
+                             "host", host,
+                             "port", port,
+                             "password-protected", password_protected,
                              NULL);
        }
+
+       g_free (service_name);
+       g_free (name);
+       g_free (host);
 }
 
 static void
-mdns_service_removed (DMAPMdnsBrowser *browser,
+mdns_service_removed (DmapMdnsBrowser *browser,
                      const char        *service_name,
                      RBDaapPlugin      *plugin)
 {
@@ -347,7 +365,7 @@ start_browsing (RBDaapPlugin *plugin)
                return;
        }
 
-       plugin->mdns_browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP);
+       plugin->mdns_browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DAAP);
        if (plugin->mdns_browser == NULL) {
                g_warning ("Unable to start mDNS browsing");
                return;
@@ -406,10 +424,11 @@ static void
 dacp_settings_changed_cb (GSettings *settings, const char *key, RBDaapPlugin *plugin)
 {
        if (g_strcmp0 (key, "enable-remote") == 0) {
+               GError *error = NULL;
                if (g_settings_get_boolean (settings, key)) {
-                       dacp_share_start_lookup (plugin->dacp_share);
+                       dmap_control_share_start_lookup_compat (plugin->dacp_share, &error);
                } else {
-                       dacp_share_stop_lookup (plugin->dacp_share);
+                       dmap_control_share_stop_lookup_compat (plugin->dacp_share, &error);
                }
        }
 }
@@ -447,7 +466,7 @@ new_daap_share_location_added_cb (RBURIDialog *dialog,
        char *host;
        char *p;
        int port = 3689;
-       DMAPMdnsBrowserService service;
+       DmapMdnsService *service;
 
        host = g_strdup (location);
        p = strrchr (host, ':');
@@ -457,17 +476,18 @@ new_daap_share_location_added_cb (RBURIDialog *dialog,
        }
 
        rb_debug ("adding manually specified DAAP share at %s", location);
-       service.name = (char *) location;
-       service.host = (char *) host;
-       service.service_name = service.name;
-       service.port = port;
-       service.password_protected = FALSE;
+       service = rb_dmap_mdns_service_new_compat(location,
+                                                 location,
+                                                 host,
+                                                 port,
+                                                 FALSE);
+
        mdns_service_added (NULL,
-                           &service,
+                           service,
                            plugin);
 
        g_free (host);
-
+       rb_dmap_mdns_service_free_compat(service);
 }
 
 static void
@@ -743,16 +763,27 @@ daap_dbus_method_call (GDBusConnection *connection,
        }
 
        if (g_strcmp0 (method_name, "AddDAAPSource") == 0) {
-               DMAPMdnsBrowserService service = {0,};
-               g_variant_get (parameters, "(&s&su)", &service.name, &service.host, &service.port);
-               service.password_protected = FALSE;
-               service.service_name = service.name;
+               DmapMdnsService *service;
+               gchar *name = NULL;
+               gchar *host = NULL;
+               guint port;
+
+               g_variant_get (parameters, "(&s&su)", &name, &host, &port);
+
+               service = rb_dmap_mdns_service_new_compat(name,
+                                                         name,
+                                                         host,
+                                                         port,
+                                                         FALSE);
 
-               rb_debug ("adding DAAP source %s (%s:%d)", service.name, service.host, service.port);
-               mdns_service_added (NULL, &service, plugin);
+               rb_debug ("adding DAAP source %s (%s:%d)", name, host, port);
+               mdns_service_added (NULL, service, plugin);
 
                g_dbus_method_invocation_return_value (invocation, NULL);
 
+               g_free(name);
+               g_free(host);
+               rb_dmap_mdns_service_free_compat(service);
        } else if (g_strcmp0 (method_name, "RemoveDAAPSource") == 0) {
                const char *service_name;
 
diff --git a/plugins/daap/rb-daap-plugin.h b/plugins/daap/rb-daap-plugin.h
index 7a06064b5..5119a890a 100644
--- a/plugins/daap/rb-daap-plugin.h
+++ b/plugins/daap/rb-daap-plugin.h
@@ -29,7 +29,9 @@
 #define __RB_DAAP_PLUGIN_H
 
 #include <libpeas/peas.h>
+#include <libdmapsharing/dmap.h>
 
+#include "rb-daap-compat.h"
 #include "rb-daap-source.h"
 
 G_BEGIN_DECLS
diff --git a/plugins/daap/rb-daap-record-factory.c b/plugins/daap/rb-daap-record-factory.c
index 35d920ead..cae9f52a6 100644
--- a/plugins/daap/rb-daap-record-factory.c
+++ b/plugins/daap/rb-daap-record-factory.c
@@ -31,13 +31,14 @@
 #include "rb-daap-record-factory.h"
 #include "rb-daap-record.h"
 
-DMAPRecord *
-rb_daap_record_factory_create  (DMAPRecordFactory *factory,
-                               gpointer user_data)
+DmapRecord *
+rb_daap_record_factory_create  (DmapRecordFactory *factory,
+                                gpointer user_data,
+                                GError **error)
 {
-       DAAPRecord *record;
+       DmapAvRecord *record;
 
-       record = DAAP_RECORD (rb_daap_record_new ((RhythmDBEntry *) user_data));
+       record = DMAP_AV_RECORD (rb_daap_record_new ((RhythmDBEntry *) user_data));
 
        return (DMAP_RECORD (record));
 }
@@ -60,11 +61,11 @@ rb_daap_record_factory_class_finalize (RBDAAPRecordFactoryClass *klass)
 static void
 rb_daap_record_factory_interface_init (gpointer iface, gpointer data)
 {
-       DMAPRecordFactoryIface *factory = iface;
+       DmapRecordFactoryInterface *factory = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
 
-       factory->create = rb_daap_record_factory_create;
+       factory->create = rb_daap_record_factory_create_compat;
 }
 
 G_DEFINE_DYNAMIC_TYPE_EXTENDED (RBDAAPRecordFactory,
diff --git a/plugins/daap/rb-daap-record-factory.h b/plugins/daap/rb-daap-record-factory.h
index f0b6bf018..5cf07c17e 100644
--- a/plugins/daap/rb-daap-record-factory.h
+++ b/plugins/daap/rb-daap-record-factory.h
@@ -32,6 +32,8 @@
 
 #include <libdmapsharing/dmap.h>
 
+#include "rb-daap-compat.h"
+
 G_BEGIN_DECLS
 
 #define RB_TYPE_DAAP_RECORD_FACTORY         (rb_daap_record_factory_get_type ())
@@ -60,7 +62,7 @@ GType                  rb_daap_record_factory_get_type (void);
 
 RBDAAPRecordFactory *rb_daap_record_factory_new      (void);
 
-DMAPRecord            *rb_daap_record_factory_create   (DMAPRecordFactory *factory, gpointer user_data);
+DmapRecord            *rb_daap_record_factory_create   (DmapRecordFactory *factory, gpointer user_data, 
GError **error);
 
 void                   _rb_daap_record_factory_register_type (GTypeModule *module);
 
diff --git a/plugins/daap/rb-daap-record.c b/plugins/daap/rb-daap-record.c
index 400ad97a5..9fcbe7669 100644
--- a/plugins/daap/rb-daap-record.c
+++ b/plugins/daap/rb-daap-record.c
@@ -254,7 +254,7 @@ rb_daap_record_get_property (GObject *object,
 }
 
 gboolean
-rb_daap_record_itunes_compat (DAAPRecord *record)
+rb_daap_record_itunes_compat (DmapAvRecord *record)
 {
        const gchar *format = RB_DAAP_RECORD (record)->priv->real_format;
 
@@ -265,7 +265,7 @@ rb_daap_record_itunes_compat (DAAPRecord *record)
 }
 
 GInputStream *
-rb_daap_record_read (DAAPRecord *record, GError **error)
+rb_daap_record_read (DmapAvRecord *record, GError **error)
 {
        GFile *file;
        GInputStream *fnval = NULL;
@@ -353,9 +353,9 @@ rb_daap_record_class_finalize (RBDAAPRecordClass *klass)
 static void
 rb_daap_record_daap_iface_init (gpointer iface, gpointer data)
 {
-       DAAPRecordIface *daap_record = iface;
+       DmapAvRecordInterface *daap_record = iface;
 
-       g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DAAP_TYPE_RECORD);
+       g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DMAP_TYPE_AV_RECORD);
 
        daap_record->itunes_compat = rb_daap_record_itunes_compat;
        daap_record->read = rb_daap_record_read;
@@ -364,7 +364,7 @@ rb_daap_record_daap_iface_init (gpointer iface, gpointer data)
 static void
 rb_daap_record_dmap_iface_init (gpointer iface, gpointer data)
 {
-       DMAPRecordIface *dmap_record = iface;
+       DmapRecordInterface *dmap_record = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD);
 }
@@ -373,7 +373,7 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (RBDAAPRecord,
                                rb_daap_record,
                                G_TYPE_OBJECT,
                                0,
-                               G_IMPLEMENT_INTERFACE_DYNAMIC (DAAP_TYPE_RECORD, 
rb_daap_record_daap_iface_init)
+                               G_IMPLEMENT_INTERFACE_DYNAMIC (DMAP_TYPE_AV_RECORD, 
rb_daap_record_daap_iface_init)
                                G_IMPLEMENT_INTERFACE_DYNAMIC (DMAP_TYPE_RECORD, 
rb_daap_record_dmap_iface_init))
 
 static void
diff --git a/plugins/daap/rb-daap-record.h b/plugins/daap/rb-daap-record.h
index 1f128a399..597f81425 100644
--- a/plugins/daap/rb-daap-record.h
+++ b/plugins/daap/rb-daap-record.h
@@ -32,6 +32,8 @@
 
 #include <libdmapsharing/dmap.h>
 
+#include "rb-daap-compat.h"
+
 G_BEGIN_DECLS
 
 #define RB_TYPE_DAAP_RECORD         (rb_daap_record_get_type ())
@@ -57,15 +59,15 @@ GType rb_daap_record_get_type (void);
 
 RBDAAPRecord *rb_daap_record_new (RhythmDBEntry *entry);
 
-gint          rb_daap_record_get_id          (DAAPRecord *record);
+gint          rb_daap_record_get_id          (DmapAvRecord *record);
 
-gboolean      rb_daap_record_itunes_compat   (DAAPRecord *record);
+gboolean      rb_daap_record_itunes_compat   (DmapAvRecord *record);
 
-void          rb_daap_record_set_transcode_format (DAAPRecord *record,
-                                                     const gint format);
+void          rb_daap_record_set_transcode_format (DmapAvRecord *record,
+                                                   const gint format);
 
-GInputStream *rb_daap_record_read            (DAAPRecord *record,
-                                                GError **err);
+GInputStream *rb_daap_record_read            (DmapAvRecord *record,
+                                              GError **err);
 
 void          _rb_daap_record_register_type  (GTypeModule *module);
 
diff --git a/plugins/daap/rb-daap-sharing.c b/plugins/daap/rb-daap-sharing.c
index 63e5dbc7e..80196661f 100644
--- a/plugins/daap/rb-daap-sharing.c
+++ b/plugins/daap/rb-daap-sharing.c
@@ -45,7 +45,7 @@
 
 #include <libdmapsharing/dmap.h>
 
-static DAAPShare *share = NULL;
+static DmapAvShare *share = NULL;
 static GSettings *settings = NULL;
 
 char *
@@ -79,8 +79,8 @@ static void
 create_share (RBShell *shell)
 {
        RhythmDB *rdb;
-       DMAPDb *db;
-       DMAPContainerDb *container_db;
+       DmapDb *db;
+       DmapContainerDb *container_db;
        RBPlaylistManager *playlist_manager;
        char *name;
        char *password;
@@ -108,7 +108,7 @@ create_share (RBShell *shell)
                password = NULL;
        }
 
-       share = daap_share_new (name, password, db, container_db, NULL);
+       share = dmap_av_share_new (name, password, db, container_db, NULL);
 
        g_settings_bind_with_mapping (settings, "share-name",
                                      share, "name",
diff --git a/plugins/daap/rb-daap-sharing.h b/plugins/daap/rb-daap-sharing.h
index f5765152e..774bac39b 100644
--- a/plugins/daap/rb-daap-sharing.h
+++ b/plugins/daap/rb-daap-sharing.h
@@ -30,6 +30,9 @@
 #ifndef __DAAP_SHARING_H
 #define __DAAP_SHARING_H
 
+#include <libdmapsharing/dmap.h>
+
+#include "rb-daap-compat.h"
 #include "rb-shell.h"
 
 G_BEGIN_DECLS
diff --git a/plugins/daap/rb-daap-source.c b/plugins/daap/rb-daap-source.c
index ef30cd8fa..a43bf8513 100644
--- a/plugins/daap/rb-daap-source.c
+++ b/plugins/daap/rb-daap-source.c
@@ -377,7 +377,7 @@ rb_daap_source_new (RBShell *shell,
 
 typedef struct {
        RBDAAPSource *source;
-       DMAPConnection *connection;
+       DmapConnection *connection;
        SoupSession *session;
        SoupMessage *message;
        SoupAuth *auth;
@@ -479,7 +479,7 @@ ask_password (RBDAAPSource *source,
 }
 
 static void
-connection_auth_cb (DMAPConnection *connection,
+connection_auth_cb (DmapConnection *connection,
                     const char     *name,
                     SoupSession    *session,
                     SoupMessage    *msg,
@@ -517,8 +517,8 @@ connection_auth_cb (DMAPConnection *connection,
 }
 
 static void
-connection_connecting_cb (DMAPConnection       *connection,
-                         DMAPConnectionState   state,
+connection_connecting_cb (DmapConnection       *connection,
+                         DmapConnectionState   state,
                          float                 progress,
                          RBDAAPSource         *source)
 {
@@ -535,7 +535,7 @@ connection_connecting_cb (DMAPConnection       *connection,
        case DMAP_GET_REVISION_NUMBER:
                g_object_set (source, "load-status", RB_SOURCE_LOAD_STATUS_LOADING, NULL);
        case DMAP_GET_DB_INFO:
-       case DMAP_GET_SONGS:
+       case DMAP_GET_MEDIA:
        case DMAP_GET_PLAYLISTS:
        case DMAP_GET_PLAYLIST_ENTRIES:
                g_object_set (source->priv->connection_status,
@@ -566,7 +566,7 @@ connection_connecting_cb (DMAPConnection       *connection,
 }
 
 static void
-connection_disconnected_cb (DMAPConnection   *connection,
+connection_disconnected_cb (DmapConnection   *connection,
                            RBDAAPSource     *source)
 {
        GIcon *icon;
@@ -605,7 +605,7 @@ _add_location_to_playlist (const char *uri, RBStaticPlaylistSource *source)
 }
 
 static void
-rb_daap_source_connection_cb (DMAPConnection   *connection,
+rb_daap_source_connection_cb (DmapConnection   *connection,
                              gboolean          result,
                              const char       *reason,
                              RBSource         *source)
@@ -640,7 +640,7 @@ rb_daap_source_connection_cb (DMAPConnection   *connection,
                      NULL);
        playlists = dmap_connection_get_playlists (DMAP_CONNECTION (daap_source->priv->connection));
        for (l = playlists; l != NULL; l = g_slist_next (l)) {
-               DMAPPlaylist *playlist = l->data;
+               DmapPlaylist *playlist = l->data;
                RBSource *playlist_source;
 
                playlist_source = rb_static_playlist_source_new (shell, playlist->name, settings, FALSE, 
entry_type);
@@ -661,9 +661,9 @@ rb_daap_source_selected (RBDisplayPage *page)
 {
        RBDAAPSource *daap_source = RB_DAAP_SOURCE (page);
        RBShell *shell = NULL;
-       DMAPRecordFactory *factory;
+       DmapRecordFactory *factory;
        RhythmDB *rdb = NULL;
-       DMAPDb *db = NULL;
+       DmapDb *db = NULL;
        char *name = NULL;
        RhythmDBEntryType *entry_type;
        RBTaskList *tasklist;
@@ -695,11 +695,11 @@ rb_daap_source_selected (RBDisplayPage *page)
        rb_task_list_add_task (tasklist, RB_TASK_PROGRESS (daap_source->priv->connection_status));
        g_object_unref (tasklist);
 
-       daap_source->priv->connection = daap_connection_new (name,
-                                                            daap_source->priv->host,
-                                                            daap_source->priv->port,
-                                                            db,
-                                                            factory);
+       daap_source->priv->connection = dmap_av_connection_new (name,
+                                                               daap_source->priv->host,
+                                                               daap_source->priv->port,
+                                                               db,
+                                                               factory);
        g_object_unref (entry_type);
        g_object_add_weak_pointer (G_OBJECT (daap_source->priv->connection), (gpointer 
*)&daap_source->priv->connection);
 
@@ -718,16 +718,16 @@ rb_daap_source_selected (RBDisplayPage *page)
                           G_CALLBACK (connection_disconnected_cb),
                          page);
 
-       dmap_connection_connect (DMAP_CONNECTION (daap_source->priv->connection),
-                                (DMAPConnectionCallback) rb_daap_source_connection_cb,
-                                page);
+       dmap_connection_start (DMAP_CONNECTION (daap_source->priv->connection),
+                             (DmapConnectionFunc) rb_daap_source_connection_cb,
+                              page);
 
        g_object_unref (rdb);
        g_object_unref (shell);
 }
 
 static void
-rb_daap_source_disconnect_cb (DMAPConnection   *connection,
+rb_daap_source_disconnect_cb (DmapConnection   *connection,
                              gboolean          result,
                              const char       *reason,
                              RBSource         *source)
@@ -792,9 +792,9 @@ rb_daap_source_disconnect (RBDAAPSource *daap_source)
 
        /* keep the source alive until the disconnect completes */
        g_object_ref (daap_source);
-       dmap_connection_disconnect (daap_source->priv->connection,
-                                      (DMAPConnectionCallback) rb_daap_source_disconnect_cb,
-                                      daap_source);
+       dmap_connection_stop (daap_source->priv->connection,
+                            (DmapConnectionFunc) rb_daap_source_disconnect_cb,
+                             daap_source);
 
        /* wait until disconnected */
        rb_debug ("Waiting for DAAP connection to finish");
diff --git a/plugins/daap/rb-daap-source.h b/plugins/daap/rb-daap-source.h
index b3c22b755..6a06830c5 100644
--- a/plugins/daap/rb-daap-source.h
+++ b/plugins/daap/rb-daap-source.h
@@ -30,12 +30,14 @@
 #ifndef __RB_DAAP_SOURCE_H
 #define __RB_DAAP_SOURCE_H
 
-#include "rb-shell.h"
-#include "rb-browser-source.h"
-
 #include <gst/gst.h>
+#include <libdmapsharing/dmap.h>
 #include <libsoup/soup.h>
 
+#include "rb-daap-compat.h"
+#include "rb-shell.h"
+#include "rb-browser-source.h"
+
 G_BEGIN_DECLS
 
 #define RB_TYPE_DAAP_SOURCE         (rb_daap_source_get_type ())
diff --git a/plugins/daap/rb-dacp-compat.h b/plugins/daap/rb-dacp-compat.h
new file mode 100644
index 000000000..fd88dfea2
--- /dev/null
+++ b/plugins/daap/rb-dacp-compat.h
@@ -0,0 +1,99 @@
+/*
+ *  Compatibility layer between libdmapsharing 3.0 and 4.0 APIs
+ *
+ *  Copyright (C) 2020 W. Michael Petullo <mike flyn org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The Rhythmbox authors hereby grant permission for non-GPL compatible
+ *  GStreamer plugins to be used and distributed together with GStreamer
+ *  and Rhythmbox. This permission is above and beyond the permissions granted
+ *  by the GPL license by which Rhythmbox is covered. If you modify this code
+ *  you may extend this exception to your version of the code, but you are not
+ *  obligated to do so. If you do not wish to do so, delete this exception
+ *  statement from your version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU 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.
+ *
+ */
+
+#ifndef __RB_DACP_COMPAT
+#define __RB_DACP_COMPAT
+
+#include "rb-dmap-compat.h"
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+/* Building against libdmapsharing 3 API. */
+
+#define DmapControlPlayer DACPPlayer
+#define DMAP_CONTROL_PLAYER DACP_PLAYER
+#define DmapControlPlayerInterface DACPPlayerIface
+#define DMAP_CONTROL_PLAY_PAUSED DACP_PLAY_PAUSED
+#define DMAP_CONTROL_PLAY_PLAYING DACP_PLAY_PLAYING
+#define DMAP_CONTROL_PLAY_STOPPED DACP_PLAY_STOPPED
+#define DMAP_CONTROL_REPEAT_ALL DACP_REPEAT_ALL
+#define DMAP_CONTROL_REPEAT_NONE DACP_REPEAT_NONE
+#define DmapControlShare DACPShare
+#define dmap_control_share_new dacp_share_new
+#define dmap_control_share_pair dacp_share_pair
+#define dmap_control_share_player_updated dacp_share_player_updated
+#define DMAP_TYPE_CONTROL_PLAYER DACP_TYPE_PLAYER
+
+gchar *rb_dacp_player_now_playing_artwork (DmapControlPlayer *player, guint width, guint height);
+
+static inline void
+dmap_control_share_start_lookup_compat(DmapControlShare *share, GError **error)
+{
+       dacp_share_start_lookup(share);
+}
+
+static inline void
+dmap_control_share_stop_lookup_compat(DmapControlShare *share, GError **error)
+{
+       dacp_share_stop_lookup(share);
+}
+
+static inline guchar *
+rb_dacp_player_now_playing_artwork_compat(DmapControlPlayer *player, guint width, guint height)
+{
+       return (guchar *) rb_dacp_player_now_playing_artwork(player, width, height);
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+gchar *rb_dacp_player_now_playing_artwork (DmapControlPlayer *player, guint width, guint height);
+
+static inline void
+dmap_control_share_start_lookup_compat(DmapControlShare *share, GError **error)
+{
+       dmap_control_share_start_lookup(share, error);
+}
+
+static inline void
+dmap_control_share_stop_lookup_compat(DmapControlShare *share, GError **error)
+{
+       dmap_control_share_stop_lookup(share, error);
+}
+
+static inline gchar *
+rb_dacp_player_now_playing_artwork_compat(DmapControlPlayer *player, guint width, guint height)
+{
+       return rb_dacp_player_now_playing_artwork(player, width, height);
+}
+
+#endif
+
+#endif /* __RB_DACP_COMPAT */
diff --git a/plugins/daap/rb-dacp-pairing-page.c b/plugins/daap/rb-dacp-pairing-page.c
index 93a5f98af..bfb74d40e 100644
--- a/plugins/daap/rb-dacp-pairing-page.c
+++ b/plugins/daap/rb-dacp-pairing-page.c
@@ -51,14 +51,11 @@
 #include "rb-rhythmdb-dmap-db-adapter.h"
 #include "rb-dmap-container-db-adapter.h"
 
+#include "rb-dacp-pairing-page.h"
 #include "rb-daap-plugin.h"
 #include "rb-daap-sharing.h"
 #include "rb-dacp-player.h"
 
-#include <libdmapsharing/dmap.h>
-
-#include "rb-dacp-pairing-page.h"
-
 static void impl_constructed (GObject *object);
 static void impl_dispose (GObject *object);
 static void impl_set_property  (GObject *object,
@@ -73,16 +70,16 @@ static void impl_get_property  (GObject *object,
 static void rb_dacp_pairing_page_connecting (RBDACPPairingPage *page, gboolean connecting);
 static gboolean entry_insert_text_cb (GtkWidget *entry, gchar *text, gint len, gint *position, 
RBDACPPairingPage *page);
 static gboolean entry_backspace_cb (GtkWidget *entry, RBDACPPairingPage *page);
-static void remote_paired_cb (DACPShare *share, gchar *service_name, gboolean connected, RBDACPPairingPage 
*page);
+static void remote_paired_cb (DmapControlShare *share, gchar *service_name, gboolean connected, 
RBDACPPairingPage *page);
 
-static void dacp_remote_added (DACPShare *share, gchar *service_name, gchar *display_name, RBDaapPlugin 
*plugin);
-static void dacp_remote_removed (DACPShare *share, gchar *service_name, RBDaapPlugin *plugin);
+static void dacp_remote_added (DmapControlShare *share, gchar *service_name, gchar *display_name, 
RBDaapPlugin *plugin);
+static void dacp_remote_removed (DmapControlShare *share, gchar *service_name, RBDaapPlugin *plugin);
 
-/* DACPShare signals */
-static gboolean dacp_lookup_guid (DACPShare *share, gchar *guid, GSettings *settings);
-static void     dacp_add_guid    (DACPShare *share, gchar *guid, GSettings *settings);
+/* DmapControlShare signals */
+static gboolean dacp_lookup_guid (DmapControlShare *share, gchar *guid, GSettings *settings);
+static void     dacp_add_guid    (DmapControlShare *share, gchar *guid, GSettings *settings);
 
-static void dacp_player_updated (RBDACPPlayer *player, DACPShare *share);
+static void dacp_player_updated (RBDACPPlayer *player, DmapControlShare *share);
 
 struct RBDACPPairingPagePrivate
 {
@@ -90,7 +87,7 @@ struct RBDACPPairingPagePrivate
 
        gboolean done_pairing;
 
-       DACPShare *dacp_share;
+       DmapControlShare *dacp_share;
 
        GtkBuilder *builder;
        GtkWidget *entries[4];
@@ -138,10 +135,10 @@ entry_insert_text_cb (GtkWidget *entry, gchar *text, gint len, gint *position, R
                /* The last character is still not in the entry */
                passcode[3] = new_char;
                rb_dacp_pairing_page_connecting (page, TRUE);
-               /* Let DACPShare do the heavy-lifting */
-               dacp_share_pair (page->priv->dacp_share,
-                                page->priv->service_name,
-                                passcode);
+               /* Let DmapControlShare do the heavy-lifting */
+               dmap_control_share_pair (page->priv->dacp_share,
+                                        page->priv->service_name,
+                                        passcode);
        }
        /* let the default handler display the number */
        return FALSE;
@@ -329,7 +326,7 @@ impl_get_property (GObject *object,
 RBDACPPairingPage *
 rb_dacp_pairing_page_new (GObject *plugin,
                          RBShell *shell,
-                         DACPShare *dacp_share,
+                         DmapControlShare *dacp_share,
                          const char *display_name,
                          const char *service_name)
 {
@@ -400,7 +397,7 @@ rb_dacp_pairing_page_connecting (RBDACPPairingPage *page, gboolean connecting) {
 }
 
 static void
-remote_paired_cb (DACPShare *share, gchar *service_name, gboolean connected, RBDACPPairingPage *page)
+remote_paired_cb (DmapControlShare *share, gchar *service_name, gboolean connected, RBDACPPairingPage *page)
 {
        /* Check if this remote is the remote paired */
        if (g_strcmp0 (service_name, page->priv->service_name) != 0)
@@ -417,14 +414,14 @@ remote_paired_cb (DACPShare *share, gchar *service_name, gboolean connected, RBD
        }
 }
 
-DACPShare *
+DmapControlShare *
 rb_daap_create_dacp_share (GObject *plugin)
 {
-       DACPShare *share;
-       DACPPlayer *player;
+       DmapControlShare *share;
+       DmapControlPlayer *player;
        RhythmDB *rdb;
-       DMAPDb *db;
-       DMAPContainerDb *container_db;
+       DmapDb *db;
+       DmapContainerDb *container_db;
        RBPlaylistManager *playlist_manager;
        RBShell *shell;
        GSettings *share_settings;
@@ -441,7 +438,7 @@ rb_daap_create_dacp_share (GObject *plugin)
        db = DMAP_DB (rb_rhythmdb_dmap_db_adapter_new (rdb, RHYTHMDB_ENTRY_TYPE_SONG));
        container_db = DMAP_CONTAINER_DB (rb_dmap_container_db_adapter_new (playlist_manager));
 
-       player = DACP_PLAYER (rb_dacp_player_new (shell));
+       player = DMAP_CONTROL_PLAYER (rb_dacp_player_new (shell));
 
        share_settings = g_settings_new ("org.gnome.rhythmbox.sharing");
        name = g_settings_get_string (share_settings, "share-name");
@@ -451,7 +448,7 @@ rb_daap_create_dacp_share (GObject *plugin)
        }
        g_object_unref (share_settings);
 
-       share = dacp_share_new (name, player, db, container_db);
+       share = dmap_control_share_new (name, player, db, container_db);
 
        daap_settings = g_settings_new ("org.gnome.rhythmbox.plugins.daap");
        settings = g_settings_get_child (daap_settings, "dacp");
@@ -497,13 +494,13 @@ rb_daap_create_dacp_share (GObject *plugin)
 
 static void
 dacp_player_updated (RBDACPPlayer *player,
-                     DACPShare *share)
+                     DmapControlShare *share)
 {
-       dacp_share_player_updated (share);
+       dmap_control_share_player_updated (share);
 }
 
 static void
-dacp_add_guid (DACPShare *share,
+dacp_add_guid (DmapControlShare *share,
                gchar *guid,
               GSettings *settings)
 {
@@ -528,7 +525,7 @@ dacp_add_guid (DACPShare *share,
 }
 
 static gboolean
-dacp_lookup_guid (DACPShare *share,
+dacp_lookup_guid (DmapControlShare *share,
                   gchar *guid,
                  GSettings *settings)
 {
@@ -589,10 +586,10 @@ find_dacp_page (RBShell *shell, const gchar *service_name)
 }
 
 static void
-dacp_remote_added (DACPShare    *share,
-                   gchar        *service_name,
-                   gchar        *display_name,
-                   RBDaapPlugin *plugin)
+dacp_remote_added (DmapControlShare *share,
+                   gchar            *service_name,
+                   gchar            *display_name,
+                   RBDaapPlugin     *plugin)
 {
        RBDACPPairingPage *page;
        RBShell *shell;
@@ -625,9 +622,9 @@ dacp_remote_added (DACPShare    *share,
 }
 
 static void
-dacp_remote_removed (DACPShare       *share,
-                     gchar           *service_name,
-                     RBDaapPlugin    *plugin)
+dacp_remote_removed (DmapControlShare *share,
+                     gchar            *service_name,
+                     RBDaapPlugin     *plugin)
 {
        RBDACPPairingPage *page;
        RBShell *shell;
diff --git a/plugins/daap/rb-dacp-pairing-page.h b/plugins/daap/rb-dacp-pairing-page.h
index fc8e06d38..2b66df1b3 100644
--- a/plugins/daap/rb-dacp-pairing-page.h
+++ b/plugins/daap/rb-dacp-pairing-page.h
@@ -30,11 +30,12 @@
 #ifndef __RB_DACP_PAIRING_PAGE_H
 #define __RB_DACP_PAIRING_PAGE_H
 
+#include <libdmapsharing/dmap.h>
+
+#include "rb-dacp-compat.h"
 #include "rb-shell.h"
 #include "rb-display-page.h"
 
-#include <libdmapsharing/dmap.h>
-
 G_BEGIN_DECLS
 
 #define RB_TYPE_DACP_PAIRING_PAGE         (rb_dacp_pairing_page_get_type ())
@@ -60,14 +61,14 @@ GType               rb_dacp_pairing_page_get_type   (void);
 
 RBDACPPairingPage *rb_dacp_pairing_page_new    (GObject *plugin,
                                                 RBShell *shell,
-                                                DACPShare *dacp_share,
+                                                DmapControlShare *dacp_share,
                                                 const char *display_name,
                                                 const char *service_name);
 
 void           rb_dacp_pairing_page_remote_found (RBDACPPairingPage *page);
 void           rb_dacp_pairing_page_remote_lost (RBDACPPairingPage *page);
 
-DACPShare     *rb_daap_create_dacp_share       (GObject *plugin);
+DmapControlShare *rb_daap_create_dacp_share       (GObject *plugin);
 
 void           _rb_dacp_pairing_page_register_type (GTypeModule *module);
 
diff --git a/plugins/daap/rb-dacp-player.c b/plugins/daap/rb-dacp-player.c
index dce8a2254..9371fa123 100644
--- a/plugins/daap/rb-dacp-player.c
+++ b/plugins/daap/rb-dacp-player.c
@@ -38,14 +38,11 @@
 #include "rhythmdb.h"
 #include "rb-shell.h"
 #include "rb-shell-player.h"
+#include "rb-dacp-player.h"
 #include "rb-daap-record.h"
 #include "rb-playlist-manager.h"
 #include "rb-play-queue-source.h"
 
-#include <libdmapsharing/dmap.h>
-
-#include "rb-dacp-player.h"
-
 struct _RBDACPPlayerPrivate {
        RBShell *shell;
        RBShellPlayer *shell_player;
@@ -60,15 +57,15 @@ static void rb_dacp_player_set_property (GObject *object, guint prop_id,
 static void playing_song_changed (RBShellPlayer *shell_player, RhythmDBEntry *entry, RBDACPPlayer *player);
 static void elapsed_changed (RBShellPlayer *shell_player, guint elapsed, RBDACPPlayer *player);
 
-static DAAPRecord *rb_dacp_player_now_playing_record  (DACPPlayer *player);
-static guchar *rb_dacp_player_now_playing_artwork (DACPPlayer *player, guint width, guint height);
-static void rb_dacp_player_play_pause          (DACPPlayer *player);
-static void rb_dacp_player_pause               (DACPPlayer *player);
-static void rb_dacp_player_next_item           (DACPPlayer *player);
-static void rb_dacp_player_prev_item           (DACPPlayer *player);
+static DmapAvRecord *rb_dacp_player_now_playing_record  (DmapControlPlayer *player);
+gchar *rb_dacp_player_now_playing_artwork (DmapControlPlayer *player, guint width, guint height);
+static void rb_dacp_player_play_pause          (DmapControlPlayer *player);
+static void rb_dacp_player_pause               (DmapControlPlayer *player);
+static void rb_dacp_player_next_item           (DmapControlPlayer *player);
+static void rb_dacp_player_prev_item           (DmapControlPlayer *player);
 
-static void rb_dacp_player_cue_clear           (DACPPlayer *player);
-static void rb_dacp_player_cue_play            (DACPPlayer *player, GList *records, guint index);
+static void rb_dacp_player_cue_clear           (DmapControlPlayer *player);
+static void rb_dacp_player_cue_play            (DmapControlPlayer *player, GList *records, guint index);
 
 enum {
        PROP_0,
@@ -89,12 +86,12 @@ static guint signals[LAST_SIGNAL] = { 0 };
 static void
 rb_dacp_player_iface_init (gpointer iface, gpointer data)
 {
-       DACPPlayerIface *dacp_player = iface;
+       DmapControlPlayerInterface *dacp_player = iface;
 
-       g_assert (G_TYPE_FROM_INTERFACE (dacp_player) == DACP_TYPE_PLAYER);
+       g_assert (G_TYPE_FROM_INTERFACE (dacp_player) == DMAP_TYPE_CONTROL_PLAYER);
 
        dacp_player->now_playing_record  = rb_dacp_player_now_playing_record;
-       dacp_player->now_playing_artwork = rb_dacp_player_now_playing_artwork;
+       dacp_player->now_playing_artwork = rb_dacp_player_now_playing_artwork_compat;
        dacp_player->play_pause          = rb_dacp_player_play_pause;
        dacp_player->pause               = rb_dacp_player_pause;
        dacp_player->next_item           = rb_dacp_player_next_item;
@@ -108,7 +105,7 @@ G_DEFINE_DYNAMIC_TYPE_EXTENDED (RBDACPPlayer,
                                rb_dacp_player,
                                G_TYPE_OBJECT,
                                0,
-                               G_IMPLEMENT_INTERFACE_DYNAMIC (DACP_TYPE_PLAYER,
+                               G_IMPLEMENT_INTERFACE_DYNAMIC (DMAP_TYPE_CONTROL_PLAYER,
                                                               rb_dacp_player_iface_init))
 
 static void
@@ -190,16 +187,16 @@ rb_dacp_player_get_property (GObject *object,
                        break;
                case PROP_REPEAT_STATE:
                        rb_shell_player_get_playback_state (player->priv->shell_player, &shuffle, &repeat);
-                       g_value_set_enum (value, repeat ? DACP_REPEAT_ALL : DACP_REPEAT_NONE);
+                       g_value_set_enum (value, repeat ? DMAP_CONTROL_REPEAT_ALL : DMAP_CONTROL_REPEAT_NONE);
                        break;
                case PROP_PLAY_STATE:
                        entry = rb_shell_player_get_playing_entry (player->priv->shell_player);
                        if (entry) {
                                g_object_get (player->priv->shell_player, "playing", &playing, NULL);
-                               g_value_set_enum (value, playing ? DACP_PLAY_PLAYING : DACP_PLAY_PAUSED);
+                               g_value_set_enum (value, playing ? DMAP_CONTROL_PLAY_PLAYING : 
DMAP_CONTROL_PLAY_PAUSED);
                                rhythmdb_entry_unref (entry);
                        } else {
-                               g_value_set_enum (value, DACP_PLAY_STOPPED);
+                               g_value_set_enum (value, DMAP_CONTROL_PLAY_STOPPED);
                        }
                        break;
                case PROP_VOLUME:
@@ -236,7 +233,7 @@ rb_dacp_player_set_property (GObject *object,
                        break;
                case PROP_REPEAT_STATE:
                        rb_shell_player_get_playback_state (player->priv->shell_player, &shuffle, &repeat);
-                       rb_shell_player_set_playback_state (player->priv->shell_player, shuffle, 
g_value_get_enum (value) != DACP_REPEAT_NONE);
+                       rb_shell_player_set_playback_state (player->priv->shell_player, shuffle, 
g_value_get_enum (value) != DMAP_CONTROL_REPEAT_NONE);
                        break;
                case PROP_VOLUME:
                        volume = ((double) g_value_get_ulong (value))  / 100.0;
@@ -291,54 +288,54 @@ rb_dacp_player_new (RBShell *shell)
        return player;
 }
 
-static DAAPRecord *
-rb_dacp_player_now_playing_record (DACPPlayer *player)
+static DmapAvRecord *
+rb_dacp_player_now_playing_record (DmapControlPlayer *player)
 {
        RhythmDBEntry *entry;
-       DAAPRecord *record;
+       DmapAvRecord *record;
 
        entry = rb_shell_player_get_playing_entry (RB_DACP_PLAYER (player)->priv->shell_player);
        if (entry == NULL) {
                return NULL;
        } else {
-               record = DAAP_RECORD (rb_daap_record_new (entry));
+               record = DMAP_AV_RECORD (rb_daap_record_new (entry));
                rhythmdb_entry_unref (entry);
                return record;
        }
 }
 
-static guchar *
-rb_dacp_player_now_playing_artwork (DACPPlayer *player, guint width, guint height)
+gchar *
+rb_dacp_player_now_playing_artwork (DmapControlPlayer *player, guint width, guint height)
 {
        return NULL;
 }
 
 static void
-rb_dacp_player_play_pause (DACPPlayer *player)
+rb_dacp_player_play_pause (DmapControlPlayer *player)
 {
        rb_shell_player_playpause (RB_DACP_PLAYER (player)->priv->shell_player, NULL);
 }
 
 static void
-rb_dacp_player_pause (DACPPlayer *player)
+rb_dacp_player_pause (DmapControlPlayer *player)
 {
        rb_shell_player_pause (RB_DACP_PLAYER (player)->priv->shell_player, NULL);
 }
 
 static void
-rb_dacp_player_next_item (DACPPlayer *player)
+rb_dacp_player_next_item (DmapControlPlayer *player)
 {
        rb_shell_player_do_next (RB_DACP_PLAYER (player)->priv->shell_player, NULL);
 }
 
 static void
-rb_dacp_player_prev_item (DACPPlayer *player)
+rb_dacp_player_prev_item (DmapControlPlayer *player)
 {
        rb_shell_player_do_previous (RB_DACP_PLAYER (player)->priv->shell_player, NULL);
 }
 
 static void
-rb_dacp_player_cue_clear (DACPPlayer *player)
+rb_dacp_player_cue_clear (DmapControlPlayer *player)
 {
        RBDACPPlayer *rbplayer;
        rbplayer = RB_DACP_PLAYER (player);
@@ -346,7 +343,7 @@ rb_dacp_player_cue_clear (DACPPlayer *player)
 }
 
 static void
-rb_dacp_player_cue_play (DACPPlayer *player, GList *records, guint index)
+rb_dacp_player_cue_play (DmapControlPlayer *player, GList *records, guint index)
 {
        GList *record;
        gint current = 0;
diff --git a/plugins/daap/rb-dacp-player.h b/plugins/daap/rb-dacp-player.h
index ff2aa18fd..96b0830b6 100644
--- a/plugins/daap/rb-dacp-player.h
+++ b/plugins/daap/rb-dacp-player.h
@@ -33,6 +33,8 @@
 #include <glib-object.h>
 #include <libdmapsharing/dmap.h>
 
+#include "rb-dacp-compat.h"
+
 G_BEGIN_DECLS
 
 #define RB_TYPE_DACP_PLAYER             (rb_dacp_player_get_type ())
@@ -52,7 +54,7 @@ struct _RBDACPPlayerClass
 {
        GObjectClass parent_class;
 
-       void (*player_updated) (DACPPlayer *player);
+       void (*player_updated) (DmapControlPlayer *player);
 };
 
 struct _RBDACPPlayer
diff --git a/plugins/daap/rb-dmap-compat.h b/plugins/daap/rb-dmap-compat.h
new file mode 100644
index 000000000..d1dc77de2
--- /dev/null
+++ b/plugins/daap/rb-dmap-compat.h
@@ -0,0 +1,173 @@
+/*
+ *  Compatibility layer between libdmapsharing 3.0 and 4.0 APIs
+ *
+ *  Copyright (C) 2020 W. Michael Petullo <mike flyn org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The Rhythmbox authors hereby grant permission for non-GPL compatible
+ *  GStreamer plugins to be used and distributed together with GStreamer
+ *  and Rhythmbox. This permission is above and beyond the permissions granted
+ *  by the GPL license by which Rhythmbox is covered. If you modify this code
+ *  you may extend this exception to your version of the code, but you are not
+ *  obligated to do so. If you do not wish to do so, delete this exception
+ *  statement from your version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU 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.
+ *
+ */
+
+#ifndef _RB_DMAP_COMPAT
+#define _RB_DMAP_COMPAT
+
+#ifdef LIBDMAPSHARING_COMPAT
+
+/* Building against libdmapsharing 3 API. */
+
+#define DmapConnection DMAPConnection
+#define DmapConnectionFunc DMAPConnectionCallback
+#define dmap_connection_start dmap_connection_connect
+#define DmapConnectionState DMAPConnectionState
+#define dmap_connection_stop dmap_connection_disconnect
+#define DmapContainerDb DMAPContainerDb
+#define DmapContainerDbInterface DMAPContainerDbIface
+#define DmapContainerRecord DMAPContainerRecord
+#define DmapContainerRecordInterface DMAPContainerRecordIface
+#define DmapDb DMAPDb
+#define DmapDbInterface DMAPDbIface
+#define DMAP_GET_MEDIA DMAP_GET_SONGS
+#define DmapIdContainerRecordFunc GHFunc
+#define DmapIdRecordFunc GHFunc
+#define DmapMdnsBrowser DMAPMdnsBrowser
+#define DmapMdnsService DMAPMdnsBrowserService
+#define DMAP_MDNS_SERVICE_TYPE_DAAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP
+#define DmapPlaylist DMAPPlaylist
+#define DmapRecord DMAPRecord
+#define DmapRecordFactory DMAPRecordFactory
+#define DmapRecordFactoryInterface DMAPRecordFactoryIface
+#define DmapRecordInterface DMAPRecordIface
+
+guint rb_rhythmdb_dmap_db_adapter_add (DMAPDb *_db, DMAPRecord *_record, GError **error);
+guint rb_rhythmdb_query_model_dmap_db_adapter_add (DmapDb *db, DmapRecord *record, GError **error);
+
+static inline guint
+rb_rhythmdb_dmap_db_adapter_add_compat (DmapDb *_db, DmapRecord *_record)
+{
+       return rb_rhythmdb_dmap_db_adapter_add (_db, _record, NULL);
+}
+
+static inline guint
+rb_rhythmdb_query_model_dmap_db_adapter_add_compat (DmapDb *db, DmapRecord *record)
+{
+       return rb_rhythmdb_query_model_dmap_db_adapter_add(db, record, NULL);
+}
+
+static inline DmapMdnsService *
+rb_dmap_mdns_service_new_compat(const gchar *service_name,
+                                const gchar *name,
+                                gchar *host,
+                                guint port,
+                                gboolean password_protected)
+{
+       DmapMdnsService *service = g_new(DmapMdnsService, 1);
+
+       service->service_name       = g_strdup(service_name);
+       service->name               = g_strdup(name);
+       service->host               = g_strdup(host);
+        service->port               = port;
+       service->password_protected = password_protected;
+
+       return service;
+}
+
+static inline void
+rb_dmap_mdns_service_get_compat(DmapMdnsService *service,
+                                gchar **service_name,
+                                gchar **name,
+                                gchar **host,
+                                guint *port,
+                                gboolean *password_protected)
+{
+       *service_name       = g_strdup(service->service_name);
+       *name               = g_strdup(service->name);
+       *host               = g_strdup(service->host);
+       *port               = service->port;
+       *password_protected = service->password_protected;
+}
+
+static inline void
+rb_dmap_mdns_service_free_compat(DmapMdnsService *service)
+{
+       g_free(service);
+}
+
+#else
+
+/* Building against libdmapsharing 4 API. */
+
+guint rb_rhythmdb_dmap_db_adapter_add (DmapDb *_db, DmapRecord *_record, GError **error);
+guint rb_rhythmdb_query_model_dmap_db_adapter_add (DmapDb *db, DmapRecord *record, GError **error);
+
+static inline guint
+rb_rhythmdb_dmap_db_adapter_add_compat (DmapDb *_db, DmapRecord *_record, GError **error)
+{
+       return rb_rhythmdb_dmap_db_adapter_add (_db, _record, error);
+}
+
+static inline guint
+rb_rhythmdb_query_model_dmap_db_adapter_add_compat (DmapDb *db, DmapRecord *record, GError **error)
+{
+       return rb_rhythmdb_query_model_dmap_db_adapter_add(db, record, error);
+}
+
+static inline DmapMdnsService *
+rb_dmap_mdns_service_new_compat(const gchar *service_name,
+                                const gchar *name,
+                                gchar *host,
+                                guint port,
+                                gboolean password_protected)
+{
+       return g_object_new(DMAP_TYPE_MDNS_SERVICE,
+                          "service-name", service_name,
+                          "name", name,
+                           "host", host,
+                           "port", port,
+                           "password-protected", FALSE,
+                            NULL);
+}
+
+static inline void
+rb_dmap_mdns_service_get_compat(DmapMdnsService *service,
+                                gchar **service_name,
+                                gchar **name,
+                                gchar **host,
+                                guint *port,
+                                gboolean *password_protected)
+{
+       g_object_get(service, "service-name", service_name,
+                             "name", name,
+                             "host", host,
+                             "port", port,
+                             "password-protected", password_protected,
+                              NULL);
+}
+
+static inline void
+rb_dmap_mdns_service_free_compat(DmapMdnsService *service)
+{
+       g_object_unref(service);
+}
+
+#endif
+
+#endif /* _RB_DMAP_COMPAT */
diff --git a/plugins/daap/rb-dmap-container-db-adapter.c b/plugins/daap/rb-dmap-container-db-adapter.c
index 11a4b6cc7..3e435df78 100644
--- a/plugins/daap/rb-dmap-container-db-adapter.c
+++ b/plugins/daap/rb-dmap-container-db-adapter.c
@@ -44,7 +44,7 @@ struct RBDMAPContainerDbAdapterPrivate {
 
 typedef struct ForeachAdapterData {
        gpointer data;
-       GHFunc func;
+       DmapIdContainerRecordFunc func;
 } ForeachAdapterData;
 
 static guint find_by_id (gconstpointer a, gconstpointer b)
@@ -52,12 +52,12 @@ static guint find_by_id (gconstpointer a, gconstpointer b)
        return GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (a), "daap_id")) != GPOINTER_TO_UINT (b);
 }
 
-static DMAPContainerRecord *
-rb_dmap_container_db_adapter_lookup_by_id (DMAPContainerDb *db, guint id)
+static DmapContainerRecord *
+rb_dmap_container_db_adapter_lookup_by_id (DmapContainerDb *db, guint id)
 {
        gchar *name;
        GList *playlists;
-       DMAPContainerRecord *fnval = NULL;
+       DmapContainerRecord *fnval = NULL;
 
        playlists = rb_playlist_manager_get_playlists (RB_DMAP_CONTAINER_DB_ADAPTER 
(db)->priv->playlist_manager);
 
@@ -80,24 +80,32 @@ rb_dmap_container_db_adapter_lookup_by_id (DMAPContainerDb *db, guint id)
 static void
 foreach_adapter (RBPlaylistSource *entry, gpointer data)
 {
+       guint id;
        gchar *name;
-       DMAPContainerRecord *record;
+       DmapContainerRecord *record;
        ForeachAdapterData *foreach_adapter_data;
 
        foreach_adapter_data = data;
        g_object_get (entry, "name", &name, NULL);
        record = DMAP_CONTAINER_RECORD (rb_daap_container_record_new (name, entry));
+       id = rb_daap_container_record_get_id (record);
 
-       foreach_adapter_data->func (GINT_TO_POINTER (rb_daap_container_record_get_id (record)),
+#ifdef LIBDMAPSHARING_COMPAT
+       foreach_adapter_data->func (GINT_TO_POINTER(id),
                                    record,
                                    foreach_adapter_data->data);
+#else
+       foreach_adapter_data->func (id,
+                                   record,
+                                   foreach_adapter_data->data);
+#endif
 
        g_object_unref (record);
 }
 
 static void
-rb_dmap_container_db_adapter_foreach   (DMAPContainerDb *db,
-                                        GHFunc func,
+rb_dmap_container_db_adapter_foreach   (DmapContainerDb *db,
+                                        DmapIdContainerRecordFunc func,
                                         gpointer data)
 {
        ForeachAdapterData *foreach_adapter_data;
@@ -115,7 +123,7 @@ rb_dmap_container_db_adapter_foreach        (DMAPContainerDb *db,
 }
 
 static gint64
-rb_dmap_container_db_adapter_count (DMAPContainerDb *db)
+rb_dmap_container_db_adapter_count (DmapContainerDb *db)
 {
        gint64 count = 0;
        GList *playlists = rb_playlist_manager_get_playlists (
@@ -145,7 +153,7 @@ rb_dmap_container_db_adapter_class_finalize (RBDMAPContainerDbAdapterClass *klas
 static void
 rb_dmap_container_db_adapter_interface_init (gpointer iface, gpointer data)
 {
-       DMAPContainerDbIface *dmap_db = iface;
+       DmapContainerDbInterface *dmap_db = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (dmap_db) == DMAP_TYPE_CONTAINER_DB);
 
diff --git a/plugins/daap/rb-dmap-container-db-adapter.h b/plugins/daap/rb-dmap-container-db-adapter.h
index 2587a8eab..12e7aa042 100644
--- a/plugins/daap/rb-dmap-container-db-adapter.h
+++ b/plugins/daap/rb-dmap-container-db-adapter.h
@@ -32,6 +32,7 @@
 
 #include <libdmapsharing/dmap.h>
 
+#include "rb-dmap-compat.h"
 #include "rb-playlist-manager.h"
 
 G_BEGIN_DECLS
diff --git a/plugins/daap/rb-rhythmdb-dmap-db-adapter.c b/plugins/daap/rb-rhythmdb-dmap-db-adapter.c
index 412fb2cfb..1212b4baf 100644
--- a/plugins/daap/rb-rhythmdb-dmap-db-adapter.c
+++ b/plugins/daap/rb-rhythmdb-dmap-db-adapter.c
@@ -45,11 +45,11 @@ struct RBRhythmDBDMAPDbAdapterPrivate {
 
 typedef struct ForeachAdapterData {
        gpointer data;
-       GHFunc func;
+       DmapIdRecordFunc func;
 } ForeachAdapterData;
 
-static DMAPRecord *
-rb_rhythmdb_dmap_db_adapter_lookup_by_id (const DMAPDb *db, guint id)
+static DmapRecord *
+rb_rhythmdb_dmap_db_adapter_lookup_by_id (const DmapDb *db, guint id)
 {
        RhythmDBEntry *entry;
 
@@ -66,7 +66,7 @@ static void
 foreach_adapter (RhythmDBEntry *entry, gpointer data)
 {
        gulong id;
-       DMAPRecord *record;
+       DmapRecord *record;
        ForeachAdapterData *foreach_adapter_data;
        char *playback_uri;
 
@@ -81,18 +81,24 @@ foreach_adapter (RhythmDBEntry *entry, gpointer data)
        foreach_adapter_data = data;
        record = DMAP_RECORD (rb_daap_record_new (entry));
 
-       foreach_adapter_data->func (GUINT_TO_POINTER (id),
+#ifdef LIBDMAPSHARING_COMPAT
+       foreach_adapter_data->func (GUINT_TO_POINTER(id),
                                    record,
                                    foreach_adapter_data->data);
+#else
+       foreach_adapter_data->func (id,
+                                   record,
+                                   foreach_adapter_data->data);
+#endif
 
        g_free (playback_uri);
        g_object_unref (record);
 }
 
 static void
-rb_rhythmdb_dmap_db_adapter_foreach    (const DMAPDb *db,
-                                        GHFunc func,
-                                        gpointer data)
+rb_rhythmdb_dmap_db_adapter_foreach (const DmapDb *db,
+                                     DmapIdRecordFunc func,
+                                     gpointer data)
 {
        ForeachAdapterData *foreach_adapter_data;
 
@@ -111,7 +117,7 @@ rb_rhythmdb_dmap_db_adapter_foreach (const DMAPDb *db,
 }
 
 static gint64
-rb_rhythmdb_dmap_db_adapter_count (const DMAPDb *db)
+rb_rhythmdb_dmap_db_adapter_count (const DmapDb *db)
 {
        g_assert (RB_RHYTHMDB_DMAP_DB_ADAPTER (db)->priv->db != NULL);
        return rhythmdb_entry_count_by_type (
@@ -140,8 +146,8 @@ entry_set_string_prop (RhythmDB        *db,
         g_value_unset (&value);
 }
 
-static guint
-rb_rhythmdb_dmap_db_adapter_add (DMAPDb *db, DMAPRecord *record)
+guint
+rb_rhythmdb_dmap_db_adapter_add (DmapDb *db, DmapRecord *record, GError **error)
 {
        gchar *uri = NULL;
        const gchar *title = NULL;
@@ -265,11 +271,11 @@ rb_rhythmdb_dmap_db_adapter_class_finalize (RBRhythmDBDMAPDbAdapterClass *klass)
 static void
 rb_rhythmdb_dmap_db_adapter_interface_init (gpointer iface, gpointer data)
 {
-       DMAPDbIface *dmap_db = iface;
+       DmapDbInterface *dmap_db = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (dmap_db) == DMAP_TYPE_DB);
 
-       dmap_db->add = rb_rhythmdb_dmap_db_adapter_add;
+       dmap_db->add = rb_rhythmdb_dmap_db_adapter_add_compat;
        dmap_db->lookup_by_id = rb_rhythmdb_dmap_db_adapter_lookup_by_id;
        dmap_db->foreach = rb_rhythmdb_dmap_db_adapter_foreach;
        dmap_db->count = rb_rhythmdb_dmap_db_adapter_count;
diff --git a/plugins/daap/rb-rhythmdb-query-model-dmap-db-adapter.c 
b/plugins/daap/rb-rhythmdb-query-model-dmap-db-adapter.c
index 63462f39b..6c2a0057f 100644
--- a/plugins/daap/rb-rhythmdb-query-model-dmap-db-adapter.c
+++ b/plugins/daap/rb-rhythmdb-query-model-dmap-db-adapter.c
@@ -43,11 +43,11 @@ struct RBRhythmDBQueryModelDMAPDbAdapterPrivate {
 
 typedef struct ForeachAdapterData {
        gpointer data;
-       GHFunc func;
+       DmapIdRecordFunc func;
 } ForeachAdapterData;
 
-static DMAPRecord *
-rb_rhythmdb_query_model_dmap_db_adapter_lookup_by_id (const DMAPDb *db,
+static DmapRecord *
+rb_rhythmdb_query_model_dmap_db_adapter_lookup_by_id (const DmapDb *db,
                                                      guint id)
 {
        g_error ("Not implemented");
@@ -61,7 +61,7 @@ foreach_adapter (GtkTreeModel *model,
                 gpointer data)
 {
        gulong id;
-       DMAPRecord *record;
+       DmapRecord *record;
        RhythmDBEntry *entry;
        ForeachAdapterData *foreach_adapter_data;
 
@@ -71,9 +71,15 @@ foreach_adapter (GtkTreeModel *model,
        foreach_adapter_data = data;
        record = DMAP_RECORD (rb_daap_record_new (entry));
 
-       foreach_adapter_data->func (GUINT_TO_POINTER (id),
+#ifdef LIBDMAPSHARING_COMPAT
+       foreach_adapter_data->func (GUINT_TO_POINTER(id),
                                    record,
                                    foreach_adapter_data->data);
+#else
+       foreach_adapter_data->func (id,
+                                   record,
+                                   foreach_adapter_data->data);
+#endif
 
        g_object_unref (record);
        rhythmdb_entry_unref (entry);
@@ -82,9 +88,9 @@ foreach_adapter (GtkTreeModel *model,
 }
 
 static void
-rb_rhythmdb_query_model_dmap_db_adapter_foreach        (const DMAPDb *db,
-                                        GHFunc func,
-                                        gpointer data)
+rb_rhythmdb_query_model_dmap_db_adapter_foreach        (const DmapDb *db,
+                                                 DmapIdRecordFunc func,
+                                                 gpointer data)
 {
        ForeachAdapterData *foreach_adapter_data;
 
@@ -102,15 +108,15 @@ rb_rhythmdb_query_model_dmap_db_adapter_foreach   (const DMAPDb *db,
 }
 
 static gint64
-rb_rhythmdb_query_model_dmap_db_adapter_count (const DMAPDb *db)
+rb_rhythmdb_query_model_dmap_db_adapter_count (const DmapDb *db)
 {
        g_assert (RB_RHYTHMDB_QUERY_MODEL_DMAP_DB_ADAPTER (db)->priv->model != NULL); 
        return gtk_tree_model_iter_n_children (
                GTK_TREE_MODEL (RB_RHYTHMDB_QUERY_MODEL_DMAP_DB_ADAPTER (db)->priv->model), NULL);
 }
 
-static guint
-rb_rhythmdb_query_model_dmap_db_adapter_add (DMAPDb *db, DMAPRecord *record)
+guint
+rb_rhythmdb_query_model_dmap_db_adapter_add (DmapDb *db, DmapRecord *record, GError **error)
 {
        g_error ("Not implemented");
        return 0;
@@ -136,11 +142,11 @@ rb_rhythmdb_query_model_dmap_db_adapter_class_finalize (RBRhythmDBQueryModelDMAP
 static void
 rb_rhythmdb_query_model_dmap_db_adapter_interface_init (gpointer iface, gpointer data)
 {
-       DMAPDbIface *dmap_db = iface;
+       DmapDbInterface *dmap_db = iface;
 
        g_assert (G_TYPE_FROM_INTERFACE (dmap_db) == DMAP_TYPE_DB);
 
-       dmap_db->add = rb_rhythmdb_query_model_dmap_db_adapter_add;
+       dmap_db->add = rb_rhythmdb_query_model_dmap_db_adapter_add_compat;
        dmap_db->lookup_by_id = rb_rhythmdb_query_model_dmap_db_adapter_lookup_by_id;
        dmap_db->foreach = rb_rhythmdb_query_model_dmap_db_adapter_foreach;
        dmap_db->count = rb_rhythmdb_query_model_dmap_db_adapter_count;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]