bool AddNew(QWidget *parent, const char *id, const char *name) { obs_source_t source = obs_get_output_source(0); obs_scene_t scene = obs_scene_from_source(source); bool success = false; if (!source) return false; source = obs_get_source_by_name(name); if (source) { QMessageBox::information(parent, QTStr("NameExists.Title"), QTStr("NameExists.Text")); } else { source = obs_source_create(OBS_SOURCE_TYPE_INPUT, id, name, NULL); if (source) { obs_add_source(source); obs_scene_add(scene, source); success = true; } } obs_source_release(source); obs_scene_release(scene); return success; }
static void AddExisting(const char *name) { obs_source_t source = obs_get_output_source(0); obs_scene_t scene = obs_scene_from_source(source); if (!scene) return; source = obs_get_source_by_name(name); if (source) { obs_scene_add(scene, source); obs_source_release(source); } obs_scene_release(scene); }
void OBSBasicTransform::OBSChannelChanged(void *param, calldata_t *data) { OBSBasicTransform *window = reinterpret_cast<OBSBasicTransform*>(param); uint32_t channel = (uint32_t)calldata_int(data, "channel"); OBSSource source = (obs_source_t*)calldata_ptr(data, "source"); if (channel == 0) { OBSScene scene = obs_scene_from_source(source); window->SetScene(scene); if (!scene) window->SetItem(nullptr); else window->SetItem(FindASelectedItem(scene)); } }
void BiLiOBSMainWid::SaveScene() { obs_data_t* sceneData; std::list<obs_scene_t*> scenes; //移除未使用的source for (OBSSource& source : OBSEnumSources()) { obs_scene_t* scene = obs_scene_from_source(source); if (scene) scenes.push_back(scene); } std::list<obs_source_t*> sourcesToRemove; //遍历所有source,找出有在场景中出现的,其他删掉 for (OBSSource& source : OBSEnumSources()) { if (obs_scene_from_source(source) == 0) { //如果是场景那么就不执行这里面的代码,只对场景元素执行里面的代码 bool isReferred = false; //遍历每个场景里的全部source,看看有没有当前的 for (obs_scene_t* scene : scenes) { for (OBSSceneItem& sceneItem : OBSEnumSceneItems(scene)) { obs_source_t* sceneItemSource = obs_sceneitem_get_source(sceneItem); if (sceneItemSource == source) { //找到了,标记找到,并停止当前查找 isReferred = true; break; } } //如果已经找到,就不需要在下一个场景中找 if (isReferred) break; } //没被引用的放到待删除里 if (isReferred == false) sourcesToRemove.push_back(source); } } //删 for (auto x : sourcesToRemove) obs_source_remove(x); //保存 sceneData = BiliSceneConfig::Get(); if (sceneData) { BiliConfigFile::SaveSceneData(sceneData); obs_data_release(sceneData); } }