freeswitch靠event机制来实现消息通信机制
1.事件的定义:
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.事件的绑定与解绑定:
switch_event_reserve_subclass()调用,注册事件类型
调用switch_event_bind()绑定一系列的事件回调函数
模块加载的时候调用:
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事件处理流程:
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);
}