]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Reorganise D-BUS interface code and introduce an MPRIS interface.
authorMike Brady <mikebrady@eircom.net>
Sun, 19 Nov 2017 16:08:39 +0000 (16:08 +0000)
committerMike Brady <mikebrady@eircom.net>
Sun, 19 Nov 2017 16:08:39 +0000 (16:08 +0000)
17 files changed:
Makefile.am
common.h
configure.ac
org.mpris.MediaPlayer2.Player.xml [new file with mode: 0755]
org.mpris.MediaPlayer2.xml [new file with mode: 0755]
player.c
scripts/shairport-sync.conf
shairport-sync-dbus-policy.conf
shairport-sync-dbus-service.c
shairport-sync-dbus-service.h
shairport-sync-mpris-interface.c [new file with mode: 0644]
shairport-sync-mpris-interface.h [new file with mode: 0644]
shairport-sync-mpris-player-interface.c [new file with mode: 0644]
shairport-sync-mpris-player-interface.h [new file with mode: 0644]
shairport-sync-mpris-service.c [new file with mode: 0644]
shairport-sync-mpris-service.h [new file with mode: 0644]
shairport.c

index b8dc383a8c94fe2f45af58664e867a72bfb3e4cd..189fa57c12e3027d2e0707e4ed5fb7fbb3bc36dc 100644 (file)
@@ -72,7 +72,7 @@ shairport_sync_SOURCES += mdns_dns_sd.c
 endif
 
 if USE_DBUS
-shairport_sync_SOURCES += shairport-sync-dbus-service.c shairport-sync-dbus-interface.c dacp.c
+shairport_sync_SOURCES += shairport-sync-dbus-service.c shairport-sync-dbus-interface.c
 BUILT_SOURCES = shairport-sync-dbus-interface.h shairport-sync-dbus-interface.c 
 # We don't want to install this header
 noinst_HEADERS = $(BUILT_SOURCES)
@@ -87,6 +87,32 @@ shairport-sync-dbus-interface.c:  org.gnome.ShairportSync.xml
        gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-dbus-interface org.gnome.ShairportSync.xml
 endif
 
+if USE_DBUS_CORE_AND_DACP
+shairport_sync_SOURCES += dacp.c
+endif
+
+if USE_MPRIS
+shairport_sync_SOURCES += shairport-sync-mpris-service.c shairport-sync-mpris-interface.c shairport-sync-mpris-player-interface.c
+BUILT_SOURCES = shairport-sync-mpris-interface.h shairport-sync-mpris-interface.c shairport-sync-mpris-player-interface.h shairport-sync-mpris-player-interface.c
+# We don't want to install this header
+noinst_HEADERS = $(BUILT_SOURCES)
+# Correctly clean the generated headers, but keep the xml description
+CLEANFILES = $(BUILT_SOURCES)
+
+#Rule to generate the binding headers
+shairport-sync-mpris-interface.h:  org.mpris.MediaPlayer2.xml
+       gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-interface org.mpris.MediaPlayer2.xml
+
+shairport-sync-mpris-interface.c:  org.mpris.MediaPlayer2.xml
+       gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-interface org.mpris.MediaPlayer2.xml
+
+shairport-sync-mpris-player-interface.h:  org.mpris.MediaPlayer2.Player.xml
+       gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-player-interface org.mpris.MediaPlayer2.Player.xml
+
+shairport-sync-mpris-player-interface.c:  org.mpris.MediaPlayer2.Player.xml
+       gdbus-codegen --interface-prefix org.gnome --generate-c-code shairport-sync-mpris-player-interface org.mpris.MediaPlayer2.Player.xml
+endif
+
 if USE_DBUS_CLIENT
  #Make it, but don't install it anywhere
 noinst_PROGRAMS = shairport-sync-dbus-test-client
index 0e02aa882bb98ace458c3a9c46a75d3716d40989..ed69d6db2b25bef80b5f564c7125e285c34dbeac 100644 (file)
--- a/common.h
+++ b/common.h
 #define SAFAMILY sa_family
 #endif
 
+#if defined(HAVE_DBUS) || defined(HAVE_MPRIS)
+enum dbus_session_type {
+  DBT_system = 0, // use the session bus
+  DBT_session,      // use the system bus
+} dbt_type;
+#endif
+
 enum endian_type {
   SS_LITTLE_ENDIAN = 0,
   SS_PDP_ENDIAN,
@@ -42,7 +49,7 @@ enum endian_type {
 enum stuffing_type {
   ST_basic = 0, // straight deletion or insertion of a frame in a 352-frame packet
   ST_soxr,      // use libsoxr to make a 352 frame packet one frame longer or shorter
-} type;
+} s_type;
 
 enum playback_mode_type {
   ST_stereo = 0,
@@ -73,6 +80,7 @@ enum sps_format_t {
 
 typedef struct {
   config_t *cfg;
+  char *appName; // normally the app is called shairport-syn, but it may be symlinked
   char *password;
   char *service_name; // the name for the shairport service, e.g. "Shairport Sync Version %v running
                       // on host %h"
@@ -158,6 +166,12 @@ typedef struct {
   int loudness;
   float loudness_reference_volume_db;
   int alsa_use_playback_switch_for_mute;
+#if defined(HAVE_DBUS)
+  enum dbus_session_type dbus_service_bus_type;
+#endif
+#if defined(HAVE_MPRIS)
+  enum dbus_session_type mpris_service_bus_type;
+#endif
 
 } shairport_cfg;
 
index 23959ad379196b15bf28b030ec29b903895fad50..66ea737df6e4eabf7bfa7306ebae39a5cc33567a 100644 (file)
@@ -283,6 +283,17 @@ AC_ARG_WITH(dbus-test-client, [  --with-dbus-test-client = compile dbus test cli
   ], )
 AM_CONDITIONAL([USE_DBUS_CLIENT], [test "x$HAS_DBUS_CLIENT" = "x1"])
 
+# Look for mpris flag
+AC_ARG_WITH(mpris, [  --with-mpris = choose mpris support], [
+  AC_MSG_RESULT(>>Including mpris support)
+  HAS_MPRIS=1
+  AC_DEFINE([HAVE_MPRIS], 1, [Needed by the compiler.])
+  PKG_CHECK_MODULES([GIO_UNIX], [gio-unix-2.0 >= 2.30.0],[CFLAGS="${GIO_UNIX_CFLAGS} ${CFLAGS}" LIBS="${GIO_UNIX_LIBS} ${LIBS}"],[AC_MSG_ERROR(dbus messaging support for mpris requires the glib 2.0 library -- libglib2.0-dev suggested!)])
+  ], )
+AM_CONDITIONAL([USE_MPRIS], [test "x$HAS_MPRIS" = "x1"])
+
+AM_CONDITIONAL([USE_DBUS_CORE_AND_DACP], [test "x$HAS_MPRIS" = "x1" -o "x$HAS_DBUS" = "x1"])
+
 if  test "x${with_systemd}" = xyes ; then
   # Find systemd unit dir
   AC_ARG_WITH([systemdsystemunitdir],
diff --git a/org.mpris.MediaPlayer2.Player.xml b/org.mpris.MediaPlayer2.Player.xml
new file mode 100755 (executable)
index 0000000..4e4c93c
--- /dev/null
@@ -0,0 +1,44 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+       <interface name='org.mpris.MediaPlayer2.Player'>
+               <method name='Next'/>
+               <method name='Previous'/>
+               <method name='Pause'/>
+               <method name='PlayPause'/>
+               <method name='Stop'/>
+                <method name='StopAfterCurrent'/> <!-- Cantata addition -->
+               <method name='Play'/>
+               <method name='Seek'>
+                       <arg direction='in' name='Offset' type='x'/>
+               </method>
+               <method name='SetPosition'>
+                       <arg direction='in' name='TrackId' type='o'/>
+                       <arg direction='in' name='Position' type='x'/>
+               </method>
+               <method name='OpenUri'>
+                       <arg direction='in' name='Uri' type='s'/>
+               </method>
+               <signal name='Seeked'>
+                       <arg name='Position' type='x'/>
+               </signal>
+               <property name='PlaybackStatus' type='s' access='read'/>
+               <property name='LoopStatus' type='s' access='readwrite'/>
+               <property name='Rate' type='d' access='readwrite'/>
+               <property name='Shuffle' type='b' access='readwrite'/>
+               <property name='Metadata' type='a{sv}' access='read'>
+                       <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
+               </property>
+               <property name='Volume' type='d' access='readwrite'/>
+               <property name='Position' type='x' access='read'/>
+               <property name='MinimumRate' type='d' access='read'/>
+               <property name='MaximumRate' type='d' access='read'/>
+               <property name='CanGoNext' type='b' access='read'/>
+               <property name='CanGoPrevious' type='b' access='read'/>
+               <property name='CanPlay' type='b' access='read'/>
+               <property name='CanPause' type='b' access='read'/>
+               <property name='CanSeek' type='b' access='read'/>
+               <property name='CanControl' type='b' access='read'/>
+       </interface>
+</node>
diff --git a/org.mpris.MediaPlayer2.xml b/org.mpris.MediaPlayer2.xml
new file mode 100755 (executable)
index 0000000..8f8d027
--- /dev/null
@@ -0,0 +1,25 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+
+<node>
+    <interface name="org.mpris.MediaPlayer2">
+        <method name="Raise"/>
+
+        <method name="Quit"/>
+
+        <property name="CanQuit" type="b" access="read"/>
+
+        <property name="CanRaise" type="b" access="read"/>
+
+        <property name="HasTrackList" type="b" access="read"/>
+
+        <property name="Identity" type="s" access="read"/>
+
+        <property name="DesktopEntry" type="s" access="read"/>
+
+        <property name="SupportedUriSchemes" type="as" access="read"/>
+
+        <property name="SupportedMimeTypes" type="as" access="read"/>
+    </interface>
+</node>
index 50241608e24482218f7cf3f58ff4c717d0690f9d..544542f81220de97cf68fcf8ed7b5c11142c3701 100644 (file)
--- a/player.c
+++ b/player.c
@@ -2485,7 +2485,7 @@ void player_volume(double airplay_volume, rtsp_conn_info *conn) {
   // %d.",overall_volume,relative_volume,actual_volume);
   // debug(1,"Our actual speaker volume is %d.",actual_volume);
   conn->dacp_volume = actual_volume; // this is needed to prevent a loop
-  shairport_sync_set_volume(SHAIRPORT_SYNC(skeleton), actual_volume);
+  shairport_sync_set_volume(SHAIRPORT_SYNC(shairportSyncSkeleton), actual_volume);
 #endif
   player_volume_without_notification(airplay_volume, conn);
 }
index 7b87191d4df6dcb6679d576dbb6fa2d89515cfda..62cd9df1a495d0d7d8163317e0d9ca7f7f6ada08 100644 (file)
@@ -42,6 +42,10 @@ general =
 //  audio_backend_latency_offset_in_seconds = 0.0; // Set this offset to compensate for a fixed delay in the audio back end. E.g. if the output device delays by 100 ms, set this to -0.1.
 //  audio_backend_buffer_desired_length_in_seconds = 0.15; // If set too small, buffer underflow occurs on low-powered machines. Too long and the response time to volume changes becomes annoying. Default is 0.15 seconds in the alsa backend, 0.35 seconds in the pa backend and 1.0 seconds otherwise.
 //  audio_backend_silent_lead_in_time = 2.0; // This optional advanced setting, from 0.0 and 4.0 seconds, sets the length of the period of silence that precedes the start of the audio. The default is the latency, usually 2.0 seconds. Values greater than the latency are ignored. Values that are too low will affect initial synchronisation.
+//  dbus_service_bus = "system"; // The Shairport Sync dbus interface, if selected at compilation, will appear
+//    as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
+//  mpris_service_bus = "system"; // The Shairport Sync mpris interface, if selected at compilation, will appear
+//    as "org.gnome.ShairportSync" on the whichever bus you specify here: "system" (default) or "session".
 };
 
 
index 497dd8852e98d3201b153f4d70765697e9418e5f..01e09521e90bf5440b63993dc6a463e1b5801a27 100644 (file)
@@ -7,12 +7,15 @@
   <!-- Only user shairport-sync can own the Shairport Sync service -->
   <policy user="shairport-sync">
     <allow own="org.gnome.ShairportSync"/>
+    <allow own="org.mpris.MediaPlayer2.ShairportSync"/>
   </policy>
 
   <!-- Allow anyone to invoke methods on Shairport Sync server -->
   <policy context="default">
     <allow send_destination="org.gnome.ShairportSync"/>
+    <allow send_destination="org.mpris.MediaPlayer2.ShairportSync"/>
     <allow receive_sender="org.gnome.ShairportSync"/>
+    <allow receive_sender="org.mpris.MediaPlayer2.ShairportSync"/>
   </policy>
 
 </busconfig>
index 1dbba650697cd0870096943328248fe8271ecacb..a89a967692dcb01ec44b2b19de5383e23d1b8cc6 100644 (file)
@@ -177,37 +177,59 @@ static gboolean on_handle_remote_command(ShairportSync *skeleton, GDBusMethodInv
   return TRUE;
 }
 
-static void on_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
 
-  skeleton = shairport_sync_skeleton_new();
+  debug(1,"Well-known interface name \"%s\" acquired for %s.",name,config.appName);
+  shairportSyncSkeleton = shairport_sync_skeleton_new();
 
-  g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(skeleton), connection,
+  g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncSkeleton), connection,
                                    "/org/gnome/ShairportSync", NULL);
 
-  shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(skeleton),
+  shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(shairportSyncSkeleton),
                                         config.loudness_reference_volume_db);
   debug(1, "Loudness threshold is %f.", config.loudness_reference_volume_db);
 
   if (config.loudness == 0) {
-    shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), FALSE);
+    shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(shairportSyncSkeleton), FALSE);
     debug(1, "Loudness is off");
   } else {
-    shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(skeleton), TRUE);
+    shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(shairportSyncSkeleton), TRUE);
     debug(1, "Loudness is on");
   }
 
