Move DACP volume detection and control to a new Advanced Remote Control D-Bus stanza.

This commit is contained in:
Mike Brady
2018-03-21 22:37:35 +00:00
parent 70d4afcf7f
commit 8453778a13
3 changed files with 59 additions and 53 deletions
+36 -27
View File
@@ -16,21 +16,22 @@
ShairportSyncDiagnostics *shairportSyncDiagnosticsSkeleton;
ShairportSyncRemoteControl *shairportSyncRemoteControlSkeleton;
ShairportSyncAdvancedRemoteControl *shairportSyncAdvancedRemoteControlSkeleton;
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);
shairport_sync_advanced_remote_control_set_volume(shairportSyncAdvancedRemoteControlSkeleton,
argc->speaker_volume);
// debug(1, "No diagnostics watcher required");
// debug(1, "DBUS remote control watcher called");
shairport_sync_remote_control_set_airplay_volume(shairportSyncRemoteControlSkeleton,
argc->airplay_volume);
argc->airplay_volume);
if (argc->dacp_server_active)
shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton,
argc->client_ip);
shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton, argc->client_ip);
else
shairport_sync_remote_control_set_server(shairportSyncRemoteControlSkeleton, "");
@@ -101,6 +102,15 @@ void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused))
shairport_sync_remote_control_set_metadata(shairportSyncRemoteControlSkeleton, dict);
}
static gboolean on_handle_set_volume(ShairportSyncAdvancedRemoteControl *skeleton,
GDBusMethodInvocation *invocation, const gint volume,
__attribute__((unused)) gpointer user_data) {
debug(1, "Set volume to %d.", volume);
dacp_set_volume(volume);
shairport_sync_advanced_remote_control_complete_set_volume(skeleton, invocation);
return TRUE;
}
static gboolean on_handle_fast_forward(ShairportSyncRemoteControl *skeleton,
GDBusMethodInvocation *invocation,
__attribute__((unused)) gpointer user_data) {
@@ -283,15 +293,6 @@ gboolean notify_loudness_threshold_callback(ShairportSync *skeleton,
return TRUE;
}
static gboolean on_handle_set_volume(ShairportSync *skeleton, GDBusMethodInvocation *invocation,
const gint volume,
__attribute__((unused)) gpointer user_data) {
// debug(1, "1 Set volume to d.", volume);
dacp_set_volume(volume);
shairport_sync_complete_set_volume(skeleton, invocation);
return TRUE;
}
static gboolean on_handle_remote_command(ShairportSync *skeleton, GDBusMethodInvocation *invocation,
const gchar *command,
__attribute__((unused)) gpointer user_data) {
@@ -302,7 +303,7 @@ static gboolean on_handle_remote_command(ShairportSync *skeleton, GDBusMethodInv
}
static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name,
gpointer user_data) {
__attribute__((unused)) 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");
@@ -329,8 +330,6 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
G_CALLBACK(notify_loudness_threshold_callback), NULL);
g_signal_connect(shairportSyncSkeleton, "handle-remote-command",
G_CALLBACK(on_handle_remote_command), NULL);
g_signal_connect(shairportSyncSkeleton, "handle-set-volume", G_CALLBACK(on_handle_set_volume),
NULL);
// debug(1,"dbus_diagnostics_on_dbus_name_acquired");
shairportSyncDiagnosticsSkeleton = shairport_sync_diagnostics_skeleton_new();
@@ -386,9 +385,8 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
// debug(1,"dbus_remote_control_on_dbus_name_acquired");
shairportSyncRemoteControlSkeleton = shairport_sync_remote_control_skeleton_new();
g_dbus_interface_skeleton_export(
G_DBUS_INTERFACE_SKELETON(shairportSyncRemoteControlSkeleton), connection,
"/org/gnome/ShairportSync", NULL);
g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(shairportSyncRemoteControlSkeleton),
connection, "/org/gnome/ShairportSync", NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-fast-forward",
G_CALLBACK(on_handle_fast_forward), NULL);
@@ -396,18 +394,18 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
G_CALLBACK(on_handle_rewind), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-toggle-mute",
G_CALLBACK(on_handle_toggle_mute), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-next",
G_CALLBACK(on_handle_next), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-next", G_CALLBACK(on_handle_next),
NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-previous",
G_CALLBACK(on_handle_previous), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-pause",
G_CALLBACK(on_handle_pause), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-pause", G_CALLBACK(on_handle_pause),
NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-play-pause",
G_CALLBACK(on_handle_play_pause), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-play",
G_CALLBACK(on_handle_play), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-stop",
G_CALLBACK(on_handle_stop), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-play", G_CALLBACK(on_handle_play),
NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-stop", G_CALLBACK(on_handle_stop),
NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-resume",
G_CALLBACK(on_handle_resume), NULL);
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-shuffle-songs",
@@ -417,6 +415,17 @@ static void on_dbus_name_acquired(GDBusConnection *connection, const gchar *name
g_signal_connect(shairportSyncRemoteControlSkeleton, "handle-volume-down",
G_CALLBACK(on_handle_volume_down), NULL);
// debug(1,"dbus_advanced_remote_control_on_dbus_name_acquired");
shairportSyncAdvancedRemoteControlSkeleton =
shairport_sync_advanced_remote_control_skeleton_new();
g_dbus_interface_skeleton_export(
G_DBUS_INTERFACE_SKELETON(shairportSyncAdvancedRemoteControlSkeleton), connection,
"/org/gnome/ShairportSync", NULL);
g_signal_connect(shairportSyncAdvancedRemoteControlSkeleton, "handle-set-volume",
G_CALLBACK(on_handle_set_volume), NULL);
add_metadata_watcher(dbus_metadata_watcher, NULL);
#ifdef HAVE_DBUS_REMOTE_CONTROL
+6 -4
View File
@@ -3,13 +3,9 @@
<interface name="org.gnome.ShairportSync">
<property name="LoudnessFilterActive" type="b" access="readwrite" />
<property name="LoudnessThreshold" type="d" access="readwrite" />
<property name="Volume" type="i" access="read" />
<method name="RemoteCommand">
<arg name="command" type="s" direction="in" />
</method>
<method name="SetVolume">
<arg name="volume" type="i" direction="in" />
</method>
</interface>
<interface name="org.gnome.ShairportSync.Diagnostics">
<property name="Verbosity" type="i" access="readwrite" />
@@ -38,4 +34,10 @@
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
</property>
</interface>
<interface name="org.gnome.ShairportSync.Advanced.Remote.Control">
<property name="Volume" type="i" access="read" />
<method name="SetVolume">
<arg name="volume" type="i" direction="in" />
</method>
</interface>
</node>
+17 -22
View File
@@ -56,8 +56,9 @@ void notify_loudness_threshold_callback(ShairportSync *proxy,
printf("Client reports loudness threshold set to %.2f dB.\n", th);
}
void notify_volume_callback(ShairportSync *proxy, __attribute__((unused)) gpointer user_data) {
gdouble th = shairport_sync_get_volume(proxy);
void notify_volume_callback(ShairportSyncAdvancedRemoteControl *proxy,
__attribute__((unused)) gpointer user_data) {
gdouble th = shairport_sync_advanced_remote_control_get_volume(proxy);
printf("Client reports volume set to %.2f.\n", th);
}
@@ -115,12 +116,12 @@ int main(int argc, char *argv[]) {
pthread_create(&dbus_thread, NULL, &dbus_thread_func, NULL);
ShairportSync *proxy;
ShairportSyncAdvancedRemoteControl *proxy;
GError *error = NULL;
proxy = shairport_sync_proxy_new_for_bus_sync(gbus_type_selected, G_DBUS_PROXY_FLAGS_NONE,
"org.gnome.ShairportSync",
"/org/gnome/ShairportSync", NULL, &error);
proxy = shairport_sync_advanced_remote_control_proxy_new_for_bus_sync(
gbus_type_selected, G_DBUS_PROXY_FLAGS_NONE, "org.gnome.ShairportSync",
"/org/gnome/ShairportSync", NULL, &error);
// g_signal_connect(proxy, "notify::loudness-filter-active",
// G_CALLBACK(notify_loudness_filter_active_callback), NULL);
@@ -148,26 +149,21 @@ int main(int argc, char *argv[]) {
"/org/gnome/ShairportSync", NULL, &error3);
g_signal_connect(proxy3, "g-properties-changed", G_CALLBACK(on_properties_changed), NULL);
/*
g_print("Starting test...\n");
shairport_sync_call_set_volume(SHAIRPORT_SYNC(proxy), 20, NULL, NULL, 0);
shairport_sync_advanced_remote_control_call_set_volume(
SHAIRPORT_SYNC_ADVANCED_REMOTE_CONTROL(proxy), 20, NULL, NULL, 0);
sleep(5);
shairport_sync_call_set_volume(SHAIRPORT_SYNC(proxy), 100, NULL, NULL, 0);
shairport_sync_advanced_remote_control_call_set_volume(
SHAIRPORT_SYNC_ADVANCED_REMOTE_CONTROL(proxy), 100, NULL, NULL, 0);
sleep(5);
shairport_sync_call_set_volume(SHAIRPORT_SYNC(proxy), 40, NULL, NULL, 0);
shairport_sync_advanced_remote_control_call_set_volume(
SHAIRPORT_SYNC_ADVANCED_REMOTE_CONTROL(proxy), 40, NULL, NULL, 0);
sleep(5);
shairport_sync_call_set_volume(SHAIRPORT_SYNC(proxy), 60, NULL, NULL, 0);
shairport_sync_advanced_remote_control_call_set_volume(
SHAIRPORT_SYNC_ADVANCED_REMOTE_CONTROL(proxy), 60, NULL, NULL, 0);
/*
// sleep(1);
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), 10);
sleep(1);
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), 0);
sleep(1);
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), 25);
sleep(1);
shairport_sync_set_volume(SHAIRPORT_SYNC(proxy), 100);
sleep(1);
shairport_sync_set_loudness_filter_active(SHAIRPORT_SYNC(proxy), TRUE);
sleep(10);
shairport_sync_set_loudness_threshold(SHAIRPORT_SYNC(proxy), -20.0);
@@ -182,9 +178,8 @@ int main(int argc, char *argv[]) {
sleep(1);
shairport_sync_call_remote_command(SHAIRPORT_SYNC(proxy), "string",NULL,NULL,NULL);
g_print("Finished test. Waiting for property changes...\n");
*/
g_print("Finished test. Listening for property changes...\n");
// g_main_loop_quit(loop);
pthread_join(dbus_thread, NULL);
printf("exiting program.\n");