OBS输入源属性对话框
2024-06-24
3
0
在OBSBasic::AddSource创建了obs_source_t之后,并通过OBSBasicSourceSelect确认按钮之后加入了当前scence的item之后。对于当前新创建的源,只有默认的参数,这里需要用根据源的不同,提供用户对话框来配置这个源。其使用CreatePropertiesWindow实现的。
void OBSBasic::AddSource(const char *id)
{
if (id && *id)
{
//创建QT对话框对象。OBSBasicSourceSelect继承于QDialog
OBSBasicSourceSelect sourceSelect(this, id, undo_s);
//弹出并显示对话框,等待用户输入信息
sourceSelect.exec();
if (should_show_properties(sourceSelect.newSource, id))
{
//创建输入源实例
CreatePropertiesWindow(sourceSelect.newSource);
}
}
}
CreatePropertiesWindow中创建了一个通用的对话框OBSBasicProperties,该对话框中有一个子窗口OBSPropertiesView,是根据源的属性创建相应的控件。
OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_):...
{
...
view = new OBSPropertiesView(
nd_settings.Get(), source,
(PropertiesReloadCallback)obs_source_properties,
(PropertiesUpdateCallback) nullptr, // No special handling required for undo/redo
(PropertiesVisualUpdateCb)obs_source_update);
}
其中obs_source_update函数是当用户确认后,用于更新源的属性信息。
void obs_source_update(obs_source_t *source, obs_data_t *settings)
{
if (!obs_source_valid(source, "obs_source_update"))
return;
if (settings)
{
obs_data_apply(source->context.settings, settings);
}
if (source->info.output_flags & OBS_SOURCE_VIDEO)
{
os_atomic_inc_long(&source->defer_update_count);
}
else if (source->context.data && source->info.update)
{
source->info.update(source->context.data, source->context.settings);
obs_source_dosignal(source, "source_update", "update");
}
}
属性信息的更新,可以看到,是通过源注册的update回调函数实现的。
总结
新创建的源是经历了两大步。
第一步是创建源,首先申请obs_source空间,再创建配置参数context.settings内存,然后调用defalut获取基本配置参数。然后调用create创建obs_source_t结构体,最后创建其对应的obs_sceneitem_t加入到当前scene链表cene->first_item中。
第二步就是根据用户窗体OBSPropertiesView的回调函数obs_source_update,调用update更新参数。