--- /dev/null
+diff --git a/src/dmap/grl-common.c b/src/dmap/grl-common.c
+index fa92df9..6a1da5e 100644
+--- a/src/dmap/grl-common.c
++++ b/src/dmap/grl-common.c
+@@ -39,7 +39,7 @@ gchar *
+ grl_dmap_build_url (DMAPMdnsBrowserService *service)
+ {
+ return g_strdup_printf ("%s://%s:%u",
+- service->service_name,
+- service->host,
+- service->port);
++ service->service_name,
++ service->host,
++ service->port);
+ }
+diff --git a/src/dmap/grl-daap-db.c b/src/dmap/grl-daap-db.c
+index 6621094..c931d91 100644
+--- a/src/dmap/grl-daap-db.c
++++ b/src/dmap/grl-daap-db.c
+@@ -112,8 +112,8 @@ grl_daap_db_lookup_by_id (const DMAPDb *db, guint id)
+
+ static void
+ grl_daap_db_foreach (const DMAPDb *db,
+- GHFunc func,
+- gpointer data)
++ GHFunc func,
++ gpointer data)
+ {
+ g_error ("Not implemented");
+ }
+@@ -135,7 +135,7 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
+ id = g_strdup_printf ("%s-%s", category_name, set_name);
+
+ container = grl_media_container_new ();
+- grl_media_set_id (container, id);
++ grl_media_set_id (container, id);
+ grl_media_set_title (container, set_name);
+
+ set = g_hash_table_lookup (category, container);
+@@ -173,26 +173,16 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ GrlMedia *media;
+
+ g_object_get (record,
+- "songalbum",
+- &album,
+- "songartist",
+- &artist,
+- "bitrate",
+- &bitrate,
+- "duration",
+- &duration,
+- "songgenre",
+- &genre,
+- "title",
+- &title,
+- "track",
+- &track,
+- "disc",
+- &disc,
+- "location",
+- &url,
+- "has-video",
+- &has_video,
++ "songalbum", &album,
++ "songartist", &artist,
++ "bitrate", &bitrate,
++ "duration", &duration,
++ "songgenre", &genre,
++ "title", &title,
++ "track", &track,
++ "disc", &disc,
++ "location", &url,
++ "has-video", &has_video,
+ NULL);
+
+ id_s = g_strdup_printf ("%u", nextid);
+@@ -203,8 +193,8 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ media = grl_media_audio_new ();
+ }
+
+- grl_media_set_id (media, id_s);
+- grl_media_set_duration (media, duration);
++ grl_media_set_id (media, id_s);
++ grl_media_set_duration (media, duration);
+
+ if (title) {
+ grl_media_set_title (media, title);
+@@ -217,7 +207,7 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ }
+
+ if (has_video == FALSE) {
+- grl_media_set_bitrate (media, bitrate);
++ grl_media_set_bitrate (media, bitrate);
+ grl_media_set_track_number (media, track);
+
+ if (disc != 0) {
+@@ -249,7 +239,7 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ static gboolean
+ same_media (GrlMedia *a, GrlMedia *b)
+ {
+- return (strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0);
++ return strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0;
+ }
+
+ void
+@@ -334,7 +324,7 @@ grl_daap_db_search (GrlDAAPDb *db,
+ results = g_hash_table_new (g_str_hash, g_str_equal);
+
+ /* For albums and artists... */
+- for (i = 0; i < G_N_ELEMENTS(hash_tables); i++) {
++ for (i = 0; i < G_N_ELEMENTS (hash_tables); i++) {
+ g_hash_table_iter_init (&iter1, hash_tables[i]);
+ /* For each album or artist in above... */
+ for (j = 0; g_hash_table_iter_next (&iter1, &key1, &val1); j++) {
+@@ -396,10 +386,10 @@ grl_daap_db_init (GrlDAAPDb *db)
+ db->priv->albums_container = grl_media_container_new ();
+ db->priv->artists_container = grl_media_container_new ();
+
+- grl_media_set_id (GRL_MEDIA (db->priv->albums_container), ALBUMS_ID);
++ grl_media_set_id (GRL_MEDIA (db->priv->albums_container), ALBUMS_ID);
+ grl_media_set_title (GRL_MEDIA (db->priv->albums_container), ALBUMS_NAME);
+
+- grl_media_set_id (GRL_MEDIA (db->priv->artists_container), ARTISTS_ID);
++ grl_media_set_id (GRL_MEDIA (db->priv->artists_container), ARTISTS_ID);
+ grl_media_set_title (GRL_MEDIA (db->priv->artists_container), ARTISTS_NAME);
+
+ db->priv->root = g_hash_table_new_full (container_hash, container_equal, g_object_unref, (GDestroyNotify) g_hash_table_destroy);
+@@ -426,9 +416,9 @@ grl_daap_db_finalize (GObject *object)
+
+ static void
+ grl_daap_db_set_property (GObject *object,
+- guint prop_id,
+- const GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
+ {
+ switch (prop_id) {
+ default:
+@@ -439,9 +429,9 @@ grl_daap_db_set_property (GObject *object,
+
+ static void
+ grl_daap_db_get_property (GObject *object,
+- guint prop_id,
+- GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
+ {
+ switch (prop_id) {
+ default:
+diff --git a/src/dmap/grl-daap-db.h b/src/dmap/grl-daap-db.h
+index f52a9b5..2548c50 100644
+--- a/src/dmap/grl-daap-db.h
++++ b/src/dmap/grl-daap-db.h
+@@ -26,34 +26,34 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_GRL_DAAP_DB \
+- (grl_daap_db_get_type ())
+-
+-#define GRL_DAAP_DB(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+- TYPE_GRL_DAAP_DB, \
+- GrlDAAPDb))
+-
+-#define GRL_DAAP_DB_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_GRL_DAAP_DB, \
+- GrlDAAPDbClass))
+-#define IS_GRL_DAAP_DB(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
+- TYPE_GRL_DAAP_DB))
+-#define IS_GRL_DAAP_DB_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_GRL_DAAP_DB_CLASS))
+-
+-#define GRL_DAAP_DB_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_GRL_DAAP_DB, \
+- GrlDAAPDbClass))
++#define TYPE_GRL_DAAP_DB (grl_daap_db_get_type ())
++
++#define GRL_DAAP_DB(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_GRL_DAAP_DB, \
++ GrlDAAPDb))
+
+-#define GRL_DAAP_DB_GET_PRIVATE(o) \
+- (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+- TYPE_GRL_DAAP_DB, \
+- GrlDAAPDbPrivate))
++#define GRL_DAAP_DB_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_GRL_DAAP_DB, \
++ GrlDAAPDbClass))
++#define IS_GRL_DAAP_DB(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
++ TYPE_GRL_DAAP_DB))
++
++#define IS_GRL_DAAP_DB_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_GRL_DAAP_DB_CLASS))
++
++#define GRL_DAAP_DB_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_GRL_DAAP_DB, \
++ GrlDAAPDbClass))
++
++#define GRL_DAAP_DB_GET_PRIVATE(o) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
++ TYPE_GRL_DAAP_DB, \
++ GrlDAAPDbPrivate))
+
+ typedef struct GrlDAAPDbPrivate GrlDAAPDbPrivate;
+
+diff --git a/src/dmap/grl-daap-record-factory.c b/src/dmap/grl-daap-record-factory.c
+index e986394..648fd85 100644
+--- a/src/dmap/grl-daap-record-factory.c
++++ b/src/dmap/grl-daap-record-factory.c
+@@ -22,9 +22,9 @@
+ #include "grl-daap-record.h"
+
+ DMAPRecord *
+-grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
++grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
+ {
+- return DMAP_RECORD (grl_daap_record_new ());
++ return DMAP_RECORD (grl_daap_record_new ());
+ }
+
+ static void
+@@ -40,19 +40,19 @@ grl_daap_record_factory_class_init (GrlDAAPRecordFactoryClass *klass)
+ static void
+ grl_daap_record_factory_interface_init (gpointer iface, gpointer data)
+ {
+- DMAPRecordFactoryIface *factory = iface;
++ DMAPRecordFactoryIface *factory = iface;
+
+- g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
++ g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
+
+- factory->create = grl_daap_record_factory_create;
++ factory->create = grl_daap_record_factory_create;
+ }
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecordFactory, grl_daap_record_factory, G_TYPE_OBJECT,
+- G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY,
+- grl_daap_record_factory_interface_init))
++ G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY,
++ grl_daap_record_factory_interface_init))
+
+ GrlDAAPRecordFactory *
+ grl_daap_record_factory_new (void)
+ {
+- return SIMPLE_DAAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DAAP_RECORD_FACTORY, NULL));
++ return SIMPLE_DAAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DAAP_RECORD_FACTORY, NULL));
+ }
+diff --git a/src/dmap/grl-daap-record-factory.h b/src/dmap/grl-daap-record-factory.h
+index 514713a..45aa69a 100644
+--- a/src/dmap/grl-daap-record-factory.h
++++ b/src/dmap/grl-daap-record-factory.h
+@@ -25,32 +25,31 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_SIMPLE_DAAP_RECORD_FACTORY \
+- (grl_daap_record_factory_get_type ())
+-
+-#define SIMPLE_DAAP_RECORD_FACTORY(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST((o), \
+- TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
+- GrlDAAPRecordFactory))
+-
+-#define SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
+- GrlDAAPRecordFactoryClass))
+-
+-#define IS_SIMPLE_DAAP_RECORD_FACTORY(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
+- TYPE_SIMPLE_DAAP_RECORD_FACTORY))
+-
+-#define IS_SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_SIMPLE_DAAP_RECORD_FACTORY_CLASS))
+-
+-#define SIMPLE_DAAP_RECORD_FACTORY_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
++#define TYPE_SIMPLE_DAAP_RECORD_FACTORY (grl_daap_record_factory_get_type ())
++
++#define SIMPLE_DAAP_RECORD_FACTORY(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
++ GrlDAAPRecordFactory))
++
++#define SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
+ GrlDAAPRecordFactoryClass))
+
++#define IS_SIMPLE_DAAP_RECORD_FACTORY(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
++ TYPE_SIMPLE_DAAP_RECORD_FACTORY))
++
++#define IS_SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_SIMPLE_DAAP_RECORD_FACTORY_CLASS))
++
++#define SIMPLE_DAAP_RECORD_FACTORY_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_SIMPLE_DAAP_RECORD_FACTORY, \
++ GrlDAAPRecordFactoryClass))
++
+ typedef struct GrlDAAPRecordFactoryPrivate GrlDAAPRecordFactoryPrivate;
+
+ typedef struct {
+@@ -61,11 +60,11 @@ typedef struct {
+ GObjectClass parent;
+ } GrlDAAPRecordFactoryClass;
+
+-GType grl_daap_record_factory_get_type (void);
++GType grl_daap_record_factory_get_type (void);
+
+-GrlDAAPRecordFactory *grl_daap_record_factory_new (void);
++GrlDAAPRecordFactory *grl_daap_record_factory_new (void);
+
+-DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
++DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
+
+ #endif /* __SIMPLE_DAAP_RECORD_FACTORY */
+
+diff --git a/src/dmap/grl-daap-record.c b/src/dmap/grl-daap-record.c
+index d1721d2..82bf2f9 100644
+--- a/src/dmap/grl-daap-record.c
++++ b/src/dmap/grl-daap-record.c
+@@ -69,9 +69,9 @@ enum {
+
+ static void
+ grl_daap_record_set_property (GObject *object,
+- guint prop_id,
+- const GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
+ {
+ GrlDAAPRecord *record = SIMPLE_DAAP_RECORD (object);
+
+@@ -86,27 +86,27 @@ grl_daap_record_set_property (GObject *object,
+ break;
+ case PROP_ALBUM:
+ g_free (record->priv->album);
+- record->priv->album = g_value_dup_string(value);
++ record->priv->album = g_value_dup_string (value);
+ break;
+ case PROP_SORT_ALBUM:
+ g_free (record->priv->sort_album);
+- record->priv->sort_album = g_value_dup_string(value);
++ record->priv->sort_album = g_value_dup_string (value);
+ break;
+ case PROP_ARTIST:
+ g_free (record->priv->artist);
+- record->priv->artist = g_value_dup_string(value);
++ record->priv->artist = g_value_dup_string (value);
+ break;
+ case PROP_SORT_ARTIST:
+ g_free (record->priv->sort_artist);
+- record->priv->sort_artist = g_value_dup_string(value);
++ record->priv->sort_artist = g_value_dup_string (value);
+ break;
+ case PROP_GENRE:
+ g_free (record->priv->genre);
+- record->priv->genre = g_value_dup_string(value);
++ record->priv->genre = g_value_dup_string (value);
+ break;
+ case PROP_FORMAT:
+ g_free (record->priv->format);
+- record->priv->format = g_value_dup_string(value);
++ record->priv->format = g_value_dup_string (value);
+ break;
+ case PROP_MEDIAKIND:
+ record->priv->mediakind = g_value_get_enum (value);
+@@ -142,18 +142,16 @@ grl_daap_record_set_property (GObject *object,
+ record->priv->has_video = g_value_get_boolean (value);
+ break;
+ default:
+- G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+- prop_id,
+- pspec);
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static void
+ grl_daap_record_get_property (GObject *object,
+- guint prop_id,
+- GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
+ {
+ GrlDAAPRecord *record = SIMPLE_DAAP_RECORD (object);
+
+@@ -216,9 +214,7 @@ grl_daap_record_get_property (GObject *object,
+ g_value_set_boolean (value, record->priv->has_video);
+ break;
+ default:
+- G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
+- prop_id,
+- pspec);
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+diff --git a/src/dmap/grl-daap-record.h b/src/dmap/grl-daap-record.h
+index 59558c4..7aae82d 100644
+--- a/src/dmap/grl-daap-record.h
++++ b/src/dmap/grl-daap-record.h
+@@ -25,36 +25,35 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_SIMPLE_DAAP_RECORD \
+- (grl_daap_record_get_type ())
+-
+-#define SIMPLE_DAAP_RECORD(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST((o), \
+- TYPE_SIMPLE_DAAP_RECORD, \
+- GrlDAAPRecord))
+-
+-#define SIMPLE_DAAP_RECORD_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_SIMPLE_DAAP_RECORD, \
+- GrlDAAPRecordClass))
+-
+-#define IS_SIMPLE_DAAP_RECORD(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
+- TYPE_SIMPLE_DAAP_RECORD))
+-
+-#define IS_SIMPLE_DAAP_RECORD_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_SIMPLE_DAAP_RECORD_CLASS))
+-
+-#define SIMPLE_DAAP_RECORD_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_SIMPLE_DAAP_RECORD, \
++#define TYPE_SIMPLE_DAAP_RECORD (grl_daap_record_get_type ())
++
++#define SIMPLE_DAAP_RECORD(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_SIMPLE_DAAP_RECORD, \
++ GrlDAAPRecord))
++
++#define SIMPLE_DAAP_RECORD_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_SIMPLE_DAAP_RECORD, \
+ GrlDAAPRecordClass))
+
+-#define SIMPLE_DAAP_RECORD_GET_PRIVATE(o) \
+- (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+- TYPE_SIMPLE_DAAP_RECORD, \
+- GrlDAAPRecordPrivate))
++#define IS_SIMPLE_DAAP_RECORD(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
++ TYPE_SIMPLE_DAAP_RECORD))
++
++#define IS_SIMPLE_DAAP_RECORD_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_SIMPLE_DAAP_RECORD_CLASS))
++
++#define SIMPLE_DAAP_RECORD_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_SIMPLE_DAAP_RECORD, \
++ GrlDAAPRecordClass))
++
++#define SIMPLE_DAAP_RECORD_GET_PRIVATE(o) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
++ TYPE_SIMPLE_DAAP_RECORD, \
++ GrlDAAPRecordPrivate))
+
+ typedef struct GrlDAAPRecordPrivate GrlDAAPRecordPrivate;
+
+@@ -69,9 +68,9 @@ typedef struct {
+
+ GType grl_daap_record_get_type (void);
+
+-GrlDAAPRecord *grl_daap_record_new (void);
+-GInputStream *grl_daap_record_read (DAAPRecord *record, GError **error);
+-gint grl_daap_record_get_id (DAAPRecord *record);
++GrlDAAPRecord *grl_daap_record_new (void);
++GInputStream *grl_daap_record_read (DAAPRecord *record, GError **error);
++gint grl_daap_record_get_id (DAAPRecord *record);
+
+ #endif /* __SIMPLE_DAAP_RECORD */
+
+diff --git a/src/dmap/grl-daap.c b/src/dmap/grl-daap.c
+index 13cc7e3..f3c4115 100644
+--- a/src/dmap/grl-daap.c
++++ b/src/dmap/grl-daap.c
+@@ -42,7 +42,7 @@
+ /* --------- Logging -------- */
+
+ #define GRL_LOG_DOMAIN_DEFAULT daap_log_domain
+-GRL_LOG_DOMAIN_STATIC(daap_log_domain);
++GRL_LOG_DOMAIN_STATIC (daap_log_domain);
+
+ /* --- Plugin information --- */
+
+@@ -111,19 +111,19 @@ grl_daap_plugin_init (GrlRegistry *registry,
+ sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+ g_signal_connect (G_OBJECT (browser),
+- "service-added",
++ "service-added",
+ G_CALLBACK (grl_daap_service_added_cb),
+ (gpointer) plugin);
+
+ g_signal_connect (G_OBJECT (browser),
+- "service-removed",
++ "service-removed",
+ G_CALLBACK (grl_daap_service_removed_cb),
+ (gpointer) plugin);
+
+ if (!dmap_mdns_browser_start (browser, &error)) {
+ GRL_DEBUG ("error starting browser. code: %d message: %s",
+- error->code,
+- error->message);
++ error->code,
++ error->message);
+ g_error_free (error);
+
+ g_hash_table_unref (connections);
+@@ -138,12 +138,12 @@ grl_daap_plugin_init (GrlRegistry *registry,
+ GRL_PLUGIN_DEFINE (GRL_MAJOR,
+ GRL_MINOR,
+ DAAP_PLUGIN_ID,
+- "DAAP",
+- "A plugin for browsing DAAP servers",
+- "W. Michael Petullo",
++ "DAAP",
++ "A plugin for browsing DAAP servers",
++ "W. Michael Petullo",
+ VERSION,
+- "LGPL",
+- "http://www.flyn.org",
++ "LGPL",
++ "http://www.flyn.org",
+ grl_daap_plugin_init,
+ NULL,
+ NULL);
+@@ -166,10 +166,10 @@ grl_daap_source_new (DMAPMdnsBrowserService *service)
+ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
+
+ source = g_object_new (GRL_DAAP_SOURCE_TYPE,
+- "source-id", source_id,
+- "source-name", service->name,
+- "source-desc", source_desc,
+- "supported-media", GRL_SUPPORTED_MEDIA_AUDIO,
++ "source-id", source_id,
++ "source-name", service->name,
++ "source-desc", source_desc,
++ "supported-media", GRL_SUPPORTED_MEDIA_AUDIO,
+ NULL);
+
+ source->priv->service = service;
+@@ -209,14 +209,14 @@ grl_daap_source_finalize (GObject *object)
+ static void
+ grl_daap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
+ {
+- grl_daap_db_browse(GRL_DAAP_DB(cb_and_db->db),
+- cb_and_db->cb.container,
+- cb_and_db->cb.source,
+- cb_and_db->cb.op_id,
+- cb_and_db->cb.skip,
+- cb_and_db->cb.count,
+- cb_and_db->cb.callback,
+- cb_and_db->cb.user_data);
++ grl_daap_db_browse (GRL_DAAP_DB(cb_and_db->db),
++ cb_and_db->cb.container,
++ cb_and_db->cb.source,
++ cb_and_db->cb.op_id,
++ cb_and_db->cb.skip,
++ cb_and_db->cb.count,
++ cb_and_db->cb.callback,
++ cb_and_db->cb.user_data);
+
+ g_free (cb_and_db);
+ }
+@@ -224,13 +224,13 @@ grl_daap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
+ static void
+ grl_daap_do_search (ResultCbAndArgsAndDb *cb_and_db)
+ {
+- grl_daap_db_search(GRL_DAAP_DB(cb_and_db->db),
+- cb_and_db->cb.source,
+- cb_and_db->cb.op_id,
+- (GHRFunc) cb_and_db->cb.predicate,
+- cb_and_db->cb.predicate_data,
+- cb_and_db->cb.callback,
+- cb_and_db->cb.user_data);
++ grl_daap_db_search (GRL_DAAP_DB (cb_and_db->db),
++ cb_and_db->cb.source,
++ cb_and_db->cb.op_id,
++ (GHRFunc) cb_and_db->cb.predicate,
++ cb_and_db->cb.predicate_data,
++ cb_and_db->cb.callback,
++ cb_and_db->cb.user_data);
+
+ g_free (cb_and_db);
+ }
+diff --git a/src/dmap/grl-daap.h b/src/dmap/grl-daap.h
+index 4912b05..1119495 100644
+--- a/src/dmap/grl-daap.h
++++ b/src/dmap/grl-daap.h
+@@ -26,31 +26,30 @@
+
+ #include <grilo.h>
+
+-#define GRL_DAAP_SOURCE_TYPE \
+- (grl_daap_source_get_type ())
+-
+-#define GRL_DAAP_SOURCE(obj) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+- GRL_DAAP_SOURCE_TYPE, \
+- GrlDaapSource))
+-
+-#define GRL_IS_DAAP_SOURCE(obj) \
+- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+- GRL_DAAP_SOURCE_TYPE))
+-
+-#define GRL_DAAP_SOURCE_CLASS(klass) \
+- (G_TYPE_CHECK_CLASS_CAST((klass), \
+- GRL_DAAP_SOURCE_TYPE, \
+- GrlDaapSourceClass))
+-
+-#define GRL_IS_DAAP_SOURCE_CLASS(klass) \
+- (G_TYPE_CHECK_CLASS_TYPE((klass), \
+- GRL_DAAP_SOURCE_TYPE))
+-
+-#define GRL_DAAP_SOURCE_GET_CLASS(obj) \
+- (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+- GRL_DAAP_SOURCE_TYPE, \
+- GrlDaapSourceClass))
++#define GRL_DAAP_SOURCE_TYPE (grl_daap_source_get_type ())
++
++#define GRL_DAAP_SOURCE(obj) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
++ GRL_DAAP_SOURCE_TYPE, \
++ GrlDaapSource))
++
++#define GRL_IS_DAAP_SOURCE(obj) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
++ GRL_DAAP_SOURCE_TYPE))
++
++#define GRL_DAAP_SOURCE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_CAST ((klass), \
++ GRL_DAAP_SOURCE_TYPE, \
++ GrlDaapSourceClass))
++
++#define GRL_IS_DAAP_SOURCE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
++ GRL_DAAP_SOURCE_TYPE))
++
++#define GRL_DAAP_SOURCE_GET_CLASS(obj) \
++ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
++ GRL_DAAP_SOURCE_TYPE, \
++ GrlDaapSourceClass))
+
+ typedef struct _GrlDaapSourcePrivate GrlDaapSourcePrivate;
+ typedef struct _GrlDaapSource GrlDaapSource;
+diff --git a/src/dmap/grl-dpap-db.c b/src/dmap/grl-dpap-db.c
+index 1f2d5ca..02ffd3a 100644
+--- a/src/dmap/grl-dpap-db.c
++++ b/src/dmap/grl-dpap-db.c
+@@ -80,8 +80,8 @@ grl_dpap_db_lookup_by_id (const DMAPDb *db, guint id)
+
+ static void
+ grl_dpap_db_foreach (const DMAPDb *db,
+- GHFunc func,
+- gpointer data)
++ GHFunc func,
++ gpointer data)
+ {
+ g_warning ("Not implemented");
+ }
+@@ -103,7 +103,7 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
+ id = g_strdup_printf ("%s-%s", category_name, set_name);
+
+ container = grl_media_container_new ();
+- grl_media_set_id (container, id);
++ grl_media_set_id (container, id);
+ grl_media_set_title (container, set_name);
+
+ set = g_hash_table_lookup (category, container);
+@@ -142,35 +142,24 @@ grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ GrlMedia *media;
+
+ g_object_get (record,
+- "large-filesize",
+- &largefilesize,
+- "creation-date",
+- &creationdate,
+- "rating",
+- &rating,
+- "filename",
+- &filename,
+- "aspect-ratio",
+- &aspectratio,
+- "pixel-height",
+- &height,
+- "pixel-width",
+- &width,
+- "format",
+- &format,
+- "comments",
+- &comments,
+- "thumbnail",
+- &thumbnail,
+- "location",
+- &url,
++ "large-filesize", &largefilesize,
++ "creation-date", &creationdate,
++ "rating", &rating,
++ "filename", &filename,
++ "aspect-ratio", &aspectratio,
++ "pixel-height", &height,
++ "pixel-width", &width,
++ "format", &format,
++ "comments", &comments,
++ "thumbnail", &thumbnail,
++ "location", &url,
+ NULL);
+
+ id_s = g_strdup_printf ("%u", nextid);
+
+ media = grl_media_image_new ();
+
+- grl_media_set_id (media, id_s);
++ grl_media_set_id (media, id_s);
+
+ if (filename)
+ grl_media_set_title (media, filename);
+@@ -181,7 +170,7 @@ grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ grl_media_set_url (media, url);
+ }
+
+- grl_media_set_width (media, width);
++ grl_media_set_width (media, width);
+ grl_media_set_height (media, height);
+
+ set_insert (db->priv->photos, PHOTOS_ID, "Unknown", media);
+@@ -195,7 +184,7 @@ grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
+ static gboolean
+ same_media (GrlMedia *a, GrlMedia *b)
+ {
+- return (strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0);
++ return strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0;
+ }
+
+ void
+@@ -230,7 +219,7 @@ grl_dpap_db_browse (GrlDPAPDb *db,
+ if (hash_table == NULL) {
+ GError *error = g_error_new (GRL_CORE_ERROR,
+ GRL_CORE_ERROR_BROWSE_FAILED,
+- "Invalid container identifier %s",
++ "Invalid container identifier %s",
+ container_id);
+ func (source, op_id, NULL, 0, user_data, error);
+ goto done;
+@@ -334,7 +323,7 @@ grl_dpap_db_init (GrlDPAPDb *db)
+
+ db->priv->photos_container = grl_media_container_new ();
+
+- grl_media_set_id (GRL_MEDIA (db->priv->photos_container), PHOTOS_ID);
++ grl_media_set_id (GRL_MEDIA (db->priv->photos_container), PHOTOS_ID);
+ grl_media_set_title (GRL_MEDIA (db->priv->photos_container), PHOTOS_NAME);
+
+ db->priv->root = g_hash_table_new_full (container_hash, container_equal, g_object_unref, (GDestroyNotify) g_hash_table_destroy);
+diff --git a/src/dmap/grl-dpap-db.h b/src/dmap/grl-dpap-db.h
+index 4c17d1a..d3abcba 100644
+--- a/src/dmap/grl-dpap-db.h
++++ b/src/dmap/grl-dpap-db.h
+@@ -26,34 +26,33 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_GRL_DPAP_DB \
+- (grl_dpap_db_get_type ())
++#define TYPE_GRL_DPAP_DB (grl_dpap_db_get_type ())
+
+-#define GRL_DPAP_DB(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+- TYPE_GRL_DPAP_DB, \
+- GrlDPAPDb))
++#define GRL_DPAP_DB(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_GRL_DPAP_DB, \
++ GrlDPAPDb))
+
+-#define GRL_DPAP_DB_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_GRL_DPAP_DB, \
+- GrlDPAPDbClass))
+-#define IS_GRL_DPAP_DB(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
+- TYPE_GRL_DPAP_DB))
+-#define IS_GRL_DPAP_DB_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_GRL_DPAP_DB_CLASS))
+-
+-#define GRL_DPAP_DB_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_GRL_DPAP_DB, \
++#define GRL_DPAP_DB_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_GRL_DPAP_DB, \
+ GrlDPAPDbClass))
++#define IS_GRL_DPAP_DB(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
++ TYPE_GRL_DPAP_DB))
++#define IS_GRL_DPAP_DB_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_GRL_DPAP_DB_CLASS))
++
++#define GRL_DPAP_DB_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_GRL_DPAP_DB, \
++ GrlDPAPDbClass))
+
+-#define GRL_DPAP_DB_GET_PRIVATE(o) \
+- (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+- TYPE_GRL_DPAP_DB, \
+- GrlDPAPDbPrivate))
++#define GRL_DPAP_DB_GET_PRIVATE(o) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
++ TYPE_GRL_DPAP_DB, \
++ GrlDPAPDbPrivate))
+
+ typedef struct GrlDPAPDbPrivate GrlDPAPDbPrivate;
+
+diff --git a/src/dmap/grl-dpap-record-factory.c b/src/dmap/grl-dpap-record-factory.c
+index 8174338..3d0c87a 100644
+--- a/src/dmap/grl-dpap-record-factory.c
++++ b/src/dmap/grl-dpap-record-factory.c
+@@ -22,9 +22,9 @@
+ #include "grl-dpap-record.h"
+
+ DMAPRecord *
+-grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
++grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
+ {
+- return DMAP_RECORD (grl_dpap_record_new ());
++ return DMAP_RECORD (grl_dpap_record_new ());
+ }
+
+ static void
+@@ -40,19 +40,19 @@ grl_dpap_record_factory_class_init (GrlDPAPRecordFactoryClass *klass)
+ static void
+ grl_dpap_record_factory_interface_init (gpointer iface, gpointer data)
+ {
+- DMAPRecordFactoryIface *factory = iface;
++ DMAPRecordFactoryIface *factory = iface;
+
+- g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
++ g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY);
+
+- factory->create = grl_dpap_record_factory_create;
++ factory->create = grl_dpap_record_factory_create;
+ }
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecordFactory, grl_dpap_record_factory, G_TYPE_OBJECT,
+- G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY,
+- grl_dpap_record_factory_interface_init))
++ G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY,
++ grl_dpap_record_factory_interface_init))
+
+ GrlDPAPRecordFactory *
+ grl_dpap_record_factory_new (void)
+ {
+- return SIMPLE_DPAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DPAP_RECORD_FACTORY, NULL));
++ return SIMPLE_DPAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DPAP_RECORD_FACTORY, NULL));
+ }
+diff --git a/src/dmap/grl-dpap-record-factory.h b/src/dmap/grl-dpap-record-factory.h
+index c2106b1..3f4ca54 100644
+--- a/src/dmap/grl-dpap-record-factory.h
++++ b/src/dmap/grl-dpap-record-factory.h
+@@ -25,30 +25,29 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_SIMPLE_DPAP_RECORD_FACTORY \
+- (grl_dpap_record_factory_get_type ())
++#define TYPE_SIMPLE_DPAP_RECORD_FACTORY (grl_dpap_record_factory_get_type ())
+
+-#define SIMPLE_DPAP_RECORD_FACTORY(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST((o), \
+- TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
+- GrlDPAPRecordFactory))
++#define SIMPLE_DPAP_RECORD_FACTORY(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
++ GrlDPAPRecordFactory))
+
+-#define SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
+- GrlDPAPRecordFactoryClass))
++#define SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
++ GrlDPAPRecordFactoryClass))
+
+-#define IS_SIMPLE_DPAP_RECORD_FACTORY(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
++#define IS_SIMPLE_DPAP_RECORD_FACTORY(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+ TYPE_SIMPLE_DPAP_RECORD_FACTORY))
+
+-#define IS_SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_SIMPLE_DPAP_RECORD_FACTORY_CLASS))
++#define IS_SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_SIMPLE_DPAP_RECORD_FACTORY_CLASS))
+
+-#define SIMPLE_DPAP_RECORD_FACTORY_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
++#define SIMPLE_DPAP_RECORD_FACTORY_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_SIMPLE_DPAP_RECORD_FACTORY, \
+ GrlDPAPRecordFactoryClass))
+
+ typedef struct GrlDPAPRecordFactoryPrivate GrlDPAPRecordFactoryPrivate;
+@@ -61,11 +60,11 @@ typedef struct {
+ GObjectClass parent;
+ } GrlDPAPRecordFactoryClass;
+
+-GType grl_dpap_record_factory_get_type (void);
++GType grl_dpap_record_factory_get_type (void);
+
+-GrlDPAPRecordFactory *grl_dpap_record_factory_new (void);
++GrlDPAPRecordFactory *grl_dpap_record_factory_new (void);
+
+-DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
++DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
+
+ #endif /* __SIMPLE_DPAP_RECORD_FACTORY */
+
+diff --git a/src/dmap/grl-dpap-record.c b/src/dmap/grl-dpap-record.c
+index 6281417..14eb1de 100644
+--- a/src/dmap/grl-dpap-record.c
++++ b/src/dmap/grl-dpap-record.c
+@@ -61,9 +61,9 @@ G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecord, grl_dpap_record, G_TYPE_OBJECT,
+
+ static void
+ grl_dpap_record_set_property (GObject *object,
+- guint prop_id,
+- const GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ const GValue *value,
++ GParamSpec *pspec)
+ {
+ GrlDPAPRecord *record = SIMPLE_DPAP_RECORD (object);
+
+@@ -116,9 +116,9 @@ grl_dpap_record_set_property (GObject *object,
+
+ static void
+ grl_dpap_record_get_property (GObject *object,
+- guint prop_id,
+- GValue *value,
+- GParamSpec *pspec)
++ guint prop_id,
++ GValue *value,
++ GParamSpec *pspec)
+ {
+ GrlDPAPRecord *record = SIMPLE_DPAP_RECORD (object);
+
+diff --git a/src/dmap/grl-dpap-record.h b/src/dmap/grl-dpap-record.h
+index 4441740..203e57e 100644
+--- a/src/dmap/grl-dpap-record.h
++++ b/src/dmap/grl-dpap-record.h
+@@ -25,36 +25,35 @@
+
+ G_BEGIN_DECLS
+
+-#define TYPE_SIMPLE_DPAP_RECORD \
+- (grl_dpap_record_get_type ())
+-
+-#define SIMPLE_DPAP_RECORD(o) \
+- (G_TYPE_CHECK_INSTANCE_CAST((o), \
+- TYPE_SIMPLE_DPAP_RECORD, \
+- GrlDPAPRecord))
+-
+-#define SIMPLE_DPAP_RECORD_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_CAST((k), \
+- TYPE_SIMPLE_DPAP_RECORD, \
+- GrlDPAPRecordClass))
+-
+-#define IS_SIMPLE_DPAP_RECORD(o) \
+- (G_TYPE_CHECK_INSTANCE_TYPE((o), \
+- TYPE_SIMPLE_DPAP_RECORD))
+-
+-#define IS_SIMPLE_DPAP_RECORD_CLASS(k) \
+- (G_TYPE_CHECK_CLASS_TYPE((k), \
+- TYPE_SIMPLE_DPAP_RECORD_CLASS))
+-
+-#define SIMPLE_DPAP_RECORD_GET_CLASS(o) \
+- (G_TYPE_INSTANCE_GET_CLASS((o), \
+- TYPE_SIMPLE_DPAP_RECORD, \
++#define TYPE_SIMPLE_DPAP_RECORD (grl_dpap_record_get_type ())
++
++#define SIMPLE_DPAP_RECORD(o) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((o), \
++ TYPE_SIMPLE_DPAP_RECORD, \
++ GrlDPAPRecord))
++
++#define SIMPLE_DPAP_RECORD_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_CAST ((k), \
++ TYPE_SIMPLE_DPAP_RECORD, \
+ GrlDPAPRecordClass))
+
+-#define SIMPLE_DPAP_RECORD_GET_PRIVATE(o) \
+- (G_TYPE_INSTANCE_GET_PRIVATE((o), \
+- TYPE_SIMPLE_DPAP_RECORD, \
+- GrlDPAPRecordPrivate))
++#define IS_SIMPLE_DPAP_RECORD(o) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
++ TYPE_SIMPLE_DPAP_RECORD))
++
++#define IS_SIMPLE_DPAP_RECORD_CLASS(k) \
++ (G_TYPE_CHECK_CLASS_TYPE ((k), \
++ TYPE_SIMPLE_DPAP_RECORD_CLASS))
++
++#define SIMPLE_DPAP_RECORD_GET_CLASS(o) \
++ (G_TYPE_INSTANCE_GET_CLASS ((o), \
++ TYPE_SIMPLE_DPAP_RECORD, \
++ GrlDPAPRecordClass))
++
++#define SIMPLE_DPAP_RECORD_GET_PRIVATE(o) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), \
++ TYPE_SIMPLE_DPAP_RECORD, \
++ GrlDPAPRecordPrivate))
+
+ typedef struct GrlDPAPRecordPrivate GrlDPAPRecordPrivate;
+
+@@ -69,9 +68,9 @@ typedef struct {
+
+ GType grl_dpap_record_get_type (void);
+
+-GrlDPAPRecord *grl_dpap_record_new (void);
+-GInputStream *grl_dpap_record_read (DPAPRecord *record, GError **error);
+-gint grl_dpap_record_get_id (DPAPRecord *record);
++GrlDPAPRecord *grl_dpap_record_new (void);
++GInputStream *grl_dpap_record_read (DPAPRecord *record, GError **error);
++gint grl_dpap_record_get_id (DPAPRecord *record);
+
+ #endif /* __SIMPLE_DPAP_RECORD */
+
+diff --git a/src/dmap/grl-dpap.c b/src/dmap/grl-dpap.c
+index 744de80..9829ec2 100644
+--- a/src/dmap/grl-dpap.c
++++ b/src/dmap/grl-dpap.c
+@@ -42,7 +42,7 @@
+ /* --------- Logging -------- */
+
+ #define GRL_LOG_DOMAIN_DEFAULT dmap_log_domain
+-GRL_LOG_DOMAIN_STATIC(dmap_log_domain);
++GRL_LOG_DOMAIN_STATIC (dmap_log_domain);
+
+ /* --- Plugin information --- */
+
+@@ -51,10 +51,10 @@ GRL_LOG_DOMAIN_STATIC(dmap_log_domain);
+
+ /* --- Grilo DPAP Private --- */
+
+-#define GRL_DPAP_SOURCE_GET_PRIVATE(object) \
+- (G_TYPE_INSTANCE_GET_PRIVATE((object), \
+- GRL_DPAP_SOURCE_TYPE, \
+- GrlDpapSourcePrivate))
++#define GRL_DPAP_SOURCE_GET_PRIVATE(object) \
++ (G_TYPE_INSTANCE_GET_PRIVATE ((object), \
++ GRL_DPAP_SOURCE_TYPE, \
++ GrlDpapSourcePrivate))
+
+ struct _GrlDpapSourcePrivate {
+ DMAPMdnsBrowserService *service;
+@@ -116,19 +116,19 @@ grl_dpap_plugin_init (GrlRegistry *registry,
+ sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+ g_signal_connect (G_OBJECT (browser),
+- "service-added",
++ "service-added",
+ G_CALLBACK (grl_dpap_service_added_cb),
+ (gpointer) plugin);
+
+ g_signal_connect (G_OBJECT (browser),
+- "service-removed",
++ "service-removed",
+ G_CALLBACK (grl_dpap_service_removed_cb),
+ (gpointer) plugin);
+
+ if (!dmap_mdns_browser_start (browser, &error)) {
+ GRL_DEBUG ("error starting browser. code: %d message: %s",
+- error->code,
+- error->message);
++ error->code,
++ error->message);
+ g_error_free (error);
+
+ g_hash_table_unref (connections);
+@@ -143,12 +143,12 @@ grl_dpap_plugin_init (GrlRegistry *registry,
+ GRL_PLUGIN_DEFINE (GRL_MAJOR,
+ GRL_MINOR,
+ DPAP_PLUGIN_ID,
+- "DPAP",
+- "A plugin for browsing DPAP servers",
+- "W. Michael Petullo",
++ "DPAP",
++ "A plugin for browsing DPAP servers",
++ "W. Michael Petullo",
+ VERSION,
+- "LGPL",
+- "http://www.flyn.org",
++ "LGPL",
++ "http://www.flyn.org",
+ grl_dpap_plugin_init,
+ NULL,
+ NULL);
+@@ -171,10 +171,10 @@ grl_dpap_source_new (DMAPMdnsBrowserService *service)
+ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
+
+ source = g_object_new (GRL_DPAP_SOURCE_TYPE,
+- "source-id", source_id,
+- "source-name", service->name,
+- "source-desc", source_desc,
+- "supported-media", GRL_SUPPORTED_MEDIA_IMAGE,
++ "source-id", source_id,
++ "source-name", service->name,
++ "source-desc", source_desc,
++ "supported-media", GRL_SUPPORTED_MEDIA_IMAGE,
+ NULL);
+
+ source->priv->service = service;
+@@ -214,14 +214,14 @@ grl_dpap_source_finalize (GObject *object)
+ static void
+ grl_dpap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
+ {
+- grl_dpap_db_browse(GRL_DPAP_DB(cb_and_db->db),
+- cb_and_db->cb.container,
+- cb_and_db->cb.source,
+- cb_and_db->cb.op_id,
+- cb_and_db->cb.skip,
+- cb_and_db->cb.count,
+- cb_and_db->cb.callback,
+- cb_and_db->cb.user_data);
++ grl_dpap_db_browse (GRL_DPAP_DB (cb_and_db->db),
++ cb_and_db->cb.container,
++ cb_and_db->cb.source,
++ cb_and_db->cb.op_id,
++ cb_and_db->cb.skip,
++ cb_and_db->cb.count,
++ cb_and_db->cb.callback,
++ cb_and_db->cb.user_data);
+
+ g_free (cb_and_db);
+ }
+@@ -229,13 +229,13 @@ grl_dpap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
+ static void
+ grl_dpap_do_search (ResultCbAndArgsAndDb *cb_and_db)
+ {
+- grl_dpap_db_search(GRL_DPAP_DB(cb_and_db->db),
+- cb_and_db->cb.source,
+- cb_and_db->cb.op_id,
+- (GHRFunc) cb_and_db->cb.predicate,
+- cb_and_db->cb.predicate_data,
+- cb_and_db->cb.callback,
+- cb_and_db->cb.user_data);
++ grl_dpap_db_search (GRL_DPAP_DB (cb_and_db->db),
++ cb_and_db->cb.source,
++ cb_and_db->cb.op_id,
++ (GHRFunc) cb_and_db->cb.predicate,
++ cb_and_db->cb.predicate_data,
++ cb_and_db->cb.callback,
++ cb_and_db->cb.user_data);
+
+ g_free (cb_and_db);
+ }
+diff --git a/src/dmap/grl-dpap.h b/src/dmap/grl-dpap.h
+index 1f36cfc..ee596b5 100644
+--- a/src/dmap/grl-dpap.h
++++ b/src/dmap/grl-dpap.h
+@@ -26,31 +26,30 @@
+
+ #include <grilo.h>
+
+-#define GRL_DPAP_SOURCE_TYPE \
+- (grl_dpap_source_get_type ())
++#define GRL_DPAP_SOURCE_TYPE (grl_dpap_source_get_type ())
+
+-#define GRL_DPAP_SOURCE(obj) \
+- (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+- GRL_DPAP_SOURCE_TYPE, \
+- GrlDpapSource))
++#define GRL_DPAP_SOURCE(obj) \
++ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
++ GRL_DPAP_SOURCE_TYPE, \
++ GrlDpapSource))
+
+-#define GRL_IS_DPAP_SOURCE(obj) \
+- (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+- GRL_DPAP_SOURCE_TYPE))
++#define GRL_IS_DPAP_SOURCE(obj) \
++ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
++ GRL_DPAP_SOURCE_TYPE))
+
+-#define GRL_DPAP_SOURCE_CLASS(klass) \
+- (G_TYPE_CHECK_CLASS_CAST((klass), \
+- GRL_DPAP_SOURCE_TYPE, \
+- GrlDpapSourceClass))
++#define GRL_DPAP_SOURCE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_CAST ((klass), \
++ GRL_DPAP_SOURCE_TYPE, \
++ GrlDpapSourceClass))
+
+-#define GRL_IS_DPAP_SOURCE_CLASS(klass) \
+- (G_TYPE_CHECK_CLASS_TYPE((klass), \
+- GRL_DPAP_SOURCE_TYPE))
++#define GRL_IS_DPAP_SOURCE_CLASS(klass) \
++ (G_TYPE_CHECK_CLASS_TYPE ((klass), \
++ GRL_DPAP_SOURCE_TYPE))
+
+-#define GRL_DPAP_SOURCE_GET_CLASS(obj) \
+- (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+- GRL_DPAP_SOURCE_TYPE, \
+- GrlDpapSourceClass))
++#define GRL_DPAP_SOURCE_GET_CLASS(obj) \
++ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
++ GRL_DPAP_SOURCE_TYPE, \
++ GrlDpapSourceClass))
+
+ typedef struct _GrlDpapSourcePrivate GrlDpapSourcePrivate;
+ typedef struct _GrlDpapSource GrlDpapSource;
--- /dev/null
+diff --git a/meson.build b/meson.build
+index 33a6f40..8a590b9 100644
+--- a/meson.build
++++ b/meson.build
+@@ -62,7 +62,12 @@ gstreamer_dep = dependency('gstreamer-1.0', required: false)
+ gthread_dep = dependency('gthread-2.0', required: false)
+ json_glib_dep = dependency('json-glib-1.0', required: false)
+ libarchive_dep = dependency('libarchive', required: false)
+-libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false)
++libdmapsharing4_dep = dependency('libdmapsharing-4.0', version: '>= 3.9.4', required: false)
++if libdmapsharing4_dep.found()
++ libdmapsharing_dep = libdmapsharing4_dep
++else
++ libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false)
++endif
+ libgdata_dep = dependency('libgdata', version: '>= 0.9.1', required: false)
+ libmediaart_dep = dependency('libmediaart-2.0', required: false)
+ libsoup_dep = dependency('libsoup-2.4', required: false)
+diff --git a/src/dmap/grl-common.c b/src/dmap/grl-common.c
+index 6a1da5e..74a965f 100644
+--- a/src/dmap/grl-common.c
++++ b/src/dmap/grl-common.c
+@@ -33,13 +33,27 @@
+ #include <stdlib.h>
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-dmap-compat.h"
+ #include "grl-common.h"
+
+ gchar *
+-grl_dmap_build_url (DMAPMdnsBrowserService *service)
++grl_dmap_build_url (DmapMdnsService *service)
+ {
+- return g_strdup_printf ("%s://%s:%u",
+- service->service_name,
+- service->host,
+- service->port);
++ gchar *url = NULL;
++ gchar *service_name, *host;
++ guint port;
++
++ service_name = grl_dmap_service_get_service_name (service);
++ host = grl_dmap_service_get_host (service);
++ port = grl_dmap_service_get_port (service);
++
++ url = g_strdup_printf ("%s://%s:%u",
++ service_name,
++ host,
++ port);
++
++ g_free (service_name);
++ g_free (host);
++
++ return url;
+ }
+diff --git a/src/dmap/grl-common.h b/src/dmap/grl-common.h
+index e9c8327..d61df63 100644
+--- a/src/dmap/grl-common.h
++++ b/src/dmap/grl-common.h
+@@ -24,9 +24,6 @@
+ #ifndef _GRL_COMMON_H_
+ #define _GRL_COMMON_H_
+
+-#include <grilo.h>
+-#include <libdmapsharing/dmap.h>
+-
+ typedef struct {
+ GrlSourceResultCb callback;
+ GrlSource *source;
+@@ -41,9 +38,9 @@ typedef struct {
+
+ typedef struct {
+ ResultCbAndArgs cb;
+- DMAPDb *db;
++ DmapDb *db;
+ } ResultCbAndArgsAndDb;
+
+-gchar *grl_dmap_build_url (DMAPMdnsBrowserService *service);
++gchar *grl_dmap_build_url (DmapMdnsService *service);
+
+ #endif /* _GRL_COMMON_H_ */
+diff --git a/src/dmap/grl-daap-compat.h b/src/dmap/grl-daap-compat.h
+new file mode 100644
+index 0000000..da9025f
+--- /dev/null
++++ b/src/dmap/grl-daap-compat.h
+@@ -0,0 +1,76 @@
++/*
++ * Copyright (C) 2019 W. Michael Petullo
++ * Copyright (C) 2019 Igalia S.L.
++ *
++ * Contact: W. Michael Petullo <mike@flyn.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ *
++ */
++
++#ifndef _GRL_DAAP_COMPAT_H_
++#define _GRL_DAAP_COMPAT_H_
++
++#include "grl-dmap-compat.h"
++
++#ifdef LIBDMAPSHARING_COMPAT
++
++DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error);
++guint grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error);
++
++/* Building against libdmapsharing 3 API. */
++
++#define dmap_av_connection_new daap_connection_new
++#define DmapAvRecord DAAPRecord
++#define DmapAvRecordInterface DAAPRecordIface
++#define DMAP_AV_RECORD DAAP_RECORD
++#define DMAP_TYPE_AV_RECORD DAAP_TYPE_RECORD
++#define IS_DMAP_AV_RECORD IS_DAAP_RECORD
++
++static inline DmapRecord *
++grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data)
++{
++ return grl_daap_record_factory_create (factory, user_data, NULL);
++}
++
++static inline guint
++grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record)
++{
++ return grl_daap_db_add (_db, _record, NULL);
++}
++
++#else
++
++/* Building against libdmapsharing 4 API. */
++
++DmapRecord *grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
++guint grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error);
++
++static inline DmapRecord *
++grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error)
++{
++ return grl_daap_record_factory_create (factory, user_data, error);
++}
++
++static inline guint
++grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error)
++{
++ return grl_daap_db_add (_db, _record, error);
++}
++
++#endif
++
++#endif /* _GRL_DAAP_COMPAT_H_ */
+diff --git a/src/dmap/grl-daap-db.c b/src/dmap/grl-daap-db.c
+index f460113..315370e 100644
+--- a/src/dmap/grl-daap-db.c
++++ b/src/dmap/grl-daap-db.c
+@@ -54,8 +54,12 @@
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <glib.h>
++#include <grilo.h>
+ #include <string.h>
++#include <libdmapsharing/dmap.h>
+
++#include "grl-daap-compat.h"
++#include "grl-common.h"
+ #include "grl-daap-db.h"
+
+ #define ALBUMS_ID "albums"
+@@ -103,23 +107,23 @@ grl_daap_db_new (void)
+ return db;
+ }
+
+-static DMAPRecord *
+-grl_daap_db_lookup_by_id (const DMAPDb *db, guint id)
++static DmapRecord *
++grl_daap_db_lookup_by_id (const DmapDb *db, guint id)
+ {
+ g_error ("Not implemented");
+ return NULL;
+ }
+
+ static void
+-grl_daap_db_foreach (const DMAPDb *db,
+- GHFunc func,
++grl_daap_db_foreach (const DmapDb *db,
++ DmapIdRecordFunc func,
+ gpointer data)
+ {
+ g_error ("Not implemented");
+ }
+
+ static gint64
+-grl_daap_db_count (const DMAPDb *db)
++grl_daap_db_count (const DmapDb *db)
+ {
+ g_error ("Not implemented");
+ return 0;
+@@ -150,14 +154,14 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
+ g_object_unref (container);
+ }
+
+-static guint
+-grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
++guint
++grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error)
+ {
+ g_assert (IS_GRL_DAAP_DB (_db));
+- g_assert (IS_DAAP_RECORD (_record));
++ g_assert (IS_DMAP_AV_RECORD (_record));
+
+ GrlDAAPDb *db = GRL_DAAP_DB (_db);
+- DAAPRecord *record = DAAP_RECORD (_record);
++ DmapAvRecord *record = DMAP_AV_RECORD (_record);
+
+ gint duration = 0;
+ gint32 bitrate = 0,
+@@ -232,11 +236,11 @@ grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record)
+
+ g_free (id_s);
+ g_object_unref (media);
+- g_free(album);
+- g_free(artist);
+- g_free(genre);
+- g_free(title);
+- g_free(url);
++ g_free (album);
++ g_free (artist);
++ g_free (genre);
++ g_free (title);
++ g_free (url);
+
+ return --nextid;
+ }
+@@ -359,11 +363,11 @@ grl_daap_db_search (GrlDAAPDb *db,
+ static void
+ dmap_db_interface_init (gpointer iface, gpointer data)
+ {
+- DMAPDbIface *daap_db = iface;
++ DmapDbInterface *daap_db = iface;
+
+ g_assert (G_TYPE_FROM_INTERFACE (daap_db) == DMAP_TYPE_DB);
+
+- daap_db->add = grl_daap_db_add;
++ daap_db->add = grl_daap_db_add_compat;
+ daap_db->lookup_by_id = grl_daap_db_lookup_by_id;
+ daap_db->foreach = grl_daap_db_foreach;
+ daap_db->count = grl_daap_db_count;
+diff --git a/src/dmap/grl-daap-db.h b/src/dmap/grl-daap-db.h
+index 2548c50..1a37a3a 100644
+--- a/src/dmap/grl-daap-db.h
++++ b/src/dmap/grl-daap-db.h
+@@ -24,6 +24,8 @@
+ #include <libdmapsharing/dmap.h>
+ #include <grilo.h>
+
++#include "grl-daap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_GRL_DAAP_DB (grl_daap_db_get_type ())
+diff --git a/src/dmap/grl-daap-record-factory.c b/src/dmap/grl-daap-record-factory.c
+index 648fd85..d0c590f 100644
+--- a/src/dmap/grl-daap-record-factory.c
++++ b/src/dmap/grl-daap-record-factory.c
+@@ -1,5 +1,5 @@
+ /*
+- * DAAPRecord factory class
++ * DmapAvRecord factory class
+ *
+ * Copyright (C) 2008 W. Michael Petullo <mike@flyn.org>
+ *
+@@ -18,11 +18,16 @@
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <grilo.h>
++#include <libdmapsharing/dmap.h>
++
++#include "grl-daap-compat.h"
++#include "grl-common.h"
+ #include "grl-daap-record-factory.h"
+ #include "grl-daap-record.h"
+
+-DMAPRecord *
+-grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
++DmapRecord *
++grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error)
+ {
+ return DMAP_RECORD (grl_daap_record_new ());
+ }
+@@ -40,11 +45,11 @@ grl_daap_record_factory_class_init (GrlDAAPRecordFactoryClass *klass)
+ static void
+ grl_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 = grl_daap_record_factory_create;
++ factory->create = grl_daap_record_factory_create_compat;
+ }
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecordFactory, grl_daap_record_factory, G_TYPE_OBJECT,
+diff --git a/src/dmap/grl-daap-record-factory.h b/src/dmap/grl-daap-record-factory.h
+index 45aa69a..f114bad 100644
+--- a/src/dmap/grl-daap-record-factory.h
++++ b/src/dmap/grl-daap-record-factory.h
+@@ -23,6 +23,8 @@
+
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-daap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_SIMPLE_DAAP_RECORD_FACTORY (grl_daap_record_factory_get_type ())
+@@ -64,8 +66,6 @@ GType grl_daap_record_factory_get_type (void);
+
+ GrlDAAPRecordFactory *grl_daap_record_factory_new (void);
+
+-DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
+-
+ #endif /* __SIMPLE_DAAP_RECORD_FACTORY */
+
+ G_END_DECLS
+diff --git a/src/dmap/grl-daap-record.c b/src/dmap/grl-daap-record.c
+index 82bf2f9..4fa0c54 100644
+--- a/src/dmap/grl-daap-record.c
++++ b/src/dmap/grl-daap-record.c
+@@ -20,6 +20,11 @@
+ *
+ */
+
++#include <grilo.h>
++#include <libdmapsharing/dmap.h>
++
++#include "grl-daap-compat.h"
++#include "grl-common.h"
+ #include "grl-daap-record.h"
+
+ struct GrlDAAPRecordPrivate {
+@@ -226,7 +231,7 @@ grl_daap_record_new (void)
+ }
+
+ GInputStream *
+-grl_daap_record_read (DAAPRecord *record, GError **error)
++grl_daap_record_read (DmapAvRecord *record, GError **error)
+ {
+ GFile *file;
+ GInputStream *stream;
+@@ -280,9 +285,9 @@ grl_daap_record_class_init (GrlDAAPRecordClass *klass)
+ static void
+ grl_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->read = grl_daap_record_read;
+ }
+@@ -290,7 +295,7 @@ grl_daap_record_daap_iface_init (gpointer iface, gpointer data)
+ static void
+ grl_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);
+ }
+@@ -298,7 +303,7 @@ grl_daap_record_dmap_iface_init (gpointer iface, gpointer data)
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecord, grl_daap_record, G_TYPE_OBJECT,
+ G_ADD_PRIVATE (GrlDAAPRecord)
+- G_IMPLEMENT_INTERFACE (DAAP_TYPE_RECORD, grl_daap_record_daap_iface_init)
++ G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD, grl_daap_record_daap_iface_init)
+ G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_daap_record_dmap_iface_init))
+
+ static void
+diff --git a/src/dmap/grl-daap-record.h b/src/dmap/grl-daap-record.h
+index 7aae82d..42782b1 100644
+--- a/src/dmap/grl-daap-record.h
++++ b/src/dmap/grl-daap-record.h
+@@ -23,6 +23,8 @@
+
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-daap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_SIMPLE_DAAP_RECORD (grl_daap_record_get_type ())
+@@ -69,8 +71,8 @@ typedef struct {
+ GType grl_daap_record_get_type (void);
+
+ GrlDAAPRecord *grl_daap_record_new (void);
+-GInputStream *grl_daap_record_read (DAAPRecord *record, GError **error);
+-gint grl_daap_record_get_id (DAAPRecord *record);
++GInputStream *grl_daap_record_read (DmapAvRecord *record, GError **error);
++gint grl_daap_record_get_id (DmapAvRecord *record);
+
+ #endif /* __SIMPLE_DAAP_RECORD */
+
+diff --git a/src/dmap/grl-daap.c b/src/dmap/grl-daap.c
+index f3c4115..962f2b8 100644
+--- a/src/dmap/grl-daap.c
++++ b/src/dmap/grl-daap.c
+@@ -33,6 +33,7 @@
+ #include <stdlib.h>
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-daap-compat.h"
+ #include "grl-common.h"
+ #include "grl-daap.h"
+ #include "grl-daap-db.h"
+@@ -52,12 +53,12 @@ GRL_LOG_DOMAIN_STATIC (daap_log_domain);
+ /* --- Grilo DAAP Private --- */
+
+ struct _GrlDaapSourcePrivate {
+- DMAPMdnsBrowserService *service;
++ DmapMdnsService *service;
+ };
+
+ /* --- Data types --- */
+
+-static GrlDaapSource *grl_daap_source_new (DMAPMdnsBrowserService *service);
++static GrlDaapSource *grl_daap_source_new (DmapMdnsService *service);
+
+ static void grl_daap_source_finalize (GObject *object);
+
+@@ -74,16 +75,16 @@ static void grl_daap_source_search (GrlSource *source,
+ GrlSourceSearchSpec *ss);
+
+
+-static void grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
+- DMAPMdnsBrowserService *service,
++static void grl_daap_service_added_cb (DmapMdnsBrowser *browser,
++ DmapMdnsService *service,
+ GrlPlugin *plugin);
+
+-static void grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
++static void grl_daap_service_removed_cb (DmapMdnsBrowser *browser,
+ const gchar *service_name,
+ GrlPlugin *plugin);
+
+ /* ===================== Globals ======================= */
+-static DMAPMdnsBrowser *browser;
++static DmapMdnsBrowser *browser;
+ /* Maps URIs to DBs */
+ static GHashTable *connections;
+ /* Map DAAP services to Grilo media sources */
+@@ -106,7 +107,7 @@ grl_daap_plugin_init (GrlRegistry *registry,
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+
+- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP);
++ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DAAP);
+ connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+ sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+@@ -153,8 +154,10 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR,
+ G_DEFINE_TYPE_WITH_PRIVATE (GrlDaapSource, grl_daap_source, GRL_TYPE_SOURCE)
+
+ static GrlDaapSource *
+-grl_daap_source_new (DMAPMdnsBrowserService *service)
++grl_daap_source_new (DmapMdnsService *service)
+ {
++ gchar *name;
++ gchar *service_name;
+ gchar *source_desc;
+ gchar *source_id;
+
+@@ -162,12 +165,15 @@ grl_daap_source_new (DMAPMdnsBrowserService *service)
+
+ GRL_DEBUG ("grl_daap_source_new");
+
+- source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name);
+- source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
++ name = grl_dmap_service_get_name (service);
++ service_name = grl_dmap_service_get_service_name (service);
++
++ source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name);
++ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name);
+
+ source = g_object_new (GRL_DAAP_SOURCE_TYPE,
+ "source-id", source_id,
+- "source-name", service->name,
++ "source-name", service_name,
+ "source-desc", source_desc,
+ "supported-media", GRL_SUPPORTED_MEDIA_AUDIO,
+ NULL);
+@@ -176,6 +182,8 @@ grl_daap_source_new (DMAPMdnsBrowserService *service)
+
+ g_free (source_desc);
+ g_free (source_id);
++ g_free (service_name);
++ g_free (name);
+
+ return source;
+ }
+@@ -209,7 +217,7 @@ grl_daap_source_finalize (GObject *object)
+ static void
+ grl_daap_do_browse (ResultCbAndArgsAndDb *cb_and_db)
+ {
+- grl_daap_db_browse (GRL_DAAP_DB(cb_and_db->db),
++ grl_daap_db_browse (GRL_DAAP_DB (cb_and_db->db),
+ cb_and_db->cb.container,
+ cb_and_db->cb.source,
+ cb_and_db->cb.op_id,
+@@ -236,7 +244,7 @@ grl_daap_do_search (ResultCbAndArgsAndDb *cb_and_db)
+ }
+
+ static void
+-browse_connected_cb (DMAPConnection *connection,
++browse_connected_cb (DmapConnection *connection,
+ gboolean result,
+ const char *reason,
+ ResultCbAndArgsAndDb *cb_and_db)
+@@ -261,7 +269,7 @@ browse_connected_cb (DMAPConnection *connection,
+ }
+
+ static void
+-search_connected_cb (DMAPConnection *connection,
++search_connected_cb (DmapConnection *connection,
+ gboolean result,
+ const char *reason,
+ ResultCbAndArgsAndDb *cb_and_db)
+@@ -286,8 +294,8 @@ search_connected_cb (DMAPConnection *connection,
+ }
+
+ static void
+-grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
+- DMAPMdnsBrowserService *service,
++grl_daap_service_added_cb (DmapMdnsBrowser *browser,
++ DmapMdnsService *service,
+ GrlPlugin *plugin)
+ {
+ GrlRegistry *registry = grl_registry_get_default ();
+@@ -301,13 +309,16 @@ grl_daap_service_added_cb (DMAPMdnsBrowser *browser,
+ GRL_SOURCE (source),
+ NULL);
+ if (source != NULL) {
+- g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source));
++ gchar *name;
++ name = grl_dmap_service_get_name (service);
++ g_hash_table_insert (sources, g_strdup (name), g_object_ref (source));
+ g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source);
++ g_free (name);
+ }
+ }
+
+ static void
+-grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
++grl_daap_service_removed_cb (DmapMdnsBrowser *browser,
+ const gchar *service_name,
+ GrlPlugin *plugin)
+ {
+@@ -323,14 +334,14 @@ grl_daap_service_removed_cb (DMAPMdnsBrowser *browser,
+ }
+
+ static void
+-grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback)
++grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback)
+ {
+- DMAPRecordFactory *factory;
+- DMAPConnection *connection;
++ DmapRecordFactory *factory;
++ DmapConnection *connection;
+
+ factory = DMAP_RECORD_FACTORY (grl_daap_record_factory_new ());
+- connection = DMAP_CONNECTION (daap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
+- dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db);
++ connection = DMAP_CONNECTION (dmap_av_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
++ dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db);
+ }
+
+ static gboolean
+@@ -397,15 +408,25 @@ grl_daap_source_browse (GrlSource *source,
+ browse_connected_cb (NULL, TRUE, NULL, cb_and_db);
+ } else {
+ /* Connect */
++ gchar *name, *host;
++ guint port;
++
+ cb_and_db->db = DMAP_DB (grl_daap_db_new ());
+
+- grl_daap_connect (dmap_source->priv->service->name,
+- dmap_source->priv->service->host,
+- dmap_source->priv->service->port,
++ name = grl_dmap_service_get_name (dmap_source->priv->service);
++ host = grl_dmap_service_get_host (dmap_source->priv->service);
++ port = grl_dmap_service_get_port (dmap_source->priv->service);
++
++ grl_daap_connect (name,
++ host,
++ port,
+ cb_and_db,
+- (DMAPConnectionCallback) browse_connected_cb);
++ (DmapConnectionFunc) browse_connected_cb);
+
+ g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
++
++ g_free (name);
++ g_free (host);
+ }
+
+ g_free (url);
+@@ -417,7 +438,7 @@ static void grl_daap_source_search (GrlSource *source,
+ GrlDaapSource *dmap_source = GRL_DAAP_SOURCE (source);
+
+ ResultCbAndArgsAndDb *cb_and_db;
+- DMAPMdnsBrowserService *service = dmap_source->priv->service;
++ DmapMdnsService *service = dmap_source->priv->service;
+ gchar *url = grl_dmap_build_url (service);
+
+ cb_and_db = g_new (ResultCbAndArgsAndDb, 1);
+@@ -435,9 +456,25 @@ static void grl_daap_source_search (GrlSource *source,
+ search_connected_cb (NULL, TRUE, NULL, cb_and_db);
+ } else {
+ /* Connect */
++ gchar *name, *host;
++ guint port;
++
+ cb_and_db->db = DMAP_DB (grl_daap_db_new ());
+- grl_daap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb);
++
++ name = grl_dmap_service_get_name (dmap_source->priv->service);
++ host = grl_dmap_service_get_host (dmap_source->priv->service);
++ port = grl_dmap_service_get_port (dmap_source->priv->service);
++
++ grl_daap_connect (name,
++ host,
++ port,
++ cb_and_db,
++ (DmapConnectionFunc) search_connected_cb);
++
+ g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
++
++ g_free (name);
++ g_free (host);
+ }
+
+ g_free (url);
+diff --git a/src/dmap/grl-daap.h b/src/dmap/grl-daap.h
+index 1119495..5271435 100644
+--- a/src/dmap/grl-daap.h
++++ b/src/dmap/grl-daap.h
+@@ -26,6 +26,8 @@
+
+ #include <grilo.h>
+
++#include "grl-daap-compat.h"
++
+ #define GRL_DAAP_SOURCE_TYPE (grl_daap_source_get_type ())
+
+ #define GRL_DAAP_SOURCE(obj) \
+diff --git a/src/dmap/grl-dmap-compat.h b/src/dmap/grl-dmap-compat.h
+new file mode 100644
+index 0000000..cd1934f
+--- /dev/null
++++ b/src/dmap/grl-dmap-compat.h
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (C) 2019 W. Michael Petullo
++ * Copyright (C) 2019 Igalia S.L.
++ *
++ * Contact: W. Michael Petullo <mike@flyn.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ *
++ */
++
++#ifndef _GRL_DMAP_COMPAT_H_
++#define _GRL_DMAP_COMPAT_H_
++
++#ifdef LIBDMAPSHARING_COMPAT
++
++/* Building against libdmapsharing 3 API. */
++
++#define DmapConnection DMAPConnection
++#define DmapConnectionFunc DMAPConnectionCallback
++#define dmap_connection_start dmap_connection_connect
++#define DmapDb DMAPDb
++#define DmapDbInterface DMAPDbIface
++#define DmapIdRecordFunc GHFunc
++#define DmapMdnsBrowser DMAPMdnsBrowser
++#define DmapMdnsService DMAPMdnsBrowserService
++#define DMAP_MDNS_SERVICE_TYPE_DAAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP
++#define DMAP_MDNS_SERVICE_TYPE_DPAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP
++#define DmapRecord DMAPRecord
++#define DmapRecordFactory DMAPRecordFactory
++#define DmapRecordFactoryInterface DMAPRecordFactoryIface
++#define DmapRecordInterface DMAPRecordIface
++
++static inline gchar *
++grl_dmap_service_get_name (DmapMdnsService *service)
++{
++ return g_strdup (service->name);
++}
++
++static inline gchar *
++grl_dmap_service_get_service_name (DmapMdnsService *service)
++{
++ return g_strdup (service->service_name);
++}
++
++static inline gchar *
++grl_dmap_service_get_host (DmapMdnsService *service)
++{
++ return g_strdup (service->host);
++}
++
++static inline guint
++grl_dmap_service_get_port (DmapMdnsService *service)
++{
++ return service->port;
++}
++
++#else
++
++/* Building against libdmapsharing 4 API. */
++
++static inline gchar *
++grl_dmap_service_get_name (DmapMdnsService *service)
++{
++ gchar *name;
++ g_object_get (service, "name", &name, NULL);
++ return name;
++}
++
++static inline gchar *
++grl_dmap_service_get_service_name (DmapMdnsService *service)
++{
++ gchar *service_name;
++ g_object_get (service, "service-name", &service_name, NULL);
++ return service_name;
++}
++
++static inline gchar *
++grl_dmap_service_get_host (DmapMdnsService *service)
++{
++ gchar *host;
++ g_object_get (service, "host", &host, NULL);
++ return host;
++}
++
++static inline guint
++grl_dmap_service_get_port (DmapMdnsService *service)
++{
++ guint port;
++ g_object_get (service, "port", &port, NULL);
++ return port;
++}
++
++#endif
++
++#endif /* _GRL_DMAP_COMPAT_H_ */
+diff --git a/src/dmap/grl-dpap-compat.h b/src/dmap/grl-dpap-compat.h
+new file mode 100644
+index 0000000..b996464
+--- /dev/null
++++ b/src/dmap/grl-dpap-compat.h
+@@ -0,0 +1,116 @@
++/*
++ * Copyright (C) 2019 W. Michael Petullo
++ * Copyright (C) 2019 Igalia S.L.
++ *
++ * Contact: W. Michael Petullo <mike@flyn.org>
++ *
++ * This library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library 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
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA
++ *
++ */
++
++#ifndef _GRL_DPAP_COMPAT_H_
++#define _GRL_DPAP_COMPAT_H_
++
++#include "grl-dmap-compat.h"
++
++#ifdef LIBDMAPSHARING_COMPAT
++
++DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error);
++guint grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error);
++
++/* Building against libdmapsharing 3 API. */
++
++#define dmap_image_connection_new dpap_connection_new
++#define DmapImageRecord DPAPRecord
++#define DmapImageRecordInterface DPAPRecordIface
++#define DMAP_IMAGE_RECORD DPAP_RECORD
++#define DMAP_TYPE_IMAGE_RECORD DPAP_TYPE_RECORD
++#define IS_DMAP_IMAGE_RECORD IS_DPAP_RECORD
++
++static inline DmapRecord *
++grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data)
++{
++ return grl_dpap_record_factory_create (factory, user_data, NULL);
++}
++
++static inline void
++set_thumbnail (GValue *value, GByteArray *thumbnail)
++{
++ g_value_set_pointer (value, thumbnail);
++}
++
++static inline GByteArray *
++get_thumbnail (GByteArray *thumbnail, const GValue *value)
++{
++ if (thumbnail)
++ g_byte_array_unref (thumbnail);
++ return g_byte_array_ref (g_value_get_pointer (value));
++}
++
++static inline void
++unref_thumbnail (GByteArray *thumbnail)
++{
++ g_byte_array_unref (thumbnail);
++}
++
++static inline guint
++grl_dpap_db_add_compat (DMAPDb *_db, DmapRecord *_record)
++{
++ return grl_dpap_db_add (_db, _record, NULL);
++}
++
++#else
++
++/* Building against libdmapsharing 4 API. */
++
++DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
++guint grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error);
++
++static inline void
++set_thumbnail (GValue *value, GArray *thumbnail)
++{
++ g_value_set_boxed (value, thumbnail);
++}
++
++static inline GArray *
++get_thumbnail (GArray *thumbnail, const GValue *value)
++{
++ if (thumbnail)
++ g_array_unref (thumbnail);
++ return g_value_get_boxed (value);
++}
++
++static inline void
++unref_thumbnail (GArray *thumbnail)
++{
++ g_array_unref (thumbnail);
++}
++
++static inline DmapRecord *
++grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error)
++{
++ return grl_dpap_record_factory_create (factory, user_data, error);
++}
++
++static inline guint
++grl_dpap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error)
++{
++ return grl_dpap_db_add (_db, _record, error);
++}
++
++#endif
++
++#endif /* _GRL_DPAP_COMPAT_H_ */
+diff --git a/src/dmap/grl-dpap-db.c b/src/dmap/grl-dpap-db.c
+index 8be278b..cd647ee 100644
+--- a/src/dmap/grl-dpap-db.c
++++ b/src/dmap/grl-dpap-db.c
+@@ -24,12 +24,16 @@
+ #include "config.h"
+ #endif
+
++#include <grilo.h>
+ #include <glib/gi18n-lib.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <glib.h>
+ #include <string.h>
++#include <libdmapsharing/dmap.h>
+
++#include "grl-dpap-compat.h"
++#include "grl-common.h"
+ #include "grl-dpap-db.h"
+
+ #define PHOTOS_ID "photos"
+@@ -71,23 +75,23 @@ grl_dpap_db_new (void)
+ return db;
+ }
+
+-static DMAPRecord *
+-grl_dpap_db_lookup_by_id (const DMAPDb *db, guint id)
++static DmapRecord *
++grl_dpap_db_lookup_by_id (const DmapDb *db, guint id)
+ {
+ g_warning ("Not implemented");
+ return NULL;
+ }
+
+ static void
+-grl_dpap_db_foreach (const DMAPDb *db,
+- GHFunc func,
++grl_dpap_db_foreach (const DmapDb *db,
++ DmapIdRecordFunc func,
+ gpointer data)
+ {
+ g_warning ("Not implemented");
+ }
+
+ static gint64
+-grl_dpap_db_count (const DMAPDb *db)
++grl_dpap_db_count (const DmapDb *db)
+ {
+ g_warning ("Not implemented");
+ return 0;
+@@ -118,21 +122,21 @@ set_insert (GHashTable *category, const char *category_name, char *set_name, Grl
+ g_object_unref (container);
+ }
+
+-static guint
+-grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
++guint
++grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error)
+ {
+ g_assert (IS_GRL_DPAP_DB (_db));
+- g_assert (IS_DPAP_RECORD (_record));
++ g_assert (IS_DMAP_IMAGE_RECORD (_record));
+
+ GrlDPAPDb *db = GRL_DPAP_DB (_db);
+- DPAPRecord *record = DPAP_RECORD (_record);
++ DmapImageRecord *record = DMAP_IMAGE_RECORD (_record);
+
+ gint height = 0,
+ width = 0,
+ largefilesize = 0,
+ creationdate = 0,
+ rating = 0;
+- GByteArray *thumbnail = NULL;
++ GArray *thumbnail = NULL;
+ gchar *id_s = NULL,
+ *filename = NULL,
+ *aspectratio = NULL,
+@@ -177,12 +181,12 @@ grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record)
+
+ g_free (id_s);
+ g_object_unref (media);
+- g_free(filename);
+- g_free(aspectratio);
+- g_free(format);
+- g_free(comments);
+- g_free(url);
+- g_byte_array_unref(thumbnail);
++ g_free (filename);
++ g_free (aspectratio);
++ g_free (format);
++ g_free (comments);
++ g_free (url);
++ g_array_unref (thumbnail);
+
+ return --nextid;
+ }
+@@ -298,11 +302,11 @@ grl_dpap_db_search (GrlDPAPDb *db,
+ static void
+ dmap_db_interface_init (gpointer iface, gpointer data)
+ {
+- DMAPDbIface *dpap_db = iface;
++ DmapDbInterface *dpap_db = iface;
+
+ g_assert (G_TYPE_FROM_INTERFACE (dpap_db) == DMAP_TYPE_DB);
+
+- dpap_db->add = grl_dpap_db_add;
++ dpap_db->add = grl_dpap_db_add_compat;
+ dpap_db->lookup_by_id = grl_dpap_db_lookup_by_id;
+ dpap_db->foreach = grl_dpap_db_foreach;
+ dpap_db->count = grl_dpap_db_count;
+diff --git a/src/dmap/grl-dpap-db.h b/src/dmap/grl-dpap-db.h
+index d3abcba..a21ad7a 100644
+--- a/src/dmap/grl-dpap-db.h
++++ b/src/dmap/grl-dpap-db.h
+@@ -24,6 +24,8 @@
+ #include <libdmapsharing/dmap.h>
+ #include <grilo.h>
+
++#include "grl-dpap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_GRL_DPAP_DB (grl_dpap_db_get_type ())
+diff --git a/src/dmap/grl-dpap-record-factory.c b/src/dmap/grl-dpap-record-factory.c
+index 3d0c87a..860d957 100644
+--- a/src/dmap/grl-dpap-record-factory.c
++++ b/src/dmap/grl-dpap-record-factory.c
+@@ -18,11 +18,18 @@
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
++#include <grilo.h>
++#include <libdmapsharing/dmap.h>
++
++#include "grl-dpap-compat.h"
++#include "grl-common.h"
+ #include "grl-dpap-record-factory.h"
+ #include "grl-dpap-record.h"
+
+-DMAPRecord *
+-grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data)
++DmapRecord *
++grl_dpap_record_factory_create (DmapRecordFactory *factory,
++ gpointer user_data,
++ GError **error)
+ {
+ return DMAP_RECORD (grl_dpap_record_new ());
+ }
+@@ -40,11 +47,11 @@ grl_dpap_record_factory_class_init (GrlDPAPRecordFactoryClass *klass)
+ static void
+ grl_dpap_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 = grl_dpap_record_factory_create;
++ factory->create = grl_dpap_record_factory_create_compat;
+ }
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecordFactory, grl_dpap_record_factory, G_TYPE_OBJECT,
+diff --git a/src/dmap/grl-dpap-record-factory.h b/src/dmap/grl-dpap-record-factory.h
+index 3f4ca54..899fd0a 100644
+--- a/src/dmap/grl-dpap-record-factory.h
++++ b/src/dmap/grl-dpap-record-factory.h
+@@ -23,6 +23,8 @@
+
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-dpap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_SIMPLE_DPAP_RECORD_FACTORY (grl_dpap_record_factory_get_type ())
+@@ -64,7 +66,7 @@ GType grl_dpap_record_factory_get_type (void);
+
+ GrlDPAPRecordFactory *grl_dpap_record_factory_new (void);
+
+-DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data);
++DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error);
+
+ #endif /* __SIMPLE_DPAP_RECORD_FACTORY */
+
+diff --git a/src/dmap/grl-dpap-record.c b/src/dmap/grl-dpap-record.c
+index 14eb1de..0afb2b8 100644
+--- a/src/dmap/grl-dpap-record.c
++++ b/src/dmap/grl-dpap-record.c
+@@ -20,6 +20,11 @@
+ *
+ */
+
++#include <grilo.h>
++#include <libdmapsharing/dmap.h>
++
++#include "grl-dpap-compat.h"
++#include "grl-common.h"
+ #include "grl-dpap-record.h"
+
+ struct GrlDPAPRecordPrivate {
+@@ -28,7 +33,7 @@ struct GrlDPAPRecordPrivate {
+ gint creationdate;
+ gint rating;
+ char *filename;
+- GByteArray *thumbnail;
++ void *thumbnail; /* GByteArray or GArray, depending on libdmapsharing ver. */
+ char *aspectratio;
+ gint height;
+ gint width;
+@@ -56,7 +61,7 @@ static void grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data);
+
+ G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecord, grl_dpap_record, G_TYPE_OBJECT,
+ G_ADD_PRIVATE (GrlDPAPRecord)
+- G_IMPLEMENT_INTERFACE (DPAP_TYPE_RECORD, grl_dpap_record_dpap_iface_init)
++ G_IMPLEMENT_INTERFACE (DMAP_TYPE_IMAGE_RECORD, grl_dpap_record_dpap_iface_init)
+ G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_dpap_record_dmap_iface_init))
+
+ static void
+@@ -104,9 +109,7 @@ grl_dpap_record_set_property (GObject *object,
+ record->priv->comments = g_value_dup_string (value);
+ break;
+ case PROP_THUMBNAIL:
+- if (record->priv->thumbnail)
+- g_byte_array_unref (record->priv->thumbnail);
+- record->priv->thumbnail = g_byte_array_ref (g_value_get_pointer (value));
++ record->priv->thumbnail = get_thumbnail (record->priv->thumbnail, value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+@@ -154,7 +157,7 @@ grl_dpap_record_get_property (GObject *object,
+ g_value_set_static_string (value, record->priv->comments);
+ break;
+ case PROP_THUMBNAIL:
+- g_value_set_pointer (value, record->priv->thumbnail);
++ set_thumbnail (value, record->priv->thumbnail);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+@@ -169,7 +172,7 @@ grl_dpap_record_new (void)
+ }
+
+ GInputStream *
+-grl_dpap_record_read (DPAPRecord *record, GError **error)
++grl_dpap_record_read (DmapImageRecord *record, GError **error)
+ {
+ GFile *file;
+ GInputStream *stream;
+@@ -215,9 +218,9 @@ grl_dpap_record_class_init (GrlDPAPRecordClass *klass)
+ static void
+ grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data)
+ {
+- DPAPRecordIface *dpap_record = iface;
++ DmapImageRecordInterface *dpap_record = iface;
+
+- g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DPAP_TYPE_RECORD);
++ g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DMAP_TYPE_IMAGE_RECORD);
+
+ dpap_record->read = grl_dpap_record_read;
+ }
+@@ -225,7 +228,7 @@ grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data)
+ static void
+ grl_dpap_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);
+ }
+@@ -242,7 +245,7 @@ grl_dpap_record_finalize (GObject *object)
+ g_free (record->priv->comments);
+
+ if (record->priv->thumbnail)
+- g_byte_array_unref (record->priv->thumbnail);
++ unref_thumbnail (record->priv->thumbnail);
+
+ G_OBJECT_CLASS (grl_dpap_record_parent_class)->finalize (object);
+ }
+diff --git a/src/dmap/grl-dpap-record.h b/src/dmap/grl-dpap-record.h
+index 203e57e..77eece0 100644
+--- a/src/dmap/grl-dpap-record.h
++++ b/src/dmap/grl-dpap-record.h
+@@ -23,6 +23,8 @@
+
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-dpap-compat.h"
++
+ G_BEGIN_DECLS
+
+ #define TYPE_SIMPLE_DPAP_RECORD (grl_dpap_record_get_type ())
+@@ -69,8 +71,8 @@ typedef struct {
+ GType grl_dpap_record_get_type (void);
+
+ GrlDPAPRecord *grl_dpap_record_new (void);
+-GInputStream *grl_dpap_record_read (DPAPRecord *record, GError **error);
+-gint grl_dpap_record_get_id (DPAPRecord *record);
++GInputStream *grl_dpap_record_read (DmapImageRecord *record, GError **error);
++gint grl_dpap_record_get_id (DmapImageRecord *record);
+
+ #endif /* __SIMPLE_DPAP_RECORD */
+
+diff --git a/src/dmap/grl-dpap.c b/src/dmap/grl-dpap.c
+index 9829ec2..6339654 100644
+--- a/src/dmap/grl-dpap.c
++++ b/src/dmap/grl-dpap.c
+@@ -33,6 +33,7 @@
+ #include <stdlib.h>
+ #include <libdmapsharing/dmap.h>
+
++#include "grl-dpap-compat.h"
+ #include "grl-common.h"
+ #include "grl-dpap.h"
+ #include "grl-dpap-db.h"
+@@ -57,12 +58,12 @@ GRL_LOG_DOMAIN_STATIC (dmap_log_domain);
+ GrlDpapSourcePrivate))
+
+ struct _GrlDpapSourcePrivate {
+- DMAPMdnsBrowserService *service;
++ DmapMdnsService *service;
+ };
+
+ /* --- Data types --- */
+
+-static GrlDpapSource *grl_dpap_source_new (DMAPMdnsBrowserService *service);
++static GrlDpapSource *grl_dpap_source_new (DmapMdnsService *service);
+
+ static void grl_dpap_source_finalize (GObject *object);
+
+@@ -79,16 +80,16 @@ static void grl_dpap_source_search (GrlSource *source,
+ GrlSourceSearchSpec *ss);
+
+
+-static void grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
+- DMAPMdnsBrowserService *service,
++static void grl_dpap_service_added_cb (DmapMdnsBrowser *browser,
++ DmapMdnsService *service,
+ GrlPlugin *plugin);
+
+-static void grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
++static void grl_dpap_service_removed_cb (DmapMdnsBrowser *browser,
+ const gchar *service_name,
+ GrlPlugin *plugin);
+
+ /* ===================== Globals ======================= */
+-static DMAPMdnsBrowser *browser;
++static DmapMdnsBrowser *browser;
+ /* Maps URIs to DBs */
+ static GHashTable *connections;
+ /* Map DPAP services to Grilo media sources */
+@@ -111,7 +112,7 @@ grl_dpap_plugin_init (GrlRegistry *registry,
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+
+- browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP);
++ browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DPAP);
+ connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+ sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+
+@@ -158,8 +159,10 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR,
+ G_DEFINE_TYPE_WITH_PRIVATE (GrlDpapSource, grl_dpap_source, GRL_TYPE_SOURCE)
+
+ static GrlDpapSource *
+-grl_dpap_source_new (DMAPMdnsBrowserService *service)
++grl_dpap_source_new (DmapMdnsService *service)
+ {
++ gchar *name;
++ gchar *service_name;
+ gchar *source_desc;
+ gchar *source_id;
+
+@@ -167,12 +170,14 @@ grl_dpap_source_new (DMAPMdnsBrowserService *service)
+
+ GRL_DEBUG ("grl_dpap_source_new");
+
+- source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name);
+- source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name);
++ name = grl_dmap_service_get_name (service);
++ service_name = grl_dmap_service_get_service_name (service);
++ source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name);
++ source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name);
+
+ source = g_object_new (GRL_DPAP_SOURCE_TYPE,
+ "source-id", source_id,
+- "source-name", service->name,
++ "source-name", service_name,
+ "source-desc", source_desc,
+ "supported-media", GRL_SUPPORTED_MEDIA_IMAGE,
+ NULL);
+@@ -181,6 +186,8 @@ grl_dpap_source_new (DMAPMdnsBrowserService *service)
+
+ g_free (source_desc);
+ g_free (source_id);
++ g_free (service_name);
++ g_free (name);
+
+ return source;
+ }
+@@ -241,7 +248,7 @@ grl_dpap_do_search (ResultCbAndArgsAndDb *cb_and_db)
+ }
+
+ static void
+-browse_connected_cb (DMAPConnection *connection,
++browse_connected_cb (DmapConnection *connection,
+ gboolean result,
+ const char *reason,
+ ResultCbAndArgsAndDb *cb_and_db)
+@@ -266,7 +273,7 @@ browse_connected_cb (DMAPConnection *connection,
+ }
+
+ static void
+-search_connected_cb (DMAPConnection *connection,
++search_connected_cb (DmapConnection *connection,
+ gboolean result,
+ const char *reason,
+ ResultCbAndArgsAndDb *cb_and_db)
+@@ -291,8 +298,8 @@ search_connected_cb (DMAPConnection *connection,
+ }
+
+ static void
+-grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
+- DMAPMdnsBrowserService *service,
++grl_dpap_service_added_cb (DmapMdnsBrowser *browser,
++ DmapMdnsService *service,
+ GrlPlugin *plugin)
+ {
+ GrlRegistry *registry = grl_registry_get_default ();
+@@ -306,13 +313,16 @@ grl_dpap_service_added_cb (DMAPMdnsBrowser *browser,
+ GRL_SOURCE (source),
+ NULL);
+ if (source != NULL) {
+- g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source));
++ gchar *name;
++ name = grl_dmap_service_get_name (service);
++ g_hash_table_insert (sources, g_strdup (name), g_object_ref (source));
+ g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source);
++ g_free (name);
+ }
+ }
+
+ static void
+-grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
++grl_dpap_service_removed_cb (DmapMdnsBrowser *browser,
+ const gchar *service_name,
+ GrlPlugin *plugin)
+ {
+@@ -328,14 +338,14 @@ grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser,
+ }
+
+ static void
+-grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback)
++grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback)
+ {
+- DMAPRecordFactory *factory;
+- DMAPConnection *connection;
++ DmapRecordFactory *factory;
++ DmapConnection *connection;
+
+ factory = DMAP_RECORD_FACTORY (grl_dpap_record_factory_new ());
+- connection = DMAP_CONNECTION (dpap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
+- dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db);
++ connection = DMAP_CONNECTION (dmap_image_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory));
++ dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db);
+ }
+
+ static gboolean
+@@ -396,15 +406,25 @@ grl_dpap_source_browse (GrlSource *source,
+ browse_connected_cb (NULL, TRUE, NULL, cb_and_db);
+ } else {
+ /* Connect */
++ gchar *name, *host;
++ guint port;
++
+ cb_and_db->db = DMAP_DB (grl_dpap_db_new ());
+
+- grl_dpap_connect (dmap_source->priv->service->name,
+- dmap_source->priv->service->host,
+- dmap_source->priv->service->port,
++ name = grl_dmap_service_get_name (dmap_source->priv->service);
++ host = grl_dmap_service_get_host (dmap_source->priv->service);
++ port = grl_dmap_service_get_port (dmap_source->priv->service);
++
++ grl_dpap_connect (name,
++ host,
++ port,
+ cb_and_db,
+- (DMAPConnectionCallback) browse_connected_cb);
++ (DmapConnectionFunc) browse_connected_cb);
+
+ g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
++
++ g_free (name);
++ g_free (host);
+ }
+
+ g_free (url);
+@@ -416,7 +436,7 @@ static void grl_dpap_source_search (GrlSource *source,
+ GrlDpapSource *dmap_source = GRL_DPAP_SOURCE (source);
+
+ ResultCbAndArgsAndDb *cb_and_db;
+- DMAPMdnsBrowserService *service = dmap_source->priv->service;
++ DmapMdnsService *service = dmap_source->priv->service;
+ gchar *url = grl_dmap_build_url (service);
+
+ cb_and_db = g_new (ResultCbAndArgsAndDb, 1);
+@@ -434,9 +454,25 @@ static void grl_dpap_source_search (GrlSource *source,
+ search_connected_cb (NULL, TRUE, NULL, cb_and_db);
+ } else {
+ /* Connect */
++ gchar *name, *host;
++ guint port;
++
+ cb_and_db->db = DMAP_DB (grl_dpap_db_new ());
+- grl_dpap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb);
++
++ name = grl_dmap_service_get_name (dmap_source->priv->service);
++ host = grl_dmap_service_get_host (dmap_source->priv->service);
++ port = grl_dmap_service_get_port (dmap_source->priv->service);
++
++ grl_dpap_connect (name,
++ host,
++ port,
++ cb_and_db,
++ (DmapConnectionFunc) search_connected_cb);
++
+ g_hash_table_insert (connections, g_strdup (url), cb_and_db->db);
++
++ g_free (name);
++ g_free (host);
+ }
+
+ g_free (url);
+diff --git a/src/dmap/grl-dpap.h b/src/dmap/grl-dpap.h
+index ee596b5..30cd61e 100644
+--- a/src/dmap/grl-dpap.h
++++ b/src/dmap/grl-dpap.h
+@@ -26,6 +26,8 @@
+
+ #include <grilo.h>
+
++#include "grl-dpap-compat.h"
++
+ #define GRL_DPAP_SOURCE_TYPE (grl_dpap_source_get_type ())
+
+ #define GRL_DPAP_SOURCE(obj) \
+diff --git a/src/dmap/meson.build b/src/dmap/meson.build
+index 2907a80..817ff5d 100644
+--- a/src/dmap/meson.build
++++ b/src/dmap/meson.build
+@@ -31,6 +31,15 @@ dpap_sources = [
+ 'grl-dpap.h',
+ ]
+
++args = [
++ '-DG_LOG_DOMAIN="GrlDmap"',
++ '-DHAVE_CONFIG_H',
++]
++
++if not libdmapsharing4_dep.found()
++ args += '-DLIBDMAPSHARING_COMPAT'
++endif
++
+ configure_file(output: 'config.h',
+ configuration: cdata)
+
+@@ -39,17 +48,11 @@ shared_library('grldaap',
+ install: true,
+ install_dir: pluginsdir,
+ dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS],
+- c_args: [
+- '-DG_LOG_DOMAIN="GrlDmap"',
+- '-DHAVE_CONFIG_H',
+- ])
++ c_args: args)
+
+ shared_library('grldpap',
+ sources: dpap_sources,
+ install: true,
+ install_dir: pluginsdir,
+ dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS],
+- c_args: [
+- '-DG_LOG_DOMAIN="GrlDmap"',
+- '-DHAVE_CONFIG_H',
+- ])
++ c_args: args)