From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Tue, 2 Dec 2025 12:57:01 +0000 (+0000) Subject: Move rtp_event_handler out to its own files, make two copies of it called ap2_event_h... X-Git-Tag: 5.0-post-dev~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e4d35ec77ee8c8ac9b78598f6f186e3ffc7e8b7;p=thirdparty%2Fshairport-sync.git Move rtp_event_handler out to its own files, make two copies of it called ap2_event_handler and ap2_rc_event_handler respectively. --- diff --git a/rtp.c b/rtp.c index ef4303c0..eae7e3b5 100644 --- 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 #include #include @@ -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 - // 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 8eff06bb..d9956ca5 100644 --- 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);