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