#include "tinyhttp/http.h"
typedef struct {
- int players_connection_thread_index; // the connection thread index when a player thread is associated with this, zero otherwise
- int scan_enable; // set to 1 if if sacanning should be considered
- uint16_t port; // zero if no port discovered
- short connection_family; // AF_INET6 or AF_INET
- uint32_t scope_id; // if it's an ipv6 connection, this will be its scope id
- char ip_string[INET6_ADDRSTRLEN]; // the ip string pointing to the client
- uint32_t active_remote_id; // send this when you want to send remote control commands
+ int players_connection_thread_index; // the connection thread index when a player thread is
+ // associated with this, zero otherwise
+ int scan_enable; // set to 1 if if sacanning should be considered
+ uint16_t port; // zero if no port discovered
+ short connection_family; // AF_INET6 or AF_INET
+ uint32_t scope_id; // if it's an ipv6 connection, this will be its scope id
+ char ip_string[INET6_ADDRSTRLEN]; // the ip string pointing to the client
+ uint32_t active_remote_id; // send this when you want to send remote control commands
} dacp_server_record;
pthread_t dacp_monitor_thread;
// only do this one at a time -- not sure it is necessary, but better safe than sorry
- int mutex_reply = ss_pthread_mutex_timedlock(&dacp_conversation_lock,1000000,command,1);
+ int mutex_reply = ss_pthread_mutex_timedlock(&dacp_conversation_lock, 1000000, command, 1);
if (mutex_reply == 0) {
// debug(1,"dacp_conversation_lock acquired for command \"%s\".",command);
}
void relinquish_dacp_server_information(rtsp_conn_info *conn) {
-// this will set the dacp_server.players_connection_thread_index to zero iff it has the same value as the conn's connection number
-// this is to signify that the player has stopped, but only if another thread (with a different index) hasn't already taken over the dacp service
- ss_pthread_mutex_timedlock(&dacp_server_information_lock,500000,"set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.",1);
+ // this will set the dacp_server.players_connection_thread_index to zero iff it has the same value
+ // as the conn's connection number
+ // this is to signify that the player has stopped, but only if another thread (with a different
+ // index) hasn't already taken over the dacp service
+ ss_pthread_mutex_timedlock(
+ &dacp_server_information_lock, 500000,
+ "set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.", 1);
if (dacp_server.players_connection_thread_index == conn->connection_number)
dacp_server.players_connection_thread_index = 0;
pthread_mutex_unlock(&dacp_server_information_lock);
// this will be running on the thread of its caller, not of the conversation thread...
void set_dacp_server_information(rtsp_conn_info *conn) { // tell the DACP conversation thread that
// the port has been set or changed
- ss_pthread_mutex_timedlock(&dacp_server_information_lock,500000,"set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.",1);
+ ss_pthread_mutex_timedlock(
+ &dacp_server_information_lock, 500000,
+ "set_dacp_server_information couldn't get DACP server information lock in 0.5 second!.", 1);
dacp_server.players_connection_thread_index = conn->connection_number;
dacp_server.port = conn->dacp_port;
dacp_server.connection_family = conn->connection_ip_family;
int32_t revision_number = 1;
while (1) {
int result;
- ss_pthread_mutex_timedlock(&dacp_server_information_lock,500000,"dacp_monitor_thread_code couldn't get DACP server information lock in 0.5 second!.",1);
+ ss_pthread_mutex_timedlock(
+ &dacp_server_information_lock, 500000,
+ "dacp_monitor_thread_code couldn't get DACP server information lock in 0.5 second!.", 1);
while (dacp_server.scan_enable == 0) {
// debug(1, "Wait for a valid DACP port");
pthread_cond_wait(&dacp_server_information_cv, &dacp_server_information_lock);
// debug(1,"Stopping scan because the response to \"dacp_get_volume(NULL)\" is %d.",result);
dacp_server.scan_enable = 0;
metadata_hub_modify_prolog();
- int ch = metadata_store.dacp_server_active !=0;
+ int ch = metadata_store.dacp_server_active != 0;
metadata_store.dacp_server_active = 0;
metadata_hub_modify_epilog(ch);
}
void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused)) void *userdata) {
// debug(1, "DBUS metadata watcher called");
shairport_sync_set_volume(shairportSyncSkeleton, argc->speaker_volume);
-
+
// debug(1, "No diagnostics watcher required");
// debug(1, "DBUS basic remote control watcher called");
-
- shairport_sync_basic_remote_control_set_airplay_volume(shairportSyncBasicRemoteControlSkeleton, argc->airplay_volume);
-
+
+ shairport_sync_basic_remote_control_set_airplay_volume(shairportSyncBasicRemoteControlSkeleton,
+ argc->airplay_volume);
+
if (argc->dacp_server_active)
- shairport_sync_basic_remote_control_set_server(shairportSyncBasicRemoteControlSkeleton, argc->client_ip);
+ shairport_sync_basic_remote_control_set_server(shairportSyncBasicRemoteControlSkeleton,
+ argc->client_ip);
else
- shairport_sync_basic_remote_control_set_server(shairportSyncBasicRemoteControlSkeleton, "");
-
- GVariantBuilder *dict_builder, *aa;
+ shairport_sync_basic_remote_control_set_server(shairportSyncBasicRemoteControlSkeleton, "");
+
+ GVariantBuilder *dict_builder, *aa;
/* Build the metadata array */
// debug(1,"Build metadata");
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);
// debug(1,"Set metadata");
shairport_sync_basic_remote_control_set_metadata(shairportSyncBasicRemoteControlSkeleton, dict);
-
-
}
-static gboolean on_handle_fast_forward(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_fast_forward(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("beginff");
shairport_sync_basic_remote_control_complete_fast_forward(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_rewind(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_rewind(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("beginrew");
shairport_sync_basic_remote_control_complete_rewind(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_toggle_mute(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_toggle_mute(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("mutetoggle");
shairport_sync_basic_remote_control_complete_toggle_mute(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_next(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
+static gboolean on_handle_next(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
__attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("nextitem");
shairport_sync_basic_remote_control_complete_next(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_previous(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_previous(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("previtem");
shairport_sync_basic_remote_control_complete_previous(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_pause(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_pause(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("pause");
shairport_sync_basic_remote_control_complete_pause(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_play_pause(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_play_pause(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("playpause");
shairport_sync_basic_remote_control_complete_play_pause(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_play(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
+static gboolean on_handle_play(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
__attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("play");
shairport_sync_basic_remote_control_complete_play(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_stop(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
+static gboolean on_handle_stop(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
__attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("stop");
shairport_sync_basic_remote_control_complete_stop(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_resume(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_resume(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("playresume");
shairport_sync_basic_remote_control_complete_resume(skeleton, invocation);
return TRUE;
}
-
-static gboolean on_handle_shuffle_songs(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_shuffle_songs(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("shuffle_songs");
shairport_sync_basic_remote_control_complete_shuffle_songs(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_volume_up(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_volume_up(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("volumeup");
shairport_sync_basic_remote_control_complete_volume_up(skeleton, invocation);
return TRUE;
}
-static gboolean on_handle_volume_down(ShairportSyncBasicRemoteControl *skeleton, GDBusMethodInvocation *invocation,
- __attribute__((unused)) gpointer user_data) {
+static gboolean on_handle_volume_down(ShairportSyncBasicRemoteControl *skeleton,
+ GDBusMethodInvocation *invocation,
+ __attribute__((unused)) gpointer user_data) {
send_simple_dacp_command("volumedown");
shairport_sync_basic_remote_control_complete_volume_down(skeleton, invocation);
return TRUE;
}
gboolean notify_elapsed_time_callback(ShairportSyncDiagnostics *skeleton,
- __attribute__((unused)) gpointer user_data) {
+ __attribute__((unused)) gpointer user_data) {
// debug(1, "\"notify_elapsed_time_callback\" called.");
if (shairport_sync_diagnostics_get_elapsed_time(skeleton)) {
config.debugger_show_elapsed_time = 1;
}
gboolean notify_delta_time_callback(ShairportSyncDiagnostics *skeleton,
- __attribute__((unused)) gpointer user_data) {
+ __attribute__((unused)) gpointer user_data) {
// debug(1, "\"notify_delta_time_callback\" called.");
if (shairport_sync_diagnostics_get_delta_time(skeleton)) {
config.debugger_show_relative_time = 1;
}
gboolean notify_statistics_callback(ShairportSyncDiagnostics *skeleton,
- __attribute__((unused)) gpointer user_data) {
+ __attribute__((unused)) gpointer user_data) {
// debug(1, "\"notify_statistics_callback\" called.");
if (shairport_sync_diagnostics_get_statistics(skeleton)) {
debug(1, ">> start logging statistics");
}
gboolean notify_verbosity_callback(ShairportSyncDiagnostics *skeleton,
- __attribute__((unused)) gpointer user_data) {
+ __attribute__((unused)) gpointer user_data) {
gint th = shairport_sync_diagnostics_get_verbosity(skeleton);
if ((th >= 0) && (th <= 3)) {
- if (th==0)
+ if (th == 0)
debug(1, ">> log verbosity set to %d.", th);
debuglev = th;
debug(1, ">> log verbosity set to %d.", th);
return TRUE;
}
-static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) {
+static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name,
+ gpointer user_data) {
// debug(1, "Shairport Sync native D-Bus interface \"%s\" acquired on the %s bus.", name,
// (config.dbus_service_bus_type == DBT_session) ? "session" : "system");
// debug(1,"dbus_diagnostics_on_dbus_name_acquired");
shairportSyncDiagnosticsSkeleton = shairport_sync_diagnostics_skeleton_new();
- g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncDiagnosticsSkeleton), connection,
- "/org/gnome/ShairportSync", NULL);
-
- shairport_sync_diagnostics_set_verbosity(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton),
- debuglev);
-
+ g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncDiagnosticsSkeleton),
+ connection, "/org/gnome/ShairportSync", NULL);
+
+ shairport_sync_diagnostics_set_verbosity(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), debuglev);
+
// debug(2,">> log verbosity is %d.",debuglev);
if (config.statistics_requested == 0) {
- shairport_sync_diagnostics_set_statistics(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
+ shairport_sync_diagnostics_set_statistics(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
// debug(1, ">> statistics logging is off");
} else {
- shairport_sync_diagnostics_set_statistics(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
+ shairport_sync_diagnostics_set_statistics(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
// debug(1, ">> statistics logging is on");
}
-
+
if (config.debugger_show_elapsed_time == 0) {
- shairport_sync_diagnostics_set_elapsed_time(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
+ shairport_sync_diagnostics_set_elapsed_time(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
// debug(1, ">> elapsed time is included in log entries");
} else {
- shairport_sync_diagnostics_set_elapsed_time(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
+ shairport_sync_diagnostics_set_elapsed_time(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
// debug(1, ">> elapsed time is not included in log entries");
}
if (config.debugger_show_relative_time == 0) {
- shairport_sync_diagnostics_set_delta_time(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
+ shairport_sync_diagnostics_set_delta_time(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), FALSE);
// debug(1, ">> delta time is included in log entries");
} else {
- shairport_sync_diagnostics_set_delta_time(SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
+ shairport_sync_diagnostics_set_delta_time(
+ SHAIRPORT_SYNC_DIAGNOSTICS(shairportSyncDiagnosticsSkeleton), TRUE);
// debug(1, ">> delta time is not included in log entries");
}
g_signal_connect(shairportSyncDiagnosticsSkeleton, "notify::delta-time",
G_CALLBACK(notify_delta_time_callback), NULL);
-
+
// debug(1,"dbus_basic_remote_control_on_dbus_name_acquired");
shairportSyncBasicRemoteControlSkeleton = shairport_sync_basic_remote_control_skeleton_new();
- g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncBasicRemoteControlSkeleton), connection,
- "/org/gnome/ShairportSync", NULL);
-
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-fast-forward", G_CALLBACK(on_handle_fast_forward), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-rewind", G_CALLBACK(on_handle_rewind), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-toggle-mute", G_CALLBACK(on_handle_toggle_mute), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-next", G_CALLBACK(on_handle_next), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-previous", G_CALLBACK(on_handle_previous), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-pause", G_CALLBACK(on_handle_pause), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-play-pause", G_CALLBACK(on_handle_play_pause), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-play", G_CALLBACK(on_handle_play), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-stop", G_CALLBACK(on_handle_stop), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-resume", G_CALLBACK(on_handle_resume), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-shuffle-songs", G_CALLBACK(on_handle_shuffle_songs), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-volume-up", G_CALLBACK(on_handle_volume_up), NULL);
- g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-volume-down", G_CALLBACK(on_handle_volume_down), NULL);
-
-
-
+ g_dbus_interface_skeleton_export(
+ G_DBUS_INTERFACE_SKELETON(shairportSyncBasicRemoteControlSkeleton), connection,
+ "/org/gnome/ShairportSync", NULL);
+
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-fast-forward",
+ G_CALLBACK(on_handle_fast_forward), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-rewind",
+ G_CALLBACK(on_handle_rewind), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-toggle-mute",
+ G_CALLBACK(on_handle_toggle_mute), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-next",
+ G_CALLBACK(on_handle_next), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-previous",
+ G_CALLBACK(on_handle_previous), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-pause",
+ G_CALLBACK(on_handle_pause), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-play-pause",
+ G_CALLBACK(on_handle_play_pause), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-play",
+ G_CALLBACK(on_handle_play), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-stop",
+ G_CALLBACK(on_handle_stop), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-resume",
+ G_CALLBACK(on_handle_resume), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-shuffle-songs",
+ G_CALLBACK(on_handle_shuffle_songs), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-volume-up",
+ G_CALLBACK(on_handle_volume_up), NULL);
+ g_signal_connect(shairportSyncBasicRemoteControlSkeleton, "handle-volume-down",
+ G_CALLBACK(on_handle_volume_down), NULL);
+
add_metadata_watcher(dbus_metadata_watcher, NULL);
#ifdef HAVE_DBUS_BASIC_REMOTE_CONTROL
- dbus_basic_remote_control_on_dbus_name_acquired(connection,name,user_data);
+ dbus_basic_remote_control_on_dbus_name_acquired(connection, name, user_data);
#endif
debug(1, "Shairport Sync native D-Bus service started at \"%s\" on the %s bus.", name,
}
int start_dbus_service() {
-// shairportSyncSkeleton = NULL;
+ // 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;