diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index aa05e976c..d21acc17a 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -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 &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 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(data))(source); + }, static_cast(&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(f))(source); - return true; - }, - static_cast(&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(data))(si); - return true; - }, static_cast(&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(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); } } diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index 4595069eb..afdac76e2 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include "window-main.hpp" @@ -71,8 +70,6 @@ class OBSBasic : public OBSMainWindow { }; private: - std::unordered_map sourceSceneRefs; - std::vector volumes; std::vector signalHandlers; @@ -170,7 +167,6 @@ private: void CloseDialogs(); void ClearSceneData(); - void CleanupUnusedSources(); void Nudge(int dist, MoveDir dir); void OpenProjector(obs_source_t *source, int monitor); @@ -244,7 +240,7 @@ private: static void SceneItemRemoved(void *data, calldata_t *params); static void SceneItemSelected(void *data, calldata_t *params); static void SceneItemDeselected(void *data, calldata_t *params); - static void SourceAdded(void *data, calldata_t *params); + static void SourceLoaded(void *data, calldata_t *params); static void SourceRemoved(void *data, calldata_t *params); static void SourceActivated(void *data, calldata_t *params); static void SourceDeactivated(void *data, calldata_t *params); diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index 0ad7c70dc..e368f96fc 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -1543,14 +1543,6 @@ void OBSBasicSettings::LoadAudioSources() return true; }; - for (int i = 0; i < MAX_CHANNELS; i++) { - obs_source_t *source = obs_get_output_source(i); - if (!source) continue; - - AddSource(source); - obs_source_release(source); - } - using AddSource_t = decltype(AddSource); obs_enum_sources([](void *data, obs_source_t *source) { diff --git a/obs/window-basic-source-select.cpp b/obs/window-basic-source-select.cpp index fd9862ad2..24014b59c 100644 --- a/obs/window-basic-source-select.cpp +++ b/obs/window-basic-source-select.cpp @@ -133,8 +133,6 @@ bool AddNew(QWidget *parent, const char *id, const char *name, id, name, NULL, nullptr); if (source) { - obs_add_source(source); - AddSourceData data; data.source = source; data.visible = visible;