[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,
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章