From: Mike Brady Date: Thu, 29 Mar 2018 16:17:50 +0000 (+0100) Subject: Quieten some unnecessary D-Bus property-changed chatter X-Git-Tag: 3.2RC1~7^2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=051326b4882f825cd5ffee96054e5bbc05a31ecb;p=thirdparty%2Fshairport-sync.git Quieten some unnecessary D-Bus property-changed chatter --- diff --git a/dbus-service.c b/dbus-service.c index 5a1689de..45e6f9b9 100644 --- a/dbus-service.c +++ b/dbus-service.c @@ -15,174 +15,184 @@ #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");