mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-12-29 11:01:23 +00:00
obs/encoder-factory: Support proper settings migration
This commit is contained in:
parent
bc5de8061f
commit
132c58632e
1 changed files with 47 additions and 6 deletions
|
@ -82,6 +82,11 @@ namespace streamfx::obs {
|
||||||
virtual void get_audio_info(struct audio_convert_info* info) {}
|
virtual void get_audio_info(struct audio_convert_info* info) {}
|
||||||
|
|
||||||
virtual void get_video_info(struct video_scale_info* info) {}
|
virtual void get_video_info(struct video_scale_info* info) {}
|
||||||
|
|
||||||
|
virtual obs_encoder_t* get()
|
||||||
|
{
|
||||||
|
return _self;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class _factory, typename _instance>
|
template<class _factory, typename _instance>
|
||||||
|
@ -155,6 +160,18 @@ namespace streamfx::obs {
|
||||||
_proxies.emplace(name, proxy);
|
_proxies.emplace(name, proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _migrate(obs_data_t* settings, encoder_instance* instance)
|
||||||
|
{
|
||||||
|
uint64_t version = static_cast<uint64_t>(obs_data_get_int(settings, S_VERSION));
|
||||||
|
migrate(settings, version);
|
||||||
|
if (instance) {
|
||||||
|
instance->migrate(settings, version);
|
||||||
|
}
|
||||||
|
obs_data_set_int(settings, S_VERSION, static_cast<int64_t>(STREAMFX_VERSION));
|
||||||
|
obs_data_set_string(settings, S_COMMIT, STREAMFX_COMMIT);
|
||||||
|
}
|
||||||
|
|
||||||
private /* Factory */:
|
private /* Factory */:
|
||||||
static const char* _get_name(void* type_data) noexcept
|
static const char* _get_name(void* type_data) noexcept
|
||||||
try {
|
try {
|
||||||
|
@ -207,10 +224,35 @@ namespace streamfx::obs {
|
||||||
DLOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
|
DLOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _properties_migrate_settings(void* priv, obs_properties_t*, obs_property_t* p,
|
||||||
|
obs_data_t* settings) noexcept
|
||||||
|
try {
|
||||||
|
obs_property_set_visible(p, false);
|
||||||
|
reinterpret_cast<factory_t*>(priv)->_migrate(settings, nullptr);
|
||||||
|
return true;
|
||||||
|
} catch (const std::exception& ex) {
|
||||||
|
DLOG_ERROR("Unexpected exception in function '%s': %s.", __FUNCTION_NAME__, ex.what());
|
||||||
|
return false;
|
||||||
|
} catch (...) {
|
||||||
|
DLOG_ERROR("Unexpected exception in function '%s'.", __FUNCTION_NAME__);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static obs_properties_t* _get_properties2(void* data, void* type_data) noexcept
|
static obs_properties_t* _get_properties2(void* data, void* type_data) noexcept
|
||||||
try {
|
try {
|
||||||
if (type_data)
|
if (type_data) {
|
||||||
return reinterpret_cast<factory_t*>(type_data)->get_properties2(reinterpret_cast<instance_t*>(data));
|
auto props =
|
||||||
|
reinterpret_cast<factory_t*>(type_data)->get_properties2(reinterpret_cast<instance_t*>(data));
|
||||||
|
|
||||||
|
{ // Support for permanent settings migration.
|
||||||
|
auto p = obs_properties_add_int(
|
||||||
|
props, S_VERSION, "If you can see this, something went horribly wrong.",
|
||||||
|
std::numeric_limits<int32_t>::lowest(), std::numeric_limits<int32_t>::max(), 1);
|
||||||
|
obs_property_set_modified_callback2(p, _properties_migrate_settings, type_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return props;
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} catch (const std::exception& ex) {
|
} catch (const std::exception& ex) {
|
||||||
DLOG_ERROR("Unexpected exception in function '%s': %s.", __FUNCTION_NAME__, ex.what());
|
DLOG_ERROR("Unexpected exception in function '%s': %s.", __FUNCTION_NAME__, ex.what());
|
||||||
|
@ -235,10 +277,7 @@ namespace streamfx::obs {
|
||||||
try {
|
try {
|
||||||
auto priv = reinterpret_cast<encoder_instance*>(data);
|
auto priv = reinterpret_cast<encoder_instance*>(data);
|
||||||
if (priv) {
|
if (priv) {
|
||||||
uint64_t version = static_cast<uint64_t>(obs_data_get_int(settings, S_VERSION));
|
reinterpret_cast<factory_t*>(obs_encoder_get_type_data(priv->get()))->_migrate(settings, priv);
|
||||||
priv->migrate(settings, version);
|
|
||||||
obs_data_set_int(settings, S_VERSION, static_cast<int64_t>(STREAMFX_VERSION));
|
|
||||||
obs_data_set_string(settings, S_COMMIT, STREAMFX_COMMIT);
|
|
||||||
return priv->update(settings);
|
return priv->update(settings);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -351,6 +390,8 @@ namespace streamfx::obs {
|
||||||
|
|
||||||
virtual void get_defaults2(obs_data_t* data) {}
|
virtual void get_defaults2(obs_data_t* data) {}
|
||||||
|
|
||||||
|
virtual void migrate(obs_data_t* data, uint64_t version) {}
|
||||||
|
|
||||||
virtual obs_properties_t* get_properties2(instance_t* data)
|
virtual obs_properties_t* get_properties2(instance_t* data)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
Loading…
Reference in a new issue