diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index a543e11c77..4c502ff683 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -34,7 +34,7 @@ #include "util/log.h" #include "util/net.h" -static struct server server = SERVER_INITIALIZER; +static struct server server; static struct screen screen = SCREEN_INITIALIZER; static struct fps_counter fps_counter; static struct video_buffer video_buffer; @@ -304,6 +304,19 @@ av_log_callback(void *avcl, int level, const char *fmt, va_list vl) { bool scrcpy(const struct scrcpy_options *options) { + if (!server_init(&server)) { + return false; + } + + bool server_started = false; + bool fps_counter_initialized = false; + bool video_buffer_initialized = false; + bool file_handler_initialized = false; + bool recorder_initialized = false; + bool stream_started = false; + bool controller_initialized = false; + bool controller_started = false; + bool record = !!options->record_filename; struct server_params params = { .log_level = options->log_level, @@ -322,18 +335,10 @@ scrcpy(const struct scrcpy_options *options) { .force_adb_forward = options->force_adb_forward, }; if (!server_start(&server, options->serial, ¶ms)) { - return false; + goto end; } - bool ret = false; - - bool fps_counter_initialized = false; - bool video_buffer_initialized = false; - bool file_handler_initialized = false; - bool recorder_initialized = false; - bool stream_started = false; - bool controller_initialized = false; - bool controller_started = false; + server_started = true; if (!sdl_init_and_configure(options->display, options->render_driver, options->disable_screensaver)) { @@ -444,7 +449,7 @@ scrcpy(const struct scrcpy_options *options) { input_manager_init(&input_manager, options); - ret = event_loop(options); + bool ret = event_loop(options); LOGD("quit..."); screen_destroy(&screen); @@ -465,8 +470,10 @@ scrcpy(const struct scrcpy_options *options) { fps_counter_interrupt(&fps_counter); } - // shutdown the sockets and kill the server - server_stop(&server); + if (server_started) { + // shutdown the sockets and kill the server + server_stop(&server); + } // now that the sockets are shutdown, the stream and controller are // interrupted, we can join them diff --git a/app/src/server.c b/app/src/server.c index 9267356b28..42e633affb 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -353,9 +353,26 @@ close_socket(socket_t socket) { } } -void +bool server_init(struct server *server) { - *server = (struct server) SERVER_INITIALIZER; + server->serial = NULL; + server->process = PROCESS_NONE; + server->wait_server_thread = NULL; + atomic_flag_clear_explicit(&server->server_socket_closed, + memory_order_relaxed); + + server->server_socket = INVALID_SOCKET; + server->video_socket = INVALID_SOCKET; + server->control_socket = INVALID_SOCKET; + + server->port_range.first = 0; + server->port_range.last = 0; + server->local_port = 0; + + server->tunnel_enabled = false; + server->tunnel_forward = false; + + return true; } static int diff --git a/app/src/server.h b/app/src/server.h index 30ce09bc58..823db0ea43 100644 --- a/app/src/server.h +++ b/app/src/server.h @@ -27,23 +27,6 @@ struct server { bool tunnel_forward; // use "adb forward" instead of "adb reverse" }; -#define SERVER_INITIALIZER { \ - .serial = NULL, \ - .process = PROCESS_NONE, \ - .wait_server_thread = NULL, \ - .server_socket_closed = ATOMIC_FLAG_INIT, \ - .server_socket = INVALID_SOCKET, \ - .video_socket = INVALID_SOCKET, \ - .control_socket = INVALID_SOCKET, \ - .port_range = { \ - .first = 0, \ - .last = 0, \ - }, \ - .local_port = 0, \ - .tunnel_enabled = false, \ - .tunnel_forward = false, \ -} - struct server_params { enum sc_log_level log_level; const char *crop; @@ -62,7 +45,7 @@ struct server_params { }; // init default values -void +bool server_init(struct server *server); // push, enable tunnel et start the server