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);