diff --git a/app/src/cli.c b/app/src/cli.c index eb784ebc..da48c021 100644 --- a/app/src/cli.c +++ b/app/src/cli.c @@ -77,6 +77,7 @@ enum { OPT_NO_AUDIO_PLAYBACK, OPT_NO_VIDEO_PLAYBACK, OPT_AUDIO_SOURCE, + OPT_NO_KILL_ADB_BEFORE_OTG, }; struct sc_option { @@ -411,6 +412,16 @@ static const struct sc_option options[] = { .longopt = "no-key-repeat", .text = "Do not forward repeated key events when a key is held down.", }, + { + .longopt_id = OPT_NO_KILL_ADB_BEFORE_OTG, + .longopt = "no-kill-adb-before-otg", + // with .text, the option is not documented on other platforms +#ifdef _WIN32 + .text = "By default, scrcpy kills the adb daemon on Windows if --otg " + "is specified.\n" + "This option avoids to kill the adb daemon.", +#endif + }, { .longopt_id = OPT_NO_MIPMAPS, .longopt = "no-mipmaps", @@ -1944,6 +1955,14 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[], return false; } break; + case OPT_NO_KILL_ADB_BEFORE_OTG: +#ifdef _WIN32 + opts->kill_adb_before_otg = false; + break; +#else + LOGE("--no-kill-adb-before-otg only exists on Windows."); + return false; +#endif default: // getopt prints the error message on stderr return false; diff --git a/app/src/options.c b/app/src/options.c index e1373753..9d75d582 100644 --- a/app/src/options.c +++ b/app/src/options.c @@ -48,6 +48,9 @@ const struct scrcpy_options scrcpy_options_default = { #endif #ifdef HAVE_USB .otg = false, +#endif +#ifdef _WIN32 + .kill_adb_before_otg = true, #endif .show_touches = false, .fullscreen = false, diff --git a/app/src/options.h b/app/src/options.h index c33fafef..c80d038b 100644 --- a/app/src/options.h +++ b/app/src/options.h @@ -148,6 +148,9 @@ struct scrcpy_options { #endif #ifdef HAVE_USB bool otg; +#endif +#ifdef _WIN32 + bool kill_adb_before_otg; #endif bool show_touches; bool fullscreen; diff --git a/app/src/usb/scrcpy_otg.c b/app/src/usb/scrcpy_otg.c index f469de1a..803b874a 100644 --- a/app/src/usb/scrcpy_otg.c +++ b/app/src/usb/scrcpy_otg.c @@ -83,10 +83,12 @@ scrcpy_otg(struct scrcpy_options *options) { #ifdef _WIN32 // On Windows, only one process could open a USB device // - LOGI("Killing adb daemon (if any)..."); - unsigned flags = SC_ADB_NO_STDOUT | SC_ADB_NO_STDERR | SC_ADB_NO_LOGERR; - // uninterruptible (intr == NULL), but in practice it's very quick - sc_adb_kill_server(NULL, flags); + if (options->kill_adb_before_otg) { + LOGI("Killing adb daemon (if any)..."); + unsigned flags = SC_ADB_NO_STDOUT | SC_ADB_NO_STDERR | SC_ADB_NO_LOGERR; + // uninterruptible (intr == NULL), but in practice it's very quick + sc_adb_kill_server(NULL, flags); + } #endif static const struct sc_usb_callbacks cbs = {