From 7d2756f14ac85c81e4e04b15e8e89791dad7a11d Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 26 Apr 2006 20:15:16 +0000 Subject: [PATCH] update git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1266 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_channel.h | 4 ++-- src/switch_channel.c | 23 +++++++++++------------ src/switch_core.c | 12 ++++++------ src/switch_ivr.c | 9 ++------- 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index f65defe179..acbaa92bee 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -85,7 +85,7 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch \param str the string to check \return the code */ -SWITCH_DECLARE(switch_call_cause_t) switch_channel_cause2str(char *str); +SWITCH_DECLARE(switch_call_cause_t) switch_channel_str2cause(char *str); /*! \brief return the cause code for a given channel @@ -99,7 +99,7 @@ SWITCH_DECLARE(switch_call_cause_t) switch_channel_get_cause(switch_channel *cha \param cause the code to check \return the string */ -SWITCH_DECLARE(char *) switch_channel_str2cause(switch_call_cause_t cause); +SWITCH_DECLARE(char *) switch_channel_cause2str(switch_call_cause_t cause); /*! \brief View the timetable of a channel diff --git a/src/switch_channel.c b/src/switch_channel.c index c5c65af6c5..9a622f3af6 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -109,7 +109,7 @@ struct switch_channel { }; -SWITCH_DECLARE(char *) switch_channel_str2cause(switch_call_cause_t cause) +SWITCH_DECLARE(char *) switch_channel_cause2str(switch_call_cause_t cause) { uint8_t x; char *str = "UNALLOCATED"; @@ -123,7 +123,7 @@ SWITCH_DECLARE(char *) switch_channel_str2cause(switch_call_cause_t cause) return str; } -SWITCH_DECLARE(switch_call_cause_t) switch_channel_cause2str(char *str) +SWITCH_DECLARE(switch_call_cause_t) switch_channel_str2cause(char *str) { uint8_t x; switch_call_cause_t cause = SWITCH_CAUSE_UNALLOCATED; @@ -412,7 +412,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch case CS_TRANSMIT: case CS_RING: case CS_EXECUTE: - case CS_HANGUP: ok++; default: break; @@ -424,7 +423,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch case CS_TRANSMIT: case CS_RING: case CS_EXECUTE: - case CS_HANGUP: ok++; default: break; @@ -436,7 +434,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch case CS_LOOPBACK: case CS_RING: case CS_EXECUTE: - case CS_HANGUP: ok++; default: break; @@ -447,7 +444,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch switch (state) { case CS_LOOPBACK: case CS_EXECUTE: - case CS_HANGUP: case CS_TRANSMIT: ok++; default: @@ -460,7 +456,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch case CS_LOOPBACK: case CS_TRANSMIT: case CS_RING: - case CS_HANGUP: ok++; default: break; @@ -483,7 +478,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch if (ok) { - switch_event *event; switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s State Change %s -> %s\n", channel->name, state_names[last_state], state_names[state]); @@ -492,10 +486,12 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch if (state == CS_HANGUP && channel->hangup_cause == SWITCH_CAUSE_UNALLOCATED) { channel->hangup_cause = SWITCH_CAUSE_NORMAL_CLEARING; } - - if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) { - switch_channel_event_set_data(channel, event); - switch_event_fire(&event); + if (state < CS_HANGUP) { + switch_event *event; + if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) { + switch_channel_event_set_data(channel, event); + switch_event_fire(&event); + } } if (state < CS_DONE) { @@ -700,9 +696,12 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_hangup(switch_channel *chann if (channel->state < CS_HANGUP) { switch_event *event; + switch_channel_state last_state = channel->state; channel->state = CS_HANGUP; channel->hangup_cause = hangup_cause; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Hangup %s [%s] [%s]\n", channel->name, + state_names[last_state], switch_channel_cause2str(channel->hangup_cause)); if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(channel, event); switch_event_fire(&event); diff --git a/src/switch_core.c b/src/switch_core.c index dc25e69f3f..5b2b96a289 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -1704,7 +1704,7 @@ static void switch_core_standard_on_ring(switch_core_session *session) if ((caller_profile = switch_channel_get_caller_profile(session->channel)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't get profile!\n"); - switch_channel_set_state(session->channel, CS_HANGUP); + switch_channel_hangup(session->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); } else { if (!switch_strlen_zero(caller_profile->dialplan)) { dialplan_interface = switch_loadable_module_get_dialplan_interface(caller_profile->dialplan); @@ -1734,7 +1734,7 @@ static void switch_core_standard_on_execute(switch_core_session *session) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Standard EXECUTE\n"); if ((extension = switch_channel_get_caller_extension(session->channel)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Extension!\n"); - switch_channel_set_state(session->channel, CS_HANGUP); + switch_channel_hangup(session->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return; } @@ -1747,14 +1747,14 @@ static void switch_core_standard_on_execute(switch_core_session *session) switch_loadable_module_get_application_interface(extension->current_application->application_name)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Application %s\n", extension->current_application->application_name); - switch_channel_set_state(session->channel, CS_HANGUP); + switch_channel_hangup(session->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return; } if (!application_interface->application_function) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Function for %s\n", extension->current_application->application_name); - switch_channel_set_state(session->channel, CS_HANGUP); + switch_channel_hangup(session->channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER); return; } @@ -1767,9 +1767,9 @@ static void switch_core_standard_on_execute(switch_core_session *session) application_interface->application_function(session, extension->current_application->application_data); extension->current_application = extension->current_application->next; } - + if (switch_channel_get_state(session->channel) == CS_EXECUTE) { - switch_channel_set_state(session->channel, CS_HANGUP); + switch_channel_hangup(session->channel, SWITCH_CAUSE_NORMAL_CLEARING); } } diff --git a/src/switch_ivr.c b/src/switch_ivr.c index a4b9f74e52..59d8f062be 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -780,6 +780,7 @@ static void *audio_bridge_thread(switch_thread *thread, void *obj) switch_core_session_receive_message(session_a, &msg); data->running = 0; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a)); if (switch_channel_test_flag(chan_a, CF_ORIGINATOR)) { if (switch_channel_test_flag(chan_b, CF_TRANSFER)) { @@ -793,16 +794,10 @@ static void *audio_bridge_thread(switch_thread *thread, void *obj) switch_channel_hangup(chan_b, SWITCH_CAUSE_NORMAL_CLEARING); } switch_channel_clear_flag(chan_a, CF_ORIGINATOR); - } - while (his_thread->running > 0) { - his_thread->running = -1; - /* wait for the other audio thread */ - while (his_thread->running == -1) { - switch_yield(1000); - } } + data->running = 0; return NULL; }