obs-studio中自定义信号(signal)

来源:互联网 发布:行最简形矩阵的特点 编辑:程序博客网 时间:2024/06/06 16:30
信号结构体signal_info
struct signal_info {struct decl_info               func;DARRAY(struct signal_callback) callbacks;pthread_mutex_t                mutex;bool                           signalling;struct signal_info             *next;};

struct decl_info {char                      *name;const char                *decl_string;DARRAY(struct decl_param) params;};

#define DARRAY(type)                     \union {                          \struct darray da;        \struct {                 \type *array;     \size_t num;      \size_t capacity; \};                       \}

signal_info结构中dec_info包含该signal的名字、描述信息、参数,

DARRAY动态数组中保存该signal对应的回调函数

signalling该信号是否处理。

struct signal_info  *next;指向下一个信号

  信号处理函数

void signal_handler_signal(signal_handler_t *handler, const char *signal,calldata_t *params){struct signal_info *sig = getsignal_locked(handler, signal);if (!sig)return;pthread_mutex_lock(&sig->mutex);sig->signalling = true;for (size_t i = 0; i < sig->callbacks.num; i++) {struct signal_callback *cb = sig->callbacks.array+i;if (!cb->remove)cb->callback(cb->data, params);}for (size_t i = sig->callbacks.num; i > 0; i--) {struct signal_callback *cb = sig->callbacks.array+i-1;if (cb->remove)da_erase(sig->callbacks, i-1);}sig->signalling = false;pthread_mutex_unlock(&sig->mutex);}

信号处理,定义一个链表保存所有的signal
typedef struct signal_handler signal_handler_t;

struct signal_handler {struct signal_info *first;pthread_mutex_t    mutex;};
//当添加一个信号时,放到signal_handler的尾部

bool signal_handler_add(signal_handler_t *handler, const char *signal_decl){struct decl_info func = {0};struct signal_info *sig, *last;bool success = true;if (!parse_decl_string(&func, signal_decl)) {blog(LOG_ERROR, "Signal declaration invalid: %s", signal_decl);return false;}pthread_mutex_lock(&handler->mutex);sig = getsignal(handler, func.name, &last);if (sig) {blog(LOG_WARNING, "Signal declaration '%s' exists", func.name);decl_info_free(&func);success = false;} else {sig = signal_info_create(&func);if (!last)handler->first = sig;elselast->next = sig;}pthread_mutex_unlock(&handler->mutex);return success;}

信号的回调函数结构

struct signal_callback {signal_callback_t callback;void              *data;bool              remove;};
typedef void (*signal_callback_t)(void*, calldata_t*);
信号和回调链接
void signal_handler_connect(signal_handler_t *handler, const char *signal,signal_callback_t callback, void *data){struct signal_info *sig, *last;struct signal_callback cb_data = {callback, data, false};size_t idx;if (!handler)return;pthread_mutex_lock(&handler->mutex);sig = getsignal(handler, signal, &last);pthread_mutex_unlock(&handler->mutex);if (!sig) {blog(LOG_WARNING, "signal_handler_connect: "                  "signal '%s' not found", signal);return;}/* -------------- */pthread_mutex_lock(&sig->mutex);idx = signal_get_callback_idx(sig, callback, data);if (idx == DARRAY_INVALID)da_push_back(sig->callbacks, &cb_data);pthread_mutex_unlock(&sig->mutex);}

调用的时候先定义一个Handler,

signal_handler_t *handler = obs_source_get_signal_handler(source);

声明一个信号,类型为const char*,定义处理该信号的回调函数,把要处理的信号和handler连接

signal_handler_connect(handler, signal, callback, param);

当想触发该信号时

handler=source->context.signals;

signal_handler_signal(handler, signal,&data);,此时就会调用 开始自己定义的回调函数callback

0 0
原创粉丝点击