diff --git a/src/nvhttp.cpp b/src/nvhttp.cpp index 813b8feb..6fc4dc67 100644 --- a/src/nvhttp.cpp +++ b/src/nvhttp.cpp @@ -716,183 +716,6 @@ namespace nvhttp { } } - void - launch(bool &host_audio, resp_https_t response, req_https_t request) { - print_req(request); - - pt::ptree tree; - auto g = util::fail_guard([&]() { - std::ostringstream data; - - pt::write_xml(data, tree); - response->write(data.str()); - response->close_connection_after_response = true; - }); - - if (rtsp_stream::session_count() == config::stream.channels) { - tree.put("root.resume", 0); - tree.put("root..status_code", 503); - tree.put("root..status_message", "The host's concurrent stream limit has been reached. Stop an existing stream or increase the 'Channels' value in the Sunshine Web UI."); - - return; - } - - auto args = request->parse_query_string(); - if ( - args.find("rikey"s) == std::end(args) || - args.find("rikeyid"s) == std::end(args) || - args.find("localAudioPlayMode"s) == std::end(args) || - args.find("appid"s) == std::end(args)) { - tree.put("root.resume", 0); - tree.put("root..status_code", 400); - tree.put("root..status_message", "Missing a required launch parameter"); - - return; - } - - auto appid = util::from_view(get_arg(args, "appid")); - - auto current_appid = proc::proc.running(); - if (current_appid > 0) { - tree.put("root.resume", 0); - tree.put("root..status_code", 400); - tree.put("root..status_message", "An app is already running on this host"); - - return; - } - - // Probe encoders again before streaming to ensure our chosen - // encoder matches the active GPU (which could have changed - // due to hotplugging, driver crash, primary monitor change, - // or any number of other factors). - if (rtsp_stream::session_count() == 0) { - if (video::probe_encoders()) { - tree.put("root..status_code", 503); - tree.put("root..status_message", "Failed to initialize video capture/encoding. Is a display connected and turned on?"); - tree.put("root.gamesession", 0); - - return; - } - } - - host_audio = util::from_view(get_arg(args, "localAudioPlayMode")); - auto launch_session = make_launch_session(host_audio, args); - - if (appid > 0) { - auto err = proc::proc.execute(appid, launch_session); - if (err) { - tree.put("root..status_code", err); - tree.put("root..status_message", "Failed to start the specified application"); - tree.put("root.gamesession", 0); - - return; - } - } - - tree.put("root..status_code", 200); - tree.put("root.sessionUrl0", "rtsp://"s + net::addr_to_url_escaped_string(request->local_endpoint().address()) + ':' + std::to_string(map_port(rtsp_stream::RTSP_SETUP_PORT))); - tree.put("root.gamesession", 1); - } - - void - resume(bool &host_audio, resp_https_t response, req_https_t request) { - print_req(request); - - pt::ptree tree; - auto g = util::fail_guard([&]() { - std::ostringstream data; - - pt::write_xml(data, tree); - response->write(data.str()); - response->close_connection_after_response = true; - }); - - // It is possible that due a race condition that this if-statement gives a false negative, - // that is automatically resolved in rtsp_server_t - if (rtsp_stream::session_count() == config::stream.channels) { - tree.put("root.resume", 0); - tree.put("root..status_code", 503); - tree.put("root..status_message", "The host's concurrent stream limit has been reached. Stop an existing stream or increase the 'Channels' value in the Sunshine Web UI."); - - return; - } - - auto current_appid = proc::proc.running(); - if (current_appid == 0) { - tree.put("root.resume", 0); - tree.put("root..status_code", 503); - tree.put("root..status_message", "No running app to resume"); - - return; - } - - auto args = request->parse_query_string(); - if ( - args.find("rikey"s) == std::end(args) || - args.find("rikeyid"s) == std::end(args)) { - tree.put("root.resume", 0); - tree.put("root..status_code", 400); - tree.put("root..status_message", "Missing a required resume parameter"); - - return; - } - - if (rtsp_stream::session_count() == 0) { - // Probe encoders again before streaming to ensure our chosen - // encoder matches the active GPU (which could have changed - // due to hotplugging, driver crash, primary monitor change, - // or any number of other factors). - if (video::probe_encoders()) { - tree.put("root.resume", 0); - tree.put("root..status_code", 503); - tree.put("root..status_message", "Failed to initialize video capture/encoding. Is a display connected and turned on?"); - - return; - } - - // Newer Moonlight clients send localAudioPlayMode on /resume too, - // so we should use it if it's present in the args and there are - // no active sessions we could be interfering with. - if (args.find("localAudioPlayMode"s) != std::end(args)) { - host_audio = util::from_view(get_arg(args, "localAudioPlayMode")); - } - } - - tree.put("root..status_code", 200); - tree.put("root.sessionUrl0", "rtsp://"s + net::addr_to_url_escaped_string(request->local_endpoint().address()) + ':' + std::to_string(map_port(rtsp_stream::RTSP_SETUP_PORT))); - tree.put("root.resume", 1); - } - - void - cancel(resp_https_t response, req_https_t request) { - print_req(request); - - pt::ptree tree; - auto g = util::fail_guard([&]() { - std::ostringstream data; - - pt::write_xml(data, tree); - response->write(data.str()); - response->close_connection_after_response = true; - }); - - // It is possible that due a race condition that this if-statement gives a false positive, - // the client should try again - if (rtsp_stream::session_count() != 0) { - tree.put("root.resume", 0); - tree.put("root..status_code", 503); - tree.put("root..status_message", "All sessions must be disconnected before quitting"); - - return; - } - - tree.put("root.cancel", 1); - tree.put("root..status_code", 200); - - if (proc::proc.running() > 0) { - proc::proc.terminate(); - } - } void appasset(resp_https_t response, req_https_t request) { @@ -1009,9 +832,6 @@ namespace nvhttp { https_server.resource["^/pair$"]["GET"] = [&add_cert](auto resp, auto req) { pair(add_cert, resp, req); }; https_server.resource["^/applist$"]["GET"] = applist; https_server.resource["^/appasset$"]["GET"] = appasset; - https_server.resource["^/launch$"]["GET"] = [&host_audio](auto resp, auto req) { launch(host_audio, resp, req); }; - https_server.resource["^/resume$"]["GET"] = [&host_audio](auto resp, auto req) { resume(host_audio, resp, req); }; - https_server.resource["^/cancel$"]["GET"] = cancel; https_server.config.reuse_address = true; https_server.config.address = net::af_to_any_address_string(address_family); diff --git a/src/stream.cpp b/src/stream.cpp index 9aa432d1..a3b4b80a 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -1444,6 +1444,7 @@ namespace stream { auto video_port = map_port(VIDEO_STREAM_PORT); auto audio_port = map_port(AUDIO_STREAM_PORT); + BOOST_LOG(info) << "Bind Control server to port ["sv << control_port << "]: "sv; if (ctx.control_server.bind(address_family, control_port)) { BOOST_LOG(error) << "Couldn't bind Control server to port ["sv << control_port << "], likely another process already bound to the port"sv; @@ -1458,6 +1459,7 @@ namespace stream { return -1; } + BOOST_LOG(info) << "Bind Video server to port ["sv << video_port << "]: "sv; ctx.video_sock.bind(udp::endpoint(protocol, video_port), ec); if (ec) { BOOST_LOG(fatal) << "Couldn't bind Video server to port ["sv << video_port << "]: "sv << ec.message(); @@ -1472,6 +1474,7 @@ namespace stream { return -1; } + BOOST_LOG(info) << "Bind Audio server to port ["sv << audio_port << "]: "sv; ctx.audio_sock.bind(udp::endpoint(protocol, audio_port), ec); if (ec) { BOOST_LOG(fatal) << "Couldn't bind Audio server to port ["sv << audio_port << "]: "sv << ec.message(); @@ -1616,7 +1619,7 @@ namespace stream { session->video.peer.port(), platf::qos_data_type_e::video); } - BOOST_LOG(debug) << "Start capturing Video"sv; + BOOST_LOG(info) << "Start capturing Video, client port : "sv << session->video.peer.port(); video::capture(session->mail, session->config.monitor, session); } @@ -1641,7 +1644,7 @@ namespace stream { session->audio.peer.port(), platf::qos_data_type_e::audio); } - BOOST_LOG(debug) << "Start capturing Audio"sv; + BOOST_LOG(info) << "Start capturing Audio, client port: "sv << session->audio.peer.port(); audio::capture(session->mail, session->config.audio, session); }