obs-studio中自定义信号(signal)
来源:互联网 发布:行最简形矩阵的特点 编辑:程序博客网 时间:2024/06/06 16:30
信号结构体signal_info
信号处理,定义一个链表保存所有的signal
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
- obs-studio中自定义信号(signal)
- 浅谈signal自定义信号
- Linux中 信号signal
- gdb中调试signal信号
- gdb中调试signal信号
- 如何在qt designer中自定义信号/槽(Signal/Slot)
- signal信号
- 信号signal
- 信号signal
- 信号signal
- 信号Signal
- python中进程通信之signal信号
- vs2015 编译obs-studio
- Windows compile obs-studio
- obs-studio的源
- vs2015 编译obs-studio
- MacOS10.9编译OBS-studio
- obs-studio 断线重连
- Java判断String是否是中文,并把中文转换成Unicode
- Perl学习(十二)——数组定义操作总结
- 内核双向循环链表介绍
- com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser
- C++ using namespace 命名空间
- obs-studio中自定义信号(signal)
- RecyclerView三种布局下的上拉加载 下拉刷新
- JZOJ4857. Tourist Attractions
- maven构建spring mvc + spring data jpa+ sql server 配置
- 继承派生优缺点小议
- Halcon 算子 读写图像
- eclipse 调试maven项目,source not found 记录
- 完整版的Android中在Sdcard文件新建文件夹,并在该文件夹中创文件并输入内容
- JSF与servlet关系