#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,
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)
shairportSyncAdvancedRemoteControlSkeleton =
shairport_sync_advanced_remote_control_skeleton_new();
+
g_dbus_interface_skeleton_export(
G_DBUS_INTERFACE_SKELETON(shairportSyncAdvancedRemoteControlSkeleton), connection,
"/org/gnome/ShairportSync", NULL);
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);
"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");