<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/0929a4ddc1dbc7b1f8aa1abd1ba1b38167749a13">https://github.com/macports/macports-ports/commit/0929a4ddc1dbc7b1f8aa1abd1ba1b38167749a13</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 0929a4ddc1d shairport-sync: update to 4.3.4
</span>0929a4ddc1d is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 0929a4ddc1dbc7b1f8aa1abd1ba1b38167749a13
</span>Author: Sergey Fedorov <barracuda@macos-powerpc.org>
AuthorDate: Mon Sep 30 16:54:15 2024 +0800

<span style='display:block; white-space:pre;color:#404040;'>    shairport-sync: update to 4.3.4
</span>---
 multimedia/shairport-sync/Portfile                 |  18 +-
 .../0412a84006773098c558ed3f8d4b57b8540244ce.patch |  33 ---
 .../c064b8bae5f1d2816857646382de5ca3a1ab5e15.patch | 311 ---------------------
 3 files changed, 6 insertions(+), 356 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/multimedia/shairport-sync/Portfile b/multimedia/shairport-sync/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index c060d6fdf21..5786af4460b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/multimedia/shairport-sync/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/multimedia/shairport-sync/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -7,8 +7,8 @@ PortGroup           legacysupport 1.1
</span> # _dprintf
 legacysupport.newest_darwin_requires_legacy 10
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-github.setup        mikebrady shairport-sync 4.3.3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+github.setup        mikebrady shairport-sync 4.3.4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            0
</span> 
 categories          multimedia
 license             MIT BSD ISC
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -17,11 +17,11 @@ maintainers         gmail.com:ale275 \
</span> description         Shairport Sync is an AirPlay audio player
 long_description    AirTunes emulator. Shairport Sync adds multi-room capability with Audio Synchronisation.
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-checksums           rmd160  de46b4c437e6fb96e3cf43cf56833754a475dafb \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  988a8547983a9d328cb6dad823e388d97ab3326bacf045bc6f3da88ea471fa79 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    562363
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+checksums           rmd160  4af53a38966869abb461e919030301d09b82edb8 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  9da48b123639973e4a219c6d79a2f752fa4c7e6687e4b3419b378c4c75bd1dee \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    562663
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_build       port:pkgconfig \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+depends_build       path:bin/pkg-config:pkgconfig \
</span>                     port:autoconf \
                     port:automake
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,12 +38,6 @@ depends_lib         path:lib/libssl.dylib:openssl \
</span>                     port:libgcrypt \
                     port:ffmpeg${ffmpeg_ver}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Patches from upstream, drop with the next update.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# https://trac.macports.org/ticket/70148
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patch.pre_args-replace -p0 -p1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-patchfiles          c064b8bae5f1d2816857646382de5ca3a1ab5e15.patch \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    0412a84006773098c558ed3f8d4b57b8540244ce.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> use_autoreconf      yes
 autoreconf.args     -fvi
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/multimedia/shairport-sync/files/0412a84006773098c558ed3f8d4b57b8540244ce.patch b/multimedia/shairport-sync/files/0412a84006773098c558ed3f8d4b57b8540244ce.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 93d6601bcc9..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/multimedia/shairport-sync/files/0412a84006773098c558ed3f8d4b57b8540244ce.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,33 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From 0412a84006773098c558ed3f8d4b57b8540244ce Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Mike Brady <4265913+mikebrady@users.noreply.github.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Sat, 15 Jun 2024 16:18:29 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] BB -- change the order of includes as mentioned in version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 4.3.4-dev-13-gc064b8ba
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- shairport.c | 4 ++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 1 file changed, 2 insertions(+), 2 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/shairport.c b/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index 79d5e78f0..7a184ce6c 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -25,6 +25,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  * OTHER DEALINGS IN THE SOFTWARE.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <errno.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <getopt.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -35,9 +37,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <popt.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <stdio.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <stdlib.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <sys/wait.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <unistd.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/multimedia/shairport-sync/files/c064b8bae5f1d2816857646382de5ca3a1ab5e15.patch b/multimedia/shairport-sync/files/c064b8bae5f1d2816857646382de5ca3a1ab5e15.patch
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index d57f5586a2c..00000000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/multimedia/shairport-sync/files/c064b8bae5f1d2816857646382de5ca3a1ab5e15.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,311 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From c064b8bae5f1d2816857646382de5ca3a1ab5e15 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-From: Mike Brady <4265913+mikebrady@users.noreply.github.com>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Date: Sat, 15 Jun 2024 14:31:14 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH] Change order of some include file to facilitiate old Mac OS X
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- builds. Check existence of TCP_KEEPINTVL before trying to use it. Fix a race
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- condition with initial messages to the metadata queues. The race was that the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- queues and mutexes were definied in a thread, so could be delayed to after
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- when the main process was using them.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rtsp.c      | 78 +++++++++++++++++++++++++++++++++--------------------
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- shairport.c | 17 +++++-------
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 2 files changed, 56 insertions(+), 39 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/rtsp.c b/rtsp.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index c1c387922..f997824e9 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/rtsp.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/rtsp.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -430,7 +430,8 @@ int pc_queue_add_item(pc_queue *the_queue, const void *the_stuff, int block) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     } else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       rc = pthread_mutex_lock(&the_queue->pc_queue_lock);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (rc)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      debug(1, "Error locking for pc_queue_add_item");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      debug(1, "Error %d (\"%s\") locking for pc_queue_add_item. Block is %d.", rc, strerror(rc),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            block);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_cleanup_push(pc_queue_cleanup_handler, (void *)the_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // leave this out if you want this to return if the queue is already full
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // irrespective of the block flag.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1687,7 +1688,7 @@ void handle_get_info(__attribute((unused)) rtsp_conn_info *conn, rtsp_message *r
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               hdr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // In Stage 1, look for the DACP and Active-Remote
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     char *ar = msg_get_header(req, "Active-Remote");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (ar) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2101,8 +2102,8 @@ void handle_post(rtsp_conn_info *conn, rtsp_message *req, rtsp_message *resp) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (strcmp(req->path, "/feedback") == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     resp->respcode = 501;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    debug(1, "Connection %d: Airplay 1. Unhandled POST %s Content-Length %d", conn->connection_number,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--          req->path, req->contentlength);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    debug(1, "Connection %d: Airplay 1. Unhandled POST %s Content-Length %d",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          conn->connection_number, req->path, req->contentlength);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     debug_log_rtsp_message(2, "POST request", req);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -3085,7 +3086,7 @@ void handle_setup_2(rtsp_conn_info *conn, rtsp_message *req, rtsp_message *resp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 // iap->ifa_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 if ((iap->ifa_addr) && (iap->ifa_netmask) && (iap->ifa_flags & IFF_UP) &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                     ((iap->ifa_flags & IFF_LOOPBACK) == 0) &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--              (config.interface == NULL || (strcmp(config.interface, iap->ifa_name) == 0))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                    (config.interface == NULL || (strcmp(config.interface, iap->ifa_name) == 0))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   char buf[INET6_ADDRSTRLEN + 1]; // +1 for a NUL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   memset(buf, 0, sizeof(buf));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   if (iap->ifa_addr->sa_family == AF_INET6) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4081,13 +4082,9 @@ void metadata_pack_cleanup_function(void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void metadata_thread_cleanup_function(__attribute__((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // debug(2, "metadata_thread_cleanup_function called");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_close();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_delete(&metadata_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void *metadata_thread_function(__attribute__((unused)) void *ignore) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  // create a pc_queue for passing information to a threaded metadata handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_init(&metadata_queue, (char *)&metadata_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                metadata_queue_size, "pipe");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_create_multicast_socket();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_package pack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   pthread_cleanup_push(metadata_thread_cleanup_function, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4113,13 +4110,9 @@ void *metadata_thread_function(__attribute__((unused)) void *ignore) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void metadata_multicast_thread_cleanup_function(__attribute__((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // debug(2, "metadata_multicast_thread_cleanup_function called");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_delete_multicast_socket();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_delete(&metadata_multicast_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void *metadata_multicast_thread_function(__attribute__((unused)) void *ignore) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  // create a pc_queue for passing information to a threaded metadata handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_init(&metadata_multicast_queue, (char *)&metadata_multicast_queue_items,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                sizeof(metadata_package), metadata_multicast_queue_size, "multicast");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_create_multicast_socket();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_package pack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   pthread_cleanup_push(metadata_multicast_thread_cleanup_function, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4154,13 +4147,9 @@ void metadata_hub_close(void) {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void metadata_hub_thread_cleanup_function(__attribute__((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // debug(2, "metadata_hub_thread_cleanup_function called");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_hub_close();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_delete(&metadata_hub_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void *metadata_hub_thread_function(__attribute__((unused)) void *ignore) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  // create a pc_queue for passing information to a threaded metadata handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_init(&metadata_hub_queue, (char *)&metadata_hub_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                metadata_hub_queue_size, "hub");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_package pack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   pthread_cleanup_push(metadata_hub_thread_cleanup_function, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   while (1) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4188,14 +4177,10 @@ void metadata_mqtt_close(void) {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void metadata_mqtt_thread_cleanup_function(__attribute__((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // debug(2, "metadata_mqtt_thread_cleanup_function called");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_mqtt_close();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_delete(&metadata_mqtt_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // debug(2, "metadata_mqtt_thread_cleanup_function done");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- void *metadata_mqtt_thread_function(__attribute__((unused)) void *ignore) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  // create a pc_queue for passing information to a threaded metadata handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  pc_queue_init(&metadata_mqtt_queue, (char *)&metadata_mqtt_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--                metadata_mqtt_queue_size, "mqtt");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   metadata_package pack;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   pthread_cleanup_push(metadata_mqtt_thread_cleanup_function, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   while (1) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4242,24 +4227,39 @@ void metadata_init(void) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if ((fd == -1) && (errno != ENXIO)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       char errorstring[1024];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       strerror_r(errno, (char *)errorstring, sizeof(errorstring));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--      debug(1, "metadata_hub_thread_function -- error %d (\"%s\") opening pipe: \"%s\".", errno,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+      debug(1, "metadata_init -- error %d (\"%s\") opening pipe: \"%s\".", errno,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             (char *)errorstring, path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       warn("can not open metadata pipe -- error %d (\"%s\") opening pipe: \"%s\".", errno,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (char *)errorstring, path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     free(path);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    // initialise the metadata queues first, otherwise the might be a race condition
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    // create a pc_queue for the metadata pipe
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pc_queue_init(&metadata_queue, (char *)&metadata_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  metadata_queue_size, "pipe");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (pthread_create(&metadata_thread, NULL, metadata_thread_function, NULL) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       debug(1, "Failed to create metadata thread!");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    // create a pc_queue for the metadata_multicast_queue
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pc_queue_init(&metadata_multicast_queue, (char *)&metadata_multicast_queue_items,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                  sizeof(metadata_package), metadata_multicast_queue_size, "multicast");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (pthread_create(&metadata_multicast_thread, NULL, metadata_multicast_thread_function,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        NULL) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       debug(1, "Failed to create metadata multicast thread!");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef CONFIG_METADATA_HUB
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  // create a pc_queue for the metadata hub
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  pc_queue_init(&metadata_hub_queue, (char *)&metadata_hub_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                metadata_hub_queue_size, "hub");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (pthread_create(&metadata_hub_thread, NULL, metadata_hub_thread_function, NULL) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     debug(1, "Failed to create metadata hub thread!");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef CONFIG_MQTT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  // create a pc_queue for the MQTT handler
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  pc_queue_init(&metadata_mqtt_queue, (char *)&metadata_mqtt_queue_items, sizeof(metadata_package),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                metadata_mqtt_queue_size, "mqtt");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (pthread_create(&metadata_mqtt_thread, NULL, metadata_mqtt_thread_function, NULL) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     debug(1, "Failed to create metadata mqtt thread!");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4273,6 +4273,7 @@ void metadata_stop(void) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // debug(2, "metadata stop mqtt thread.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_cancel(metadata_mqtt_thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_join(metadata_mqtt_thread, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pc_queue_delete(&metadata_mqtt_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // debug(2, "metadata stop mqtt done.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef CONFIG_METADATA_HUB
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4280,6 +4281,7 @@ void metadata_stop(void) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_cancel(metadata_hub_thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_join(metadata_hub_thread, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     // debug(2, "metadata stop hub done.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+    pc_queue_delete(&metadata_hub_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (config.metadata_enabled) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       // debug(2, "metadata stop multicast thread.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4287,12 +4289,14 @@ void metadata_stop(void) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         pthread_cancel(metadata_multicast_thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         pthread_join(metadata_multicast_thread, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         // debug(2, "metadata stop multicast done.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pc_queue_delete(&metadata_multicast_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       if (metadata_thread) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         // debug(2, "metadata stop metadata_thread thread.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         pthread_cancel(metadata_thread);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         pthread_join(metadata_thread, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         // debug(2, "metadata_stop finished successfully.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        pc_queue_delete(&metadata_queue);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -4343,6 +4347,8 @@ int send_metadata_to_queue(pc_queue *queue, uint32_t type, uint32_t code, char *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (data)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       pack.data = memdup(data, length); // only if it's not a null
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  // debug(1, "send_metadata_to_queue %x/%x", type, code);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   int rc = pc_queue_add_item(queue, &pack, block);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (rc != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (pack.carrier) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5642,22 +5648,33 @@ void *rtsp_listen_loop(__attribute((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         size_of_reply = sizeof(SOCKADDR);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         if (getsockname(conn->fd, (struct sockaddr *)&conn->local, &size_of_reply) == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// skip this stuff in OpenBSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef COMPILE_FOR_OPENBSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           // Thanks to https://holmeshe.me/network-essentials-setsockopt-SO_KEEPALIVE/ for this.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           // turn on keepalive stuff -- wait for keepidle + (keepcnt * keepinttvl time) seconds
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           // before giving up an ETIMEOUT error is returned if the keepalive check fails
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          // if TCP_KEEPINTVL is defined, check a few times before declaring the line dead
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          // otherwise just wait a little while longer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef TCP_KEEPINTVL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           int keepAliveIdleTime = 35; // wait this many seconds before checking for a dropped client
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           int keepAliveCount = 5;     // check this many times
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           int keepAliveInterval = 5;  // wait this many seconds between checks
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+          int keepAliveIdleTime = 60; // wait this many seconds before dropping a client
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// --- the following is a bit  too complicated
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// decide to use IPPROTO_TCP or SOL_TCP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #if defined COMPILE_FOR_BSD || defined COMPILE_FOR_OSX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define SOL_OPTION IPPROTO_TCP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define SOL_OPTION SOL_TCP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// decide to use TCP_KEEPALIVE or TCP_KEEPIDLE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef COMPILE_FOR_OSX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define KEEP_ALIVE_OR_IDLE_OPTION TCP_KEEPALIVE
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5666,17 +5683,20 @@ void *rtsp_listen_loop(__attribute((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (setsockopt(conn->fd, SOL_OPTION, KEEP_ALIVE_OR_IDLE_OPTION,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                          (void *)&keepAliveIdleTime, sizeof(keepAliveIdleTime))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            debug(1, "can't set the keepidle wait time");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            debug(1, "can't set the keepAliveIdleTime wait time");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// ---
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+// if TCP_KEEPINTVL is defined...
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef TCP_KEEPINTVL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (setsockopt(conn->fd, SOL_OPTION, TCP_KEEPCNT, (void *)&keepAliveCount,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                          sizeof(keepAliveCount))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            debug(1, "can't set the keepidle missing count");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            debug(1, "can't set the keepAliveCount count");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           if (setsockopt(conn->fd, SOL_OPTION, TCP_KEEPINTVL, (void *)&keepAliveInterval,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                          sizeof(keepAliveInterval))) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--            debug(1, "can't set the keepidle missing count interval");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            debug(1, "can't set the keepAliveCount count interval");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           };
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           // initialise the connection info
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -5736,8 +5756,8 @@ void *rtsp_listen_loop(__attribute((unused)) void *arg) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     pthread_cleanup_pop(1); // should never happen
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     die("could not establish a service on port %d -- program terminating. Is another instance of "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         "Shairport Sync running on this device?",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--         config.port);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        "Shairport Sync running on this device?",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        config.port);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   debug(1, "Oops -- fell out of the RTSP select loop");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   pthread_exit(NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-diff --git a/shairport.c b/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-index cb1e6cb30..79d5e78f0 100644
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/shairport.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1207,8 +1207,8 @@ int parse_options(int argc, char **argv) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       if (config_error_type(&config_file_stuff) == CONFIG_ERR_FILE_IO)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--        die("Error reading configuration file \"%s\": \"%s\".",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--              config_file_real_path, config_error_text(&config_file_stuff));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+        die("Error reading configuration file \"%s\": \"%s\".", config_file_real_path,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+            config_error_text(&config_file_stuff));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-       else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-         die("Line %d of the configuration file \"%s\":\n%s", config_error_line(&config_file_stuff),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             config_error_file(&config_file_stuff), config_error_text(&config_file_stuff));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2110,12 +2110,9 @@ int main(int argc, char **argv) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef COMPILE_FOR_OPENBSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Any command to be executed at runtime? */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--  int run_cmds =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    config.cmd_active_start != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    config.cmd_active_stop != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    config.cmd_set_volume != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    config.cmd_start != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--    config.cmd_stop != NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+  int run_cmds = config.cmd_active_start != NULL || config.cmd_active_stop != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 config.cmd_set_volume != NULL || config.cmd_start != NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+                 config.cmd_stop != NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   // mDNS supports maximum of 63-character names (we append 13).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2381,11 +2378,11 @@ int main(int argc, char **argv) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef COMPILE_FOR_OPENBSD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Past first and last sio_open(3), sndio(7) only needs "audio". */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# ifdef CONFIG_METADATA
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef CONFIG_METADATA
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   /* Only coverart cache is created.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    * Only metadata pipe is special. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   if (!config.metadata_enabled)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--# endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     /* Drop "cpath dpath". */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-     if (run_cmds) {
</span></pre><pre style='margin:0'>

</pre>