Пример #1
0
static void obs_free_data(void)
{
	struct obs_core_data *data = &obs->data;

	data->valid = false;

	obs_view_free(&data->main_view);

	blog(LOG_INFO, "Freeing OBS context data");

	if (data->user_sources.num)
		blog(LOG_INFO, "\t%d user source(s) were remaining",
				(int)data->user_sources.num);

	while (data->user_sources.num)
		obs_source_remove(data->user_sources.array[0]);
	da_free(data->user_sources);

	FREE_OBS_LINKED_LIST(source);
	FREE_OBS_LINKED_LIST(output);
	FREE_OBS_LINKED_LIST(encoder);
	FREE_OBS_LINKED_LIST(display);
	FREE_OBS_LINKED_LIST(service);

	pthread_mutex_destroy(&data->user_sources_mutex);
	pthread_mutex_destroy(&data->sources_mutex);
	pthread_mutex_destroy(&data->displays_mutex);
	pthread_mutex_destroy(&data->outputs_mutex);
	pthread_mutex_destroy(&data->encoders_mutex);
	pthread_mutex_destroy(&data->services_mutex);
}
Пример #2
0
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);
	}
}