OBS源
+ -

OBS输入源属性对话框

2024-06-24 2 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更新参数。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!