# Signal GObject signal 可用于通知应用程序该对象的特定事件。 但请注意,应用程序需要了解信号及其含义,因此,如果您正在寻找应用程序元素交互的通用方法,那么信号可能不是您想要的。 信号系统的基本概念是信号的发射 (emission)。 信号按类型引入并通过字符串进行识别。 为父类型引入的信号在派生类型中也可用,因此基本上它们继承的是每一个类型中的基本设施。 信号发射主要涉及以精确定义的方式调用一组特定的回调。 此类回调主要有两类:每个对象的回调和用户提供的回调。 (虽然信号可以处理任何类型的可实例化类型,但我在下面将这些类型称为“对象类型”,只是因为这是大多数用户会遇到信号的上下文。) 每个对象的回调最常见 称为“对象方法处理程序”或“默认(信号)处理程序”,而用户提供的回调通常简称为“信号处理程序”。 对象方法处理程序是在信号创建时提供的(这最常发生在对象类创建结束时),而用户提供的处理程序经常与某些对象实例上的某个信号连接和断开。 ## g_signal_emit_by_name ```c void g_signal_emit_by_name ( GObject* instance, const gchar* detailed_signal, ... ) ``` ### Description Emits a signal. Signal emission is done synchronously. The method will only return control after all handlers are called or signal emission was stopped. Note that g_signal_emit_by_name() resets the return value to the default if no handlers are connected, in contrast to g_signal_emitv(). ## g_signal_connect ```c #define g_signal_connect ( instance, detailed_signal, c_handler, data ) ``` ### Description Connects a GCallback function to a signal for a particular object. The handler will be called synchronously, before the default handler of the signal. g_signal_emit() will not return control until all handlers are called. See [memory management of signal handlers][signal-memory-management] for details on how to handle the return value and memory management of data. ## signal definition 例如我们想要定义一些信号,在一些特定事件发生时回调给应用, 假设我们的插件名称为 `hfasr` ```c enum { SIGNAL_ASR_STATE, SIGNAL_ASR_INFO, /* FILL ME */ LAST_SIGNAL }; static guint hfasr_signals[LAST_SIGNAL] = {0}; static void signal_demo_default_handler(gpointer instance, const gchar *buffer, gpointer userdata) { // g_printf("work state is -> %s\n", buffer); } static void gst_hfasr_class_init(GsthfasrClass *klass) { /* omit some code */ /* 创建一个 signal */ klass->asr_state = signal_demo_default_handler; hfasr_signals[SIGNAL_ASR_STATE] = g_signal_new("asr-state", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(GsthfasrClass, asr_state), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); } /* 发送这个信号 */ static void send_asr_state_signal(Gsthasr *sink, const gchar *buffer) { g_signal_emit_by_name(sink, "asr-state", buffer, G_TYPE_NONE); } ``` ## Reference * https://www.manpagez.com/html/gobject/gobject-2.56.0/gobject-Signals.php