From 8d63845dd48b1e2b7c1d117d1f64dbc4e39fa55e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 17 Jan 2014 06:24:34 -0700 Subject: [PATCH] Use macros to improve safety loading callbacks Just a minor fix mostly because I noticed that I kept accidentally forgetting to add checks to the code properly. This is one of those cases where macros come in useful, as macros can automate the process and help prevent these mistakes from happening by accident. --- libobs/obs-data.h | 8 ++++++ libobs/obs-encoder.c | 35 ++++++++--------------- libobs/obs-output.c | 32 +++++++-------------- libobs/obs-source.c | 66 ++++++++++++++------------------------------ libobs/obs-source.h | 39 ++++++++++++++------------ libobs/obs.h | 4 +-- 6 files changed, 72 insertions(+), 112 deletions(-) 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);