build(android): support android platform (config and logging) (#3741)
This commit is contained in:
@@ -32,7 +32,7 @@
|
|||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#if !defined(__ANDROID__) && !defined(__APPLE__)
|
||||||
// For NVENC legacy constants
|
// For NVENC legacy constants
|
||||||
#include <ffnvcodec/nvEncodeAPI.h>
|
#include <ffnvcodec/nvEncodeAPI.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -1038,9 +1038,12 @@ namespace config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void apply_config(std::unordered_map<std::string, std::string> &&vars) {
|
void apply_config(std::unordered_map<std::string, std::string> &&vars) {
|
||||||
|
#ifndef __ANDROID__
|
||||||
|
// TODO: Android can possibly support this
|
||||||
if (!fs::exists(stream.file_apps.c_str())) {
|
if (!fs::exists(stream.file_apps.c_str())) {
|
||||||
fs::copy_file(SUNSHINE_ASSETS_DIR "/apps.json", stream.file_apps);
|
fs::copy_file(SUNSHINE_ASSETS_DIR "/apps.json", stream.file_apps);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (auto &[name, val] : vars) {
|
for (auto &[name, val] : vars) {
|
||||||
BOOST_LOG(info) << "config: '"sv << name << "' = "sv << val;
|
BOOST_LOG(info) << "config: '"sv << name << "' = "sv << val;
|
||||||
@@ -1066,7 +1069,7 @@ namespace config {
|
|||||||
bool_f(vars, "nvenc_opengl_vulkan_on_dxgi", video.nv_opengl_vulkan_on_dxgi);
|
bool_f(vars, "nvenc_opengl_vulkan_on_dxgi", video.nv_opengl_vulkan_on_dxgi);
|
||||||
bool_f(vars, "nvenc_latency_over_power", video.nv_sunshine_high_power_mode);
|
bool_f(vars, "nvenc_latency_over_power", video.nv_sunshine_high_power_mode);
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#if !defined(__ANDROID__) && !defined(__APPLE__)
|
||||||
video.nv_legacy.preset = video.nv.quality_preset + 11;
|
video.nv_legacy.preset = video.nv.quality_preset + 11;
|
||||||
video.nv_legacy.multipass = video.nv.two_pass == nvenc::nvenc_two_pass::quarter_resolution ? NV_ENC_TWO_PASS_QUARTER_RESOLUTION :
|
video.nv_legacy.multipass = video.nv.two_pass == nvenc::nvenc_two_pass::quarter_resolution ? NV_ENC_TWO_PASS_QUARTER_RESOLUTION :
|
||||||
video.nv.two_pass == nvenc::nvenc_two_pass::full_resolution ? NV_ENC_TWO_PASS_FULL_RESOLUTION :
|
video.nv.two_pass == nvenc::nvenc_two_pass::full_resolution ? NV_ENC_TWO_PASS_FULL_RESOLUTION :
|
||||||
|
|||||||
@@ -15,11 +15,17 @@
|
|||||||
#include <boost/log/expressions.hpp>
|
#include <boost/log/expressions.hpp>
|
||||||
#include <boost/log/sinks.hpp>
|
#include <boost/log/sinks.hpp>
|
||||||
#include <boost/log/sources/severity_logger.hpp>
|
#include <boost/log/sources/severity_logger.hpp>
|
||||||
#include <display_device/logging.h>
|
|
||||||
|
|
||||||
// local includes
|
// local includes
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
|
|
||||||
|
// conditional includes
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
#include <android/log.h>
|
||||||
|
#else
|
||||||
|
#include <display_device/logging.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <libavutil/log.h>
|
#include <libavutil/log.h>
|
||||||
}
|
}
|
||||||
@@ -97,6 +103,48 @@ namespace logging {
|
|||||||
os << "["sv << std::put_time(<, "%Y-%m-%d %H:%M:%S.") << boost::format("%03u") % ms.count() << "]: "sv
|
os << "["sv << std::put_time(<, "%Y-%m-%d %H:%M:%S.") << boost::format("%03u") % ms.count() << "]: "sv
|
||||||
<< log_type << view.attribute_values()[message].extract<std::string>();
|
<< log_type << view.attribute_values()[message].extract<std::string>();
|
||||||
}
|
}
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
namespace sinks = boost::log::sinks;
|
||||||
|
namespace expr = boost::log::expressions;
|
||||||
|
|
||||||
|
void android_log(const std::string &message, int severity) {
|
||||||
|
android_LogPriority android_priority;
|
||||||
|
switch (severity) {
|
||||||
|
case 0:
|
||||||
|
android_priority = ANDROID_LOG_VERBOSE;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
android_priority = ANDROID_LOG_DEBUG;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
android_priority = ANDROID_LOG_INFO;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
android_priority = ANDROID_LOG_WARN;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
android_priority = ANDROID_LOG_ERROR;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
android_priority = ANDROID_LOG_FATAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
android_priority = ANDROID_LOG_UNKNOWN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
__android_log_print(android_priority, "Sunshine", "%s", message.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom sink backend for android
|
||||||
|
struct android_sink_backend: public sinks::basic_sink_backend<sinks::concurrent_feeding> {
|
||||||
|
void consume(const bl::record_view &rec) {
|
||||||
|
int log_sev = rec[severity].get();
|
||||||
|
const std::string log_msg = rec[expr::smessage].get();
|
||||||
|
// log to android
|
||||||
|
android_log(log_msg, log_sev);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
[[nodiscard]] std::unique_ptr<deinit_t> init(int min_log_level, const std::string &log_file) {
|
[[nodiscard]] std::unique_ptr<deinit_t> init(int min_log_level, const std::string &log_file) {
|
||||||
if (sink) {
|
if (sink) {
|
||||||
@@ -104,8 +152,10 @@ namespace logging {
|
|||||||
deinit();
|
deinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __ANDROID__
|
||||||
setup_av_logging(min_log_level);
|
setup_av_logging(min_log_level);
|
||||||
setup_libdisplaydevice_logging(min_log_level);
|
setup_libdisplaydevice_logging(min_log_level);
|
||||||
|
#endif
|
||||||
|
|
||||||
sink = boost::make_shared<text_sink>();
|
sink = boost::make_shared<text_sink>();
|
||||||
|
|
||||||
@@ -113,6 +163,7 @@ namespace logging {
|
|||||||
boost::shared_ptr<std::ostream> stream {&std::cout, boost::null_deleter()};
|
boost::shared_ptr<std::ostream> stream {&std::cout, boost::null_deleter()};
|
||||||
sink->locked_backend()->add_stream(stream);
|
sink->locked_backend()->add_stream(stream);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>(log_file));
|
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>(log_file));
|
||||||
sink->set_filter(severity >= min_log_level);
|
sink->set_filter(severity >= min_log_level);
|
||||||
sink->set_formatter(&formatter);
|
sink->set_formatter(&formatter);
|
||||||
@@ -122,9 +173,15 @@ namespace logging {
|
|||||||
sink->locked_backend()->auto_flush(true);
|
sink->locked_backend()->auto_flush(true);
|
||||||
|
|
||||||
bl::core::get()->add_sink(sink);
|
bl::core::get()->add_sink(sink);
|
||||||
|
|
||||||
|
#ifdef __ANDROID__
|
||||||
|
auto android_sink = boost::make_shared<sinks::synchronous_sink<android_sink_backend>>();
|
||||||
|
bl::core::get()->add_sink(android_sink);
|
||||||
|
#endif
|
||||||
return std::make_unique<deinit_t>();
|
return std::make_unique<deinit_t>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __ANDROID__
|
||||||
void setup_av_logging(int min_log_level) {
|
void setup_av_logging(int min_log_level) {
|
||||||
if (min_log_level >= 1) {
|
if (min_log_level >= 1) {
|
||||||
av_log_set_level(AV_LOG_QUIET);
|
av_log_set_level(AV_LOG_QUIET);
|
||||||
@@ -182,6 +239,7 @@ namespace logging {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void log_flush() {
|
void log_flush() {
|
||||||
if (sink) {
|
if (sink) {
|
||||||
|
|||||||
Reference in New Issue
Block a user