UI: Remove obs_source_add and sourceSceneRefs variable

Prunes code used to workaround libobs "user sources" (such as
sourceSceneRefs) and instead simply holds its own references and saves
sources it chooses with obs_save_sources_filtered.
This commit is contained in:
jp9000
2015-12-05 05:58:05 -08:00
parent e3795a2187
commit 3c83be374e
4 changed files with 36 additions and 95 deletions

View File

@@ -227,12 +227,15 @@ OBSBasic::OBSBasic(QWidget *parent)
addNudge(Qt::Key_Right, SLOT(NudgeRight()));
}
static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent)
static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent,
vector<OBSSource> &audioSources)
{
obs_source_t *source = obs_get_output_source(channel);
if (!source)
return;
audioSources.push_back(source);
obs_data_t *data = obs_save_source(source);
obs_data_set_obj(parent, name, data);
@@ -243,20 +246,36 @@ static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent)
static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder)
{
obs_data_t *saveData = obs_data_create();
obs_data_array_t *sourcesArray = obs_save_sources();
obs_source_t *currentScene = obs_get_output_source(0);
const char *sceneName = obs_source_get_name(currentScene);
obs_data_t *saveData = obs_data_create();
vector<OBSSource> audioSources;
audioSources.reserve(5);
SaveAudioDevice(DESKTOP_AUDIO_1, 1, saveData, audioSources);
SaveAudioDevice(DESKTOP_AUDIO_2, 2, saveData, audioSources);
SaveAudioDevice(AUX_AUDIO_1, 3, saveData, audioSources);
SaveAudioDevice(AUX_AUDIO_2, 4, saveData, audioSources);
SaveAudioDevice(AUX_AUDIO_3, 5, saveData, audioSources);
auto FilterAudioSources = [&](obs_source_t *source)
{
return find(begin(audioSources), end(audioSources), source) ==
end(audioSources);
};
using FilterAudioSources_t = decltype(FilterAudioSources);
obs_data_array_t *sourcesArray = obs_save_sources_filtered(
[](void *data, obs_source_t *source)
{
return (*static_cast<FilterAudioSources_t*>(data))(source);
}, static_cast<void*>(&FilterAudioSources));
obs_source_t *currentScene = obs_get_output_source(0);
const char *sceneName = obs_source_get_name(currentScene);
const char *sceneCollection = config_get_string(App()->GlobalConfig(),
"Basic", "SceneCollection");
SaveAudioDevice(DESKTOP_AUDIO_1, 1, saveData);
SaveAudioDevice(DESKTOP_AUDIO_2, 2, saveData);
SaveAudioDevice(AUX_AUDIO_1, 3, saveData);
SaveAudioDevice(AUX_AUDIO_2, 4, saveData);
SaveAudioDevice(AUX_AUDIO_3, 5, saveData);
obs_data_set_string(saveData, "current_scene", sceneName);
obs_data_set_array(saveData, "scene_order", sceneOrder);
obs_data_set_string(saveData, "name", sceneCollection);
@@ -380,9 +399,6 @@ void OBSBasic::CreateDefaultScene(bool firstStart)
ClearSceneData();
obs_scene_t *scene = obs_scene_create(Str("Basic.Scene"));
obs_source_t *source = obs_scene_get_source(scene);
obs_add_source(source);
if (firstStart)
CreateFirstRunSources();
@@ -422,30 +438,6 @@ void OBSBasic::LoadSceneListOrder(obs_data_array_t *array)
}
}
void OBSBasic::CleanupUnusedSources()
{
auto removeUnusedSources = [&](obs_source_t *source)
{
obs_scene_t *scene = obs_scene_from_source(source);
if (scene)
return;
if (sourceSceneRefs[source] == 0) {
sourceSceneRefs.erase(source);
obs_source_remove(source);
}
};
using func_type = decltype(removeUnusedSources);
obs_enum_sources(
[](void *f, obs_source_t *source)
{
(*static_cast<func_type*>(f))(source);
return true;
},
static_cast<void*>(&removeUnusedSources));
}
void OBSBasic::Load(const char *file)
{
if (!file || !os_file_exists(file)) {
@@ -513,8 +505,6 @@ void OBSBasic::Load(const char *file)
obs_data_release(data);
CleanupUnusedSources();
disableSaving--;
}
@@ -776,8 +766,8 @@ void OBSBasic::InitOBSCallbacks()
ProfileScope("OBSBasic::InitOBSCallbacks");
signalHandlers.reserve(signalHandlers.size() + 6);
signalHandlers.emplace_back(obs_get_signal_handler(), "source_add",
OBSBasic::SourceAdded, this);
signalHandlers.emplace_back(obs_get_signal_handler(), "source_load",
OBSBasic::SourceLoaded, this);
signalHandlers.emplace_back(obs_get_signal_handler(), "source_remove",
OBSBasic::SourceRemoved, this);
signalHandlers.emplace_back(obs_get_signal_handler(), "channel_change",
@@ -1395,37 +1385,16 @@ void OBSBasic::RemoveScene(OBSSource source)
delete sel;
}
auto DeleteSceneRefs = [&](obs_sceneitem_t *si)
{
obs_source_t *source = obs_sceneitem_get_source(si);
sourceSceneRefs[source] -= 1;
if (!sourceSceneRefs[source]) {
obs_source_remove(source);
sourceSceneRefs.erase(source);
}
};
using DeleteSceneRefs_t = decltype(DeleteSceneRefs);
obs_scene_enum_items(obs_scene_from_source(source),
[](obs_scene_t *, obs_sceneitem_t *si, void *data)
{
(*static_cast<DeleteSceneRefs_t*>(data))(si);
return true;
}, static_cast<void*>(&DeleteSceneRefs));
SaveProject();
}
void OBSBasic::AddSceneItem(OBSSceneItem item)
{
obs_scene_t *scene = obs_sceneitem_get_scene(item);
obs_source_t *source = obs_sceneitem_get_source(item);
if (GetCurrentScene() == scene)
InsertSceneItem(item);
sourceSceneRefs[source] = sourceSceneRefs[source] + 1;
SaveProject();
}
@@ -1444,16 +1413,6 @@ void OBSBasic::RemoveSceneItem(OBSSceneItem item)
}
}
obs_source_t *source = obs_sceneitem_get_source(item);
int scenes = sourceSceneRefs[source] - 1;
sourceSceneRefs[source] = scenes;
if (scenes == 0) {
obs_source_remove(source);
sourceSceneRefs.erase(source);
}
SaveProject();
}
@@ -1770,7 +1729,6 @@ void OBSBasic::DuplicateSelectedScene()
obs_scene_t *scene = obs_scene_duplicate(curScene,
name.c_str());
source = obs_scene_get_source(scene);
obs_add_source(source);
obs_scene_release(scene);
obs_set_output_source(0, source);
@@ -1913,7 +1871,7 @@ void OBSBasic::SceneItemDeselected(void *data, calldata_t *params)
Q_ARG(bool, false));
}
void OBSBasic::SourceAdded(void *data, calldata_t *params)
void OBSBasic::SourceLoaded(void *data, calldata_t *params)
{
OBSBasic *window = static_cast<OBSBasic*>(data);
obs_source_t *source = (obs_source_t*)calldata_ptr(params, "source");
@@ -2286,8 +2244,6 @@ void OBSBasic::ClearSceneData()
obs_enum_sources(cb, nullptr);
sourceSceneRefs.clear();
disableSaving--;
blog(LOG_INFO, "All scene data cleared");
@@ -2532,10 +2488,9 @@ void OBSBasic::on_actionAddScene_triggered()
obs_scene_t *scene = obs_scene_create(name.c_str());
source = obs_scene_get_source(scene);
obs_add_source(source);
obs_scene_release(scene);
AddScene(source);
obs_set_output_source(0, source);
obs_scene_release(scene);
}
}