diff --git a/frontend/settings/OBSBasicSettings.cpp b/frontend/settings/OBSBasicSettings.cpp index dc7bc73fd916b4..59dd91ef6fbb65 100644 --- a/frontend/settings/OBSBasicSettings.cpp +++ b/frontend/settings/OBSBasicSettings.cpp @@ -5588,7 +5588,9 @@ void OBSBasicSettings::UpdateMultitrackVideo() ui->enableMultitrackVideo->setChecked(false); } -#ifndef _WIN32 + // Enhanced Broadcasting works on Windows and Apple Silicon Macs. + // For other OS variants, only enable the GUI controls if developer mode was invoked. +#if !defined(_WIN32) && !(defined(__APPLE__) && defined(__aarch64__)) available = available && MultitrackVideoDeveloperModeEnabled(); #endif diff --git a/frontend/utility/system-info-macos.mm b/frontend/utility/system-info-macos.mm index 0c81e4cfb84c19..e99c0cb224bd9e 100644 --- a/frontend/utility/system-info-macos.mm +++ b/frontend/utility/system-info-macos.mm @@ -1,6 +1,96 @@ #include "system-info.hpp" +#ifdef __aarch64__ +#import + +#import +#import +#import +#import + +static std::optional getCpuName() +{ + std::string name; + size_t size; + int ret; + + ret = sysctlbyname("machdep.cpu.brand_string", NULL, &size, NULL, 0); + if (ret != 0) + return std::nullopt; + + name.resize(size); + + ret = sysctlbyname("machdep.cpu.brand_string", name.data(), &size, NULL, 0); + if (ret != 0) + return std::nullopt; + + // Remove null terminator + name.resize(name.find('\0')); + return name; +} + +// Apple Silicon Macs have a single SoC that contains both GPU and CPU, the same information is valid for both. +static void fillSoCInfo(GoLiveApi::Capabilities &capabilities) +{ + capabilities.cpu.name = getCpuName(); + // Getting the frequency is not supported on Apple Silicon. + capabilities.cpu.physical_cores = os_get_physical_cores(); + capabilities.cpu.logical_cores = os_get_logical_cores(); + + capabilities.memory.total = os_get_sys_total_size(); + capabilities.memory.free = os_get_sys_free_size(); + + // Apple Silicon does not support dGPUs, there's only going to be one (the SoC). + GoLiveApi::Gpu gpu; + gpu.model = capabilities.cpu.name.value_or("Unknown"); + gpu.vendor_id = 0x106b; // Always Apple + gpu.device_id = 0; // Always 0 for Apple Silicon + + std::vector gpus; + gpus.push_back(std::move(gpu)); + capabilities.gpu = gpus; +} + +static void fillSystemInfo(GoLiveApi::System &sysinfo) +{ + NSProcessInfo *procInfo = [NSProcessInfo processInfo]; + NSOperatingSystemVersion versionObj = [procInfo operatingSystemVersion]; + + sysinfo.name = "macOS"; + sysinfo.bits = 64; // 32-bit macOS is long deprecated. + sysinfo.version = [[procInfo operatingSystemVersionString] UTF8String]; + + switch (versionObj.majorVersion) { + case 11: + sysinfo.release = "Big Sur"; + break; + case 12: + sysinfo.release = "Monterey"; + break; + case 13: + sysinfo.release = "Ventura"; + break; + case 14: + sysinfo.release = "Sonoma"; + break; + case 15: + sysinfo.release = "Sequoia"; + break; + default: + sysinfo.release = "unknown"; + } + + sysinfo.arm = true; + sysinfo.armEmulation = false; +} +#endif + void system_info(GoLiveApi::Capabilities &capabilities) { +#ifdef __aarch64__ + fillSoCInfo(capabilities); + fillSystemInfo(capabilities.system); +#else UNUSED_PARAMETER(capabilities); +#endif }