diff --git a/src/single_window/render.cpp b/src/single_window/render.cpp index 36041e2..8b6df2f 100644 --- a/src/single_window/render.cpp +++ b/src/single_window/render.cpp @@ -438,13 +438,28 @@ int Render::Run() { // Main loop while (!exit_) { if (SignalStatus::SignalConnected == signal_status_ && - !is_create_connection_ && password_inited_) { + !is_create_connection_ && password_inited_ && + "Failed" != connection_status_str_) { LOG_INFO("Connected with signal server, create p2p connection"); is_create_connection_ = CreateConnection(peer_, client_id_, password_saved_.c_str()) ? false : true; } + if (!is_create_connection_ && rejoin_ && + "Failed" == connection_status_str_) { + LeaveConnection(peer_, client_id_); + DestroyPeer(&peer_); + peer_ = CreatePeer(¶ms_); + if (peer_) { + LOG_INFO("[{}] Create peer instance successful", client_id_); + Init(peer_, client_id_); + LOG_INFO("[{}] Peer init finish", client_id_); + } else { + LOG_INFO("Create peer instance failed"); + } + } + if (!inited_ || localization_language_index_last_ != localization_language_index_) { connect_button_label_ = @@ -541,8 +556,8 @@ int Render::Run() { LeaveConnection(peer_reserved_ ? peer_reserved_ : peer_, remote_id_.c_str()); if (peer_reserved_) { - DestroyPeer(&peer_reserved_); LOG_INFO("Destroy peer[reserved]"); + DestroyPeer(&peer_reserved_); } rejoin_ = false; @@ -667,17 +682,16 @@ int Render::Run() { device_controller_factory_ = nullptr; } - if (is_create_connection_) { + if (peer_) { LOG_INFO("[{}] Leave connection [{}]", client_id_, client_id_); LeaveConnection(peer_, client_id_); is_client_mode_ = false; - } - - if (peer_) { + LOG_INFO("Destroy peer"); DestroyPeer(&peer_); } if (peer_reserved_) { + LOG_INFO("Destroy peer[reserved]"); DestroyPeer(&peer_reserved_); } diff --git a/src/single_window/render_callback_func.cpp b/src/single_window/render_callback_func.cpp index 2dc3bf3..4cb355b 100644 --- a/src/single_window/render_callback_func.cpp +++ b/src/single_window/render_callback_func.cpp @@ -198,7 +198,9 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { } else if (ConnectionStatus::Failed == status) { render->connection_status_str_ = "Failed"; render->password_validating_time_ = 0; - LOG_ERROR("rtc connection failed"); + render->is_create_connection_ = false; + render->params_.enable_turn = true; + render->rejoin_ = true; } else if (ConnectionStatus::Closed == status) { render->connection_status_str_ = "Closed"; render->password_validating_time_ = 0; @@ -212,7 +214,9 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { render->audio_capture_button_pressed_ = false; } render->exit_video_window_ = false; - render->remote_password_.clear(); + if (!render->rejoin_) { + render->remote_password_.clear(); + } if (render->dst_buffer_) { memset(render->dst_buffer_, 0, 1280 * 720 * 3); SDL_UpdateTexture(render->stream_texture_, NULL, render->dst_buffer_, diff --git a/thirdparty/projectx b/thirdparty/projectx index 0b0e61c..0b11646 160000 --- a/thirdparty/projectx +++ b/thirdparty/projectx @@ -1 +1 @@ -Subproject commit 0b0e61cdc48518650bc7f7d1f274910bb8f945e1 +Subproject commit 0b11646619fb88c5a802b583551d9c63d3ae8215