OBS扩展模块DLL-模块路径及配置文件路径
扩展模块即OBS需要加载的外部dll。这些dll一般位于
C:\Program Files\obs-studio\obs-plugins\64bit
目录下。
模块路径
外部模块的路径添加通过函数obs_add_module_path实现。
void obs_add_module_path(const char *bin, const char *data)
{
struct obs_module_path omp;
if (!obs || !bin || !data)
return;
omp.bin = bstrdup(bin);
omp.data = bstrdup(data);
da_push_back(obs->module_paths, &omp);
}
这其中的两个参数:
- bin:是模块dll的路
- data:是配置参数ini的路径
第一个汲到到的obs_add_module_path调用有:
static const char *module_bin[] = {"../../obs-plugins/64bit"};
static const char *module_data[] = {"../../data/obs-plugins/%module%"};
static const int module_patterns_size = sizeof(module_bin) / sizeof(module_bin[0]);
void add_default_module_paths(void)
{
for (int i = 0; i < module_patterns_size; i++)
obs_add_module_path(module_bin[i], module_data[i]);
}
该函数被调用有顺序为:
- OBSApp::OBSInit()
- ::StartupOBS
- ::obs_startup
- ::obs_init
- ::add_default_module_paths()
- ::obs_add_module_path
- ::add_default_module_paths()
- ::obs_init
- ::obs_startup
- ::StartupOBS
第二个汲的obs_add_module_path调用有AddExtraModulePaths
调用顺序为:
- OBSBasic::OBSInit()
- AddExtraModulePaths()
OBSBasic::OBSInit()中调用代码如下:
/* Safe Mode disables third-party plugins so we don't need to add earch
* paths outside the OBS bundle/installation. */
if (safe_mode || disable_3p_plugins) {
SetSafeModuleNames();
} else {
AddExtraModulePaths();
}
OBSApp是应用程序,而OBSBasic是该应用下的主窗口。
bool OBSApp::OBSInit()
{
//创建主窗口
mainWindow = new OBSBasic();
mainWindow->setAttribute(Qt::WA_DeleteOnClose, true);
connect(mainWindow, &OBSBasic::destroyed, this, &OBSApp::quit);
//初始化主窗口的OBSInit
mainWindow->OBSInit();
}
第一个的最终路径为:
- C:\Program Files\obs-studio\obs-plugins\64bit
- C:\Program Files\obs-studio\data\obs-plugins
第二个的最终路径为:
- C:\Program Files\obs-studio\bin\64bit
- C:\Program Files\obs-studio\data\obs-studio
路径存储数组obs_core成员module_paths
obs_add_module_path将这些dll的路径及配置信息使用obs_module_path结构体,并存储在obs->module_paths成员中。
模块汲及到的成员包括:
struct obs_core {
struct obs_module *first_module;
DARRAY(struct obs_module_path) module_paths;//模块存储位置
DARRAY(char *) safe_modules; //CMake定义了SAFE_MODULES时才用,通过解析文件获取,如未定义该宏,则为空
...
}
附录:
这段函数是用来添加额外的模块路径到 OBS Studio 中。函数首先尝试从环境变量中获取两个路径:OBS_PLUGINS_PATH
和 OBS_PLUGINS_DATA_PATH
。如果这两个路径都存在,就将 plugins_data_path
拼接成 data_path_with_module_suffix
,然后调用 obs_add_module_path
函数,将 plugins_path
和 data_path_with_module_suffix
作为参数添加到模块路径中。
接着,如果处于便携模式下 (portable_mode
),函数直接返回,不进行后续操作。
然后根据不同的操作系统平台,设置不同的 base_module_dir
路径,并调用相应的路径获取函数。如果路径获取失败 (ret <= 0
),函数也直接返回。
最后根据操作系统的不同和架构的不同,设置不同的模块路径。例如,在 macOS 上,根据应用程序支持路径和系统旧版本支持路径添加模块路径;在其它系统上,则根据架构位数添加模块路径。
总体来说,这段函数用于根据环境变量和操作系统平台动态添加 OBS Studio 的模块路径,以支持不同的插件和模块加载需求。
static void AddExtraModulePaths()
{
string plugins_path, plugins_data_path;
char *s;
s = getenv("OBS_PLUGINS_PATH");
if (s)
plugins_path = s;
s = getenv("OBS_PLUGINS_DATA_PATH");
if (s)
plugins_data_path = s;
if (!plugins_path.empty() && !plugins_data_path.empty())
{
string data_path_with_module_suffix;
data_path_with_module_suffix += plugins_data_path;
data_path_with_module_suffix += "/%module%";
obs_add_module_path(plugins_path.c_str(), data_path_with_module_suffix.c_str());
}
if (portable_mode)
return;
char base_module_dir[512];
#if defined(_WIN32)
int ret = GetProgramDataPath(base_module_dir, sizeof(base_module_dir), "obs-studio/plugins/%module%");
#elif defined(__APPLE__)
int ret = GetConfigPath(base_module_dir, sizeof(base_module_dir), "obs-studio/plugins/%module%.plugin");
#else
int ret = GetConfigPath(base_module_dir, sizeof(base_module_dir), "obs-studio/plugins/%module%");
#endif
if (ret <= 0)
return;
string path = base_module_dir;
#if defined(__APPLE__)
/* User Application Support Search Path */
obs_add_module_path((path + "/Contents/MacOS").c_str(),(path + "/Contents/Resources").c_str());
#ifndef __aarch64__
/* Legacy System Library Search Path */
char system_legacy_module_dir[PATH_MAX];
GetProgramDataPath(system_legacy_module_dir, sizeof(system_legacy_module_dir), "obs-studio/plugins/%module%");
std::string path_system_legacy = system_legacy_module_dir;
obs_add_module_path((path_system_legacy + "/bin").c_str(), (path_system_legacy + "/data").c_str());
/* Legacy User Application Support Search Path */
char user_legacy_module_dir[PATH_MAX];
GetConfigPath(user_legacy_module_dir, sizeof(user_legacy_module_dir), "obs-studio/plugins/%module%");
std::string path_user_legacy = user_legacy_module_dir;
obs_add_module_path((path_user_legacy + "/bin").c_str(),(path_user_legacy + "/data").c_str());
#endif
#else
#if ARCH_BITS == 64
obs_add_module_path((path + "/bin/64bit").c_str(),
(path + "/data").c_str());
#else
obs_add_module_path((path + "/bin/32bit").c_str(),
(path + "/data").c_str());
#endif
#endif
}