diff --git a/lib/raop.c b/lib/raop.c index a34fadb..7098fae 100644 --- a/lib/raop.c +++ b/lib/raop.c @@ -87,7 +87,8 @@ struct raop_s { /* activate support for HLS live streaming */ bool hls_support; - + bool hls_pending; + /* used in digest authentication */ char *nonce; char *random_pw; @@ -424,6 +425,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } else if (!strcmp(method, "OPTIONS")) { handler = &raop_handler_options; } else if (!strcmp(method, "SETUP")) { + raop->hls_pending = false; handler = &raop_handler_setup; } else if (!strcmp(method, "GET_PARAMETER")) { handler = &raop_handler_get_parameter; @@ -459,6 +461,7 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } } else if (!strcmp(method, "GET")) { if (!strcmp(url, "/server-info")) { + raop->hls_pending = true; handler = &http_handler_server_info; } else if (!strcmp(url, "/playback-info")) { handler = &http_handler_playback_info; @@ -487,7 +490,6 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response) { } } http_response_finish(*response, response_data, response_datalen); - int len = 0; const char *data = http_response_get_data(*response, &len); if (response_data && response_datalen > 0) { @@ -635,7 +637,8 @@ raop_init(raop_callbacks_t *callbacks) { raop->audio_delay_micros = 250000; raop->hls_support = false; - + raop->hls_pending = false; + raop->nonce = NULL; raop->lang = NULL; diff --git a/lib/raop.h b/lib/raop.h index b6bd745..2140a0b 100644 --- a/lib/raop.h +++ b/lib/raop.h @@ -35,7 +35,6 @@ typedef struct raop_s raop_t; typedef void (*raop_log_callback_t)(void *cls, int level, const char *msg); - typedef struct playback_info_s { //char * uuid; uint32_t stallcount; @@ -66,7 +65,7 @@ typedef enum reset_type_e { RESET_TYPE_HLS_SHUTDOWN, RESET_TYPE_HLS_EOS, RESET_TYPE_ON_VIDEO_PLAY, - RESET_TYPE_TEARDOWN_110 + RESET_TYPE_RTP_TO_HLS_TEARDOWN } reset_type_t; struct raop_callbacks_s { diff --git a/lib/raop_handlers.h b/lib/raop_handlers.h index eac243f..c7fc716 100644 --- a/lib/raop_handlers.h +++ b/lib/raop_handlers.h @@ -1278,7 +1278,11 @@ raop_handler_teardown(raop_conn_t *conn, } } } else if (teardown_110) { - raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_SHUTDOWN); + if (raop->hls_pending) { + raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_TO_HLS_TEARDOWN); + } else { + raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_RTP_SHUTDOWN); + } if (conn->raop_rtp_mirror) { /* Stop our video RTP session */ raop_rtp_mirror_stop(conn->raop_rtp_mirror); @@ -1299,7 +1303,4 @@ raop_handler_teardown(raop_conn_t *conn, raop->callbacks.video_reset(raop->callbacks.cls, RESET_TYPE_HLS_SHUTDOWN); } } - if (raop->callbacks.conn_teardown) { - raop->callbacks.conn_teardown(raop->callbacks.cls, &teardown_96, &teardown_110); - } } diff --git a/uxplay.cpp b/uxplay.cpp index cd5ac9d..e62a9c6 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -2113,14 +2113,25 @@ static bool check_blocked_client(char *deviceid) { //to be simplified + +static const char *reset_name[] = { + [RESET_TYPE_NOHOLD] = "Nohold", + [RESET_TYPE_RTP_SHUTDOWN] = "RTP_Shutdown", + [RESET_TYPE_HLS_SHUTDOWN] = "HLS_Shutdown", + [RESET_TYPE_HLS_EOS] = "HLS_eos", + [RESET_TYPE_ON_VIDEO_PLAY] = "on_video_play", + [RESET_TYPE_RTP_TO_HLS_TEARDOWN] = "RTP_to_HLS_Shutdown" +}; + extern "C" void video_reset(void *cls, reset_type_t type) { - LOGD("video_reset"); + LOGD("video_reset: type = %s", reset_name[type]); switch (type) { case RESET_TYPE_NOHOLD: if (hls_support) { url.erase(); raop_destroy_airplay_video(raop, -1); } + case RESET_TYPE_HLS_EOS: if (use_video) { video_renderer_stop(); /* reset the video renderer immediately to avoid a timing issue if we wait for main_loop to reset */ @@ -2136,6 +2147,8 @@ extern "C" void video_reset(void *cls, reset_type_t type) { remote_clock_offset = 0; relaunch_video = true; break; + case RESET_TYPE_RTP_TO_HLS_TEARDOWN: + preserve_connections = true; case RESET_TYPE_RTP_SHUTDOWN: if (use_video) { video_renderer_stop(); @@ -2156,27 +2169,6 @@ extern "C" void video_reset(void *cls, reset_type_t type) { remote_clock_offset = 0; relaunch_video = true; break; - case RESET_TYPE_HLS_EOS: - if (use_video) { - /* reset the video renderer immediately to avoid a timing issue if we wait for main_loop to reset */ - video_renderer_stop(); - video_renderer_destroy(); - video_renderer_init(render_logger, server_name.c_str(), videoflip, video_parser.c_str(), rtp_pipeline.c_str(), - video_decoder.c_str(), video_converter.c_str(), videosink.c_str(), - videosink_options.c_str(), fullscreen, video_sync, h265_support, - render_coverart, playbin_version, NULL); - video_renderer_start(); - close_window = false; // we already closed the window - } - remote_clock_offset = 0; - relaunch_video = true; - break; - case RESET_TYPE_TEARDOWN_110: - if (use_video) { - video_renderer_stop(); - } - relaunch_video = true; - break; case RESET_TYPE_ON_VIDEO_PLAY: break; default: @@ -2282,12 +2274,6 @@ extern "C" void conn_reset (void *cls, int reason) { reset_loop = true; } -extern "C" void conn_teardown(void *cls, bool *teardown_96, bool *teardown_110) { - if (*teardown_110 && close_window) { - video_reset(cls,RESET_TYPE_TEARDOWN_110); - } -} - extern "C" void report_client_request(void *cls, char *deviceid, char * model, char *name, bool * admit) { LOGI("connection request from %s (%s) with deviceID = %s\n", name, model, deviceid); if (restrict_clients) { @@ -2717,7 +2703,6 @@ static int start_raop_server (unsigned short display[5], unsigned short tcp[3], raop_cbs.conn_destroy = conn_destroy; raop_cbs.conn_reset = conn_reset; raop_cbs.conn_feedback = conn_feedback; - raop_cbs.conn_teardown = conn_teardown; raop_cbs.audio_process = audio_process; raop_cbs.video_process = video_process; raop_cbs.audio_flush = audio_flush;