Quieten some unnecessary D-Bus property-changed chatter
This commit is contained in:
+178
-161
@@ -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) {
|
||||
char response[100];
|
||||
if (initialised) {
|
||||
shairport_sync_advanced_remote_control_set_volume(shairportSyncAdvancedRemoteControlSkeleton,
|
||||
argc->speaker_volume);
|
||||
|
||||
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_airplay_volume(shairportSyncRemoteControlSkeleton,
|
||||
argc->airplay_volume);
|
||||
shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton, argc->client_ip);
|
||||
|
||||
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->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");
|
||||
|
||||
Reference in New Issue
Block a user