-  g_signal_connect(skeleton, "notify::loudness-filter-active",
+  g_signal_connect(shairportSyncSkeleton, "notify::loudness-filter-active",
                    G_CALLBACK(notify_loudness_filter_active_callback), NULL);
-  g_signal_connect(skeleton, "notify::loudness-threshold",
+  g_signal_connect(shairportSyncSkeleton, "notify::loudness-threshold",
                    G_CALLBACK(notify_loudness_threshold_callback), NULL);
-  g_signal_connect(skeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
-  g_signal_connect(skeleton, "handle-remote-command", G_CALLBACK(on_handle_remote_command), NULL);
+  g_signal_connect(shairportSyncSkeleton, "notify::volume", G_CALLBACK(notify_volume_callback), NULL);
+  g_signal_connect(shairportSyncSkeleton, "handle-remote-command", G_CALLBACK(on_handle_remote_command), NULL);
+  debug(1,"Shairport Sync D-BUS service started on interface \"%s\".",name);
+}
+
+static void on_dbus_name_lost_again(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+  warn("Could not acquire an Shairport Sync D-BUS interface.");
+}
+
+static void on_dbus_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+  debug(1,"Could not acquire well-known interface name \"%s\" -- will try adding the process number to the end of it.",name);
+  pid_t pid = getpid();
+  char interface_name[256] = "";
+  sprintf(interface_name,"org.gnome.ShairportSync.i%d",pid);
+  GBusType dbus_bus_type = G_BUS_TYPE_SYSTEM;
+  if (config.dbus_service_bus_type==DBT_session)
+    dbus_bus_type = G_BUS_TYPE_SESSION;
+  debug(1,"Looking for well-known interface name \"%s\".",interface_name);
+  g_bus_own_name(dbus_bus_type, interface_name, G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
+                on_dbus_name_acquired, on_dbus_name_lost_again, NULL, NULL);
 }
 
 int start_dbus_service() {
-  skeleton = NULL;
-  g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.gnome.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
-                 on_name_acquired, NULL, NULL, NULL);
-  //  G_BUS_TYPE_SESSION or G_BUS_TYPE_SYSTEM
+  shairportSyncSkeleton = NULL;
+  GBusType dbus_bus_type = G_BUS_TYPE_SYSTEM;
+  if (config.dbus_service_bus_type==DBT_session)
+    dbus_bus_type = G_BUS_TYPE_SESSION;
+  debug(1,"Looking for well-known name \"org.gnome.ShairportSync\".");
+  g_bus_own_name(dbus_bus_type, "org.gnome.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
+                on_dbus_name_acquired, on_dbus_name_lost, NULL, NULL);
   return 0; // this is just to quieten a compiler warning
 }
index d029c7a0eb859bf8130ebc0a05b2ff7f6c6c990d..19d1b65b96e3eba90f6791a5f25e6e249b289e1e 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "shairport-sync-dbus-interface.h"
 
-ShairportSync *skeleton;
+ShairportSync *shairportSyncSkeleton;
 
 int start_dbus_service();
 
