]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Quieten some unnecessary D-Bus property-changed chatter
authorMike Brady <mikebrady@eircom.net>
Thu, 29 Mar 2018 16:17:50 +0000 (17:17 +0100)
committerMike Brady <mikebrady@eircom.net>
Thu, 29 Mar 2018 16:17:50 +0000 (17:17 +0100)
dbus-service.c

index 5a1689de9bdb6890f036a8a4e58655b5d371be33..45e6f9b96d7a36ff7f2b6ef2ba6a979af7d3c673 100644 (file)
 
 #include "dbus-service.h"
 
-ShairportSyncDiagnostics *shairportSyncDiagnosticsSkeleton;
-ShairportSyncRemoteControl *shairportSyncRemoteControlSkeleton;
-ShairportSyncAdvancedRemoteControl *shairportSyncAdvancedRemoteControlSkeleton;
+int initialised = 0;
+ShairportSyncDiagnostics *shairportSyncDiagnosticsSkeleton = NULL;
+ShairportSyncRemoteControl *shairportSyncRemoteControlSkeleton = NULL;
+ShairportSyncAdvancedRemoteControl *shairportSyncAdvancedRemoteControlSkeleton = NULL;
 
 void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused)) void *userdata) {
-
-  shairport_sync_advanced_remote_control_set_volume(shairportSyncAdvancedRemoteControlSkeleton,
-                                                    argc->speaker_volume);
-
-  shairport_sync_remote_control_set_airplay_volume(shairportSyncRemoteControlSkeleton,
-                                                   argc->airplay_volume);
-
-  shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton, argc->client_ip);
-
-  if (argc->dacp_server_active) {
-    shairport_sync_remote_control_set_available(shairportSyncRemoteControlSkeleton, TRUE);
-  } else {
-    shairport_sync_remote_control_set_available(shairportSyncRemoteControlSkeleton, FALSE);
+       char response[100];
+       if (initialised) {
+               shairport_sync_advanced_remote_control_set_volume(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                       argc->speaker_volume);
+
+               shairport_sync_remote_control_set_airplay_volume(shairportSyncRemoteControlSkeleton,
+                                                                                                                                                                                                                argc->airplay_volume);
+
+               shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton, argc->client_ip);
+
+               if (argc->dacp_server_active) {
+                       shairport_sync_remote_control_set_available(shairportSyncRemoteControlSkeleton, TRUE);
+               } else {
+                       shairport_sync_remote_control_set_available(shairportSyncRemoteControlSkeleton, FALSE);
+               }
+
+               if (argc->advanced_dacp_server_active) {
+                       shairport_sync_advanced_remote_control_set_available(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                                        TRUE);
+               } else {
+                       shairport_sync_advanced_remote_control_set_available(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                                        FALSE);
+               }
+
+               switch (argc->player_state) {
+               case PS_NOT_AVAILABLE:
+                       shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton,
+                                                                                                                                                                                                                "Not Available");
+               case PS_STOPPED:
+                       shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Stopped");
+                       break;
+               case PS_PAUSED:
+                       shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Paused");
+                       break;
+               case PS_PLAYING:
+                       shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Playing");
+                       break;
+               default:
+                       debug(1, "This should never happen.");
+               }
+
+               switch (argc->play_status) {
+               case PS_NOT_AVAILABLE:
+                       shairport_sync_advanced_remote_control_set_playback_status(
+                                       shairportSyncAdvancedRemoteControlSkeleton, "Not Available");
+               case PS_STOPPED:
+                       shairport_sync_advanced_remote_control_set_playback_status(
+                                       shairportSyncAdvancedRemoteControlSkeleton, "Stopped");
+                       break;
+               case PS_PAUSED:
+                       shairport_sync_advanced_remote_control_set_playback_status(
+                                       shairportSyncAdvancedRemoteControlSkeleton, "Paused");
+                       break;
+               case PS_PLAYING:
+                       shairport_sync_advanced_remote_control_set_playback_status(
+                                       shairportSyncAdvancedRemoteControlSkeleton, "Playing");
+                       break;
+               default:
+                       debug(1, "This should never happen.");
+               }
+
+               switch (argc->repeat_status) {
+               case RS_NOT_AVAILABLE:
+                       strcpy(response,"Not Available");
+                       break;
+               case RS_OFF:
+                       strcpy(response,"Off");
+                       break;
+               case RS_ONE:
+                       strcpy(response,"One");
+                       break;
+               case RS_ALL:
+                       strcpy(response,"All");
+                       break;
+               default:
+                       debug(1, "This should never happen.");
+               }
+               const char *th = shairport_sync_advanced_remote_control_get_loop_status(shairportSyncAdvancedRemoteControlSkeleton);
+               if (th)
+                       debug(1,"Reported loop status is \"%s\".",th);
+               else
+                       debug(1,"Null loop status.");
+                       
+               // only set this if it's different
+               if ((th==NULL) || (strcasecmp(th,response)!=0)) {
+                       debug(1,"Loop Status should be changed");
+                       shairport_sync_advanced_remote_control_set_loop_status(shairportSyncAdvancedRemoteControlSkeleton, response);  
+               }
+
+               switch (argc->shuffle_status) {
+               case SS_NOT_AVAILABLE:
+                       shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                                FALSE);
+                       break;
+               case SS_OFF:
+                       shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                                FALSE);
+                       break;
+               case SS_ON:
+                       shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
+                                                                                                                                                                                                                                TRUE);
+                       break;
+               default:
+                       debug(1, "This should never happen.");
+               }
+
+               GVariantBuilder *dict_builder, *aa;
+
+               /* Build the metadata array */
+               // debug(1,"Build metadata");
+               dict_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+               // Make up the artwork URI if we have one
+               if (argc->cover_art_pathname) {
+                       char artURIstring[1024];
+                       sprintf(artURIstring, "file://%s", argc->cover_art_pathname);
+                       // sprintf(artURIstring,"");
+                       // debug(1,"artURI String: \"%s\".",artURIstring);
+                       GVariant *artUrl = g_variant_new("s", artURIstring);
+                       g_variant_builder_add(dict_builder, "{sv}", "mpris:artUrl", artUrl);
+               }
+
+               // Add the TrackID if we have one
+               if (argc->item_id) {
+                       char trackidstring[128];
+                       // debug(1, "Set ID using mper ID: \"%u\".",argc->item_id);
+                       sprintf(trackidstring, "/org/gnome/ShairportSync/mper_%u", argc->item_id);
+                       GVariant *trackid = g_variant_new("o", trackidstring);
+                       g_variant_builder_add(dict_builder, "{sv}", "mpris:trackid", trackid);
+               }
+
+               // Add the track name if there is one
+               if (argc->track_name) {
+                       // debug(1, "Track name set to \"%s\".", argc->track_name);
+                       GVariant *trackname = g_variant_new("s", argc->track_name);
+                       g_variant_builder_add(dict_builder, "{sv}", "xesam:title", trackname);
+               }
+
+               // Add the album name if there is one
+               if (argc->album_name) {
+                       // debug(1, "Album name set to \"%s\".", argc->album_name);
+                       GVariant *albumname = g_variant_new("s", argc->album_name);
+                       g_variant_builder_add(dict_builder, "{sv}", "xesam:album", albumname);
+               }
+
+               // Add the artists if there are any (actually there will be at most one, but put it in an array)
+               if (argc->artist_name) {
+                       /* Build the artists array */
+                       // debug(1,"Build artist array");
+                       aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
+                       g_variant_builder_add(aa, "s", argc->artist_name);
+                       GVariant *artists = g_variant_builder_end(aa);
+                       g_variant_builder_unref(aa);
+                       g_variant_builder_add(dict_builder, "{sv}", "xesam:artist", artists);
+               }
+
+               // Add the genres if there are any (actually there will be at most one, but put it in an array)
+               if (argc->genre) {
+                       // debug(1,"Build genre");
+                       aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
+                       g_variant_builder_add(aa, "s", argc->genre);
+                       GVariant *genres = g_variant_builder_end(aa);
+                       g_variant_builder_unref(aa);
+                       g_variant_builder_add(dict_builder, "{sv}", "xesam:genre", genres);
+               }
+
+               GVariant *dict = g_variant_builder_end(dict_builder);
+               g_variant_builder_unref(dict_builder);
+
+               // debug(1,"Set metadata");
+               shairport_sync_remote_control_set_metadata(shairportSyncRemoteControlSkeleton, dict);
   }
