]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Move rtp_event_handler out to its own files, make two copies of it called ap2_event_h...
authorMike Brady <4265913+mikebrady@users.noreply.github.com>
Tue, 2 Dec 2025 12:57:01 +0000 (12:57 +0000)
committerMike Brady <4265913+mikebrady@users.noreply.github.com>
Tue, 2 Dec 2025 12:57:01 +0000 (12:57 +0000)
rtp.c
rtp.h

diff --git a/rtp.c b/rtp.c
index ef4303c031d3a8e488cfcafbf3b0390f671939e8..eae7e3b5697ca645babf201d51a106d5a8e4c1bb 100644 (file)
--- a/rtp.c
+++ b/rtp.c
@@ -49,6 +49,7 @@
 #ifdef CONFIG_AIRPLAY_2
 // #include "plist_xml_strings.h"
 #include "ptp-utilities.h"
+#include "utilities/structured_buffer.h"
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
 #include <libavutil/channel_layout.h>
@@ -86,93 +87,6 @@ typedef struct {
   pthread_cond_t not_full_cv;
 } buffered_tcp_desc;
 
-typedef struct {
-  char *buf;
-  size_t buf_size;
-  size_t buf_pos;
-} structured_buffer;
-
-structured_buffer *sbuf_new(size_t size) {
-  structured_buffer *sbuf = (structured_buffer *)malloc(sizeof(structured_buffer));
-  if (sbuf != NULL) {
-    memset(sbuf, 0, sizeof(structured_buffer));
-    char *buf = malloc(size + 1); // extra space for a possible NULL
-    if (buf == NULL) {
-      free(sbuf);
-      sbuf = NULL;
-    } else {
-      sbuf->buf_size = size;
-      sbuf->buf = buf;
-    }
-  }
-  return sbuf;
-}
-
-int sbuf_clear(structured_buffer *sbuf) {
-  int response = -1;
-  if ((sbuf != NULL) && (sbuf->buf != NULL)) {
-    sbuf->buf_pos = 0;
-    response = 0;
-  }
-  return response;
-}
-
-void sbuf_free(structured_buffer *sbuf) {
-  if (sbuf != NULL) {
-    if (sbuf->buf != NULL)
-      free(sbuf->buf);
-    free(sbuf);
-  }
-}
-
-void sbuf_cleanup(void *arg) {
-  structured_buffer *sbuf = (structured_buffer *)arg;
-  debug(3, "structured_buffer cleanup");
-  sbuf_free(sbuf);
-}
-
-int sbuf_printf(structured_buffer *sbuf, const char *format, ...) {
-  int response = -1;
-  if ((sbuf != NULL) && (sbuf->buf != NULL)) {
-    char *p = sbuf->buf + sbuf->buf_pos;
-    va_list args;
-    va_start(args, format);
-    vsnprintf(p, sbuf->buf_size - sbuf->buf_pos, format, args);
-    sbuf->buf_pos = sbuf->buf_pos + strlen(p);
-    response = strlen(p);
-    va_end(args);
-  }
-  return response;
-}
-
-int sbuf_append(structured_buffer *sbuf, char *plistString, uint32_t plistStringLength) {
-  int response = -1;
-  if ((sbuf != NULL) && (sbuf->buf != NULL) && (plistString != NULL)) {
-    if (plistStringLength == 0) {
-      response = 0;
-    } else {
-      if (plistStringLength < (sbuf->buf_size - sbuf->buf_pos)) {
-        memcpy(sbuf->buf + sbuf->buf_pos, plistString, plistStringLength);
-        sbuf->buf_pos = sbuf->buf_pos + plistStringLength;
-        response = 0;
-      } else {
-        debug(1, "plist too large -- omitted");
-      }
-    }
-  }
-  return response;
-}
-
-int sbuf_buf_and_length(structured_buffer *sbuf, char **b, size_t *l) {
-  int response = 0;
-  if ((sbuf != NULL) && (sbuf->buf != NULL)) {
-    *b = sbuf->buf;
-    *l = sbuf->buf_pos;
-  } else {
-    response = -1;
-  }
-  return response;
-}
 
 /*
       char obf[4096];
@@ -1646,132 +1560,6 @@ int local_ptp_time_to_frame(uint64_t time, uint32_t *frame, rtsp_conn_info *conn
   return result;
 }
 
-void rtp_event_receiver_cleanup_handler(void *arg) {
-  rtsp_conn_info *conn = (rtsp_conn_info *)arg;
-  debug(2, "Connection %d: AP2 Event Receiver Cleanup.", conn->connection_number);
-}
-
-void *rtp_event_receiver(void *arg) {
-  //  #include <syscall.h>
-  //  debug(1, "rtp_event_receiver PID %d", syscall(SYS_gettid));
-  rtsp_conn_info *conn = (rtsp_conn_info *)arg;
-  if (conn->airplay_stream_category == remote_control_stream)
-    debug(2, "Connection %d (RC): AP2 Event Receiver started", conn->connection_number);
-  else
-    debug(2, "Connection %d: AP2 Event Receiver started", conn->connection_number);
-
-  structured_buffer *sbuf = sbuf_new(4096);
-  if (sbuf != NULL) {
-    pthread_cleanup_push(sbuf_cleanup, sbuf);
-
-    pthread_cleanup_push(rtp_event_receiver_cleanup_handler, arg);
-
-    // listen(conn->event_socket, 5); // this is now done in the handle_setup_2 code
-
-    uint8_t packet[4096];
-    ssize_t nread;
-    SOCKADDR remote_addr;
-    memset(&remote_addr, 0, sizeof(remote_addr));
-    socklen_t addr_size = sizeof(remote_addr);
-
-    int fd = accept(conn->event_socket, (struct sockaddr *)&remote_addr, &addr_size);
-    debug(2,
-          "Connection %d: rtp_event_receiver accepted a connection on socket %d and moved to a new "
-          "socket %d.",
-          conn->connection_number, conn->event_socket, fd);
-    intptr_t pfd = fd;
-    pthread_cleanup_push(socket_cleanup, (void *)pfd);
-    int finished = 0;
-    do {
-
-      plist_t value_plist = generateInfoPlist(conn);
-      if (value_plist != NULL) {
-        void *txtData = NULL;
-        size_t txtDataLength = 0;
-        generateTxtDataValueInfo(conn, &txtData, &txtDataLength);
-        plist_dict_set_item(value_plist, "txtAirPlay", plist_new_data(txtData, txtDataLength));
-        free(txtData);
-        plist_t update_info_plist = plist_new_dict();
-        if (update_info_plist != NULL) {
-          plist_dict_set_item(update_info_plist, "type", plist_new_string("updateInfo"));
-          plist_dict_set_item(update_info_plist, "value", value_plist);
-          char *plistString = NULL;
-          uint32_t plistStringLength = 0;
-          plist_to_bin(update_info_plist, &plistString, &plistStringLength);
-          if (plistString != NULL) {
-            char *plist_as_string = plist_as_xml_text(update_info_plist);
-            if (plist_as_string != NULL) {
-              debug(3, "Plist is: \"%s\".", plist_as_string);
-              free(plist_as_string);
-            }
-            sbuf_printf(sbuf, "POST /command RTSP/1.0\r\nContent-Length: %u\r\n",
-                        plistStringLength);
-            sbuf_printf(sbuf, "Content-Type: application/x-apple-binary-plist\r\n\r\n");
-            sbuf_append(sbuf, plistString, plistStringLength);
-
-            free(plistString); // should be plist_to_bin_free, but it's not defined in older
-                               // libraries
-            char *b = 0;
-            size_t l = 0;
-            sbuf_buf_and_length(sbuf, &b, &l);
-            ssize_t wres =
-                write_encrypted(fd, &conn->ap2_pairing_context.event_cipher_bundle, b, l);
-            if ((wres == -1) || ((size_t)wres != l))
-              debug(1, "Encrypted write error");
-
-            sbuf_clear(sbuf);
-          } else {
-            debug(1, "plist string not created!");
-          }
-          plist_free(update_info_plist);
-        } else {
-          debug(1, "Could not build an updateInfo plist");
-        }
-        // plist_free(value_plist);
-      } else {
-        debug(1, "Could not build an value plist");
-      }
-
-      while (finished == 0) {
-        nread = read_encrypted(fd, &conn->ap2_pairing_context.event_cipher_bundle, packet,
-                               sizeof(packet));
-
-        // nread = recv(fd, packet, sizeof(packet), 0);
-
-        if (nread < 0) {
-          char errorstring[1024];
-          strerror_r(errno, (char *)errorstring, sizeof(errorstring));
-          debug(
-              1,
-              "Connection %d: error in ap2 rtp_event_receiver %d: \"%s\". Could not recv a packet.",
-              conn->connection_number, errno, errorstring);
-          // if ((config.diagnostic_drop_packet_fraction == 0.0) ||
-          //     (drand48() > config.diagnostic_drop_packet_fraction)) {
-        } else if (nread > 0) {
-
-          // ssize_t plen = nread;
-          packet[nread] = '\0';
-          debug(3, "Connection %d: Packet Received on Event Port with contents: \"%s\".",
-                conn->connection_number, packet);
-        } else {
-          debug(1, "Connection %d: Event Port connection closed by client",
-                conn->connection_number);
-          finished = 1;
-        }
-      }
-
-    } while (finished == 0);
-    pthread_cleanup_pop(1); // close the socket
-    pthread_cleanup_pop(1); // do the cleanup
-    pthread_cleanup_pop(1); // delete the structured buffer
-    debug(2, "Connection %d: AP2 Event Receiver RTP thread \"normal\" exit.",
-          conn->connection_number);
-  } else {
-    debug(1, "Could not allocate a structured buffer!");
-  }
-  pthread_exit(NULL);
-}
-
 void rtp_ap2_control_handler_cleanup_handler(void *arg) {
   rtsp_conn_info *conn = (rtsp_conn_info *)arg;
   debug(2, "Connection %d: AP2 Control Receiver Cleanup.", conn->connection_number);
diff --git a/rtp.h b/rtp.h
index 8eff06bb437c3bac6e37233cdc97851787228d89..d9956ca5af78bd80ab51df388a64addd36e5dfcf 100644 (file)
--- a/rtp.h
+++ b/rtp.h
@@ -25,7 +25,6 @@ int frame_to_local_time(uint32_t timestamp, uint64_t *time, rtsp_conn_info *conn
 int local_time_to_frame(uint64_t time, uint32_t *frame, rtsp_conn_info *conn);
 
 #ifdef CONFIG_AIRPLAY_2
-void *rtp_event_receiver(void *arg);
 void *rtp_ap2_control_receiver(void *arg);
 void *rtp_realtime_audio_receiver(void *arg);
 void *rtp_buffered_audio_processor(void *arg);