OBS-扩展模块DLL
+ -

OBS扩展模块DLL-模块路径及配置文件路径

2024-06-20 19 0

扩展模块即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

第二个汲的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_PATHOBS_PLUGINS_DATA_PATH。如果这两个路径都存在,就将 plugins_data_path 拼接成 data_path_with_module_suffix,然后调用 obs_add_module_path 函数,将 plugins_pathdata_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
}

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!