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.
This commit is contained in:
jp9000 2014-01-17 06:24:34 -07:00
parent ff1afac5f8
commit 8d63845dd4
6 changed files with 72 additions and 112 deletions

View file

@ -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 {

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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)

View file

@ -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);

View file

@ -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);