FSCORE-615
This commit is contained in:
parent
e7f8ae8fdf
commit
2cc59f1ed4
|
@ -558,6 +558,7 @@ SWITCH_DECLARE(switch_call_direction_t) switch_channel_direction(switch_channel_
|
||||||
SWITCH_DECLARE(switch_core_session_t *) switch_channel_get_session(switch_channel_t *channel);
|
SWITCH_DECLARE(switch_core_session_t *) switch_channel_get_session(switch_channel_t *channel);
|
||||||
SWITCH_DECLARE(char *) switch_channel_get_flag_string(switch_channel_t *channel);
|
SWITCH_DECLARE(char *) switch_channel_get_flag_string(switch_channel_t *channel);
|
||||||
SWITCH_DECLARE(char *) switch_channel_get_cap_string(switch_channel_t *channel);
|
SWITCH_DECLARE(char *) switch_channel_get_cap_string(switch_channel_t *channel);
|
||||||
|
SWITCH_DECLARE(int) switch_channel_state_change_pending(switch_channel_t *channel);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
|
@ -1260,6 +1260,11 @@ SWITCH_DECLARE(switch_channel_state_t) switch_channel_get_running_state(switch_c
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SWITCH_DECLARE(int) switch_channel_state_change_pending(switch_channel_t *channel)
|
||||||
|
{
|
||||||
|
return channel->running_state != channel->state;
|
||||||
|
}
|
||||||
|
|
||||||
SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_bool_t check_ready, switch_bool_t check_media)
|
SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_bool_t check_ready, switch_bool_t check_media)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -1270,6 +1275,7 @@ SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_
|
||||||
ret = ((switch_channel_test_flag(channel, CF_ANSWERED) ||
|
ret = ((switch_channel_test_flag(channel, CF_ANSWERED) ||
|
||||||
switch_channel_test_flag(channel, CF_EARLY_MEDIA)) && !switch_channel_test_flag(channel, CF_PROXY_MODE) &&
|
switch_channel_test_flag(channel, CF_EARLY_MEDIA)) && !switch_channel_test_flag(channel, CF_PROXY_MODE) &&
|
||||||
switch_core_session_get_read_codec(channel->session) && switch_core_session_get_write_codec(channel->session));
|
switch_core_session_get_read_codec(channel->session) && switch_core_session_get_write_codec(channel->session));
|
||||||
|
|
||||||
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1281,7 +1287,8 @@ SWITCH_DECLARE(int) switch_channel_test_ready(switch_channel_t *channel, switch_
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
if (!channel->hangup_cause && channel->state > CS_ROUTING && channel->state < CS_HANGUP && channel->state != CS_RESET &&
|
if (!channel->hangup_cause && channel->state > CS_ROUTING && channel->state < CS_HANGUP && channel->state != CS_RESET &&
|
||||||
!switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_NOT_READY)) {
|
!switch_channel_test_flag(channel, CF_TRANSFER) && !switch_channel_test_flag(channel, CF_NOT_READY) &&
|
||||||
|
!switch_channel_state_change_pending(channel)) {
|
||||||
ret++;
|
ret++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -287,6 +287,16 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
|
||||||
switch_event_t *event;
|
switch_event_t *event;
|
||||||
loop_count++;
|
loop_count++;
|
||||||
|
|
||||||
|
if (switch_channel_test_flag(chan_a, CF_TRANSFER)) {
|
||||||
|
data->clean_exit = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->clean_exit || switch_channel_test_flag(chan_b, CF_TRANSFER)) {
|
||||||
|
switch_channel_clear_flag(chan_a, CF_HOLD);
|
||||||
|
switch_channel_clear_flag(chan_a, CF_SUSPEND);
|
||||||
|
goto end_of_bridge_loop;
|
||||||
|
}
|
||||||
|
|
||||||
if (!switch_channel_test_flag(chan_b, CF_BRIDGED)) {
|
if (!switch_channel_test_flag(chan_b, CF_BRIDGED)) {
|
||||||
goto end_of_bridge_loop;
|
goto end_of_bridge_loop;
|
||||||
}
|
}
|
||||||
|
@ -298,17 +308,7 @@ static void *audio_bridge_thread(switch_thread_t *thread, void *obj)
|
||||||
if ((b_state = switch_channel_down(chan_b))) {
|
if ((b_state = switch_channel_down(chan_b))) {
|
||||||
goto end_of_bridge_loop;
|
goto end_of_bridge_loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (switch_channel_test_flag(chan_a, CF_TRANSFER)) {
|
|
||||||
data->clean_exit = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data->clean_exit || switch_channel_test_flag(chan_b, CF_TRANSFER)) {
|
|
||||||
switch_channel_clear_flag(chan_a, CF_HOLD);
|
|
||||||
switch_channel_clear_flag(chan_a, CF_SUSPEND);
|
|
||||||
goto end_of_bridge_loop;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (loop_count > DEFAULT_LEAD_FRAMES && switch_channel_media_ack(chan_a) && switch_core_session_private_event_count(session_a)) {
|
if (loop_count > DEFAULT_LEAD_FRAMES && switch_channel_media_ack(chan_a) && switch_core_session_private_event_count(session_a)) {
|
||||||
switch_channel_set_flag(chan_b, CF_SUSPEND);
|
switch_channel_set_flag(chan_b, CF_SUSPEND);
|
||||||
msg.string_arg = data->b_uuid;
|
msg.string_arg = data->b_uuid;
|
||||||
|
|
|
@ -1810,8 +1810,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
|
||||||
switch_ivr_media(switch_core_session_get_uuid(session), SMF_NONE);
|
switch_ivr_media(switch_core_session_get_uuid(session), SMF_NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (switch_channel_test_flag(caller_channel, CF_PROXY_MODE) && switch_channel_media_ready(caller_channel)) {
|
if (switch_channel_test_flag(caller_channel, CF_PROXY_MODE) && switch_channel_test_flag(caller_channel, CF_ANSWERED)) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG,
|
||||||
"Channel is already up, delaying proxy mode 'till both legs are answered.\n");
|
"Channel is already up, delaying proxy mode 'till both legs are answered.\n");
|
||||||
switch_channel_set_variable(caller_channel, "bypass_media_after_bridge", "true");
|
switch_channel_set_variable(caller_channel, "bypass_media_after_bridge", "true");
|
||||||
|
|
Loading…
Reference in New Issue