obs_source_t obs_source_create(enum obs_source_type type, const char *id, const char *name, const char *settings) { struct obs_source *source; const struct source_info *info = get_source_info(type, id); if (!info) { blog(LOG_WARNING, "Source '%s' not found", id); return NULL; } source = bmalloc(sizeof(struct obs_source)); memset(source, 0, sizeof(struct obs_source)); if (!obs_source_init_handlers(source)) goto fail; source->name = bstrdup(name); source->type = type; source->data = info->create(settings, source); if (!source->data) goto fail; if (!obs_source_init(source, settings, info)) goto fail; obs_source_dosignal(source, "source-create"); return source; fail: blog(LOG_ERROR, "obs_source_create failed"); obs_source_destroy(source); return NULL; }
obs_scene_t obs_scene_create(const char *name) { struct obs_source *source = bmalloc(sizeof(struct obs_source)); struct obs_scene *scene; memset(source, 0, sizeof(struct obs_source)); if (!obs_source_init_handlers(source)) { bfree(source); return NULL; } source->settings = obs_data_create(); scene = scene_create(source->settings, source); source->data = scene; assert(scene); if (!scene) { obs_data_release(source->settings); bfree(source); return NULL; } source->name = bstrdup(name); source->type = SOURCE_SCENE; scene->source = source; obs_source_init(source, &scene_info); memcpy(&source->callbacks, &scene_info, sizeof(struct source_info)); return scene; }