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