diff --git a/libobs/obs-data.h b/libobs/obs-data.h index bbf3599c8..0549b84a6 100644 --- a/libobs/obs-data.h +++ b/libobs/obs-data.h @@ -32,6 +32,14 @@ #include "obs-service.h" #include "obs-encoder.h" +#define LOAD_MODULE_SUBFUNC(name, required) \ + do { \ + info->name = load_module_subfunc(module, module_name, \ + id, #name, required); \ + if (required && !info->name) \ + return false; \ + } while (false) + #define NUM_TEXTURES 2 struct obs_display { diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index a3109b93b..095751e03 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -19,33 +19,20 @@ #include "obs-data.h" bool load_encoder_info(void *module, const char *module_name, - const char *encoder_id, struct encoder_info *info) + const char *id, struct encoder_info *info) { - info->getname = load_module_subfunc(module, module_name, - encoder_id, "getname", true); - info->create = load_module_subfunc(module, module_name, - encoder_id, "create", true); - info->destroy = load_module_subfunc(module, module_name, - encoder_id, "destroy", true); - info->update = load_module_subfunc(module, module_name, - encoder_id, "update", true); - info->reset = load_module_subfunc(module, module_name, - encoder_id, "reset", true); - info->encode = load_module_subfunc(module, module_name, - encoder_id, "encode", true); - info->getheader = load_module_subfunc(module, module_name, - encoder_id, "getheader", true); + LOAD_MODULE_SUBFUNC(getname, true); + LOAD_MODULE_SUBFUNC(create, true); + LOAD_MODULE_SUBFUNC(destroy, true); + LOAD_MODULE_SUBFUNC(update, true); + LOAD_MODULE_SUBFUNC(reset, true); + LOAD_MODULE_SUBFUNC(encode, true); + LOAD_MODULE_SUBFUNC(getheader, true); - if (!info->getname || !info->create || !info->destroy || - !info->reset || !info->encode || !info->getheader) - return false; + LOAD_MODULE_SUBFUNC(setbitrate, false); + LOAD_MODULE_SUBFUNC(request_keyframe, false); - info->setbitrate = load_module_subfunc(module, module_name, - encoder_id, "setbitrate", false); - info->request_keyframe = load_module_subfunc(module, module_name, - encoder_id, "request_keyframe", false); - - info->id = encoder_id; + info->id = id; return true; } diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 44c2eceaf..59f70f2f0 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -19,31 +19,19 @@ #include "obs-data.h" bool load_output_info(void *module, const char *module_name, - const char *output_id, struct output_info *info) + const char *id, struct output_info *info) { - info->getname = load_module_subfunc(module, module_name, - output_id, "getname", true); - info->create = load_module_subfunc(module, module_name, - output_id, "create", true); - info->destroy = load_module_subfunc(module, module_name, - output_id, "destroy", true); - info->update = load_module_subfunc(module, module_name, - output_id, "update", true); - info->start = load_module_subfunc(module, module_name, - output_id, "start", true); - info->stop = load_module_subfunc(module, module_name, - output_id, "stop", true); - info->active = load_module_subfunc(module, module_name, - output_id, "active", true); + LOAD_MODULE_SUBFUNC(getname, true); + LOAD_MODULE_SUBFUNC(create, true); + LOAD_MODULE_SUBFUNC(destroy, true); + LOAD_MODULE_SUBFUNC(update, true); + LOAD_MODULE_SUBFUNC(start, true); + LOAD_MODULE_SUBFUNC(stop, true); + LOAD_MODULE_SUBFUNC(active, true); - if (!info->getname || !info->create || !info->destroy || - !info->start || !info->stop || !info->active) - return false; + LOAD_MODULE_SUBFUNC(pause, false); - info->pause = load_module_subfunc(module, module_name, - output_id, "pause", false); - - info->id = output_id; + info->id = id; return true; } diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 21746a3d2..062f97f5d 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -27,47 +27,26 @@ static void obs_source_destroy(obs_source_t source); bool load_source_info(void *module, const char *module_name, - const char *source_id, struct source_info *info) + const char *id, struct source_info *info) { - info->getname = load_module_subfunc(module, module_name, - source_id, "getname", true); - info->create = load_module_subfunc(module, module_name, - source_id,"create", true); - info->destroy = load_module_subfunc(module, module_name, - source_id, "destroy", true); - info->get_output_flags = load_module_subfunc(module, module_name, - source_id, "get_output_flags", true); + LOAD_MODULE_SUBFUNC(getname, true); + LOAD_MODULE_SUBFUNC(create, true); + LOAD_MODULE_SUBFUNC(destroy, true); + LOAD_MODULE_SUBFUNC(get_output_flags, true); - if (!info->getname || !info->create || !info->destroy || - !info->get_output_flags) - return false; + LOAD_MODULE_SUBFUNC(update, false); + LOAD_MODULE_SUBFUNC(activate, false); + LOAD_MODULE_SUBFUNC(deactivate, false); + LOAD_MODULE_SUBFUNC(video_tick, false); + LOAD_MODULE_SUBFUNC(video_render, false); + LOAD_MODULE_SUBFUNC(getwidth, false); + LOAD_MODULE_SUBFUNC(getheight, false); + LOAD_MODULE_SUBFUNC(getparam, false); + LOAD_MODULE_SUBFUNC(setparam, false); + LOAD_MODULE_SUBFUNC(filter_video, false); + LOAD_MODULE_SUBFUNC(filter_audio, false); - info->config = load_module_subfunc(module, module_name, - source_id, "config", false); - info->activate = load_module_subfunc(module, module_name, - source_id, "activate", false); - info->deactivate = load_module_subfunc(module, module_name, - source_id, "deactivate", false); - info->video_tick = load_module_subfunc(module, module_name, - source_id, "video_tick", false); - info->video_render = load_module_subfunc(module, module_name, - source_id, "video_render", false); - info->getwidth = load_module_subfunc(module, module_name, - source_id, "getwidth", false); - info->getheight = load_module_subfunc(module, module_name, - source_id, "getheight", false); - - info->getparam = load_module_subfunc(module, module_name, - source_id, "getparam", false); - info->setparam = load_module_subfunc(module, module_name, - source_id, "setparam", false); - - info->filter_video = load_module_subfunc(module, module_name, - source_id, "filter_video", false); - info->filter_audio = load_module_subfunc(module, module_name, - source_id, "filter_audio", false); - - info->id = source_id; + info->id = id; return true; } @@ -292,15 +271,10 @@ uint32_t obs_source_get_output_flags(obs_source_t source) return source->callbacks.get_output_flags(source->data); } -bool obs_source_hasconfig(obs_source_t source) +void obs_source_update(obs_source_t source, const char *settings) { - return source->callbacks.config != NULL; -} - -void obs_source_config(obs_source_t source, void *parent) -{ - if (source->callbacks.config) - source->callbacks.config(source->data, parent); + if (source->callbacks.update) + source->callbacks.update(source->data, settings); } void obs_source_activate(obs_source_t source) diff --git a/libobs/obs-source.h b/libobs/obs-source.h index 3ac074677..56e69fc12 100644 --- a/libobs/obs-source.h +++ b/libobs/obs-source.h @@ -40,15 +40,20 @@ * + mysource_getname * + mysource_create * + mysource_destroy - * + mysource_getflags + * + mysource_get_output_flags * * [and optionally] * + mysource_update - * + mysource_config + * + mysource_activate + * + mysource_deactivate * + mysource_video_tick * + mysource_video_render + * + mysource_getwidth + * + mysource_getheight * + mysource_getparam * + mysource_setparam + * + mysource_filtervideo + * + mysource_filteraudio * * =========================================== * Primary Exports @@ -77,7 +82,7 @@ * Destroys the source. * * --------------------------------------------------------- - * uint32_t [name]_getflags(void *data); + * uint32_t [name]_get_output_flags(void *data); * Returns a combination of one of the following values: * + SOURCE_VIDEO: source has video * + SOURCE_AUDIO: source has audio @@ -85,23 +90,11 @@ * + SOURCE_DEFAULT_EFFECT: source uses default effect * + SOURCE_YUV: source is in YUV color space * - * --------------------------------------------------------- - * uint32_t [name]_getwidth(void *data); - * Returns the width of a source, or -1 for maximum width. If you render - * video, this is required. - * - * --------------------------------------------------------- - * uint32_t [name]_getheight(void *data); - * Returns the height of a source, or -1 for maximum height. If you - * render video, this is required. - * * =========================================== * Optional Source Exports * =========================================== - * void [name]_config(void *data, void *parent); - * Called to configure the source. - * - * parent: Parent window pointer + * void [name]_update(void *data, const char *settings); + * Called to update the settings of the source. * * --------------------------------------------------------- * void [name]_video_activate(void *data); @@ -121,6 +114,16 @@ * Called to render the source. * * --------------------------------------------------------- + * uint32_t [name]_getwidth(void *data); + * Returns the width of a source, or -1 for maximum width. If you render + * video, this is required. + * + * --------------------------------------------------------- + * uint32_t [name]_getheight(void *data); + * Returns the height of a source, or -1 for maximum height. If you + * render video, this is required. + * + * --------------------------------------------------------- * void [name]_getparam(void *data, const char *param, void *buf, * size_t buf_size); * Gets a source parameter value. @@ -171,7 +174,7 @@ struct source_info { /* ----------------------------------------------------------------- */ /* optional implementations */ - bool (*config)(void *data, void *parent); + void (*update)(void *data, const char *settings); void (*activate)(void *data); void (*deactivate)(void *data); diff --git a/libobs/obs.h b/libobs/obs.h index 84ce03360..e4fbf9c21 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -377,8 +377,8 @@ EXPORT uint32_t obs_source_get_output_flags(obs_source_t source); /** Specifies whether the source can be configured */ EXPORT bool obs_source_hasconfig(obs_source_t source); -/** Opens a configuration panel and attaches it to the parent window */ -EXPORT void obs_source_config(obs_source_t source, void *parent); +/** Updates settings for this source */ +EXPORT void obs_source_update(obs_source_t source, const char *settings); /** Renders a video source. */ EXPORT void obs_source_video_render(obs_source_t source);