|
@@ -478,7 +478,7 @@ cleanup:
|
|
|
"(%llu)", \
|
|
|
(long long unsigned)size_var, \
|
|
|
(long long unsigned)sizeof(data));\
|
|
|
- return; \
|
|
|
+ goto error; \
|
|
|
} \
|
|
|
\
|
|
|
memcpy(&data, info, size_var); \
|
|
@@ -492,10 +492,23 @@ cleanup:
|
|
|
blog(LOG_ERROR, "Required value '" #val "' for " \
|
|
|
"'%s' not found. " #func \
|
|
|
" failed.", info->id); \
|
|
|
- return; \
|
|
|
+ goto error; \
|
|
|
} \
|
|
|
} while (false)
|
|
|
|
|
|
+#define HANDLE_ERROR(size_var, structure, info) \
|
|
|
+ do { \
|
|
|
+ struct structure data = {0}; \
|
|
|
+ if (!size_var) \
|
|
|
+ return; \
|
|
|
+ \
|
|
|
+ memcpy(&data, info, sizeof(data) < size_var ? \
|
|
|
+ sizeof(data) : size_var); \
|
|
|
+ \
|
|
|
+ if (info->type_data && info->free_type_data) \
|
|
|
+ info->free_type_data(info->type_data); \
|
|
|
+ } while (false)
|
|
|
+
|
|
|
void obs_register_source_s(const struct obs_source_info *info, size_t size)
|
|
|
{
|
|
|
struct obs_source_info data = {0};
|
|
@@ -510,13 +523,13 @@ void obs_register_source_s(const struct obs_source_info *info, size_t size)
|
|
|
} else {
|
|
|
blog(LOG_ERROR, "Tried to register unknown source type: %u",
|
|
|
info->type);
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
if (find_source(array, info->id)) {
|
|
|
blog(LOG_WARNING, "Source d '%s' already exists! "
|
|
|
"Duplicate library?", info->id);
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
#define CHECK_REQUIRED_VAL_(info, val, func) \
|
|
@@ -538,7 +551,7 @@ void obs_register_source_s(const struct obs_source_info *info, size_t size)
|
|
|
"%llu which is more than libobs currently "
|
|
|
"supports (%llu)", (long long unsigned)size,
|
|
|
(long long unsigned)sizeof(data));
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
memcpy(&data, info, size);
|
|
@@ -550,6 +563,10 @@ void obs_register_source_s(const struct obs_source_info *info, size_t size)
|
|
|
}
|
|
|
|
|
|
darray_push_back(sizeof(struct obs_source_info), array, &data);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_source_info, info);
|
|
|
}
|
|
|
|
|
|
void obs_register_output_s(const struct obs_output_info *info, size_t size)
|
|
@@ -557,7 +574,7 @@ void obs_register_output_s(const struct obs_output_info *info, size_t size)
|
|
|
if (find_output(info->id)) {
|
|
|
blog(LOG_WARNING, "Output id '%s' already exists! "
|
|
|
"Duplicate library?", info->id);
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
#define CHECK_REQUIRED_VAL_(info, val, func) \
|
|
@@ -582,6 +599,10 @@ void obs_register_output_s(const struct obs_output_info *info, size_t size)
|
|
|
#undef CHECK_REQUIRED_VAL_
|
|
|
|
|
|
REGISTER_OBS_DEF(size, obs_output_info, obs->output_types, info);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_output_info, info);
|
|
|
}
|
|
|
|
|
|
void obs_register_encoder_s(const struct obs_encoder_info *info, size_t size)
|
|
@@ -589,7 +610,7 @@ void obs_register_encoder_s(const struct obs_encoder_info *info, size_t size)
|
|
|
if (find_encoder(info->id)) {
|
|
|
blog(LOG_WARNING, "Encoder id '%s' already exists! "
|
|
|
"Duplicate library?", info->id);
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
#define CHECK_REQUIRED_VAL_(info, val, func) \
|
|
@@ -604,6 +625,10 @@ void obs_register_encoder_s(const struct obs_encoder_info *info, size_t size)
|
|
|
#undef CHECK_REQUIRED_VAL_
|
|
|
|
|
|
REGISTER_OBS_DEF(size, obs_encoder_info, obs->encoder_types, info);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_encoder_info, info);
|
|
|
}
|
|
|
|
|
|
void obs_register_service_s(const struct obs_service_info *info, size_t size)
|
|
@@ -611,7 +636,7 @@ void obs_register_service_s(const struct obs_service_info *info, size_t size)
|
|
|
if (find_service(info->id)) {
|
|
|
blog(LOG_WARNING, "Service id '%s' already exists! "
|
|
|
"Duplicate library?", info->id);
|
|
|
- return;
|
|
|
+ goto error;
|
|
|
}
|
|
|
|
|
|
#define CHECK_REQUIRED_VAL_(info, val, func) \
|
|
@@ -622,6 +647,10 @@ void obs_register_service_s(const struct obs_service_info *info, size_t size)
|
|
|
#undef CHECK_REQUIRED_VAL_
|
|
|
|
|
|
REGISTER_OBS_DEF(size, obs_service_info, obs->service_types, info);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_service_info, info);
|
|
|
}
|
|
|
|
|
|
void obs_regsiter_modal_ui_s(const struct obs_modal_ui *info, size_t size)
|
|
@@ -634,6 +663,10 @@ void obs_regsiter_modal_ui_s(const struct obs_modal_ui *info, size_t size)
|
|
|
#undef CHECK_REQUIRED_VAL_
|
|
|
|
|
|
REGISTER_OBS_DEF(size, obs_modal_ui, obs->modal_ui_callbacks, info);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_modal_ui, info);
|
|
|
}
|
|
|
|
|
|
void obs_regsiter_modeless_ui_s(const struct obs_modeless_ui *info, size_t size)
|
|
@@ -647,4 +680,8 @@ void obs_regsiter_modeless_ui_s(const struct obs_modeless_ui *info, size_t size)
|
|
|
|
|
|
REGISTER_OBS_DEF(size, obs_modeless_ui, obs->modeless_ui_callbacks,
|
|
|
info);
|
|
|
+ return;
|
|
|
+
|
|
|
+error:
|
|
|
+ HANDLE_ERROR(size, obs_modeless_ui, info);
|
|
|
}
|