obs/source-factory: Add function to register proxy objects

Proxies allow for older configurations to work fine on newer versions, without having to manually adjust the scene collection to match the new ids at all. Thanks to the migration system we can freely support any number of old versions, as long as we write migration code.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2020-06-07 21:56:45 +02:00
parent 5530d2d416
commit 203581f30c
2 changed files with 21 additions and 2 deletions

View file

@ -33,12 +33,15 @@
// Common C++ includes // Common C++ includes
#include <algorithm> #include <algorithm>
#include <limits> #include <limits>
#include <map>
#include <memory> #include <memory>
#include <set>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <type_traits> #include <type_traits>
#include <utility> #include <utility>
#include <vector>
// Common Plugin includes // Common Plugin includes
#include "strings.hpp" #include "strings.hpp"

View file

@ -26,6 +26,8 @@ namespace obs {
class source_factory { class source_factory {
protected: protected:
obs_source_info _info = {}; obs_source_info _info = {};
std::map<std::string, std::shared_ptr<obs_source_info>> _proxies;
std::set<std::string> _proxy_names;
public: public:
source_factory() source_factory()
@ -166,6 +168,20 @@ namespace obs {
obs_register_source(&_info); obs_register_source(&_info);
} }
void register_proxy(std::string_view name)
{
auto iter = _proxy_names.emplace(name);
// Create proxy.
std::shared_ptr<obs_source_info> proxy = std::make_shared<obs_source_info>();
memcpy(proxy.get(), &_info, sizeof(obs_source_info));
proxy->id = iter.first->c_str();
proxy->output_flags |= OBS_SOURCE_DEPRECATED;
obs_register_source(proxy.get());
_proxies.emplace(name, proxy);
}
private /* Factory */: private /* Factory */:
static const char* _get_name(void* type_data) noexcept static const char* _get_name(void* type_data) noexcept
try { try {
@ -509,7 +525,7 @@ namespace obs {
public: public:
virtual const char* get_name() virtual const char* get_name()
{ {
return "Not Implemented Yet"; return "Not Yet Implemented";
} }
virtual void* create(obs_data_t* settings, obs_source_t* source) virtual void* create(obs_data_t* settings, obs_source_t* source)