]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Set and reset bonjour flags correctly when it's a Classic Airplay session. Reintroduc...
authorMike Brady <4265913+mikebrady@users.noreply.github.com>
Thu, 21 Sep 2023 15:36:21 +0000 (16:36 +0100)
committerMike Brady <4265913+mikebrady@users.noreply.github.com>
Thu, 21 Sep 2023 15:36:21 +0000 (16:36 +0100)
rtsp.c

diff --git a/rtsp.c b/rtsp.c
index 5c750a2ab31a6159c707e5d72ea198972f370cbd..2ae1c9390ac248ba175ac7ee09eebd1d77901af8 100644 (file)
--- a/rtsp.c
+++ b/rtsp.c
@@ -597,7 +597,7 @@ int get_play_lock(rtsp_conn_info *conn, int allow_session_interruption) {
     rtsp_conn_info *previous_principal_conn = principal_conn;
     principal_conn = NULL; // no longer the principal conn
     pthread_cancel(previous_principal_conn->thread);
-    // usleep(1000000);       // don't know why this delay is needed.
+    usleep(1000000);       // don't know why this delay is needed.
     principal_conn = conn; // make the conn the new principal_conn
     response = 1;          // interrupted an existing session
   } else {
@@ -700,7 +700,7 @@ void cleanup_threads(void) {
       debug(2, "Found RTSP connection thread %d in a non-running state.",
             conns[i]->connection_number);
       pthread_join(conns[i]->thread, &retval);
-      debug(1, "Connection %d: deleted.", conns[i]->connection_number);
+      debug(2, "Connection %d: deleted.", conns[i]->connection_number);
       free(conns[i]);
       conns[i] = NULL;
     }
@@ -2715,7 +2715,7 @@ void teardown_phase_two(rtsp_conn_info *conn) {
 void handle_teardown_2(rtsp_conn_info *conn, __attribute__((unused)) rtsp_message *req,
                        rtsp_message *resp) {
 
-  debug(1, "Connection %d: TEARDOWN %s.", conn->connection_number,
+  debug(1, "Connection %d: TEARDOWN %s.", conn->connection_number,
         get_category_string(conn->airplay_stream_category));
   debug_log_rtsp_message(2, "TEARDOWN: ", req);
   resp->respcode = 200;
@@ -2768,6 +2768,7 @@ void handle_teardown_2(rtsp_conn_info *conn, __attribute__((unused)) rtsp_messag
 #endif
 
 void teardown(rtsp_conn_info *conn) {
+  debug(2, "Connection %d: TEARDOWN (Classic AirPlay).", conn->connection_number);
   player_stop(conn);
   activity_monitor_signify_activity(0); // inactive, and should be after command_stop()
   if (conn->dacp_active_remote != NULL) {
@@ -2780,11 +2781,23 @@ void handle_teardown(rtsp_conn_info *conn, __attribute__((unused)) rtsp_message
                      rtsp_message *resp) {
   debug_log_rtsp_message(2, "TEARDOWN request", req);
   debug(2, "Connection %d: TEARDOWN", conn->connection_number);
-  // if (have_play_lock(conn)) {
   debug(3,
         "TEARDOWN: synchronously terminating the player thread of RTSP conversation thread %d (2).",
         conn->connection_number);
   teardown(conn);
+
+#ifdef CONFIG_AIRPLAY_2
+  // only update these things if you're (still) the principal conn
+  pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed
+  pthread_cleanup_push(rwlock_unlock,(void *)&principal_conn_lock);
+  if (principal_conn == conn) {
+    config.airplay_statusflags &= (0xffffffff - (1 << 11)); // DeviceSupportsRelay
+    build_bonjour_strings(conn);
+    mdns_update(NULL, secondary_txt_records);
+  }
+  pthread_cleanup_pop(1); // release the principal_conn lock
+#endif
+  
   release_play_lock(conn);
 
   resp->respcode = 200;
@@ -4514,9 +4527,25 @@ static void handle_announce(rtsp_conn_info *conn, rtsp_message *req, rtsp_messag
 #ifdef CONFIG_AIRPLAY_2
     conn->airplay_type = ap_1;
     conn->timing_type = ts_ntp;
+    if (conn->airplay_gid != NULL) {
+      free(conn->airplay_gid);
+      conn->airplay_gid = NULL;
+    }
+    
+    // only update these things if you're (still) the principal conn
+    pthread_rwlock_rdlock(&principal_conn_lock); // don't let the principal_conn be changed
+    pthread_cleanup_push(rwlock_unlock,(void *)&principal_conn_lock);
+    if (principal_conn == conn) {
+      config.airplay_statusflags |= 1 << 11; // DeviceSupportsRelay -- should this be on?
+      build_bonjour_strings(conn);
+      get_category_string(conn->airplay_stream_category));
+      mdns_update(NULL, secondary_txt_records);
+    }
+    pthread_cleanup_pop(1); // release the principal_conn lock
+
     debug(1, "Connection %d: Classic AirPlay connection from %s:%u to self at %s:%u.",
           conn->connection_number, conn->client_ip_string, conn->client_rtsp_port,
-          conn->self_ip_string, conn->self_rtsp_port);
+          conn->self_ip_string, conn->self_rtsp_port);    
 #endif
 
     conn->stream.type = ast_unknown;
@@ -5201,7 +5230,7 @@ static void *rtsp_conversation_thread_func(void *pconn) {
     int i;
     for (i = 0; i < nconns; i++) {
       if ((conns[i] != NULL) && (conns[i]->connection_number == 0)) {
-        debug(1, "conns[%d] at %" PRIxPTR " has a Connection Number of 0.", conns[i]);
+        debug(1, "conns[%d] at %" PRIxPTR " has a Connection Number of 0!", conns[i]);
       }
     }
     debug_mutex_unlock(&conns_lock, 3);
@@ -5507,7 +5536,7 @@ void *rtsp_listen_loop(__attribute((unused)) void *arg) {
         maxfd = sockfd[i];
     }
 
-    char **t1 = txt_records; // ap1 test records
+    char **t1 = txt_records; // ap1 text records
     char **t2 = NULL;        // possibly two text records
 #ifdef CONFIG_AIRPLAY_2
     // make up a secondary set of text records
@@ -5561,7 +5590,7 @@ void *rtsp_listen_loop(__attribute((unused)) void *arg) {
       pthread_cleanup_push(malloc_cleanup, conn);
       memset(conn, 0, sizeof(rtsp_conn_info));
       conn->connection_number = RTSP_connection_index++;
-      debug(1, "Connection %d is at: 0x%" PRIxPTR ".", conn->connection_number, conn);
+      debug(2, "Connection %d is at: 0x%" PRIxPTR ".", conn->connection_number, conn);
 #ifdef CONFIG_AIRPLAY_2
       conn->airplay_type = ap_2;  // changed if an ANNOUNCE is received
       conn->timing_type = ts_ptp; // changed if an ANNOUNCE is received