diff --git a/shairport-sync-mpris-interface.c b/shairport-sync-mpris-interface.c
new file mode 100644 (file)
index 0000000..9f9b991
--- /dev/null
@@ -0,0 +1,2068 @@
+/*
+ * Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "shairport-sync-mpris-interface.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+#  include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+  GDBusArgInfo parent_struct;
+  gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+  GDBusMethodInfo parent_struct;
+  const gchar *signal_name;
+  gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+  GDBusSignalInfo parent_struct;
+  const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+  GDBusPropertyInfo parent_struct;
+  const gchar *hyphen_name;
+  gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+  GDBusInterfaceInfo parent_struct;
+  const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  guint prop_id;
+  GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+  g_value_unset (&data->orig_value);
+  g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+  gboolean ret = FALSE;
+  guint n;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  if (g_strv_length (a) != g_strv_length (b))
+    goto out;
+  for (n = 0; a[n] != NULL; n++)
+    if (g_strcmp0 (a[n], b[n]) != 0)
+      goto out;
+  ret = TRUE;
+out:
+  return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+  gboolean ret = FALSE;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  ret = g_variant_equal (a, b);
+out:
+  return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+  gboolean ret = FALSE;
+  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+  switch (G_VALUE_TYPE (a))
+    {
+      case G_TYPE_BOOLEAN:
+        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+        break;
+      case G_TYPE_UCHAR:
+        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+        break;
+      case G_TYPE_INT:
+        ret = (g_value_get_int (a) == g_value_get_int (b));
+        break;
+      case G_TYPE_UINT:
+        ret = (g_value_get_uint (a) == g_value_get_uint (b));
+        break;
+      case G_TYPE_INT64:
+        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+        break;
+      case G_TYPE_UINT64:
+        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+        break;
+      case G_TYPE_DOUBLE:
+        {
+          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+          gdouble da = g_value_get_double (a);
+          gdouble db = g_value_get_double (b);
+          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+        }
+        break;
+      case G_TYPE_STRING:
+        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+        break;
+      case G_TYPE_VARIANT:
+        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+        break;
+      default:
+        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+        else
+          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+        break;
+    }
+  return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.mpris.MediaPlayer2
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:OrgMprisMediaPlayer2
+ * @title: OrgMprisMediaPlayer2
+ * @short_description: Generated C code for the org.mpris.MediaPlayer2 D-Bus interface
+ *
+ * This section contains code for working with the <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link> D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.mpris.MediaPlayer2 ---- */
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_method_info_raise =
+{
+  {
+    -1,
+    (gchar *) "Raise",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-raise",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_method_info_quit =
+{
+  {
+    -1,
+    (gchar *) "Quit",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-quit",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _org_mpris_media_player2_method_info_pointers[] =
+{
+  &_org_mpris_media_player2_method_info_raise,
+  &_org_mpris_media_player2_method_info_quit,
+  NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_can_quit =
+{
+  {
+    -1,
+    (gchar *) "CanQuit",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-quit",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_can_raise =
+{
+  {
+    -1,
+    (gchar *) "CanRaise",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-raise",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_has_track_list =
+{
+  {
+    -1,
+    (gchar *) "HasTrackList",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "has-track-list",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_identity =
+{
+  {
+    -1,
+    (gchar *) "Identity",
+    (gchar *) "s",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "identity",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_desktop_entry =
+{
+  {
+    -1,
+    (gchar *) "DesktopEntry",
+    (gchar *) "s",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "desktop-entry",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_supported_uri_schemes =
+{
+  {
+    -1,
+    (gchar *) "SupportedUriSchemes",
+    (gchar *) "as",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "supported-uri-schemes",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_property_info_supported_mime_types =
+{
+  {
+    -1,
+    (gchar *) "SupportedMimeTypes",
+    (gchar *) "as",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "supported-mime-types",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _org_mpris_media_player2_property_info_pointers[] =
+{
+  &_org_mpris_media_player2_property_info_can_quit,
+  &_org_mpris_media_player2_property_info_can_raise,
+  &_org_mpris_media_player2_property_info_has_track_list,
+  &_org_mpris_media_player2_property_info_identity,
+  &_org_mpris_media_player2_property_info_desktop_entry,
+  &_org_mpris_media_player2_property_info_supported_uri_schemes,
+  &_org_mpris_media_player2_property_info_supported_mime_types,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _org_mpris_media_player2_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.mpris.MediaPlayer2",
+    (GDBusMethodInfo **) &_org_mpris_media_player2_method_info_pointers,
+    NULL,
+    (GDBusPropertyInfo **) &_org_mpris_media_player2_property_info_pointers,
+    NULL
+  },
+  "org-mpris-media-player2",
+};
+
+
+/**
+ * org_mpris_media_player2_interface_info:
+ *
+ * Gets a machine-readable description of the <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link> D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+org_mpris_media_player2_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct;
+}
+
+/**
+ * org_mpris_media_player2_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #OrgMprisMediaPlayer2 interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+org_mpris_media_player2_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  g_object_class_override_property (klass, property_id_begin++, "can-quit");
+  g_object_class_override_property (klass, property_id_begin++, "can-raise");
+  g_object_class_override_property (klass, property_id_begin++, "has-track-list");
+  g_object_class_override_property (klass, property_id_begin++, "identity");
+  g_object_class_override_property (klass, property_id_begin++, "desktop-entry");
+  g_object_class_override_property (klass, property_id_begin++, "supported-uri-schemes");
+  g_object_class_override_property (klass, property_id_begin++, "supported-mime-types");
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * OrgMprisMediaPlayer2:
+ *
+ * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link>.
+ */
+
+/**
+ * OrgMprisMediaPlayer2Iface:
+ * @parent_iface: The parent interface.
+ * @handle_quit: Handler for the #OrgMprisMediaPlayer2::handle-quit signal.
+ * @handle_raise: Handler for the #OrgMprisMediaPlayer2::handle-raise signal.
+ * @get_can_quit: Getter for the #OrgMprisMediaPlayer2:can-quit property.
+ * @get_can_raise: Getter for the #OrgMprisMediaPlayer2:can-raise property.
+ * @get_desktop_entry: Getter for the #OrgMprisMediaPlayer2:desktop-entry property.
+ * @get_has_track_list: Getter for the #OrgMprisMediaPlayer2:has-track-list property.
+ * @get_identity: Getter for the #OrgMprisMediaPlayer2:identity property.
+ * @get_supported_mime_types: Getter for the #OrgMprisMediaPlayer2:supported-mime-types property.
+ * @get_supported_uri_schemes: Getter for the #OrgMprisMediaPlayer2:supported-uri-schemes property.
+ *
+ * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link>.
+ */
+
+typedef OrgMprisMediaPlayer2Iface OrgMprisMediaPlayer2Interface;
+G_DEFINE_INTERFACE (OrgMprisMediaPlayer2, org_mpris_media_player2, G_TYPE_OBJECT);
+
+static void
+org_mpris_media_player2_default_init (OrgMprisMediaPlayer2Iface *iface)
+{
+  /* GObject signals for incoming D-Bus method calls: */
+  /**
+   * OrgMprisMediaPlayer2::handle-raise:
+   * @object: A #OrgMprisMediaPlayer2.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Raise">Raise()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_complete_raise() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-raise",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2Iface, handle_raise),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2::handle-quit:
+   * @object: A #OrgMprisMediaPlayer2.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Quit">Quit()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_complete_quit() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-quit",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2Iface, handle_quit),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /* GObject properties for D-Bus properties: */
+  /**
+   * OrgMprisMediaPlayer2:can-quit:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanQuit">"CanQuit"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-quit", "CanQuit", "CanQuit", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:can-raise:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanRaise">"CanRaise"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-raise", "CanRaise", "CanRaise", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:has-track-list:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.HasTrackList">"HasTrackList"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("has-track-list", "HasTrackList", "HasTrackList", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:identity:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.Identity">"Identity"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_string ("identity", "Identity", "Identity", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:desktop-entry:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.DesktopEntry">"DesktopEntry"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_string ("desktop-entry", "DesktopEntry", "DesktopEntry", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:supported-uri-schemes:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedUriSchemes">"SupportedUriSchemes"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boxed ("supported-uri-schemes", "SupportedUriSchemes", "SupportedUriSchemes", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2:supported-mime-types:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedMimeTypes">"SupportedMimeTypes"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boxed ("supported-mime-types", "SupportedMimeTypes", "SupportedMimeTypes", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * org_mpris_media_player2_get_can_quit: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanQuit">"CanQuit"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_get_can_quit (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_can_quit (object);
+}
+
+/**
+ * org_mpris_media_player2_set_can_quit: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanQuit">"CanQuit"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_can_quit (OrgMprisMediaPlayer2 *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-quit", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_can_raise: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanRaise">"CanRaise"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_get_can_raise (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_can_raise (object);
+}
+
+/**
+ * org_mpris_media_player2_set_can_raise: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.CanRaise">"CanRaise"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_can_raise (OrgMprisMediaPlayer2 *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-raise", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_has_track_list: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.HasTrackList">"HasTrackList"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_get_has_track_list (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_has_track_list (object);
+}
+
+/**
+ * org_mpris_media_player2_set_has_track_list: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.HasTrackList">"HasTrackList"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_has_track_list (OrgMprisMediaPlayer2 *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "has-track-list", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_identity: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.Identity">"Identity"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_dup_identity() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *
+org_mpris_media_player2_get_identity (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_identity (object);
+}
+
+/**
+ * org_mpris_media_player2_dup_identity: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.Identity">"Identity"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
+ */
+gchar *
+org_mpris_media_player2_dup_identity (OrgMprisMediaPlayer2 *object)
+{
+  gchar *value;
+  g_object_get (G_OBJECT (object), "identity", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_set_identity: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.Identity">"Identity"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_identity (OrgMprisMediaPlayer2 *object, const gchar *value)
+{
+  g_object_set (G_OBJECT (object), "identity", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_desktop_entry: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.DesktopEntry">"DesktopEntry"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_dup_desktop_entry() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *
+org_mpris_media_player2_get_desktop_entry (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_desktop_entry (object);
+}
+
+/**
+ * org_mpris_media_player2_dup_desktop_entry: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.DesktopEntry">"DesktopEntry"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
+ */
+gchar *
+org_mpris_media_player2_dup_desktop_entry (OrgMprisMediaPlayer2 *object)
+{
+  gchar *value;
+  g_object_get (G_OBJECT (object), "desktop-entry", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_set_desktop_entry: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.DesktopEntry">"DesktopEntry"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_desktop_entry (OrgMprisMediaPlayer2 *object, const gchar *value)
+{
+  g_object_set (G_OBJECT (object), "desktop-entry", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_supported_uri_schemes: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedUriSchemes">"SupportedUriSchemes"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_dup_supported_uri_schemes() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *const *
+org_mpris_media_player2_get_supported_uri_schemes (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_supported_uri_schemes (object);
+}
+
+/**
+ * org_mpris_media_player2_dup_supported_uri_schemes: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedUriSchemes">"SupportedUriSchemes"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_strfreev().
+ */
+gchar **
+org_mpris_media_player2_dup_supported_uri_schemes (OrgMprisMediaPlayer2 *object)
+{
+  gchar **value;
+  g_object_get (G_OBJECT (object), "supported-uri-schemes", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_set_supported_uri_schemes: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedUriSchemes">"SupportedUriSchemes"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_supported_uri_schemes (OrgMprisMediaPlayer2 *object, const gchar *const *value)
+{
+  g_object_set (G_OBJECT (object), "supported-uri-schemes", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_get_supported_mime_types: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedMimeTypes">"SupportedMimeTypes"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_dup_supported_mime_types() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *const *
+org_mpris_media_player2_get_supported_mime_types (OrgMprisMediaPlayer2 *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE (object)->get_supported_mime_types (object);
+}
+
+/**
+ * org_mpris_media_player2_dup_supported_mime_types: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedMimeTypes">"SupportedMimeTypes"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_strfreev().
+ */
+gchar **
+org_mpris_media_player2_dup_supported_mime_types (OrgMprisMediaPlayer2 *object)
+{
+  gchar **value;
+  g_object_get (G_OBJECT (object), "supported-mime-types", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_set_supported_mime_types: (skip)
+ * @object: A #OrgMprisMediaPlayer2.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2.SupportedMimeTypes">"SupportedMimeTypes"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_set_supported_mime_types (OrgMprisMediaPlayer2 *object, const gchar *const *value)
+{
+  g_object_set (G_OBJECT (object), "supported-mime-types", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_call_raise:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Raise">Raise()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_call_raise_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_call_raise_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_call_raise (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Raise",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_call_raise_finish:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_call_raise().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_call_raise().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_call_raise_finish (
+    OrgMprisMediaPlayer2 *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_call_raise_sync:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Raise">Raise()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_call_raise() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_call_raise_sync (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Raise",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_call_quit:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Quit">Quit()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_call_quit_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_call_quit_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_call_quit (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Quit",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_call_quit_finish:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_call_quit().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_call_quit().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_call_quit_finish (
+    OrgMprisMediaPlayer2 *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_call_quit_sync:
+ * @proxy: A #OrgMprisMediaPlayer2Proxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Quit">Quit()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_call_quit() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_call_quit_sync (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Quit",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_complete_raise:
+ * @object: A #OrgMprisMediaPlayer2.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Raise">Raise()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_complete_raise (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_complete_quit:
+ * @object: A #OrgMprisMediaPlayer2.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2.Quit">Quit()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_complete_quit (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * OrgMprisMediaPlayer2Proxy:
+ *
+ * The #OrgMprisMediaPlayer2Proxy structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * OrgMprisMediaPlayer2ProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #OrgMprisMediaPlayer2Proxy.
+ */
+
+struct _OrgMprisMediaPlayer2ProxyPrivate
+{
+  GData *qdata;
+};
+
+static void org_mpris_media_player2_proxy_iface_init (OrgMprisMediaPlayer2Iface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2Proxy, org_mpris_media_player2_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (OrgMprisMediaPlayer2Proxy)
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2, org_mpris_media_player2_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2Proxy, org_mpris_media_player2_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2, org_mpris_media_player2_proxy_iface_init));
+
+#endif
+static void
+org_mpris_media_player2_proxy_finalize (GObject *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (org_mpris_media_player2_proxy_parent_class)->finalize (object);
+}
+
+static void
+org_mpris_media_player2_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  info = _org_mpris_media_player2_property_info_pointers[prop_id - 1];
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+  if (info->use_gvariant)
+    {
+      g_value_set_variant (value, variant);
+    }
+  else
+    {
+      if (variant != NULL)
+        g_dbus_gvariant_to_gvalue (variant, value);
+    }
+  if (variant != NULL)
+    g_variant_unref (variant);
+}
+
+static void
+org_mpris_media_player2_proxy_set_property_cb (GDBusProxy *proxy,
+  GAsyncResult *res,
+  gpointer      user_data)
+{
+  const _ExtendedGDBusPropertyInfo *info = user_data;
+  GError *error;
+  GVariant *_ret;
+  error = NULL;
+  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (!_ret)
+    {
+      g_warning ("Error setting property '%s' on interface org.mpris.MediaPlayer2: %s (%s, %d)",
+                 info->parent_struct.name, 
+                 error->message, g_quark_to_string (error->domain), error->code);
+      g_error_free (error);
+    }
+  else
+    {
+      g_variant_unref (_ret);
+    }
+}
+
+static void
+org_mpris_media_player2_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  info = _org_mpris_media_player2_property_info_pointers[prop_id - 1];
+  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+  g_dbus_proxy_call (G_DBUS_PROXY (object),
+    "org.freedesktop.DBus.Properties.Set",
+    g_variant_new ("(ssv)", "org.mpris.MediaPlayer2", info->parent_struct.name, variant),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    NULL, (GAsyncReadyCallback) org_mpris_media_player2_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
+  g_variant_unref (variant);
+}
+
+static void
+org_mpris_media_player2_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], TYPE_ORG_MPRIS_MEDIA_PLAYER2);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_ORG_MPRIS_MEDIA_PLAYER2);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+org_mpris_media_player2_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static gboolean 
+org_mpris_media_player2_proxy_get_can_quit (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanQuit");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_proxy_get_can_raise (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanRaise");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_proxy_get_has_track_list (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "HasTrackList");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_proxy_get_identity (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  const gchar *value = NULL;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Identity");
+  if (variant != NULL)
+    {
+      value = g_variant_get_string (variant, NULL);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_proxy_get_desktop_entry (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  const gchar *value = NULL;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "DesktopEntry");
+  if (variant != NULL)
+    {
+      value = g_variant_get_string (variant, NULL);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static const gchar *const *
+org_mpris_media_player2_proxy_get_supported_uri_schemes (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  const gchar *const *value = NULL;
+  value = g_datalist_get_data (&proxy->priv->qdata, "SupportedUriSchemes");
+  if (value != NULL)
+    return value;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SupportedUriSchemes");
+  if (variant != NULL)
+    {
+      value = g_variant_get_strv (variant, NULL);
+      g_datalist_set_data_full (&proxy->priv->qdata, "SupportedUriSchemes", (gpointer) value, g_free);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static const gchar *const *
+org_mpris_media_player2_proxy_get_supported_mime_types (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Proxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PROXY (object);
+  GVariant *variant;
+  const gchar *const *value = NULL;
+  value = g_datalist_get_data (&proxy->priv->qdata, "SupportedMimeTypes");
+  if (value != NULL)
+    return value;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SupportedMimeTypes");
+  if (variant != NULL)
+    {
+      value = g_variant_get_strv (variant, NULL);
+      g_datalist_set_data_full (&proxy->priv->qdata, "SupportedMimeTypes", (gpointer) value, g_free);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static void
+org_mpris_media_player2_proxy_init (OrgMprisMediaPlayer2Proxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = org_mpris_media_player2_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2ProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), org_mpris_media_player2_interface_info ());
+}
+
+static void
+org_mpris_media_player2_proxy_class_init (OrgMprisMediaPlayer2ProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = org_mpris_media_player2_proxy_finalize;
+  gobject_class->get_property = org_mpris_media_player2_proxy_get_property;
+  gobject_class->set_property = org_mpris_media_player2_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = org_mpris_media_player2_proxy_g_signal;
+  proxy_class->g_properties_changed = org_mpris_media_player2_proxy_g_properties_changed;
+
+  org_mpris_media_player2_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (OrgMprisMediaPlayer2ProxyPrivate));
+#endif
+}
+
+static void
+org_mpris_media_player2_proxy_iface_init (OrgMprisMediaPlayer2Iface *iface)
+{
+  iface->get_can_quit = org_mpris_media_player2_proxy_get_can_quit;
+  iface->get_can_raise = org_mpris_media_player2_proxy_get_can_raise;
+  iface->get_has_track_list = org_mpris_media_player2_proxy_get_has_track_list;
+  iface->get_identity = org_mpris_media_player2_proxy_get_identity;
+  iface->get_desktop_entry = org_mpris_media_player2_proxy_get_desktop_entry;
+  iface->get_supported_uri_schemes = org_mpris_media_player2_proxy_get_supported_uri_schemes;
+  iface->get_supported_mime_types = org_mpris_media_player2_proxy_get_supported_mime_types;
+}
+
+/**
+ * org_mpris_media_player2_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link>. See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_proxy_new_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+org_mpris_media_player2_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2", NULL);
+}
+
+/**
+ * org_mpris_media_player2_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with org_mpris_media_player2_proxy_new().
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2Proxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2 *
+org_mpris_media_player2_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2 (ret);
+  else
+    return NULL;
+}
+
+/**
+ * org_mpris_media_player2_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link>. See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2Proxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2 *
+org_mpris_media_player2_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2", NULL);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2 (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * org_mpris_media_player2_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like org_mpris_media_player2_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+org_mpris_media_player2_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2", NULL);
+}
+
+/**
+ * org_mpris_media_player2_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with org_mpris_media_player2_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2Proxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2 *
+org_mpris_media_player2_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2 (ret);
+  else
+    return NULL;
+}
+
+/**
+ * org_mpris_media_player2_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like org_mpris_media_player2_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2Proxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2 *
+org_mpris_media_player2_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2", NULL);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2 (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * OrgMprisMediaPlayer2Skeleton:
+ *
+ * The #OrgMprisMediaPlayer2Skeleton structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * OrgMprisMediaPlayer2SkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #OrgMprisMediaPlayer2Skeleton.
+ */
+
+struct _OrgMprisMediaPlayer2SkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_org_mpris_media_player2_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], TYPE_ORG_MPRIS_MEDIA_PLAYER2);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_ORG_MPRIS_MEDIA_PLAYER2);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_org_mpris_media_player2_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_org_mpris_media_player2_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _org_mpris_media_player2_skeleton_vtable =
+{
+  _org_mpris_media_player2_skeleton_handle_method_call,
+  _org_mpris_media_player2_skeleton_handle_get_property,
+  _org_mpris_media_player2_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+org_mpris_media_player2_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return org_mpris_media_player2_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+org_mpris_media_player2_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_org_mpris_media_player2_skeleton_vtable;
+}
+
+static GVariant *
+org_mpris_media_player2_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_org_mpris_media_player2_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _org_mpris_media_player2_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _org_mpris_media_player2_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _org_mpris_media_player2_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.mpris.MediaPlayer2", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static gboolean _org_mpris_media_player2_emit_changed (gpointer user_data);
+
+static void
+org_mpris_media_player2_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (_skeleton);
+  gboolean emit_changed = FALSE;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    {
+      g_source_destroy (skeleton->priv->changed_properties_idle_source);
+      skeleton->priv->changed_properties_idle_source = NULL;
+      emit_changed = TRUE;
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+
+  if (emit_changed)
+    _org_mpris_media_player2_emit_changed (skeleton);
+}
+
+static void org_mpris_media_player2_skeleton_iface_init (OrgMprisMediaPlayer2Iface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2Skeleton, org_mpris_media_player2_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (OrgMprisMediaPlayer2Skeleton)
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2, org_mpris_media_player2_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2Skeleton, org_mpris_media_player2_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2, org_mpris_media_player2_skeleton_iface_init));
+
+#endif
+static void
+org_mpris_media_player2_skeleton_finalize (GObject *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  guint n;
+  for (n = 0; n < 7; n++)
+    g_value_unset (&skeleton->priv->properties[n]);
+  g_free (skeleton->priv->properties);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (org_mpris_media_player2_skeleton_parent_class)->finalize (object);
+}
+
+static void
+org_mpris_media_player2_skeleton_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_org_mpris_media_player2_emit_changed (gpointer user_data)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (user_data);
+  GList *l;
+  GVariantBuilder builder;
+  GVariantBuilder invalidated_builder;
+  guint num_changes;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+    {
+      ChangedProperty *cp = l->data;
+      GVariant *variant;
+      const GValue *cur_value;
+
+      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+      if (!_g_value_equal (cur_value, &cp->orig_value))
+        {
+          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
+          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+          g_variant_unref (variant);
+          num_changes++;
+        }
+    }
+  if (num_changes > 0)
+    {
+      GList *connections, *ll;
+      GVariant *signal_variant;
+      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.mpris.MediaPlayer2",
+                                           &builder, &invalidated_builder));
+      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+      for (ll = connections; ll != NULL; ll = ll->next)
+        {
+          GDBusConnection *connection = ll->data;
+
+          g_dbus_connection_emit_signal (connection,
+                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
+                                         "org.freedesktop.DBus.Properties",
+                                         "PropertiesChanged",
+                                         signal_variant,
+                                         NULL);
+        }
+      g_variant_unref (signal_variant);
+      g_list_free_full (connections, g_object_unref);
+    }
+  else
+    {
+      g_variant_builder_clear (&builder);
+      g_variant_builder_clear (&invalidated_builder);
+    }
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  skeleton->priv->changed_properties = NULL;
+  skeleton->priv->changed_properties_idle_source = NULL;
+  g_mutex_unlock (&skeleton->priv->lock);
+  return FALSE;
+}
+
+static void
+_org_mpris_media_player2_schedule_emit_changed (OrgMprisMediaPlayer2Skeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+  ChangedProperty *cp;
+  GList *l;
+  cp = NULL;
+  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+    {
+      ChangedProperty *i_cp = l->data;
+      if (i_cp->info == info)
+        {
+          cp = i_cp;
+          break;
+        }
+    }
+  if (cp == NULL)
+    {
+      cp = g_new0 (ChangedProperty, 1);
+      cp->prop_id = prop_id;
+      cp->info = info;
+      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+      g_value_copy (orig_value, &cp->orig_value);
+    }
+}
+
+static void
+org_mpris_media_player2_skeleton_notify (GObject      *object,
+  GParamSpec *pspec G_GNUC_UNUSED)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties != NULL &&
+      skeleton->priv->changed_properties_idle_source == NULL)
+    {
+      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _org_mpris_media_player2_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+      g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _org_mpris_media_player2_emit_changed");
+      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+      g_source_unref (skeleton->priv->changed_properties_idle_source);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+org_mpris_media_player2_skeleton_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 7);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_object_freeze_notify (object);
+  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+    {
+      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+        _org_mpris_media_player2_schedule_emit_changed (skeleton, _org_mpris_media_player2_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+      g_object_notify_by_pspec (object, pspec);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+  g_object_thaw_notify (object);
+}
+
+static void
+org_mpris_media_player2_skeleton_init (OrgMprisMediaPlayer2Skeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = org_mpris_media_player2_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2SkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+  skeleton->priv->properties = g_new0 (GValue, 7);
+  g_value_init (&skeleton->priv->properties[0], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[1], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[2], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[3], G_TYPE_STRING);
+  g_value_init (&skeleton->priv->properties[4], G_TYPE_STRING);
+  g_value_init (&skeleton->priv->properties[5], G_TYPE_STRV);
+  g_value_init (&skeleton->priv->properties[6], G_TYPE_STRV);
+}
+
+static gboolean 
+org_mpris_media_player2_skeleton_get_can_quit (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[0]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_skeleton_get_can_raise (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[1]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_skeleton_get_has_track_list (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[2]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_skeleton_get_identity (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  const gchar *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_string (&(skeleton->priv->properties[3]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_skeleton_get_desktop_entry (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  const gchar *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_string (&(skeleton->priv->properties[4]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static const gchar *const *
+org_mpris_media_player2_skeleton_get_supported_uri_schemes (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  const gchar *const *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boxed (&(skeleton->priv->properties[5]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static const gchar *const *
+org_mpris_media_player2_skeleton_get_supported_mime_types (OrgMprisMediaPlayer2 *object)
+{
+  OrgMprisMediaPlayer2Skeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_SKELETON (object);
+  const gchar *const *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boxed (&(skeleton->priv->properties[6]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static void
+org_mpris_media_player2_skeleton_class_init (OrgMprisMediaPlayer2SkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = org_mpris_media_player2_skeleton_finalize;
+  gobject_class->get_property = org_mpris_media_player2_skeleton_get_property;
+  gobject_class->set_property = org_mpris_media_player2_skeleton_set_property;
+  gobject_class->notify       = org_mpris_media_player2_skeleton_notify;
+
+
+  org_mpris_media_player2_override_properties (gobject_class, 1);
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = org_mpris_media_player2_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = org_mpris_media_player2_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = org_mpris_media_player2_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = org_mpris_media_player2_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (OrgMprisMediaPlayer2SkeletonPrivate));
+#endif
+}
+
+static void
+org_mpris_media_player2_skeleton_iface_init (OrgMprisMediaPlayer2Iface *iface)
+{
+  iface->get_can_quit = org_mpris_media_player2_skeleton_get_can_quit;
+  iface->get_can_raise = org_mpris_media_player2_skeleton_get_can_raise;
+  iface->get_has_track_list = org_mpris_media_player2_skeleton_get_has_track_list;
+  iface->get_identity = org_mpris_media_player2_skeleton_get_identity;
+  iface->get_desktop_entry = org_mpris_media_player2_skeleton_get_desktop_entry;
+  iface->get_supported_uri_schemes = org_mpris_media_player2_skeleton_get_supported_uri_schemes;
+  iface->get_supported_mime_types = org_mpris_media_player2_skeleton_get_supported_mime_types;
+}
+
+/**
+ * org_mpris_media_player2_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2.top_of_page">org.mpris.MediaPlayer2</link>.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2Skeleton): The skeleton object.
+ */
+OrgMprisMediaPlayer2 *
+org_mpris_media_player2_skeleton_new (void)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2 (g_object_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, NULL));
+}
+
diff --git a/shairport-sync-mpris-interface.h b/shairport-sync-mpris-interface.h
new file mode 100644 (file)
index 0000000..615dc37
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__
+#define __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.mpris.MediaPlayer2 */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2 (org_mpris_media_player2_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2, OrgMprisMediaPlayer2))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2))
+#define ORG_MPRIS_MEDIA_PLAYER2_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2, OrgMprisMediaPlayer2Iface))
+
+struct _OrgMprisMediaPlayer2;
+typedef struct _OrgMprisMediaPlayer2 OrgMprisMediaPlayer2;
+typedef struct _OrgMprisMediaPlayer2Iface OrgMprisMediaPlayer2Iface;
+
+struct _OrgMprisMediaPlayer2Iface
+{
+  GTypeInterface parent_iface;
+
+
+  gboolean (*handle_quit) (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_raise) (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean  (*get_can_quit) (OrgMprisMediaPlayer2 *object);
+
+  gboolean  (*get_can_raise) (OrgMprisMediaPlayer2 *object);
+
+  const gchar * (*get_desktop_entry) (OrgMprisMediaPlayer2 *object);
+
+  gboolean  (*get_has_track_list) (OrgMprisMediaPlayer2 *object);
+
+  const gchar * (*get_identity) (OrgMprisMediaPlayer2 *object);
+
+  const gchar *const * (*get_supported_mime_types) (OrgMprisMediaPlayer2 *object);
+
+  const gchar *const * (*get_supported_uri_schemes) (OrgMprisMediaPlayer2 *object);
+
+};
+
+GType org_mpris_media_player2_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *org_mpris_media_player2_interface_info (void);
+guint org_mpris_media_player2_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void org_mpris_media_player2_complete_raise (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_complete_quit (
+    OrgMprisMediaPlayer2 *object,
+    GDBusMethodInvocation *invocation);
+
+
+
+/* D-Bus method calls: */
+void org_mpris_media_player2_call_raise (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_call_raise_finish (
+    OrgMprisMediaPlayer2 *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_call_raise_sync (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_call_quit (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_call_quit_finish (
+    OrgMprisMediaPlayer2 *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_call_quit_sync (
+    OrgMprisMediaPlayer2 *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+gboolean org_mpris_media_player2_get_can_quit (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_can_quit (OrgMprisMediaPlayer2 *object, gboolean value);
+
+gboolean org_mpris_media_player2_get_can_raise (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_can_raise (OrgMprisMediaPlayer2 *object, gboolean value);
+
+gboolean org_mpris_media_player2_get_has_track_list (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_has_track_list (OrgMprisMediaPlayer2 *object, gboolean value);
+
+const gchar *org_mpris_media_player2_get_identity (OrgMprisMediaPlayer2 *object);
+gchar *org_mpris_media_player2_dup_identity (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_identity (OrgMprisMediaPlayer2 *object, const gchar *value);
+
+const gchar *org_mpris_media_player2_get_desktop_entry (OrgMprisMediaPlayer2 *object);
+gchar *org_mpris_media_player2_dup_desktop_entry (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_desktop_entry (OrgMprisMediaPlayer2 *object, const gchar *value);
+
+const gchar *const *org_mpris_media_player2_get_supported_uri_schemes (OrgMprisMediaPlayer2 *object);
+gchar **org_mpris_media_player2_dup_supported_uri_schemes (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_supported_uri_schemes (OrgMprisMediaPlayer2 *object, const gchar *const *value);
+
+const gchar *const *org_mpris_media_player2_get_supported_mime_types (OrgMprisMediaPlayer2 *object);
+gchar **org_mpris_media_player2_dup_supported_mime_types (OrgMprisMediaPlayer2 *object);
+void org_mpris_media_player2_set_supported_mime_types (OrgMprisMediaPlayer2 *object, const gchar *const *value);
+
+
+/* ---- */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY (org_mpris_media_player2_proxy_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2Proxy))
+#define ORG_MPRIS_MEDIA_PLAYER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2ProxyClass))
+#define ORG_MPRIS_MEDIA_PLAYER2_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY, OrgMprisMediaPlayer2ProxyClass))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PROXY))
+
+typedef struct _OrgMprisMediaPlayer2Proxy OrgMprisMediaPlayer2Proxy;
+typedef struct _OrgMprisMediaPlayer2ProxyClass OrgMprisMediaPlayer2ProxyClass;
+typedef struct _OrgMprisMediaPlayer2ProxyPrivate OrgMprisMediaPlayer2ProxyPrivate;
+
+struct _OrgMprisMediaPlayer2Proxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  OrgMprisMediaPlayer2ProxyPrivate *priv;
+};
+
+struct _OrgMprisMediaPlayer2ProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType org_mpris_media_player2_proxy_get_type (void) G_GNUC_CONST;
+
+#if GLIB_CHECK_VERSION(2, 44, 0)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2Proxy, g_object_unref)
+#endif
+
+void org_mpris_media_player2_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void org_mpris_media_player2_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+OrgMprisMediaPlayer2 *org_mpris_media_player2_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON (org_mpris_media_player2_skeleton_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2Skeleton))
+#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2SkeletonClass))
+#define ORG_MPRIS_MEDIA_PLAYER2_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON, OrgMprisMediaPlayer2SkeletonClass))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_SKELETON))
+
+typedef struct _OrgMprisMediaPlayer2Skeleton OrgMprisMediaPlayer2Skeleton;
+typedef struct _OrgMprisMediaPlayer2SkeletonClass OrgMprisMediaPlayer2SkeletonClass;
+typedef struct _OrgMprisMediaPlayer2SkeletonPrivate OrgMprisMediaPlayer2SkeletonPrivate;
+
+struct _OrgMprisMediaPlayer2Skeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  OrgMprisMediaPlayer2SkeletonPrivate *priv;
+};
+
+struct _OrgMprisMediaPlayer2SkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType org_mpris_media_player2_skeleton_get_type (void) G_GNUC_CONST;
+
+#if GLIB_CHECK_VERSION(2, 44, 0)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2Skeleton, g_object_unref)
+#endif
+
+OrgMprisMediaPlayer2 *org_mpris_media_player2_skeleton_new (void);
+
+
+G_END_DECLS
+
+#endif /* __SHAIRPORT_SYNC_MPRIS_INTERFACE_H__ */
diff --git a/shairport-sync-mpris-player-interface.c b/shairport-sync-mpris-player-interface.c
new file mode 100644 (file)
index 0000000..0c78fa5
--- /dev/null
@@ -0,0 +1,4094 @@
+/*
+ * Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "shairport-sync-mpris-player-interface.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+#  include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+  GDBusArgInfo parent_struct;
+  gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+  GDBusMethodInfo parent_struct;
+  const gchar *signal_name;
+  gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+  GDBusSignalInfo parent_struct;
+  const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+  GDBusPropertyInfo parent_struct;
+  const gchar *hyphen_name;
+  gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+  GDBusInterfaceInfo parent_struct;
+  const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  guint prop_id;
+  GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+  g_value_unset (&data->orig_value);
+  g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+  gboolean ret = FALSE;
+  guint n;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  if (g_strv_length (a) != g_strv_length (b))
+    goto out;
+  for (n = 0; a[n] != NULL; n++)
+    if (g_strcmp0 (a[n], b[n]) != 0)
+      goto out;
+  ret = TRUE;
+out:
+  return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+  gboolean ret = FALSE;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  ret = g_variant_equal (a, b);
+out:
+  return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+  gboolean ret = FALSE;
+  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+  switch (G_VALUE_TYPE (a))
+    {
+      case G_TYPE_BOOLEAN:
+        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+        break;
+      case G_TYPE_UCHAR:
+        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+        break;
+      case G_TYPE_INT:
+        ret = (g_value_get_int (a) == g_value_get_int (b));
+        break;
+      case G_TYPE_UINT:
+        ret = (g_value_get_uint (a) == g_value_get_uint (b));
+        break;
+      case G_TYPE_INT64:
+        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+        break;
+      case G_TYPE_UINT64:
+        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+        break;
+      case G_TYPE_DOUBLE:
+        {
+          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+          gdouble da = g_value_get_double (a);
+          gdouble db = g_value_get_double (b);
+          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+        }
+        break;
+      case G_TYPE_STRING:
+        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+        break;
+      case G_TYPE_VARIANT:
+        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+        break;
+      default:
+        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+        else
+          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+        break;
+    }
+  return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.mpris.MediaPlayer2.Player
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:OrgMprisMediaPlayer2Player
+ * @title: OrgMprisMediaPlayer2Player
+ * @short_description: Generated C code for the org.mpris.MediaPlayer2.Player D-Bus interface
+ *
+ * This section contains code for working with the <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link> D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.mpris.MediaPlayer2.Player ---- */
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_next =
+{
+  {
+    -1,
+    (gchar *) "Next",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-next",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_previous =
+{
+  {
+    -1,
+    (gchar *) "Previous",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-previous",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_pause =
+{
+  {
+    -1,
+    (gchar *) "Pause",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-pause",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_play_pause =
+{
+  {
+    -1,
+    (gchar *) "PlayPause",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-play-pause",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_stop =
+{
+  {
+    -1,
+    (gchar *) "Stop",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-stop",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_stop_after_current =
+{
+  {
+    -1,
+    (gchar *) "StopAfterCurrent",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-stop-after-current",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_play =
+{
+  {
+    -1,
+    (gchar *) "Play",
+    NULL,
+    NULL,
+    NULL
+  },
+  "handle-play",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _org_mpris_media_player2_player_method_info_seek_IN_ARG_Offset =
+{
+  {
+    -1,
+    (gchar *) "Offset",
+    (gchar *) "x",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _org_mpris_media_player2_player_method_info_seek_IN_ARG_pointers[] =
+{
+  &_org_mpris_media_player2_player_method_info_seek_IN_ARG_Offset,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_seek =
+{
+  {
+    -1,
+    (gchar *) "Seek",
+    (GDBusArgInfo **) &_org_mpris_media_player2_player_method_info_seek_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-seek",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _org_mpris_media_player2_player_method_info_set_position_IN_ARG_TrackId =
+{
+  {
+    -1,
+    (gchar *) "TrackId",
+    (gchar *) "o",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _org_mpris_media_player2_player_method_info_set_position_IN_ARG_Position =
+{
+  {
+    -1,
+    (gchar *) "Position",
+    (gchar *) "x",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _org_mpris_media_player2_player_method_info_set_position_IN_ARG_pointers[] =
+{
+  &_org_mpris_media_player2_player_method_info_set_position_IN_ARG_TrackId,
+  &_org_mpris_media_player2_player_method_info_set_position_IN_ARG_Position,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_set_position =
+{
+  {
+    -1,
+    (gchar *) "SetPosition",
+    (GDBusArgInfo **) &_org_mpris_media_player2_player_method_info_set_position_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-set-position",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _org_mpris_media_player2_player_method_info_open_uri_IN_ARG_Uri =
+{
+  {
+    -1,
+    (gchar *) "Uri",
+    (gchar *) "s",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _org_mpris_media_player2_player_method_info_open_uri_IN_ARG_pointers[] =
+{
+  &_org_mpris_media_player2_player_method_info_open_uri_IN_ARG_Uri,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _org_mpris_media_player2_player_method_info_open_uri =
+{
+  {
+    -1,
+    (gchar *) "OpenUri",
+    (GDBusArgInfo **) &_org_mpris_media_player2_player_method_info_open_uri_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-open-uri",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _org_mpris_media_player2_player_method_info_pointers[] =
+{
+  &_org_mpris_media_player2_player_method_info_next,
+  &_org_mpris_media_player2_player_method_info_previous,
+  &_org_mpris_media_player2_player_method_info_pause,
+  &_org_mpris_media_player2_player_method_info_play_pause,
+  &_org_mpris_media_player2_player_method_info_stop,
+  &_org_mpris_media_player2_player_method_info_stop_after_current,
+  &_org_mpris_media_player2_player_method_info_play,
+  &_org_mpris_media_player2_player_method_info_seek,
+  &_org_mpris_media_player2_player_method_info_set_position,
+  &_org_mpris_media_player2_player_method_info_open_uri,
+  NULL
+};
+
+static const _ExtendedGDBusArgInfo _org_mpris_media_player2_player_signal_info_seeked_ARG_Position =
+{
+  {
+    -1,
+    (gchar *) "Position",
+    (gchar *) "x",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _org_mpris_media_player2_player_signal_info_seeked_ARG_pointers[] =
+{
+  &_org_mpris_media_player2_player_signal_info_seeked_ARG_Position,
+  NULL
+};
+
+static const _ExtendedGDBusSignalInfo _org_mpris_media_player2_player_signal_info_seeked =
+{
+  {
+    -1,
+    (gchar *) "Seeked",
+    (GDBusArgInfo **) &_org_mpris_media_player2_player_signal_info_seeked_ARG_pointers,
+    NULL
+  },
+  "seeked"
+};
+
+static const _ExtendedGDBusSignalInfo * const _org_mpris_media_player2_player_signal_info_pointers[] =
+{
+  &_org_mpris_media_player2_player_signal_info_seeked,
+  NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_playback_status =
+{
+  {
+    -1,
+    (gchar *) "PlaybackStatus",
+    (gchar *) "s",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "playback-status",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_loop_status =
+{
+  {
+    -1,
+    (gchar *) "LoopStatus",
+    (gchar *) "s",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "loop-status",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_rate =
+{
+  {
+    -1,
+    (gchar *) "Rate",
+    (gchar *) "d",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "rate",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_shuffle =
+{
+  {
+    -1,
+    (gchar *) "Shuffle",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "shuffle",
+  FALSE
+};
+
+static const GDBusAnnotationInfo _org_mpris_media_player2_player_property_metadata_annotation_info_0 =
+{
+  -1,
+  (gchar *) "org.qtproject.QtDBus.QtTypeName",
+  (gchar *) "QVariantMap",
+  NULL
+};
+
+static const GDBusAnnotationInfo * const _org_mpris_media_player2_player_property_metadata_annotation_info_pointers[] =
+{
+  &_org_mpris_media_player2_player_property_metadata_annotation_info_0,
+  NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_metadata =
+{
+  {
+    -1,
+    (gchar *) "Metadata",
+    (gchar *) "a{sv}",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    (GDBusAnnotationInfo **) &_org_mpris_media_player2_player_property_metadata_annotation_info_pointers
+  },
+  "metadata",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_volume =
+{
+  {
+    -1,
+    (gchar *) "Volume",
+    (gchar *) "d",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
+    NULL
+  },
+  "volume",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_position =
+{
+  {
+    -1,
+    (gchar *) "Position",
+    (gchar *) "x",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "position",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_minimum_rate =
+{
+  {
+    -1,
+    (gchar *) "MinimumRate",
+    (gchar *) "d",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "minimum-rate",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_maximum_rate =
+{
+  {
+    -1,
+    (gchar *) "MaximumRate",
+    (gchar *) "d",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "maximum-rate",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_go_next =
+{
+  {
+    -1,
+    (gchar *) "CanGoNext",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-go-next",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_go_previous =
+{
+  {
+    -1,
+    (gchar *) "CanGoPrevious",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-go-previous",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_play =
+{
+  {
+    -1,
+    (gchar *) "CanPlay",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-play",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_pause =
+{
+  {
+    -1,
+    (gchar *) "CanPause",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-pause",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_seek =
+{
+  {
+    -1,
+    (gchar *) "CanSeek",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-seek",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _org_mpris_media_player2_player_property_info_can_control =
+{
+  {
+    -1,
+    (gchar *) "CanControl",
+    (gchar *) "b",
+    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+    NULL
+  },
+  "can-control",
+  FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _org_mpris_media_player2_player_property_info_pointers[] =
+{
+  &_org_mpris_media_player2_player_property_info_playback_status,
+  &_org_mpris_media_player2_player_property_info_loop_status,
+  &_org_mpris_media_player2_player_property_info_rate,
+  &_org_mpris_media_player2_player_property_info_shuffle,
+  &_org_mpris_media_player2_player_property_info_metadata,
+  &_org_mpris_media_player2_player_property_info_volume,
+  &_org_mpris_media_player2_player_property_info_position,
+  &_org_mpris_media_player2_player_property_info_minimum_rate,
+  &_org_mpris_media_player2_player_property_info_maximum_rate,
+  &_org_mpris_media_player2_player_property_info_can_go_next,
+  &_org_mpris_media_player2_player_property_info_can_go_previous,
+  &_org_mpris_media_player2_player_property_info_can_play,
+  &_org_mpris_media_player2_player_property_info_can_pause,
+  &_org_mpris_media_player2_player_property_info_can_seek,
+  &_org_mpris_media_player2_player_property_info_can_control,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _org_mpris_media_player2_player_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.mpris.MediaPlayer2.Player",
+    (GDBusMethodInfo **) &_org_mpris_media_player2_player_method_info_pointers,
+    (GDBusSignalInfo **) &_org_mpris_media_player2_player_signal_info_pointers,
+    (GDBusPropertyInfo **) &_org_mpris_media_player2_player_property_info_pointers,
+    NULL
+  },
+  "org-mpris-media-player2-player",
+};
+
+
+/**
+ * org_mpris_media_player2_player_interface_info:
+ *
+ * Gets a machine-readable description of the <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link> D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+org_mpris_media_player2_player_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct;
+}
+
+/**
+ * org_mpris_media_player2_player_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #OrgMprisMediaPlayer2Player interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+org_mpris_media_player2_player_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  g_object_class_override_property (klass, property_id_begin++, "playback-status");
+  g_object_class_override_property (klass, property_id_begin++, "loop-status");
+  g_object_class_override_property (klass, property_id_begin++, "rate");
+  g_object_class_override_property (klass, property_id_begin++, "shuffle");
+  g_object_class_override_property (klass, property_id_begin++, "metadata");
+  g_object_class_override_property (klass, property_id_begin++, "volume");
+  g_object_class_override_property (klass, property_id_begin++, "position");
+  g_object_class_override_property (klass, property_id_begin++, "minimum-rate");
+  g_object_class_override_property (klass, property_id_begin++, "maximum-rate");
+  g_object_class_override_property (klass, property_id_begin++, "can-go-next");
+  g_object_class_override_property (klass, property_id_begin++, "can-go-previous");
+  g_object_class_override_property (klass, property_id_begin++, "can-play");
+  g_object_class_override_property (klass, property_id_begin++, "can-pause");
+  g_object_class_override_property (klass, property_id_begin++, "can-seek");
+  g_object_class_override_property (klass, property_id_begin++, "can-control");
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * OrgMprisMediaPlayer2Player:
+ *
+ * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link>.
+ */
+
+/**
+ * OrgMprisMediaPlayer2PlayerIface:
+ * @parent_iface: The parent interface.
+ * @handle_next: Handler for the #OrgMprisMediaPlayer2Player::handle-next signal.
+ * @handle_open_uri: Handler for the #OrgMprisMediaPlayer2Player::handle-open-uri signal.
+ * @handle_pause: Handler for the #OrgMprisMediaPlayer2Player::handle-pause signal.
+ * @handle_play: Handler for the #OrgMprisMediaPlayer2Player::handle-play signal.
+ * @handle_play_pause: Handler for the #OrgMprisMediaPlayer2Player::handle-play-pause signal.
+ * @handle_previous: Handler for the #OrgMprisMediaPlayer2Player::handle-previous signal.
+ * @handle_seek: Handler for the #OrgMprisMediaPlayer2Player::handle-seek signal.
+ * @handle_set_position: Handler for the #OrgMprisMediaPlayer2Player::handle-set-position signal.
+ * @handle_stop: Handler for the #OrgMprisMediaPlayer2Player::handle-stop signal.
+ * @handle_stop_after_current: Handler for the #OrgMprisMediaPlayer2Player::handle-stop-after-current signal.
+ * @get_can_control: Getter for the #OrgMprisMediaPlayer2Player:can-control property.
+ * @get_can_go_next: Getter for the #OrgMprisMediaPlayer2Player:can-go-next property.
+ * @get_can_go_previous: Getter for the #OrgMprisMediaPlayer2Player:can-go-previous property.
+ * @get_can_pause: Getter for the #OrgMprisMediaPlayer2Player:can-pause property.
+ * @get_can_play: Getter for the #OrgMprisMediaPlayer2Player:can-play property.
+ * @get_can_seek: Getter for the #OrgMprisMediaPlayer2Player:can-seek property.
+ * @get_loop_status: Getter for the #OrgMprisMediaPlayer2Player:loop-status property.
+ * @get_maximum_rate: Getter for the #OrgMprisMediaPlayer2Player:maximum-rate property.
+ * @get_metadata: Getter for the #OrgMprisMediaPlayer2Player:metadata property.
+ * @get_minimum_rate: Getter for the #OrgMprisMediaPlayer2Player:minimum-rate property.
+ * @get_playback_status: Getter for the #OrgMprisMediaPlayer2Player:playback-status property.
+ * @get_position: Getter for the #OrgMprisMediaPlayer2Player:position property.
+ * @get_rate: Getter for the #OrgMprisMediaPlayer2Player:rate property.
+ * @get_shuffle: Getter for the #OrgMprisMediaPlayer2Player:shuffle property.
+ * @get_volume: Getter for the #OrgMprisMediaPlayer2Player:volume property.
+ * @seeked: Handler for the #OrgMprisMediaPlayer2Player::seeked signal.
+ *
+ * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link>.
+ */
+
+typedef OrgMprisMediaPlayer2PlayerIface OrgMprisMediaPlayer2PlayerInterface;
+G_DEFINE_INTERFACE (OrgMprisMediaPlayer2Player, org_mpris_media_player2_player, G_TYPE_OBJECT);
+
+static void
+org_mpris_media_player2_player_default_init (OrgMprisMediaPlayer2PlayerIface *iface)
+{
+  /* GObject signals for incoming D-Bus method calls: */
+  /**
+   * OrgMprisMediaPlayer2Player::handle-next:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Next">Next()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_next() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-next",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_next),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-previous:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Previous">Previous()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_previous() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-previous",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_previous),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-pause:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Pause">Pause()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_pause() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-pause",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_pause),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-play-pause:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.PlayPause">PlayPause()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_play_pause() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-play-pause",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_play_pause),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-stop:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Stop">Stop()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_stop() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-stop",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_stop),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-stop-after-current:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.StopAfterCurrent">StopAfterCurrent()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_stop_after_current() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-stop-after-current",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_stop_after_current),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-play:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Play">Play()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_play() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-play",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_play),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-seek:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_Offset: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Seek">Seek()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_seek() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-seek",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_seek),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    2,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT64);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-set-position:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_TrackId: Argument passed by remote caller.
+   * @arg_Position: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.SetPosition">SetPosition()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_set_position() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-set-position",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_set_position),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    3,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_INT64);
+
+  /**
+   * OrgMprisMediaPlayer2Player::handle-open-uri:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_Uri: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.OpenUri">OpenUri()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call org_mpris_media_player2_player_complete_open_uri() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-open-uri",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, handle_open_uri),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    2,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);
+
+  /* GObject signals for received D-Bus signals: */
+  /**
+   * OrgMprisMediaPlayer2Player::seeked:
+   * @object: A #OrgMprisMediaPlayer2Player.
+   * @arg_Position: Argument.
+   *
+   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-mpris-MediaPlayer2-Player.Seeked">"Seeked"</link> is received.
+   *
+   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.
+   */
+  g_signal_new ("seeked",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (OrgMprisMediaPlayer2PlayerIface, seeked),
+    NULL,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_NONE,
+    1, G_TYPE_INT64);
+
+  /* GObject properties for D-Bus properties: */
+  /**
+   * OrgMprisMediaPlayer2Player:playback-status:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.PlaybackStatus">"PlaybackStatus"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_string ("playback-status", "PlaybackStatus", "PlaybackStatus", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:loop-status:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.LoopStatus">"LoopStatus"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_string ("loop-status", "LoopStatus", "LoopStatus", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:rate:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Rate">"Rate"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_double ("rate", "Rate", "Rate", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:shuffle:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Shuffle">"Shuffle"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("shuffle", "Shuffle", "Shuffle", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:metadata:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Metadata">"Metadata"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_variant ("metadata", "Metadata", "Metadata", G_VARIANT_TYPE ("a{sv}"), NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:volume:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Volume">"Volume"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_double ("volume", "Volume", "Volume", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:position:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Position">"Position"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_int64 ("position", "Position", "Position", G_MININT64, G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:minimum-rate:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MinimumRate">"MinimumRate"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_double ("minimum-rate", "MinimumRate", "MinimumRate", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:maximum-rate:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MaximumRate">"MaximumRate"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_double ("maximum-rate", "MaximumRate", "MaximumRate", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-go-next:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoNext">"CanGoNext"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-go-next", "CanGoNext", "CanGoNext", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-go-previous:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoPrevious">"CanGoPrevious"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-go-previous", "CanGoPrevious", "CanGoPrevious", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-play:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPlay">"CanPlay"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-play", "CanPlay", "CanPlay", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-pause:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPause">"CanPause"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-pause", "CanPause", "CanPause", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-seek:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanSeek">"CanSeek"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-seek", "CanSeek", "CanSeek", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /**
+   * OrgMprisMediaPlayer2Player:can-control:
+   *
+   * Represents the D-Bus property <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanControl">"CanControl"</link>.
+   *
+   * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.
+   */
+  g_object_interface_install_property (iface,
+    g_param_spec_boolean ("can-control", "CanControl", "CanControl", FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * org_mpris_media_player2_player_get_playback_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.PlaybackStatus">"PlaybackStatus"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_player_dup_playback_status() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *
+org_mpris_media_player2_player_get_playback_status (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_playback_status (object);
+}
+
+/**
+ * org_mpris_media_player2_player_dup_playback_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.PlaybackStatus">"PlaybackStatus"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
+ */
+gchar *
+org_mpris_media_player2_player_dup_playback_status (OrgMprisMediaPlayer2Player *object)
+{
+  gchar *value;
+  g_object_get (G_OBJECT (object), "playback-status", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_player_set_playback_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.PlaybackStatus">"PlaybackStatus"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_playback_status (OrgMprisMediaPlayer2Player *object, const gchar *value)
+{
+  g_object_set (G_OBJECT (object), "playback-status", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_loop_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.LoopStatus">"LoopStatus"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_player_dup_loop_status() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+const gchar *
+org_mpris_media_player2_player_get_loop_status (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_loop_status (object);
+}
+
+/**
+ * org_mpris_media_player2_player_dup_loop_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.LoopStatus">"LoopStatus"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
+ */
+gchar *
+org_mpris_media_player2_player_dup_loop_status (OrgMprisMediaPlayer2Player *object)
+{
+  gchar *value;
+  g_object_get (G_OBJECT (object), "loop-status", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_player_set_loop_status: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.LoopStatus">"LoopStatus"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+org_mpris_media_player2_player_set_loop_status (OrgMprisMediaPlayer2Player *object, const gchar *value)
+{
+  g_object_set (G_OBJECT (object), "loop-status", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Rate">"Rate"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gdouble 
+org_mpris_media_player2_player_get_rate (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_rate (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Rate">"Rate"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+org_mpris_media_player2_player_set_rate (OrgMprisMediaPlayer2Player *object, gdouble value)
+{
+  g_object_set (G_OBJECT (object), "rate", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_shuffle: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Shuffle">"Shuffle"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_shuffle (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_shuffle (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_shuffle: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Shuffle">"Shuffle"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+org_mpris_media_player2_player_set_shuffle (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "shuffle", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_metadata: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Metadata">"Metadata"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use org_mpris_media_player2_player_dup_metadata() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
+ */
+GVariant *
+org_mpris_media_player2_player_get_metadata (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_metadata (object);
+}
+
+/**
+ * org_mpris_media_player2_player_dup_metadata: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Metadata">"Metadata"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_variant_unref().
+ */
+GVariant *
+org_mpris_media_player2_player_dup_metadata (OrgMprisMediaPlayer2Player *object)
+{
+  GVariant *value;
+  g_object_get (G_OBJECT (object), "metadata", &value, NULL);
+  return value;
+}
+
+/**
+ * org_mpris_media_player2_player_set_metadata: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Metadata">"Metadata"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_metadata (OrgMprisMediaPlayer2Player *object, GVariant *value)
+{
+  g_object_set (G_OBJECT (object), "metadata", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_volume: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Volume">"Volume"</link> D-Bus property.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gdouble 
+org_mpris_media_player2_player_get_volume (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_volume (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_volume: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Volume">"Volume"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
+ */
+void
+org_mpris_media_player2_player_set_volume (OrgMprisMediaPlayer2Player *object, gdouble value)
+{
+  g_object_set (G_OBJECT (object), "volume", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_position: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Position">"Position"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gint64 
+org_mpris_media_player2_player_get_position (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_position (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_position: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.Position">"Position"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_position (OrgMprisMediaPlayer2Player *object, gint64 value)
+{
+  g_object_set (G_OBJECT (object), "position", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_minimum_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MinimumRate">"MinimumRate"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gdouble 
+org_mpris_media_player2_player_get_minimum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_minimum_rate (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_minimum_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MinimumRate">"MinimumRate"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_minimum_rate (OrgMprisMediaPlayer2Player *object, gdouble value)
+{
+  g_object_set (G_OBJECT (object), "minimum-rate", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_maximum_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MaximumRate">"MaximumRate"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gdouble 
+org_mpris_media_player2_player_get_maximum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_maximum_rate (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_maximum_rate: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.MaximumRate">"MaximumRate"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_maximum_rate (OrgMprisMediaPlayer2Player *object, gdouble value)
+{
+  g_object_set (G_OBJECT (object), "maximum-rate", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_go_next: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoNext">"CanGoNext"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_go_next (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_go_next (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_go_next: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoNext">"CanGoNext"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_go_next (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-go-next", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_go_previous: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoPrevious">"CanGoPrevious"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_go_previous (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_go_previous (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_go_previous: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanGoPrevious">"CanGoPrevious"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_go_previous (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-go-previous", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_play: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPlay">"CanPlay"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_play (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_play (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_play: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPlay">"CanPlay"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_play (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-play", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_pause: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPause">"CanPause"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_pause (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_pause (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_pause: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanPause">"CanPause"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_pause (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-pause", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_seek: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanSeek">"CanSeek"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_seek (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_seek (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_seek: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanSeek">"CanSeek"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_seek (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-seek", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_get_can_control: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanControl">"CanControl"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
+ *
+ * Returns: The property value.
+ */
+gboolean 
+org_mpris_media_player2_player_get_can_control (OrgMprisMediaPlayer2Player *object)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE (object)->get_can_control (object);
+}
+
+/**
+ * org_mpris_media_player2_player_set_can_control: (skip)
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-mpris-MediaPlayer2-Player.CanControl">"CanControl"</link> D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+org_mpris_media_player2_player_set_can_control (OrgMprisMediaPlayer2Player *object, gboolean value)
+{
+  g_object_set (G_OBJECT (object), "can-control", value, NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_emit_seeked:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @arg_Position: Argument to pass with the signal.
+ *
+ * Emits the <link linkend="gdbus-signal-org-mpris-MediaPlayer2-Player.Seeked">"Seeked"</link> D-Bus signal.
+ */
+void
+org_mpris_media_player2_player_emit_seeked (
+    OrgMprisMediaPlayer2Player *object,
+    gint64 arg_Position)
+{
+  g_signal_emit_by_name (object, "seeked", arg_Position);
+}
+
+/**
+ * org_mpris_media_player2_player_call_next:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Next">Next()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_next_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_next_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_next (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Next",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_next_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_next().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_next().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_next_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_next_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Next">Next()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_next() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_next_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Next",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_previous:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Previous">Previous()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_previous_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_previous_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_previous (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Previous",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_previous_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_previous().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_previous().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_previous_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_previous_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Previous">Previous()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_previous() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_previous_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Previous",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_pause:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Pause">Pause()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_pause_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_pause_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_pause (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Pause",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_pause_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_pause().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_pause().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_pause_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_pause_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Pause">Pause()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_pause() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_pause_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Pause",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_play_pause:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.PlayPause">PlayPause()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_play_pause_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_play_pause_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_play_pause (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "PlayPause",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_play_pause_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_play_pause().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_play_pause().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_play_pause_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_play_pause_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.PlayPause">PlayPause()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_play_pause() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_play_pause_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "PlayPause",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Stop">Stop()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_stop_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_stop_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_stop (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Stop",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_stop().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_stop().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_stop_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Stop">Stop()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_stop() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_stop_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Stop",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop_after_current:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.StopAfterCurrent">StopAfterCurrent()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_stop_after_current_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_stop_after_current_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_stop_after_current (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "StopAfterCurrent",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop_after_current_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_stop_after_current().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_stop_after_current().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_stop_after_current_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_stop_after_current_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.StopAfterCurrent">StopAfterCurrent()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_stop_after_current() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_stop_after_current_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "StopAfterCurrent",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_play:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Play">Play()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_play_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_play_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_play (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Play",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_play_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_play().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_play().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_play_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_play_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Play">Play()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_play() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_play_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Play",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_seek:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_Offset: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Seek">Seek()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_seek_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_seek_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_seek (
+    OrgMprisMediaPlayer2Player *proxy,
+    gint64 arg_Offset,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Seek",
+    g_variant_new ("(x)",
+                   arg_Offset),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_seek_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_seek().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_seek().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_seek_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_seek_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_Offset: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Seek">Seek()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_seek() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_seek_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    gint64 arg_Offset,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Seek",
+    g_variant_new ("(x)",
+                   arg_Offset),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_set_position:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_TrackId: Argument to pass with the method invocation.
+ * @arg_Position: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.SetPosition">SetPosition()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_set_position_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_set_position_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_set_position (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_TrackId,
+    gint64 arg_Position,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "SetPosition",
+    g_variant_new ("(ox)",
+                   arg_TrackId,
+                   arg_Position),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_set_position_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_set_position().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_set_position().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_set_position_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_set_position_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_TrackId: Argument to pass with the method invocation.
+ * @arg_Position: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.SetPosition">SetPosition()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_set_position() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_set_position_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_TrackId,
+    gint64 arg_Position,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "SetPosition",
+    g_variant_new ("(ox)",
+                   arg_TrackId,
+                   arg_Position),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_open_uri:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_Uri: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.OpenUri">OpenUri()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_call_open_uri_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_call_open_uri_sync() for the synchronous, blocking version of this method.
+ */
+void
+org_mpris_media_player2_player_call_open_uri (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_Uri,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "OpenUri",
+    g_variant_new ("(s)",
+                   arg_Uri),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * org_mpris_media_player2_player_call_open_uri_finish:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_call_open_uri().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_call_open_uri().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_open_uri_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_call_open_uri_sync:
+ * @proxy: A #OrgMprisMediaPlayer2PlayerProxy.
+ * @arg_Uri: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.OpenUri">OpenUri()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_call_open_uri() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+org_mpris_media_player2_player_call_open_uri_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_Uri,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "OpenUri",
+    g_variant_new ("(s)",
+                   arg_Uri),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_complete_next:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Next">Next()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_next (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_previous:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Previous">Previous()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_previous (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_pause:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Pause">Pause()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_pause (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_play_pause:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.PlayPause">PlayPause()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_play_pause (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_stop:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Stop">Stop()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_stop (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_stop_after_current:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.StopAfterCurrent">StopAfterCurrent()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_stop_after_current (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_play:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Play">Play()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_play (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_seek:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.Seek">Seek()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_seek (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_set_position:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.SetPosition">SetPosition()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_set_position (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * org_mpris_media_player2_player_complete_open_uri:
+ * @object: A #OrgMprisMediaPlayer2Player.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-mpris-MediaPlayer2-Player.OpenUri">OpenUri()</link> D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+org_mpris_media_player2_player_complete_open_uri (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * OrgMprisMediaPlayer2PlayerProxy:
+ *
+ * The #OrgMprisMediaPlayer2PlayerProxy structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * OrgMprisMediaPlayer2PlayerProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #OrgMprisMediaPlayer2PlayerProxy.
+ */
+
+struct _OrgMprisMediaPlayer2PlayerProxyPrivate
+{
+  GData *qdata;
+};
+
+static void org_mpris_media_player2_player_proxy_iface_init (OrgMprisMediaPlayer2PlayerIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2PlayerProxy, org_mpris_media_player2_player_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (OrgMprisMediaPlayer2PlayerProxy)
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, org_mpris_media_player2_player_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2PlayerProxy, org_mpris_media_player2_player_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, org_mpris_media_player2_player_proxy_iface_init));
+
+#endif
+static void
+org_mpris_media_player2_player_proxy_finalize (GObject *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (org_mpris_media_player2_player_proxy_parent_class)->finalize (object);
+}
+
+static void
+org_mpris_media_player2_player_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 15);
+  info = _org_mpris_media_player2_player_property_info_pointers[prop_id - 1];
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+  if (info->use_gvariant)
+    {
+      g_value_set_variant (value, variant);
+    }
+  else
+    {
+      if (variant != NULL)
+        g_dbus_gvariant_to_gvalue (variant, value);
+    }
+  if (variant != NULL)
+    g_variant_unref (variant);
+}
+
+static void
+org_mpris_media_player2_player_proxy_set_property_cb (GDBusProxy *proxy,
+  GAsyncResult *res,
+  gpointer      user_data)
+{
+  const _ExtendedGDBusPropertyInfo *info = user_data;
+  GError *error;
+  GVariant *_ret;
+  error = NULL;
+  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+  if (!_ret)
+    {
+      g_warning ("Error setting property '%s' on interface org.mpris.MediaPlayer2.Player: %s (%s, %d)",
+                 info->parent_struct.name, 
+                 error->message, g_quark_to_string (error->domain), error->code);
+      g_error_free (error);
+    }
+  else
+    {
+      g_variant_unref (_ret);
+    }
+}
+
+static void
+org_mpris_media_player2_player_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  GVariant *variant;
+  g_assert (prop_id != 0 && prop_id - 1 < 15);
+  info = _org_mpris_media_player2_player_property_info_pointers[prop_id - 1];
+  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+  g_dbus_proxy_call (G_DBUS_PROXY (object),
+    "org.freedesktop.DBus.Properties.Set",
+    g_variant_new ("(ssv)", "org.mpris.MediaPlayer2.Player", info->parent_struct.name, variant),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    NULL, (GAsyncReadyCallback) org_mpris_media_player2_player_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
+  g_variant_unref (variant);
+}
+
+static void
+org_mpris_media_player2_player_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+org_mpris_media_player2_player_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static const gchar *
+org_mpris_media_player2_player_proxy_get_playback_status (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  const gchar *value = NULL;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "PlaybackStatus");
+  if (variant != NULL)
+    {
+      value = g_variant_get_string (variant, NULL);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_player_proxy_get_loop_status (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  const gchar *value = NULL;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoopStatus");
+  if (variant != NULL)
+    {
+      value = g_variant_get_string (variant, NULL);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_proxy_get_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gdouble value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Rate");
+  if (variant != NULL)
+    {
+      value = g_variant_get_double (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_shuffle (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Shuffle");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static GVariant *
+org_mpris_media_player2_player_proxy_get_metadata (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  GVariant *value = NULL;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Metadata");
+  value = variant;
+  if (variant != NULL)
+    g_variant_unref (variant);
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_proxy_get_volume (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gdouble value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Volume");
+  if (variant != NULL)
+    {
+      value = g_variant_get_double (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gint64 
+org_mpris_media_player2_player_proxy_get_position (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gint64 value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Position");
+  if (variant != NULL)
+    {
+      value = g_variant_get_int64 (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_proxy_get_minimum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gdouble value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "MinimumRate");
+  if (variant != NULL)
+    {
+      value = g_variant_get_double (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_proxy_get_maximum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gdouble value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "MaximumRate");
+  if (variant != NULL)
+    {
+      value = g_variant_get_double (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_go_next (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanGoNext");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_go_previous (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanGoPrevious");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_play (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanPlay");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_pause (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanPause");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_seek (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanSeek");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_proxy_get_can_control (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerProxy *proxy = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (object);
+  GVariant *variant;
+  gboolean value = 0;
+  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "CanControl");
+  if (variant != NULL)
+    {
+      value = g_variant_get_boolean (variant);
+      g_variant_unref (variant);
+    }
+  return value;
+}
+
+static void
+org_mpris_media_player2_player_proxy_init (OrgMprisMediaPlayer2PlayerProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = org_mpris_media_player2_player_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), org_mpris_media_player2_player_interface_info ());
+}
+
+static void
+org_mpris_media_player2_player_proxy_class_init (OrgMprisMediaPlayer2PlayerProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = org_mpris_media_player2_player_proxy_finalize;
+  gobject_class->get_property = org_mpris_media_player2_player_proxy_get_property;
+  gobject_class->set_property = org_mpris_media_player2_player_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = org_mpris_media_player2_player_proxy_g_signal;
+  proxy_class->g_properties_changed = org_mpris_media_player2_player_proxy_g_properties_changed;
+
+  org_mpris_media_player2_player_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (OrgMprisMediaPlayer2PlayerProxyPrivate));
+#endif
+}
+
+static void
+org_mpris_media_player2_player_proxy_iface_init (OrgMprisMediaPlayer2PlayerIface *iface)
+{
+  iface->get_playback_status = org_mpris_media_player2_player_proxy_get_playback_status;
+  iface->get_loop_status = org_mpris_media_player2_player_proxy_get_loop_status;
+  iface->get_rate = org_mpris_media_player2_player_proxy_get_rate;
+  iface->get_shuffle = org_mpris_media_player2_player_proxy_get_shuffle;
+  iface->get_metadata = org_mpris_media_player2_player_proxy_get_metadata;
+  iface->get_volume = org_mpris_media_player2_player_proxy_get_volume;
+  iface->get_position = org_mpris_media_player2_player_proxy_get_position;
+  iface->get_minimum_rate = org_mpris_media_player2_player_proxy_get_minimum_rate;
+  iface->get_maximum_rate = org_mpris_media_player2_player_proxy_get_maximum_rate;
+  iface->get_can_go_next = org_mpris_media_player2_player_proxy_get_can_go_next;
+  iface->get_can_go_previous = org_mpris_media_player2_player_proxy_get_can_go_previous;
+  iface->get_can_play = org_mpris_media_player2_player_proxy_get_can_play;
+  iface->get_can_pause = org_mpris_media_player2_player_proxy_get_can_pause;
+  iface->get_can_seek = org_mpris_media_player2_player_proxy_get_can_seek;
+  iface->get_can_control = org_mpris_media_player2_player_proxy_get_can_control;
+}
+
+/**
+ * org_mpris_media_player2_player_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link>. See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_proxy_new_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+org_mpris_media_player2_player_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2.Player", NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_proxy_new().
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2PlayerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2Player *
+org_mpris_media_player2_player_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2_PLAYER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link>. See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2PlayerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2Player *
+org_mpris_media_player2_player_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2.Player", NULL);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2_PLAYER (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * org_mpris_media_player2_player_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like org_mpris_media_player2_player_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
+ * You can then call org_mpris_media_player2_player_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See org_mpris_media_player2_player_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+org_mpris_media_player2_player_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2.Player", NULL);
+}
+
+/**
+ * org_mpris_media_player2_player_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to org_mpris_media_player2_player_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with org_mpris_media_player2_player_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2PlayerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2Player *
+org_mpris_media_player2_player_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2_PLAYER (ret);
+  else
+    return NULL;
+}
+
+/**
+ * org_mpris_media_player2_player_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like org_mpris_media_player2_player_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See org_mpris_media_player2_player_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2PlayerProxy): The constructed proxy object or %NULL if @error is set.
+ */
+OrgMprisMediaPlayer2Player *
+org_mpris_media_player2_player_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.mpris.MediaPlayer2.Player", NULL);
+  if (ret != NULL)
+    return ORG_MPRIS_MEDIA_PLAYER2_PLAYER (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * OrgMprisMediaPlayer2PlayerSkeleton:
+ *
+ * The #OrgMprisMediaPlayer2PlayerSkeleton structure contains only private data and should only be accessed using the provided API.
+ */
+
+/**
+ * OrgMprisMediaPlayer2PlayerSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #OrgMprisMediaPlayer2PlayerSkeleton.
+ */
+
+struct _OrgMprisMediaPlayer2PlayerSkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_org_mpris_media_player2_player_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_org_mpris_media_player2_player_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_org_mpris_media_player2_player_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_org_mpris_media_player2_player_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _org_mpris_media_player2_player_skeleton_vtable =
+{
+  _org_mpris_media_player2_player_skeleton_handle_method_call,
+  _org_mpris_media_player2_player_skeleton_handle_get_property,
+  _org_mpris_media_player2_player_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+org_mpris_media_player2_player_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return org_mpris_media_player2_player_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+org_mpris_media_player2_player_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_org_mpris_media_player2_player_skeleton_vtable;
+}
+
+static GVariant *
+org_mpris_media_player2_player_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_org_mpris_media_player2_player_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _org_mpris_media_player2_player_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _org_mpris_media_player2_player_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _org_mpris_media_player2_player_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.mpris.MediaPlayer2.Player", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static gboolean _org_mpris_media_player2_player_emit_changed (gpointer user_data);
+
+static void
+org_mpris_media_player2_player_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (_skeleton);
+  gboolean emit_changed = FALSE;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    {
+      g_source_destroy (skeleton->priv->changed_properties_idle_source);
+      skeleton->priv->changed_properties_idle_source = NULL;
+      emit_changed = TRUE;
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+
+  if (emit_changed)
+    _org_mpris_media_player2_player_emit_changed (skeleton);
+}
+
+static void
+_org_mpris_media_player2_player_on_signal_seeked (
+    OrgMprisMediaPlayer2Player *object,
+    gint64 arg_Position)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+
+  GList      *connections, *l;
+  GVariant   *signal_variant;
+  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+  signal_variant = g_variant_ref_sink (g_variant_new ("(x)",
+                   arg_Position));
+  for (l = connections; l != NULL; l = l->next)
+    {
+      GDBusConnection *connection = l->data;
+      g_dbus_connection_emit_signal (connection,
+        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.mpris.MediaPlayer2.Player", "Seeked",
+        signal_variant, NULL);
+    }
+  g_variant_unref (signal_variant);
+  g_list_free_full (connections, g_object_unref);
+}
+
+static void org_mpris_media_player2_player_skeleton_iface_init (OrgMprisMediaPlayer2PlayerIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2PlayerSkeleton, org_mpris_media_player2_player_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (OrgMprisMediaPlayer2PlayerSkeleton)
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, org_mpris_media_player2_player_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (OrgMprisMediaPlayer2PlayerSkeleton, org_mpris_media_player2_player_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, org_mpris_media_player2_player_skeleton_iface_init));
+
+#endif
+static void
+org_mpris_media_player2_player_skeleton_finalize (GObject *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  guint n;
+  for (n = 0; n < 15; n++)
+    g_value_unset (&skeleton->priv->properties[n]);
+  g_free (skeleton->priv->properties);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (org_mpris_media_player2_player_skeleton_parent_class)->finalize (object);
+}
+
+static void
+org_mpris_media_player2_player_skeleton_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 15);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_org_mpris_media_player2_player_emit_changed (gpointer user_data)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (user_data);
+  GList *l;
+  GVariantBuilder builder;
+  GVariantBuilder invalidated_builder;
+  guint num_changes;
+
+  g_mutex_lock (&skeleton->priv->lock);
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+    {
+      ChangedProperty *cp = l->data;
+      GVariant *variant;
+      const GValue *cur_value;
+
+      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+      if (!_g_value_equal (cur_value, &cp->orig_value))
+        {
+          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
+          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+          g_variant_unref (variant);
+          num_changes++;
+        }
+    }
+  if (num_changes > 0)
+    {
+      GList *connections, *ll;
+      GVariant *signal_variant;
+      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.mpris.MediaPlayer2.Player",
+                                           &builder, &invalidated_builder));
+      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+      for (ll = connections; ll != NULL; ll = ll->next)
+        {
+          GDBusConnection *connection = ll->data;
+
+          g_dbus_connection_emit_signal (connection,
+                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
+                                         "org.freedesktop.DBus.Properties",
+                                         "PropertiesChanged",
+                                         signal_variant,
+                                         NULL);
+        }
+      g_variant_unref (signal_variant);
+      g_list_free_full (connections, g_object_unref);
+    }
+  else
+    {
+      g_variant_builder_clear (&builder);
+      g_variant_builder_clear (&invalidated_builder);
+    }
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  skeleton->priv->changed_properties = NULL;
+  skeleton->priv->changed_properties_idle_source = NULL;
+  g_mutex_unlock (&skeleton->priv->lock);
+  return FALSE;
+}
+
+static void
+_org_mpris_media_player2_player_schedule_emit_changed (OrgMprisMediaPlayer2PlayerSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+  ChangedProperty *cp;
+  GList *l;
+  cp = NULL;
+  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+    {
+      ChangedProperty *i_cp = l->data;
+      if (i_cp->info == info)
+        {
+          cp = i_cp;
+          break;
+        }
+    }
+  if (cp == NULL)
+    {
+      cp = g_new0 (ChangedProperty, 1);
+      cp->prop_id = prop_id;
+      cp->info = info;
+      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+      g_value_copy (orig_value, &cp->orig_value);
+    }
+}
+
+static void
+org_mpris_media_player2_player_skeleton_notify (GObject      *object,
+  GParamSpec *pspec G_GNUC_UNUSED)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  g_mutex_lock (&skeleton->priv->lock);
+  if (skeleton->priv->changed_properties != NULL &&
+      skeleton->priv->changed_properties_idle_source == NULL)
+    {
+      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _org_mpris_media_player2_player_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+      g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _org_mpris_media_player2_player_emit_changed");
+      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+      g_source_unref (skeleton->priv->changed_properties_idle_source);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+org_mpris_media_player2_player_skeleton_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  g_assert (prop_id != 0 && prop_id - 1 < 15);
+  g_mutex_lock (&skeleton->priv->lock);
+  g_object_freeze_notify (object);
+  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+    {
+      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+        _org_mpris_media_player2_player_schedule_emit_changed (skeleton, _org_mpris_media_player2_player_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+      g_object_notify_by_pspec (object, pspec);
+    }
+  g_mutex_unlock (&skeleton->priv->lock);
+  g_object_thaw_notify (object);
+}
+
+static void
+org_mpris_media_player2_player_skeleton_init (OrgMprisMediaPlayer2PlayerSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = org_mpris_media_player2_player_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+  skeleton->priv->properties = g_new0 (GValue, 15);
+  g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
+  g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
+  g_value_init (&skeleton->priv->properties[2], G_TYPE_DOUBLE);
+  g_value_init (&skeleton->priv->properties[3], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[4], G_TYPE_VARIANT);
+  g_value_init (&skeleton->priv->properties[5], G_TYPE_DOUBLE);
+  g_value_init (&skeleton->priv->properties[6], G_TYPE_INT64);
+  g_value_init (&skeleton->priv->properties[7], G_TYPE_DOUBLE);
+  g_value_init (&skeleton->priv->properties[8], G_TYPE_DOUBLE);
+  g_value_init (&skeleton->priv->properties[9], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[10], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[11], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[12], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[13], G_TYPE_BOOLEAN);
+  g_value_init (&skeleton->priv->properties[14], G_TYPE_BOOLEAN);
+}
+
+static const gchar *
+org_mpris_media_player2_player_skeleton_get_playback_status (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  const gchar *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_string (&(skeleton->priv->properties[0]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static const gchar *
+org_mpris_media_player2_player_skeleton_get_loop_status (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  const gchar *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_string (&(skeleton->priv->properties[1]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_skeleton_get_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gdouble value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_double (&(skeleton->priv->properties[2]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_shuffle (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[3]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static GVariant *
+org_mpris_media_player2_player_skeleton_get_metadata (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  GVariant *value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_variant (&(skeleton->priv->properties[4]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_skeleton_get_volume (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gdouble value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_double (&(skeleton->priv->properties[5]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gint64 
+org_mpris_media_player2_player_skeleton_get_position (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gint64 value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_int64 (&(skeleton->priv->properties[6]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_skeleton_get_minimum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gdouble value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_double (&(skeleton->priv->properties[7]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gdouble 
+org_mpris_media_player2_player_skeleton_get_maximum_rate (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gdouble value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_double (&(skeleton->priv->properties[8]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_go_next (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[9]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_go_previous (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[10]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_play (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[11]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_pause (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[12]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_seek (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[13]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static gboolean 
+org_mpris_media_player2_player_skeleton_get_can_control (OrgMprisMediaPlayer2Player *object)
+{
+  OrgMprisMediaPlayer2PlayerSkeleton *skeleton = ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (object);
+  gboolean value;
+  g_mutex_lock (&skeleton->priv->lock);
+  value = g_value_get_boolean (&(skeleton->priv->properties[14]));
+  g_mutex_unlock (&skeleton->priv->lock);
+  return value;
+}
+
+static void
+org_mpris_media_player2_player_skeleton_class_init (OrgMprisMediaPlayer2PlayerSkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = org_mpris_media_player2_player_skeleton_finalize;
+  gobject_class->get_property = org_mpris_media_player2_player_skeleton_get_property;
+  gobject_class->set_property = org_mpris_media_player2_player_skeleton_set_property;
+  gobject_class->notify       = org_mpris_media_player2_player_skeleton_notify;
+
+
+  org_mpris_media_player2_player_override_properties (gobject_class, 1);
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = org_mpris_media_player2_player_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = org_mpris_media_player2_player_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = org_mpris_media_player2_player_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = org_mpris_media_player2_player_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (OrgMprisMediaPlayer2PlayerSkeletonPrivate));
+#endif
+}
+
+static void
+org_mpris_media_player2_player_skeleton_iface_init (OrgMprisMediaPlayer2PlayerIface *iface)
+{
+  iface->seeked = _org_mpris_media_player2_player_on_signal_seeked;
+  iface->get_playback_status = org_mpris_media_player2_player_skeleton_get_playback_status;
+  iface->get_loop_status = org_mpris_media_player2_player_skeleton_get_loop_status;
+  iface->get_rate = org_mpris_media_player2_player_skeleton_get_rate;
+  iface->get_shuffle = org_mpris_media_player2_player_skeleton_get_shuffle;
+  iface->get_metadata = org_mpris_media_player2_player_skeleton_get_metadata;
+  iface->get_volume = org_mpris_media_player2_player_skeleton_get_volume;
+  iface->get_position = org_mpris_media_player2_player_skeleton_get_position;
+  iface->get_minimum_rate = org_mpris_media_player2_player_skeleton_get_minimum_rate;
+  iface->get_maximum_rate = org_mpris_media_player2_player_skeleton_get_maximum_rate;
+  iface->get_can_go_next = org_mpris_media_player2_player_skeleton_get_can_go_next;
+  iface->get_can_go_previous = org_mpris_media_player2_player_skeleton_get_can_go_previous;
+  iface->get_can_play = org_mpris_media_player2_player_skeleton_get_can_play;
+  iface->get_can_pause = org_mpris_media_player2_player_skeleton_get_can_pause;
+  iface->get_can_seek = org_mpris_media_player2_player_skeleton_get_can_seek;
+  iface->get_can_control = org_mpris_media_player2_player_skeleton_get_can_control;
+}
+
+/**
+ * org_mpris_media_player2_player_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-mpris-MediaPlayer2-Player.top_of_page">org.mpris.MediaPlayer2.Player</link>.
+ *
+ * Returns: (transfer full) (type OrgMprisMediaPlayer2PlayerSkeleton): The skeleton object.
+ */
+OrgMprisMediaPlayer2Player *
+org_mpris_media_player2_player_skeleton_new (void)
+{
+  return ORG_MPRIS_MEDIA_PLAYER2_PLAYER (g_object_new (TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, NULL));
+}
+
diff --git a/shairport-sync-mpris-player-interface.h b/shairport-sync-mpris-player-interface.h
new file mode 100644 (file)
index 0000000..a6baaac
--- /dev/null
@@ -0,0 +1,496 @@
+/*
+ * Generated by gdbus-codegen 2.48.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__
+#define __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.mpris.MediaPlayer2.Player */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER (org_mpris_media_player2_player_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, OrgMprisMediaPlayer2Player))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER))
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER, OrgMprisMediaPlayer2PlayerIface))
+
+struct _OrgMprisMediaPlayer2Player;
+typedef struct _OrgMprisMediaPlayer2Player OrgMprisMediaPlayer2Player;
+typedef struct _OrgMprisMediaPlayer2PlayerIface OrgMprisMediaPlayer2PlayerIface;
+
+struct _OrgMprisMediaPlayer2PlayerIface
+{
+  GTypeInterface parent_iface;
+
+
+
+  gboolean (*handle_next) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_open_uri) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *arg_Uri);
+
+  gboolean (*handle_pause) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_play) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_play_pause) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_previous) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_seek) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation,
+    gint64 arg_Offset);
+
+  gboolean (*handle_set_position) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *arg_TrackId,
+    gint64 arg_Position);
+
+  gboolean (*handle_stop) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean (*handle_stop_after_current) (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+  gboolean  (*get_can_control) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_can_go_next) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_can_go_previous) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_can_pause) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_can_play) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_can_seek) (OrgMprisMediaPlayer2Player *object);
+
+  const gchar * (*get_loop_status) (OrgMprisMediaPlayer2Player *object);
+
+  gdouble  (*get_maximum_rate) (OrgMprisMediaPlayer2Player *object);
+
+  GVariant * (*get_metadata) (OrgMprisMediaPlayer2Player *object);
+
+  gdouble  (*get_minimum_rate) (OrgMprisMediaPlayer2Player *object);
+
+  const gchar * (*get_playback_status) (OrgMprisMediaPlayer2Player *object);
+
+  gint64  (*get_position) (OrgMprisMediaPlayer2Player *object);
+
+  gdouble  (*get_rate) (OrgMprisMediaPlayer2Player *object);
+
+  gboolean  (*get_shuffle) (OrgMprisMediaPlayer2Player *object);
+
+  gdouble  (*get_volume) (OrgMprisMediaPlayer2Player *object);
+
+  void (*seeked) (
+    OrgMprisMediaPlayer2Player *object,
+    gint64 arg_Position);
+
+};
+
+GType org_mpris_media_player2_player_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *org_mpris_media_player2_player_interface_info (void);
+guint org_mpris_media_player2_player_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void org_mpris_media_player2_player_complete_next (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_previous (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_pause (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_play_pause (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_stop (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_stop_after_current (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_play (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_seek (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_set_position (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+void org_mpris_media_player2_player_complete_open_uri (
+    OrgMprisMediaPlayer2Player *object,
+    GDBusMethodInvocation *invocation);
+
+
+
+/* D-Bus signal emissions functions: */
+void org_mpris_media_player2_player_emit_seeked (
+    OrgMprisMediaPlayer2Player *object,
+    gint64 arg_Position);
+
+
+
+/* D-Bus method calls: */
+void org_mpris_media_player2_player_call_next (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_next_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_next_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_previous (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_previous_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_previous_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_pause (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_pause_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_pause_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_play_pause (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_play_pause_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_play_pause_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_stop (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_stop_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_stop_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_stop_after_current (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_stop_after_current_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_stop_after_current_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_play (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_play_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_play_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_seek (
+    OrgMprisMediaPlayer2Player *proxy,
+    gint64 arg_Offset,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_seek_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_seek_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    gint64 arg_Offset,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_set_position (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_TrackId,
+    gint64 arg_Position,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_set_position_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_set_position_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_TrackId,
+    gint64 arg_Position,
+    GCancellable *cancellable,
+    GError **error);
+
+void org_mpris_media_player2_player_call_open_uri (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_Uri,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean org_mpris_media_player2_player_call_open_uri_finish (
+    OrgMprisMediaPlayer2Player *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean org_mpris_media_player2_player_call_open_uri_sync (
+    OrgMprisMediaPlayer2Player *proxy,
+    const gchar *arg_Uri,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* D-Bus property accessors: */
+const gchar *org_mpris_media_player2_player_get_playback_status (OrgMprisMediaPlayer2Player *object);
+gchar *org_mpris_media_player2_player_dup_playback_status (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_playback_status (OrgMprisMediaPlayer2Player *object, const gchar *value);
+
+const gchar *org_mpris_media_player2_player_get_loop_status (OrgMprisMediaPlayer2Player *object);
+gchar *org_mpris_media_player2_player_dup_loop_status (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_loop_status (OrgMprisMediaPlayer2Player *object, const gchar *value);
+
+gdouble org_mpris_media_player2_player_get_rate (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
+
+gboolean org_mpris_media_player2_player_get_shuffle (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_shuffle (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+GVariant *org_mpris_media_player2_player_get_metadata (OrgMprisMediaPlayer2Player *object);
+GVariant *org_mpris_media_player2_player_dup_metadata (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_metadata (OrgMprisMediaPlayer2Player *object, GVariant *value);
+
+gdouble org_mpris_media_player2_player_get_volume (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_volume (OrgMprisMediaPlayer2Player *object, gdouble value);
+
+gint64 org_mpris_media_player2_player_get_position (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_position (OrgMprisMediaPlayer2Player *object, gint64 value);
+
+gdouble org_mpris_media_player2_player_get_minimum_rate (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_minimum_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
+
+gdouble org_mpris_media_player2_player_get_maximum_rate (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_maximum_rate (OrgMprisMediaPlayer2Player *object, gdouble value);
+
+gboolean org_mpris_media_player2_player_get_can_go_next (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_go_next (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+gboolean org_mpris_media_player2_player_get_can_go_previous (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_go_previous (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+gboolean org_mpris_media_player2_player_get_can_play (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_play (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+gboolean org_mpris_media_player2_player_get_can_pause (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_pause (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+gboolean org_mpris_media_player2_player_get_can_seek (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_seek (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+gboolean org_mpris_media_player2_player_get_can_control (OrgMprisMediaPlayer2Player *object);
+void org_mpris_media_player2_player_set_can_control (OrgMprisMediaPlayer2Player *object, gboolean value);
+
+
+/* ---- */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY (org_mpris_media_player2_player_proxy_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxy))
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxyClass))
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY, OrgMprisMediaPlayer2PlayerProxyClass))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_PROXY))
+
+typedef struct _OrgMprisMediaPlayer2PlayerProxy OrgMprisMediaPlayer2PlayerProxy;
+typedef struct _OrgMprisMediaPlayer2PlayerProxyClass OrgMprisMediaPlayer2PlayerProxyClass;
+typedef struct _OrgMprisMediaPlayer2PlayerProxyPrivate OrgMprisMediaPlayer2PlayerProxyPrivate;
+
+struct _OrgMprisMediaPlayer2PlayerProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  OrgMprisMediaPlayer2PlayerProxyPrivate *priv;
+};
+
+struct _OrgMprisMediaPlayer2PlayerProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType org_mpris_media_player2_player_proxy_get_type (void) G_GNUC_CONST;
+
+#if GLIB_CHECK_VERSION(2, 44, 0)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2PlayerProxy, g_object_unref)
+#endif
+
+void org_mpris_media_player2_player_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void org_mpris_media_player2_player_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON (org_mpris_media_player2_player_skeleton_get_type ())
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeleton))
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeletonClass))
+#define ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON, OrgMprisMediaPlayer2PlayerSkeletonClass))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON))
+#define IS_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_ORG_MPRIS_MEDIA_PLAYER2_PLAYER_SKELETON))
+
+typedef struct _OrgMprisMediaPlayer2PlayerSkeleton OrgMprisMediaPlayer2PlayerSkeleton;
+typedef struct _OrgMprisMediaPlayer2PlayerSkeletonClass OrgMprisMediaPlayer2PlayerSkeletonClass;
+typedef struct _OrgMprisMediaPlayer2PlayerSkeletonPrivate OrgMprisMediaPlayer2PlayerSkeletonPrivate;
+
+struct _OrgMprisMediaPlayer2PlayerSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  OrgMprisMediaPlayer2PlayerSkeletonPrivate *priv;
+};
+
+struct _OrgMprisMediaPlayer2PlayerSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType org_mpris_media_player2_player_skeleton_get_type (void) G_GNUC_CONST;
+
+#if GLIB_CHECK_VERSION(2, 44, 0)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (OrgMprisMediaPlayer2PlayerSkeleton, g_object_unref)
+#endif
+
+OrgMprisMediaPlayer2Player *org_mpris_media_player2_player_skeleton_new (void);
+
+
+G_END_DECLS
+
+#endif /* __SHAIRPORT_SYNC_MPRIS_PLAYER_INTERFACE_H__ */
diff --git a/shairport-sync-mpris-service.c b/shairport-sync-mpris-service.c
new file mode 100644 (file)
index 0000000..28db7d1
--- /dev/null
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "config.h"
+
+#include "common.h"
+#include "player.h"
+#include "rtsp.h"
+
+#include "rtp.h"
+
+#include "dacp.h"
+
+#include "shairport-sync-mpris-service.h"
+
+static void on_mpris_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+
+const char* empty_string_array[] = {
+    NULL
+};
+
+  debug(1,"MPRIS well-known interface name \"%s\" acquired for %s.",name,config.appName);
+  mprisPlayerSkeleton = org_mpris_media_player2_skeleton_new();
+  mprisPlayerPlayerSkeleton = org_mpris_media_player2_player_skeleton_new();
+
+  g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(mprisPlayerSkeleton), connection,
+                                   "/org/mpris/MediaPlayer2", NULL);
+  g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(mprisPlayerPlayerSkeleton), connection,
+                                   "/org/mpris/MediaPlayer2", NULL);
+                                   
+  org_mpris_media_player2_set_desktop_entry(mprisPlayerSkeleton, "shairport-sync");
+  org_mpris_media_player2_set_identity(mprisPlayerSkeleton, "Shairport Sync");
+  org_mpris_media_player2_set_can_quit(mprisPlayerSkeleton, FALSE);
+  org_mpris_media_player2_set_can_raise(mprisPlayerSkeleton, FALSE);
+  org_mpris_media_player2_set_has_track_list(mprisPlayerSkeleton, FALSE);
+  org_mpris_media_player2_set_supported_uri_schemes (mprisPlayerSkeleton,empty_string_array);
+  org_mpris_media_player2_set_supported_mime_types (mprisPlayerSkeleton, empty_string_array);
+  
+  org_mpris_media_player2_player_set_playback_status (mprisPlayerPlayerSkeleton, "stop");
+  org_mpris_media_player2_player_set_loop_status (mprisPlayerPlayerSkeleton, "off");
+  org_mpris_media_player2_player_set_volume (mprisPlayerPlayerSkeleton, 0.5);
+  org_mpris_media_player2_player_set_minimum_rate (mprisPlayerPlayerSkeleton,1.0);
+  org_mpris_media_player2_player_set_maximum_rate (mprisPlayerPlayerSkeleton,1.0);
+  org_mpris_media_player2_player_set_can_go_next (mprisPlayerPlayerSkeleton,FALSE);
+  org_mpris_media_player2_player_set_can_go_previous (mprisPlayerPlayerSkeleton,FALSE);
+  org_mpris_media_player2_player_set_can_play (mprisPlayerPlayerSkeleton, TRUE);
+  org_mpris_media_player2_player_set_can_pause (mprisPlayerPlayerSkeleton,FALSE);
+  org_mpris_media_player2_player_set_can_seek (mprisPlayerPlayerSkeleton, FALSE);
+  org_mpris_media_player2_player_set_can_control (mprisPlayerPlayerSkeleton, TRUE); 
+  debug(1,"MPRIS service started on interface \"%s\".",name);
+}
+
+static void on_mpris_name_lost_again(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+  warn("Could not acquire an MPRIS interface.");
+}
+
+static void on_mpris_name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+  debug(1,"Could not acquire well-known interface name \"%s\" -- will try adding the process number to the end of it.",name);
+  pid_t pid = getpid();
+  char interface_name[256] = "";
+  sprintf(interface_name,"org.mpris.MediaPlayer2.ShairportSync.i%d",pid);
+  GBusType mpris_bus_type = G_BUS_TYPE_SYSTEM;
+  if (config.mpris_service_bus_type==DBT_session)
+    mpris_bus_type = G_BUS_TYPE_SESSION;
+  debug(1,"Looking for well-known interface name \"%s\".",interface_name);
+  g_bus_own_name(mpris_bus_type, interface_name, G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
+                on_mpris_name_acquired, on_mpris_name_lost_again, NULL, NULL);
+}
+
+int start_mpris_service() {
+  mprisPlayerSkeleton = NULL;
+  mprisPlayerPlayerSkeleton = NULL;
+  GBusType mpris_bus_type = G_BUS_TYPE_SYSTEM;
+  if (config.mpris_service_bus_type==DBT_session)
+    mpris_bus_type = G_BUS_TYPE_SESSION;
+  debug(1,"Looking for well-known name \"org.mpris.MediaPlayer2.ShairportSync\".");
+  g_bus_own_name(mpris_bus_type, "org.mpris.MediaPlayer2.ShairportSync", G_BUS_NAME_OWNER_FLAGS_NONE, NULL,
+                on_mpris_name_acquired, on_mpris_name_lost, NULL, NULL);
+  return 0; // this is just to quieten a compiler warning
+}
diff --git a/shairport-sync-mpris-service.h b/shairport-sync-mpris-service.h
new file mode 100644 (file)
index 0000000..966ef8d
--- /dev/null
@@ -0,0 +1,13 @@
+
+#ifndef MPRIS_SERVICE_H
+#define MPRIS_SERVICE_H
+
+#include "shairport-sync-mpris-interface.h"
+#include "shairport-sync-mpris-player-interface.h"
+
+OrgMprisMediaPlayer2 *mprisPlayerSkeleton;
+OrgMprisMediaPlayer2Player *mprisPlayerPlayerSkeleton;
+
+int start_mpris_service();
+
+#endif /* #ifndef MPRIS_SERVICE_H */
index 4f6a9c3095cf59f6b5cbb75ddc3fca091c11bf47..971f3a0c3558d80333de72c683440f9f4a7cd72c 100644 (file)
 #include "shairport-sync-dbus-service.h"
 #endif
 
+#ifdef HAVE_MPRIS
+#include "shairport-sync-mpris-service.h"
+#endif
+
+
 #include "common.h"
 #include "mdns.h"
 #include "rtp.h"
@@ -78,7 +83,6 @@
 #endif
 
 static int shutting_down = 0;
-static char *appName = NULL;
 char configuration_file_path[4096 + 1];
 char actual_configuration_file_path[4096 + 1];
 
@@ -223,6 +227,12 @@ char *get_version_string() {
 #endif
 #ifdef CONFIG_METADATA
     strcat(version_string, "-metadata");
+#endif
+#ifdef HAVE_DBUS
+    strcat(version_string, "-dbus");
+#endif
+#ifdef HAVE_MPRIS
+    strcat(version_string, "-mpris");
 #endif
     strcat(version_string, "-sysconfdir:");
     strcat(version_string, SYSCONFDIR);
@@ -854,6 +864,31 @@ int parse_options(int argc, char **argv) {
             config_error_file(&config_file_stuff), config_error_text(&config_file_stuff));
       }
     }
+#if defined(HAVE_DBUS)
+      /* Get the dbus service sbus setting. */
+      if (config_lookup_string(config.cfg, "general.dbus_service_bus", &str)) {
+        if (strcasecmp(str, "system") == 0)
+          config.dbus_service_bus_type = DBT_system;
+        else if (strcasecmp(str, "session") == 0)
+          config.dbus_service_bus_type = DBT_session;
+        else
+          die("Invalid dbus_service_bus option choice \"%s\". It should be \"system\" (default) or \"session\"");
+      }
+#endif
+
+#if defined(HAVE_MPRIS)
+      /* Get the mpris service sbus setting. */
+      if (config_lookup_string(config.cfg, "general.mpris_service_bus", &str)) {
+        if (strcasecmp(str, "system") == 0)
+          config.mpris_service_bus_type = DBT_system;
+        else if (strcasecmp(str, "session") == 0)
+          config.mpris_service_bus_type = DBT_session;
+        else
+          die("Invalid mpris_service_bus option choice \"%s\". It should be \"system\" (default) or \"session\"");
+      }
+#endif
+
+
     free(config_file_real_path);
   }
 
@@ -1030,8 +1065,11 @@ const char *pid_file_proc(void) {
 }
 
 void exit_function() {
+  debug(1,"exit function called...");
   if (config.cfg)
     config_destroy(config.cfg);
+  if (config.appName)
+    free(config.appName);
   // probably should be freeing malloc'ed memory here, including strdup-created strings...
 }
 
@@ -1044,8 +1082,8 @@ int main(int argc, char **argv) {
   // this is a bit weird, but apparently necessary
   char *basec = strdup(argv[0]);
   char *bname = basename(basec);
-  appName = strdup(bname);
-  if (appName == NULL)
+  config.appName = strdup(bname);
+  if (config.appName == NULL)
     die("can not allocate memory for the app name!");
   free(basec);
 
@@ -1078,7 +1116,7 @@ int main(int argc, char **argv) {
   // strcat(configuration_file_path, "/shairport-sync"); // thinking about adding a special
   // shairport-sync directory
   strcat(configuration_file_path, "/");
-  strcat(configuration_file_path, appName);
+  strcat(configuration_file_path, config.appName);
   strcat(configuration_file_path, ".conf");
   config.configfile = configuration_file_path;
 
@@ -1496,11 +1534,16 @@ int main(int argc, char **argv) {
   metadata_init(); // create the metadata pipe if necessary
 #endif
 
-#ifdef HAVE_DBUS
+#if defined(HAVE_DBUS) || defined(HAVE_MPRIS)
   // Start up DBUS services after initial settings are all made
   debug(1, "Starting up D-Bus services");
   pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
+#ifdef HAVE_DBUS
   start_dbus_service();
+#endif
+#ifdef HAVE_MPRIS
+  start_mpris_service();
+#endif
 #endif
 
   daemon_log(LOG_INFO, "Successful Startup");