From 37f060f48e90aa11d66f28dc1f06e91afa73ed3a Mon Sep 17 00:00:00 2001
From: Mike Brady <4265913+mikebrady@users.noreply.github.com>
Date: Mon, 28 Nov 2022 15:09:43 +0000
Subject: [PATCH] Add "FirstFramePostion" property set when first frame of a
play session is sent.
---
dbus-service.c | 9 +++++++++
metadata_hub.c | 11 ++++++++++-
metadata_hub.h | 3 +++
org.gnome.ShairportSync.xml | 1 +
player.c | 2 ++
5 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/dbus-service.c b/dbus-service.c
index e957dfa5..4cfc8254 100644
--- a/dbus-service.c
+++ b/dbus-service.c
@@ -106,6 +106,15 @@ void dbus_metadata_watcher(struct metadata_bundle *argc, __attribute__((unused))
}
}
+ if (argc->first_frame_position_string) {
+ // debug(1, "Check first frame position string");
+ th = shairport_sync_get_first_frame_position(shairportSyncSkeleton);
+ if ((th == NULL) || (strcasecmp(th, argc->first_frame_position_string) != 0)) {
+ // debug(1, "First frame position string should be changed");
+ shairport_sync_set_first_frame_position(shairportSyncSkeleton, argc->first_frame_position_string);
+ }
+ }
+
if (argc->stream_type) {
// debug(1, "Check stream type");
th = shairport_sync_remote_control_get_stream_type(shairportSyncRemoteControlSkeleton);
diff --git a/metadata_hub.c b/metadata_hub.c
index 1d9a9a28..e39752fe 100644
--- a/metadata_hub.c
+++ b/metadata_hub.c
@@ -589,7 +589,16 @@ void metadata_hub_process_metadata(uint32_t type, uint32_t code, char *data, uin
if (string_update(&metadata_store.frame_position_string,
&metadata_store.frame_position_string_changed, cs)) {
changed = 1;
- debug(2, "MH Frame Position String set to: \"%s\"", metadata_store.progress_string);
+ debug(2, "MH Frame Position String set to: \"%s\"", metadata_store.frame_position_string);
+ }
+ free(cs);
+ break;
+ case 'phb0':
+ cs = strndup(data, length);
+ if (string_update(&metadata_store.first_frame_position_string,
+ &metadata_store.first_frame_position_string_changed, cs)) {
+ changed = 1;
+ debug(2, "MH First Frame Position String set to: \"%s\"", metadata_store.first_frame_position_string);
}
free(cs);
break;
diff --git a/metadata_hub.h b/metadata_hub.h
index 63efb1c0..8235c6e4 100644
--- a/metadata_hub.h
+++ b/metadata_hub.h
@@ -58,6 +58,9 @@ typedef struct metadata_bundle {
char *frame_position_string; // frame position string emitted by SPS on request
int frame_position_string_changed;
+ char *first_frame_position_string; // first frame position string emitted by SPS on request
+ int first_frame_position_string_changed;
+
int player_thread_active; // true if a play thread is running
int dacp_server_active; // true if there's a reachable DACP server (assumed to be the Airplay
// client) ; false otherwise
diff --git a/org.gnome.ShairportSync.xml b/org.gnome.ShairportSync.xml
index 75355a8b..722fda5b 100644
--- a/org.gnome.ShairportSync.xml
+++ b/org.gnome.ShairportSync.xml
@@ -27,6 +27,7 @@
+
diff --git a/player.c b/player.c
index 3c5b1d99..9d8159a5 100644
--- a/player.c
+++ b/player.c
@@ -3056,6 +3056,7 @@ void *player_thread_func(void *arg) {
memset(hb, 0, 128);
snprintf(hb, 127, "%" PRIu32 "/%" PRId64 "", inframe->given_timestamp,
should_be_time);
+ send_ssnc_metadata('phb0', hb, strlen(hb), 1);
send_ssnc_metadata('phbt', hb, strlen(hb), 1);
time_of_last_metadata_progress_update = local_time_now;
} else {
@@ -3131,6 +3132,7 @@ void *player_thread_func(void *arg) {
memset(hb, 0, 128);
snprintf(hb, 127, "%" PRIu32 "/%" PRId64 "", inframe->given_timestamp,
should_be_time);
+ send_ssnc_metadata('phb0', hb, strlen(hb), 1);
send_ssnc_metadata('phbt', hb, strlen(hb), 1);
time_of_last_metadata_progress_update = local_time_now;
} else {