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_mediasofia_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);
0 0
原创粉丝点击