From 57eaf05289b6f3bed79a799db7ab18292e649878 Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 25 Mar 2018 16:20:34 +0200 Subject: [PATCH] Improve startup time when show_touches is enabled Enabling "show touches" involves the execution of an adb command, which takes some time. In order to parallelize, execute the command as soon as possible, but reap the process only once everything is initialized. --- app/src/scrcpy.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/scrcpy.c b/app/src/scrcpy.c index eefb9a05..fc97e3b2 100644 --- a/app/src/scrcpy.c +++ b/app/src/scrcpy.c @@ -106,13 +106,17 @@ static void event_loop(void) { } } -static SDL_bool set_show_touches_enabled(const char *serial, SDL_bool enabled) { +static process_t set_show_touches_enabled(const char *serial, SDL_bool enabled) { const char *value = enabled ? "1" : "0"; const char *const adb_cmd[] = { "shell", "settings", "put", "system", "show_touches", value }; - process_t proc = adb_execute(serial, adb_cmd, ARRAY_LEN(adb_cmd)); - return process_check_success(proc, "show_touches"); + return adb_execute(serial, adb_cmd, ARRAY_LEN(adb_cmd)); +} + +static void wait_show_touches(process_t process) { + // reap the process, ignore the result + process_check_success(process, "show_touches"); } SDL_bool scrcpy(const struct scrcpy_options *options) { @@ -121,6 +125,14 @@ SDL_bool scrcpy(const struct scrcpy_options *options) { return SDL_FALSE; } + process_t proc_show_touches; + SDL_bool show_touches_waited; + if (options->show_touches) { + LOGI("Enable show_touches"); + proc_show_touches = set_show_touches_enabled(options->serial, SDL_TRUE); + show_touches_waited = SDL_FALSE; + } + SDL_bool ret = SDL_TRUE; if (!SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1")) { @@ -183,8 +195,8 @@ SDL_bool scrcpy(const struct scrcpy_options *options) { } if (options->show_touches) { - LOGI("Enable show_touches"); - set_show_touches_enabled(options->serial, SDL_TRUE); + wait_show_touches(proc_show_touches); + show_touches_waited = SDL_TRUE; } event_loop(); @@ -192,10 +204,6 @@ SDL_bool scrcpy(const struct scrcpy_options *options) { screen_destroy(&screen); - if (options->show_touches) { - LOGI("Disable show_touches"); - set_show_touches_enabled(options->serial, SDL_FALSE); - } finally_stop_and_join_controller: controller_stop(&controller); controller_join(&controller); @@ -209,6 +217,16 @@ finally_stop_decoder: finally_destroy_frames: frames_destroy(&frames); finally_destroy_server: + if (options->show_touches) { + if (!show_touches_waited) { + // wait the process which enabled "show touches" + wait_show_touches(proc_show_touches); + } + LOGI("Disable show_touches"); + proc_show_touches = set_show_touches_enabled(options->serial, SDL_FALSE); + wait_show_touches(proc_show_touches); + } + server_destroy(&server); return ret;