diff --git a/src/config.cpp b/src/config.cpp index 9aae15c4..dfa7399a 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -380,6 +380,8 @@ namespace config { {}, // encoder {}, // adapter_name {}, // output_name + + "1920x1080x60", // fallback_mode }; audio_t audio { @@ -1052,6 +1054,7 @@ namespace config { string_f(vars, "encoder", video.encoder); string_f(vars, "adapter_name", video.adapter_name); string_f(vars, "output_name", video.output_name); + string_f(vars, "fallback_mode", video.fallback_mode); int_between_f(vars, "min_fps_factor", video.min_fps_factor, { 1, 3 }); path_f(vars, "pkey", nvhttp.pkey); diff --git a/src/config.h b/src/config.h index 2d71fc03..8d57bf28 100644 --- a/src/config.h +++ b/src/config.h @@ -77,6 +77,8 @@ namespace config { std::string encoder; std::string adapter_name; std::string output_name; + + std::string fallback_mode; }; struct audio_t { diff --git a/src/nvhttp.cpp b/src/nvhttp.cpp index 759f89c4..11fdbc67 100644 --- a/src/nvhttp.cpp +++ b/src/nvhttp.cpp @@ -356,16 +356,6 @@ namespace nvhttp { std::copy(rikey.cbegin(), rikey.cend(), std::back_inserter(launch_session->gcm_key)); launch_session->host_audio = host_audio; - std::stringstream mode = std::stringstream(get_arg(args, "mode", "0x0x0")); - // Split mode by the char "x", to populate width/height/fps - int x = 0; - std::string segment; - while (std::getline(mode, segment, 'x')) { - if (x == 0) launch_session->width = atoi(segment.c_str()); - if (x == 1) launch_session->height = atoi(segment.c_str()); - if (x == 2) launch_session->fps = atoi(segment.c_str()); - x++; - } // Encrypted RTSP is enabled with client reported corever >= 1 auto corever = util::from_view(get_arg(args, "corever", "0")); @@ -387,10 +377,17 @@ namespace nvhttp { uint32_t prepend_iv = util::endian::big(util::from_view(get_arg(args, "rikeyid"))); auto prepend_iv_p = (uint8_t *) &prepend_iv; std::copy(prepend_iv_p, prepend_iv_p + sizeof(prepend_iv), std::begin(launch_session->iv)); - } else { - launch_session->width = 0; - launch_session->height = 0; - launch_session->fps = 0; + } + + std::stringstream mode = std::stringstream(get_arg(args, "mode", config::video.fallback_mode.c_str())); + // Split mode by the char "x", to populate width/height/fps + int x = 0; + std::string segment; + while (std::getline(mode, segment, 'x')) { + if (x == 0) launch_session->width = atoi(segment.c_str()); + if (x == 1) launch_session->height = atoi(segment.c_str()); + if (x == 2) launch_session->fps = atoi(segment.c_str()); + x++; } launch_session->device_name = named_cert_p->name.empty() ? "ApolloDisplay"s : named_cert_p->name; diff --git a/src/process.cpp b/src/process.cpp index 6ba8941e..ab42ca5c 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -223,7 +223,7 @@ namespace proc { std::wstring currentPrimaryDisplayName = VDISPLAY::getPrimaryDisplay(); - // When launched through config ui, don't change display settings + // Don't change display settings when no params are given if (launch_session->width && launch_session->height && launch_session->fps) { // Apply display settings VDISPLAY::changeDisplaySettings(vdisplayName.c_str(), render_width, render_height, launch_session->fps); diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index 4a9a4f3f..9596d99c 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -343,6 +343,11 @@ serialize() { this.config.global_prep_cmd = JSON.stringify(this.global_prep_cmd.filter(cmd => cmd.do || cmd.undo)); this.config.server_cmd = JSON.stringify(this.server_cmd.filter(cmd => cmd.name && cmd.cmd)); + + // Validate fallback mode + if (this.config.fallback_mode && !this.config.fallback_mode.match(/^\d+x\d+x\d+$/)) { + this.config.fallback_mode = "1920x1080x60"; + } }, save() { this.saved = false; diff --git a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue index b16a6eba..d591f40a 100644 --- a/src_assets/common/assets/web/configs/tabs/AudioVideo.vue +++ b/src_assets/common/assets/web/configs/tabs/AudioVideo.vue @@ -1,5 +1,5 @@