-
-  if (argc->advanced_dacp_server_active) {
-    shairport_sync_advanced_remote_control_set_available(shairportSyncAdvancedRemoteControlSkeleton,
-                                                         TRUE);
-  } else {
-    shairport_sync_advanced_remote_control_set_available(shairportSyncAdvancedRemoteControlSkeleton,
-                                                         FALSE);
-  }
-
-  switch (argc->player_state) {
-  case PS_NOT_AVAILABLE:
-    shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton,
-                                                   "Not Available");
-  case PS_STOPPED:
-    shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Stopped");
-    break;
-  case PS_PAUSED:
-    shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Paused");
-    break;
-  case PS_PLAYING:
-    shairport_sync_remote_control_set_player_state(shairportSyncRemoteControlSkeleton, "Playing");
-    break;
-  default:
-    debug(1, "This should never happen.");
-  }
-
-  switch (argc->play_status) {
-  case PS_NOT_AVAILABLE:
-    shairport_sync_advanced_remote_control_set_playback_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Not Available");
-  case PS_STOPPED:
-    shairport_sync_advanced_remote_control_set_playback_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Stopped");
-    break;
-  case PS_PAUSED:
-    shairport_sync_advanced_remote_control_set_playback_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Paused");
-    break;
-  case PS_PLAYING:
-    shairport_sync_advanced_remote_control_set_playback_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Playing");
-    break;
-  default:
-    debug(1, "This should never happen.");
-  }
-
-  switch (argc->repeat_status) {
-  case RS_NOT_AVAILABLE:
-    shairport_sync_advanced_remote_control_set_loop_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Not Available");
-    break;
-  case RS_OFF:
-    shairport_sync_advanced_remote_control_set_loop_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "Off");
-    break;
-  case RS_ONE:
-    shairport_sync_advanced_remote_control_set_loop_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "One");
-    break;
-  case RS_ALL:
-    shairport_sync_advanced_remote_control_set_loop_status(
-        shairportSyncAdvancedRemoteControlSkeleton, "All");
-    break;
-  default:
-    debug(1, "This should never happen.");
-  }
-
-  switch (argc->shuffle_status) {
-  case SS_NOT_AVAILABLE:
-    shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
-                                                       FALSE);
-    break;
-  case SS_OFF:
-    shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
-                                                       FALSE);
-    break;
-  case SS_ON:
-    shairport_sync_advanced_remote_control_set_shuffle(shairportSyncAdvancedRemoteControlSkeleton,
-                                                       TRUE);
-    break;
-  default:
-    debug(1, "This should never happen.");
-  }
-
-  GVariantBuilder *dict_builder, *aa;
-
-  /* Build the metadata array */
-  // debug(1,"Build metadata");
-  dict_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
-
-  // Make up the artwork URI if we have one
-  if (argc->cover_art_pathname) {
-    char artURIstring[1024];
-    sprintf(artURIstring, "file://%s", argc->cover_art_pathname);
-    // sprintf(artURIstring,"");
-    // debug(1,"artURI String: \"%s\".",artURIstring);
-    GVariant *artUrl = g_variant_new("s", artURIstring);
-    g_variant_builder_add(dict_builder, "{sv}", "mpris:artUrl", artUrl);
-  }
-
-  // Add the TrackID if we have one
-  if (argc->item_id) {
-    char trackidstring[128];
-    // debug(1, "Set ID using mper ID: \"%u\".",argc->item_id);
-    sprintf(trackidstring, "/org/gnome/ShairportSync/mper_%u", argc->item_id);
-    GVariant *trackid = g_variant_new("o", trackidstring);
-    g_variant_builder_add(dict_builder, "{sv}", "mpris:trackid", trackid);
-  }
-
-  // Add the track name if there is one
-  if (argc->track_name) {
-    // debug(1, "Track name set to \"%s\".", argc->track_name);
-    GVariant *trackname = g_variant_new("s", argc->track_name);
-    g_variant_builder_add(dict_builder, "{sv}", "xesam:title", trackname);
-  }
-
-  // Add the album name if there is one
-  if (argc->album_name) {
-    // debug(1, "Album name set to \"%s\".", argc->album_name);
-    GVariant *albumname = g_variant_new("s", argc->album_name);
-    g_variant_builder_add(dict_builder, "{sv}", "xesam:album", albumname);
-  }
-
-  // Add the artists if there are any (actually there will be at most one, but put it in an array)
-  if (argc->artist_name) {
-    /* Build the artists array */
-    // debug(1,"Build artist array");
-    aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
-    g_variant_builder_add(aa, "s", argc->artist_name);
-    GVariant *artists = g_variant_builder_end(aa);
-    g_variant_builder_unref(aa);
-    g_variant_builder_add(dict_builder, "{sv}", "xesam:artist", artists);
-  }
-
-  // Add the genres if there are any (actually there will be at most one, but put it in an array)
-  if (argc->genre) {
-    // debug(1,"Build genre");
-    aa = g_variant_builder_new(G_VARIANT_TYPE("as"));
-    g_variant_builder_add(aa, "s", argc->genre);
-    GVariant *genres = g_variant_builder_end(aa);
-    g_variant_builder_unref(aa);
-    g_variant_builder_add(dict_builder, "{sv}", "xesam:genre", genres);
-  }
-
-  GVariant *dict = g_variant_builder_end(dict_builder);
-  g_variant_builder_unref(dict_builder);
-
-  // debug(1,"Set metadata");
-  shairport_sync_remote_control_set_metadata(shairportSyncRemoteControlSkeleton, dict);
 }
 
 static gboolean on_handle_set_volume(ShairportSyncAdvancedRemoteControl *skeleton,
@@ -490,6 +500,7 @@ gboolean notify_loop_status_callback(ShairportSyncAdvancedRemoteControl *skeleto
   char *th = (char *)shairport_sync_advanced_remote_control_get_loop_status(skeleton);
   //  enum volume_control_profile_type previous_volume_control_profile =
   //  config.volume_control_profile;
+  debug(1,"notify_loop_status_callback called with loop status of \"%s\".",th);
   if (strcasecmp(th, "off") == 0)
     send_simple_dacp_command("setproperty?dacp.repeatstate=0");
   else if (strcasecmp(th, "one") == 0)
@@ -549,6 +560,7 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
 
   shairportSyncAdvancedRemoteControlSkeleton =
       shairport_sync_advanced_remote_control_skeleton_new();
+      
   g_dbus_interface_skeleton_export(
       G_DBUS_INTERFACE_SKELETON(shairportSyncAdvancedRemoteControlSkeleton), connection,
       "/org/gnome/ShairportSync", NULL);
@@ -616,6 +628,8 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
                    G_CALLBACK(notify_loop_status_callback), NULL);
 
   add_metadata_watcher(dbus_metadata_watcher, NULL);
+  
+  initialised = 1;
 
   shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(shairportSyncSkeleton),
                                         config.loudness_reference_volume_db);
@@ -694,6 +708,9 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
                                                  "Not Available");
   shairport_sync_advanced_remote_control_set_playback_status(
       shairportSyncAdvancedRemoteControlSkeleton, "Not Available");
+  
+  shairport_sync_advanced_remote_control_set_loop_status(
+      shairportSyncAdvancedRemoteControlSkeleton, "Not Available");
 
   debug(1, "Shairport Sync native D-Bus service started at \"%s\" on the %s bus.", name,
         (config.dbus_service_bus_type == DBT_session) ? "session" : "system");