Freeswitch内核研究之状态机
来源:互联网 发布:中国地质大学武汉知乎 编辑:程序博客网 时间:2024/05/20 09:27
Freeswitch内核研究之状态机
状态机初始化
switch.c : main
switch_core_init_and_modload
=> switch_core_init
=> switch_core_session_init
=>switch_core_session_thread_pool_manager
=> check_queue
=>switch_core_session_thread_pool_worker
=>switch_core_session_thread
=>switch_core_session_run
改变状态
通过调用switch_channel_set_state来实现状态机的状态改变。
处理状态变化
当状态发生变化后,通过switch_channel_set_running_state函数来改变running_state,
并执行相关的回调来通知其状态已经发生改变了:
endpoint_interface->io_routines->state_run
呼入状态变化
- CS_NEW
sofia_event_callback
case nua_i_invite,
switch_core_session_request_uuid
创建会话,初始状态为CS_NEW,调用switch_core_session_thread_launch
执行状态机线程,调用switch_core_session_run处理状态机。
- CS_INIT
sofia_handle_sip_i_state
case nua_callstate_received (收到invite请求)修改状态机的状态:CS_NEW ==>CS_INIT switch_channel_set_state(channel, CS_INIT);
switch_core_session_run
状态机处理状态变化 STATE_MACRO(init, "INIT"); on_init即: sofia_on_init
switch_core_standard_on_init
- CS_ROUTING
switch_core_standard_on_init
修改状态机的状态: CS_INIT == > CS_ROUTING
switch_channel_set_state(channel,CS_ROUTING);
switch_core_session_run
状态机处理状态变化 STATE_MACRO(routing, "ROUTING"); on_routing即: sofia_on_routing
switch_core_standard_on_routing
执行拨号规则dialplan_interface->hunt_function
- CS_EXECUTE
switch_core_standard_on_routing 修改状态机的状态: CS_ROUTING == > CS_EXECUTEswitch_channel_set_state(session->channel, CS_EXECUTE);
switch_core_session_run
状态机处理状态变化 STATE_MACRO(execute, "EXECUTE"); on_execute即: sofia_on_execute
switch_core_standard_on_execute
- CS_HANGUP
接收到BYE,触发sofia_handle_sip_i_bye 调用switch_channel_hangup:即 switch_channel_perform_hangup 修改状态机的状态 channel->state = CS_HANGUP;
状态机处理状态变化
switch_core_session_hangup_state
STATE_MACRO(hangup,"HANGUP");
· CS_REPORTING
switch_core_session_run
case CS_HANGUP
switch_channel_set_state(session->channel,CS_REPORTING);
· CS_DESTORY
switch_core_session_run
case CS_ REPORTING
switch_channel_set_state(session->channel,CS_DESTORY);
外呼状态变化
- CS_NEW
switch_ivr_originate外呼
sofia_outgoing_channel
switch_core_session_request_uuid
初始状态为CS_NEW,
switch_core_session_thread_launch执行状态机线程
switch_core_session_run
- CS_INIT
originate 调用sofia_outgoing_channel修改状态机的状态:CS_NEW ==> CS_INIT switch_channel_set_state(nchannel,CS_INIT);
- CS_ROUTING
sofia_on_init
sofia_glue_do_invite外呼
switch_core_standard_on_init
修改状态机的状态: CS_INIT == >CS_ROUTING
switch_channel_set_state(channel, CS_ROUTING);
状态机处理逻辑参考主叫。
- CS_CONSUME_MEDIA
switch_core_session_run
originate_on_routing 修改状态机的状态:CS_ROUTING ->CS_CONSUME_MEDIA
switch_channel_set_state(channel, CS_CONSUME_MEDIA);
switch_core_session_run
状态机处理状态变化 STATE_MACRO(consume_media, "CONSUME_MEDIA");on_ consume_media即: NULLswitch_core_standard_on_consume_media
- CS_EXCHANGE_MEDIA
switch_core_session_run
状态机处理状态变化 STATE_MACRO(exchange_media, "EXCHANGE_MEDIA");on_exchange_media即:sofia_on_exchange_media
switch_core_standard_on_exchange_media
- CS_HANGUP
audio_bridge_on_exchange_media
switch_channel_hangup :即switch_channel_perform_hangup修改状态机的状态channel->state = CS_HANGUP;
状态机处理状态变化
switch_core_session_hangup_state
STATE_MACRO(hangup,"HANGUP");
· CS_REPORTING
switch_core_session_run
case CS_HANGUP
switch_channel_set_state(session->channel,CS_REPORTING);
· CS_DESTORY
switch_core_session_run
case CS_ REPORTING
switch_channel_set_state(session->channel,CS_DESTORY);- Freeswitch内核研究之状态机
- Freeswitch内核研究之录音
- Freeswitch内核研究之sofia
- freeswitch 内核研究笔记 (持续更新)
- freeswitch 内核之sip 模块
- freeswitch 内核之sip 模块
- Freeswitch内核之事件类型
- freeswitch源码研究
- freeswitch 内核模块开发
- freeswitch内核模块开发
- SQLite剖析之内核研究
- freeswitch 解决方案之视频会议
- freeswitch 解决方案之视频会议
- freeswitch结构之switch_core_session_t
- freeswitch结构之switch_channel_t
- Freeswitch结构之switch_caller_profile_t
- freeswitch 解决方案之视频会议
- freeswitch结构之sofia_profile_t
- CCF中学生计算机程序设计入门篇2.6顺序结构程序实例例2.28
- StorageBox 1000
- Speak
- jsp边框阴影
- 欢迎使用CSDN-markdown编辑器
- Freeswitch内核研究之状态机
- Swift——convenience(便利构造函数)和类方法
- 第三方登录的原理
- 十进制与N进制之间的转换
- 枚举常见用法
- iOS开发之Runtime常用示例总结
- ES6--对象
- 盘点外卖订单奇葩备注:来的时候要鬼鬼祟祟
- 微实平台使用说明