glib里面定义型号的时候可以指定参数个数以及每个参数的类型,因此说明是可以传递多个参数给信号callback的。
正常情况下可以把所有参数封装到一个结构体里面,然后通过传递结构体的方式同时传递多个参数,但是这样会增加代码量。
下文介绍如何直接传递多个参数给信号callback。
- /**
- * GstAppSrc::cache-info:
- * @appsrc: the appsrc element that emitted the signal
- * @size: total size are there in the appsre queue in size_t of queue element.
- * @cnt: buffer count are there in the appsrc queue.
- *
- * Signal the cache info of source.
- */
- gst_app_src_signals[SIGNAL_CACHE_INFO] =
- g_signal_new ("cache-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT64, G_TYPE_UINT64);
定义一个信号,叫做cache-info,这个信号传递两个参数,都是 G_TYPE_UINT64 类型。
-
- static void GstAppSrcCacheInfoCb(GstElement* element, guint64 size, guint64 cnt, gpointer
- userdata) {
- cacheInfoCb_GstAppSrcUserData* src = static_cast
(userdata); - printf("size = %llu, cnt = %llu" , size , cnt );
- }
这里的信号处理函数是4个参数,第一个是信号所属的element的实例,最后一个是g_signal_connect时指定传递给信号处理函数的额外入参,中间的参数就是信号的参数,参数个数在定义信号时有指定。
g_signal_connect(G_OBJECT(element_.get()), "cache-info", G_CALLBACK(GstAppSrcCacheInfoCb), this);
element_是当前信号所属的element实例,最后一个参数(这里的this)对应信号处理函数的 gpointer userdata 入参。
- g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_CACHE_INFO], 0,
- priv->queued_bytes, priv->queued_buffers, NULL);
需要在最后用NULL结尾,这很重要,如果是一个参数的信号就不需要,大于等于两个的信号发送时都要在结尾补上NULL。
gstreamer源码中 Cairo_overlay.c 里面对于 Gstcairolay.c 的 SIGNAL_DRAW 信号("draw")的使用。