0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00

Merge pull request #6622 from tommyvct/new-rosetta-detection

libobs/util: Add function to get Rosetta translation status
This commit is contained in:
Patrick Heyer 2022-06-19 16:04:50 +02:00 committed by GitHub
commit 3ea8dbb392
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 37 additions and 15 deletions

View File

@ -2173,7 +2173,7 @@ static int run_program(fstream &logFile, int argc, char *argv[])
}
#ifdef __APPLE__
bool rosettaTranslated = ProcessIsRosettaTranslated();
bool rosettaTranslated = os_get_emulation_status();
blog(LOG_INFO, "Rosetta translation used: %s",
rosettaTranslated ? "true" : "false");
#endif

View File

@ -202,19 +202,6 @@ void EnableOSXDockIcon(bool enable)
NSApplicationActivationPolicyProhibited];
}
bool ProcessIsRosettaTranslated()
{
#ifdef __aarch64__
return false;
#else
int ret = 0;
size_t size = sizeof(ret);
if (sysctlbyname("sysctl.proc_translated", &ret, &size, NULL, 0) == -1)
return false;
return ret == 1;
#endif
}
// Not implemented yet
void TaskbarOverlayInit() {}
void TaskbarOverlaySetStatus(TaskbarOverlayStatus) {}

View File

@ -85,5 +85,4 @@ void EnableOSXDockIcon(bool enable);
bool isInBundle();
void InstallNSApplicationSubclass();
void disableColorSpaceConversion(QWidget *window);
bool ProcessIsRosettaTranslated();
#endif

View File

@ -478,3 +478,12 @@ Other Functions
.. function:: uint64_t os_get_proc_virtual_size(void)
Returns the virtual memory size of the current process.
---------------------
.. function:: bool os_get_emulation_status(void)
Returns true if the current process is a x64 binary and is being emulated or translated
by the host operating system. On macOS, it returns true when a x64 binary is
being translated by Rosetta and running on Apple Silicon Macs. This function is not yet
implemented on Windows and Linux and will always return false on those platforms.

View File

@ -319,6 +319,21 @@ static int physical_cores = 0;
static int logical_cores = 0;
static bool core_count_initialized = false;
bool os_get_emulation_status(void)
{
#ifdef __aarch64__
return false;
#else
int rosettaTranslated = 0;
size_t size = sizeof(rosettaTranslated);
if (sysctlbyname("sysctl.proc_translated", &rosettaTranslated, &size,
NULL, 0) == -1)
return false;
return rosettaTranslated == 1;
#endif
}
static void os_get_cores_internal(void)
{
if (core_count_initialized)

View File

@ -401,6 +401,11 @@ char *os_get_executable_path_ptr(const char *name)
return path.array;
}
bool os_get_emulation_status(void)
{
return false;
}
#endif
bool os_file_exists(const char *path)

View File

@ -992,6 +992,11 @@ bool is_64_bit_windows(void)
#endif
}
bool os_get_emulation_status(void)
{
return false;
}
void get_reg_dword(HKEY hkey, LPCWSTR sub_key, LPCWSTR value_name,
struct reg_dword *info)
{

View File

@ -123,6 +123,8 @@ EXPORT char *os_get_abs_path_ptr(const char *path);
EXPORT const char *os_get_path_extension(const char *path);
EXPORT bool os_get_emulation_status(void);
struct os_dir;
typedef struct os_dir os_dir_t;