[OBS] 信号和槽 —— 底层事件推送

信号是底层用来传递消息给UI的。

UI提前连接好相关信号和槽函数,OBS底层发生某些事件时,会推送信号给UI。

 

槽函数的签名格式

// userdata : tanslate user's data

// params : any params

void signal_callback_t(void* userdata, calldata_t* params)

 

calldata_t

调用signal回调函数时用来动态传递参数的对象

https://obsproject.com/docs/reference-libobs-callback.html

1. 推送signal事件端的使用方法:

// 创建参数对象
calldata_init(&data); 

// 对各种类型的参数赋值
calldata_set_ptr(&data, "source", source);
calldata_set_string(&data, "new_name", source->context.name);
calldata_set_string(&data, "prev_name", prev_name);

// 调用signal 传递参数
signal_handler_signal(source->context.signals, "rename", &data);

// 释放对象
calldata_free(&data); 

 

2. signal callback端的使用方法:

void OBSBasic::SourceRenamed(void *data, calldata_t *params)
{
    // 解析各种类型的参数
	obs_source_t *source = (obs_source_t *)calldata_ptr(params, "source");
	const char *newName = calldata_string(params, "new_name");
	const char *prevName = calldata_string(params, "prev_name");

	QMetaObject::invokeMethod(static_cast<OBSBasic *>(data),
				  "RenameSources", Q_ARG(OBSSource, source),
				  Q_ARG(QString, QT_UTF8(newName)),
				  Q_ARG(QString, QT_UTF8(prevName)));
}

 

信号相关的API:

 

创建一个信号

signal_handler_t *signal_handler_create(void)

删除一个信号 注意:如果handler的引用计数不是0 是不会释放对象的

void signal_handler_destroy(signal_handler_t *handler)

 

给信号添加回调函数

bool signal_handler_add(signal_handler_t *handler, const char *signal_decl)

bool signal_handler_add_array(signal_handler_t *handler, const char **signal_decls)

 

将一个callback绑定到信号中对应的回调函数

void signal_handler_connect(signal_handler_t *handler, const char *signal, signal_callback_t callback, void *data)

 

将一个callback绑定到信号中对应的回调函数

同时将信号handler引用计数加1,保证disconnect之前handler不会被释放

void signal_handler_connect_ref(signal_handler_t *handler, const char *signal, signal_callback_t callback, void *data)

 

将callback解绑定,注意:如果之前增加了handler的引用计数,将其减1,如果减1后等于0 直接释放

void signal_handler_disconnect(signal_handler_t *handler, const char *signal, signal_callback_t callback, void *data)

 

调用signal绑定的callbacks

void signal_handler_signal(signal_handler_t *handler, const char *signal, calldata_t *params)

 

底层拥有的signal,以及对应的获取信号对象的API:

signal_handler_t *obs_get_signal_handler(void);
static const char *obs_signals[] = {
// 每次要调用signal时 用“source_create”指定要调用的函数
	"void source_create(ptr source)", 
	"void source_destroy(ptr source)",
	"void source_remove(ptr source)",
	"void source_save(ptr source)",
	"void source_load(ptr source)",
	"void source_activate(ptr source)",
	"void source_deactivate(ptr source)",
	"void source_show(ptr source)",
	"void source_hide(ptr source)",
	"void source_rename(ptr source, string new_name, string prev_name)",
	"void source_volume(ptr source, in out float volume)",
	"void source_volume_level(ptr source, float level, float magnitude, "
	"float peak)",
	"void source_transition_start(ptr source)",
	"void source_transition_video_stop(ptr source)",
	"void source_transition_stop(ptr source)",

	"void channel_change(int channel, in out ptr source, ptr prev_source)",
	"void master_volume(in out float volume)",

	"void hotkey_layout_change()",
	"void hotkey_register(ptr hotkey)",
	"void hotkey_unregister(ptr hotkey)",
	"void hotkey_bindings_changed(ptr hotkey)",

	NULL,
};

// 该函数返回source或scene的handler
signal_handler_t *obs_source_get_signal_handler(const obs_source_t *source)
static const char *source_signals[] = {
	"void destroy(ptr source)",
	"void remove(ptr source)",
	"void save(ptr source)",
	"void load(ptr source)",
	"void activate(ptr source)",
	"void deactivate(ptr source)",
	"void show(ptr source)",
	"void hide(ptr source)",
	"void mute(ptr source, bool muted)",
	"void push_to_mute_changed(ptr source, bool enabled)",
	"void push_to_mute_delay(ptr source, int delay)",
	"void push_to_talk_changed(ptr source, bool enabled)",
	"void push_to_talk_delay(ptr source, int delay)",
	"void enable(ptr source, bool enabled)",
	"void rename(ptr source, string new_name, string prev_name)",
	"void volume(ptr source, in out float volume)",
	"void update_properties(ptr source)",
	"void update_flags(ptr source, int flags)",
	"void audio_sync(ptr source, int out int offset)",
	"void audio_mixers(ptr source, in out int mixers)",
	"void filter_add(ptr source, ptr filter)",
	"void filter_remove(ptr source, ptr filter)",
	"void reorder_filters(ptr source)",
	"void transition_start(ptr source)",
	"void transition_video_stop(ptr source)",
	"void transition_stop(ptr source)",
	NULL,
};

signal_handler_t * obs_output_get_signal_handler(const obs_output_t *output);
static const char *output_signals[] = {
	"void start(ptr output)",
	"void stop(ptr output, int code)",
	"void pause(ptr output)",
	"void unpause(ptr output)",
	"void starting(ptr output)",
	"void stopping(ptr output)",
	"void activate(ptr output)",
	"void deactivate(ptr output)",
	"void reconnect(ptr output)",
	"void reconnect_success(ptr output)",
	NULL,
};

// 该函数返回source或scene的handler
signal_handler_t *obs_source_get_signal_handler(const obs_source_t *scene)
static const char *obs_scene_signals[] = {
	"void item_add(ptr scene, ptr item)",
	"void item_remove(ptr scene, ptr item)",
	"void reorder(ptr scene)",
	"void item_visible(ptr scene, ptr item, bool visible)",
	"void item_select(ptr scene, ptr item)",
	"void item_deselect(ptr scene, ptr item)",
	"void item_transform(ptr scene, ptr item)",
	"void item_locked(ptr scene, ptr item, bool locked)",
	NULL,
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值