(API Change) Refactor module handling
Changed API: - char *obs_find_plugin_file(const char *sub_path); Changed to: char *obs_module_file(const char *file); Cahnge it so you no longer need to specify a sub-path such as: obs_find_plugin_file("module_name/file.ext") Instead, now automatically handle the module data path so all you need to do is: obs_module_file("file.ext") - int obs_load_module(const char *name); Changed to: int obs_open_module(obs_module_t *module, const char *path, const char *data_path); bool obs_init_module(obs_module_t module); Change the module loading API so that if the front-end chooses, it can load modules directly from a specified path, and associate a data directory with it on the spot. The module will not be initialized immediately; obs_init_module must be called on the module pointer in order to fully initialize the module. This is done so a module can be disabled by the front-end if the it so chooses. New API: - void obs_add_module_path(const char *bin, const char *data); These functions allow you to specify new module search paths to add, and allow you to search through them, or optionally just load all modules from them. If the string %module% is included, it will replace it with the module's name when that string is used as a lookup. Data paths are now directly added to the module's internal storage structure, and when obs_find_module_file is used, it will look up the pointer to the obs_module structure and get its data directory that way. Example: obs_add_module_path("/opt/obs/my-modules/%module%/bin", "/opt/obs/my-modules/%module%/data"); This would cause it to additionally look for the binary of a hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so (or libfoo.so), and then look for the data in /opt/obs/my-modules/foo/data. This gives the front-end more flexibility for handling third-party plugin modules, or handling all plugin modules in a custom way. - void obs_find_modules(obs_find_module_callback_t callback, void *param); This searches the existing paths for modules and calls the callback function when any are found. Useful for plugin management and custom handling of the paths by the front-end if desired. - void obs_load_all_modules(void); Search through the paths and both loads and initializes all modules automatically without custom handling. - void obs_enum_modules(obs_enum_module_callback_t callback, void *param); Enumerates currently opened modules.
This commit is contained in:
@@ -27,57 +27,32 @@ const char *get_module_extension(void)
|
||||
return ".dll";
|
||||
}
|
||||
|
||||
static inline bool check_path(const char* data, const char *path,
|
||||
struct dstr * output)
|
||||
{
|
||||
dstr_copy(output, path);
|
||||
dstr_cat(output, data);
|
||||
|
||||
blog(LOG_DEBUG, "Attempting path: %s\n", output->array);
|
||||
|
||||
return os_file_exists(output->array);
|
||||
}
|
||||
|
||||
static inline bool check_lib_path(const char* data, const char *path,
|
||||
struct dstr *output)
|
||||
{
|
||||
bool result = false;
|
||||
struct dstr tmp;
|
||||
|
||||
dstr_init_copy(&tmp, data);
|
||||
dstr_cat(&tmp, ".dll");
|
||||
result = check_path(tmp.array, path, output);
|
||||
|
||||
dstr_free(&tmp);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* on windows, plugin files are located in [base directory]/plugins/[bit] */
|
||||
char *find_plugin(const char *plugin)
|
||||
{
|
||||
struct dstr path;
|
||||
dstr_init(&path);
|
||||
|
||||
#ifdef _WIN64
|
||||
if (check_lib_path(plugin, "obs-plugins/64bit/", &path))
|
||||
#define BIT_STRING "64bit"
|
||||
#else
|
||||
if (check_lib_path(plugin, "obs-plugins/32bit/", &path))
|
||||
#define BIT_STRING "32bit"
|
||||
#endif
|
||||
return path.array;
|
||||
|
||||
#ifdef _WIN64
|
||||
if (check_lib_path(plugin, "../../obs-plugins/64bit/", &path))
|
||||
#else
|
||||
if (check_lib_path(plugin, "../../obs-plugins/32bit/", &path))
|
||||
#endif
|
||||
return path.array;
|
||||
static const char *module_bin[] = {
|
||||
"obs-plugins/" BIT_STRING,
|
||||
"../../obs-plugins/" BIT_STRING,
|
||||
};
|
||||
|
||||
dstr_free(&path);
|
||||
return NULL;
|
||||
static const char *module_data[] = {
|
||||
"data/%module%",
|
||||
"../../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]);
|
||||
}
|
||||
|
||||
/* on windows, points to [base directory]/libobs */
|
||||
/* on windows, points to [base directory]/data/libobs */
|
||||
char *find_libobs_data_file(const char *file)
|
||||
{
|
||||
struct dstr path;
|
||||
@@ -93,22 +68,6 @@ char *find_libobs_data_file(const char *file)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* on windows, data files should always be in [base directory]/data */
|
||||
char *obs_find_plugin_file(const char *file)
|
||||
{
|
||||
struct dstr path;
|
||||
dstr_init(&path);
|
||||
|
||||
if (check_path(file, "data/obs-plugins/", &path))
|
||||
return path.array;
|
||||
|
||||
if (check_path(file, "../../data/obs-plugins/", &path))
|
||||
return path.array;
|
||||
|
||||
dstr_free(&path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void log_processor_info(void)
|
||||
{
|
||||
HKEY key;
|
||||
|
Reference in New Issue
Block a user