The event mechanism of freeswitch

freeswitch relies on event mechanism to implement message communication mechanism

1. Definition of event:

switch_types.h	src\include	96298	2020/6/16	
typedef enum {
    
    
	SWITCH_EVENT_CUSTOM,
	SWITCH_EVENT_CLONE,
	SWITCH_EVENT_CHANNEL_CREATE,
	SWITCH_EVENT_CHANNEL_DESTROY,
	SWITCH_EVENT_CHANNEL_STATE,
	SWITCH_EVENT_CHANNEL_CALLSTATE,
	SWITCH_EVENT_CHANNEL_ANSWER,
	SWITCH_EVENT_CHANNEL_HANGUP,
	SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE,
	SWITCH_EVENT_CHANNEL_EXECUTE,
	SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE,
	SWITCH_EVENT_CHANNEL_HOLD,
。。。
} switch_event_types_t;

与switch_event.c	src	92696	2020/6/16	2555  一一对应
static char *EVENT_NAMES[] = {
    
    
	"CUSTOM",
	"CLONE",
	"CHANNEL_CREATE",
	"CHANNEL_DESTROY",
	"CHANNEL_STATE",
	"CHANNEL_CALLSTATE",
	"CHANNEL_ANSWER",
	"CHANNEL_HANGUP",
	"CHANNEL_HANGUP_COMPLETE",
	"CHANNEL_EXECUTE",
	"CHANNEL_EXECUTE_COMPLETE",
	"CHANNEL_HOLD",
	"CHANNEL_UNHOLD",
	"CHANNEL_BRIDGE",
	"CHANNEL_UNBRIDGE",
	"CHANNEL_PROGRESS",
	"CHANNEL_PROGRESS_MEDIA",
	"CHANNEL_OUTGOING",
。。。
}

2. Binding and unbinding of events:

switch_event_reserve_subclass() call, register the event type,
call switch_event_bind() to bind a series of event callback functions

模块加载的时候调用:
SWITCH_MODULE_LOAD_FUNCTION(mod_conference_load)
	=》switch_event_reserve_subclass(CONF_EVENT_MAINT) != SWITCH_STATUS_SUCCESS
	=》switch_event_bind(modname, SWITCH_EVENT_PRESENCE_PROBE, SWITCH_EVENT_SUBCLASS_ANY, conference_event_pres_handler, NULL) != SWITCH_STATUS_SUCCESS)
	=》switch_event_bind(modname, SWITCH_EVENT_CONFERENCE_DATA_QUERY, SWITCH_EVENT_SUBCLASS_ANY, conference_data_event_handler, NULL) != SWITCH_STATUS_SUCCESS)
	=》switch_event_bind(modname, SWITCH_EVENT_CALL_SETUP_REQ, SWITCH_EVENT_SUBCLASS_ANY, conference_event_call_setup_handler, NULL) != SWITCH_STATUS_SUCCESS)
	=》switch_event_bind_removable(id, event, subclass_name, callback, user_data, NULL);

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_conference_shutdown)
	=》switch_event_unbind_callback(conference_event_pres_handler);
	=》switch_event_unbind_callback(conference_data_event_handler);
	=》switch_event_unbind_callback(conference_event_call_setup_handler);
	=》switch_event_free_subclass(CONF_EVENT_MAINT);

3. Freeswitch event processing flow:

switch_event.c	src	92696	2020/6/16	2555
#define switch_event_create(event, id) switch_event_create_subclass(event, id, SWITCH_EVENT_SUBCLASS_ANY)
	a.调用switch_event_create生成事件
	b.调用switch_event_fire把事件push到EVENT_DISPATCH_QUEUE
	#define switch_event_fire(event) switch_event_fire_detailed(__FILE__, (const char * )__SWITCH_FUNC__, __LINE__, event, NULL)
	switch_event_fire_detailed
		=>switch_event_queue_dispatch_event
			=>switch_queue_push(EVENT_DISPATCH_QUEUE, event);
		
	switch_event_queue_dispatch_event《=》 switch_event_dispatch_thread
	c.线程switch_event_dispatch_thread,调用switch_queue_pop,取得事件,
	调用switch_event_deliver调用对应的event callback,处理对应的事件。
	switch.c	src	35767	2020/6/16	878
	Main
		=》switch_core_init_and_modload
			=》switch_load_core_config("post_load_switch.conf");
				=》switch_event_launch_dispatch_threads
					=》switch_thread_create(&EVENT_DISPATCH_QUEUE_THREADS[index], thd_attr, switch_event_dispatch_thread, EVENT_DISPATCH_QUEUE, pool);
						=》 switch_event_dispatch_thread
							=》if (switch_queue_pop(queue, &pop) != SWITCH_STATUS_SUCCESS)
							=》switch_event_deliver(&event);
								=》switch_events_match(switch_event_t *event, switch_event_node_t *node)
								=》node->callback(*event);
								
								callback是在这里设置的,把所有的事件回调函数放在EVENT_NODES中。
	调用switch_event_fire发送事件的线程一直执行到switch_queue_push把事件放入队列就返回,线程switch_event_dispatch_thread
	到队列里面取事件,并调用相应的事件处理函数(回调函数),处理完事件后才返回。
Eg:
if (test_eflag(member->conference, EFLAG_MUTE_MEMBER) &&
		switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
    
    
		conference_member_add_event_data(member, event);
		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "mute-member");
		switch_event_fire(&event);
	}

if (test_eflag(member->conference, EFLAG_HOLD_MEMBER) &&
		switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
    
    
		conference_member_add_event_data(member, event);
		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Action", "unhold-member");
		switch_event_fire(&event);
	}

Guess you like

Origin blog.csdn.net/weixin_44991625/article/details/107717291