diff --git a/source/filters/filter-color-grade.cpp b/source/filters/filter-color-grade.cpp index 6cf3bfd..eb9d265 100644 --- a/source/filters/filter-color-grade.cpp +++ b/source/filters/filter-color-grade.cpp @@ -826,26 +826,33 @@ bool color_grade_factory::on_manual_open(obs_properties_t* props, obs_property_t } #endif -std::shared_ptr _color_grade_factory_instance = nullptr; - -void streamfx::filter::color_grade::color_grade_factory::initialize() +std::shared_ptr streamfx::filter::color_grade::color_grade_factory::instance() { - try { - if (!_color_grade_factory_instance) - _color_grade_factory_instance = std::make_shared(); - } catch (const std::exception& ex) { - D_LOG_ERROR("Failed to initialize due to error: %s", ex.what()); - } catch (...) { - D_LOG_ERROR("Failed to initialize due to unknown error.", ""); + static std::weak_ptr winst; + static std::mutex mtx; + + std::unique_lock lock(mtx); + auto instance = winst.lock(); + if (!instance) { + try { + instance = std::shared_ptr(new color_grade_factory()); + winst = instance; + } catch (const std::exception& ex) { + D_LOG_ERROR("Failed to initialize due to error: %s", ex.what()); + } catch (...) { + D_LOG_ERROR("Failed to initialize due to unknown error.", ""); + } } + return instance; } -void streamfx::filter::color_grade::color_grade_factory::finalize() -{ - _color_grade_factory_instance.reset(); -} +static std::shared_ptr loader_instance; -std::shared_ptr streamfx::filter::color_grade::color_grade_factory::get() -{ - return _color_grade_factory_instance; -} +static auto loader = streamfx::loader( + []() { // Initalizer + loader_instance = color_grade_factory::instance(); + }, + []() { // Finalizer + loader_instance.reset(); + }, + streamfx::loader_priority::NORMAL); // Must be loaded after all other functionality. diff --git a/source/filters/filter-color-grade.hpp b/source/filters/filter-color-grade.hpp index 21e2ff1..9e4e7fa 100644 --- a/source/filters/filter-color-grade.hpp +++ b/source/filters/filter-color-grade.hpp @@ -103,10 +103,6 @@ namespace streamfx::filter::color_grade { #endif public: // Singleton - static void initialize(); - - static void finalize(); - - static std::shared_ptr get(); + static std::shared_ptr instance(); }; } // namespace streamfx::filter::color_grade diff --git a/source/plugin.cpp b/source/plugin.cpp index b2e15f3..d3f6f28 100644 --- a/source/plugin.cpp +++ b/source/plugin.cpp @@ -22,9 +22,6 @@ #ifdef ENABLE_FILTER_BLUR #include "filters/filter-blur.hpp" #endif -#ifdef ENABLE_FILTER_COLOR_GRADE -#include "filters/filter-color-grade.hpp" -#endif #ifdef ENABLE_FILTER_DENOISING #include "filters/filter-denoising.hpp" #endif @@ -162,9 +159,6 @@ MODULE_EXPORT bool obs_module_load(void) #ifdef ENABLE_FILTER_BLUR streamfx::filter::blur::blur_factory::initialize(); #endif -#ifdef ENABLE_FILTER_COLOR_GRADE - streamfx::filter::color_grade::color_grade_factory::initialize(); -#endif #ifdef ENABLE_FILTER_DENOISING streamfx::filter::denoising::denoising_factory::initialize(); #endif @@ -235,9 +229,6 @@ MODULE_EXPORT void obs_module_unload(void) #ifdef ENABLE_FILTER_BLUR streamfx::filter::blur::blur_factory::finalize(); #endif -#ifdef ENABLE_FILTER_COLOR_GRADE - streamfx::filter::color_grade::color_grade_factory::finalize(); -#endif #ifdef ENABLE_FILTER_DENOISING streamfx::filter::denoising::denoising_factory::finalize(); #endif