git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@1266 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2006-04-26 20:15:16 +00:00
parent 380bc2b68c
commit 7d2756f14a
4 changed files with 21 additions and 27 deletions

View File

@ -85,7 +85,7 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
\param str the string to check \param str the string to check
\return the code \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 \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 \param cause the code to check
\return the string \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 \brief View the timetable of a channel

View File

@ -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; uint8_t x;
char *str = "UNALLOCATED"; char *str = "UNALLOCATED";
@ -123,7 +123,7 @@ SWITCH_DECLARE(char *) switch_channel_str2cause(switch_call_cause_t cause)
return str; 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; uint8_t x;
switch_call_cause_t cause = SWITCH_CAUSE_UNALLOCATED; 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_TRANSMIT:
case CS_RING: case CS_RING:
case CS_EXECUTE: case CS_EXECUTE:
case CS_HANGUP:
ok++; ok++;
default: default:
break; break;
@ -424,7 +423,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
case CS_TRANSMIT: case CS_TRANSMIT:
case CS_RING: case CS_RING:
case CS_EXECUTE: case CS_EXECUTE:
case CS_HANGUP:
ok++; ok++;
default: default:
break; break;
@ -436,7 +434,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
case CS_LOOPBACK: case CS_LOOPBACK:
case CS_RING: case CS_RING:
case CS_EXECUTE: case CS_EXECUTE:
case CS_HANGUP:
ok++; ok++;
default: default:
break; break;
@ -447,7 +444,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
switch (state) { switch (state) {
case CS_LOOPBACK: case CS_LOOPBACK:
case CS_EXECUTE: case CS_EXECUTE:
case CS_HANGUP:
case CS_TRANSMIT: case CS_TRANSMIT:
ok++; ok++;
default: default:
@ -460,7 +456,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
case CS_LOOPBACK: case CS_LOOPBACK:
case CS_TRANSMIT: case CS_TRANSMIT:
case CS_RING: case CS_RING:
case CS_HANGUP:
ok++; ok++;
default: default:
break; break;
@ -483,7 +478,6 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_set_state(switch_channel *ch
if (ok) { if (ok) {
switch_event *event;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s State Change %s -> %s\n", channel->name, switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s State Change %s -> %s\n", channel->name,
state_names[last_state], state_names[state]); 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) { if (state == CS_HANGUP && channel->hangup_cause == SWITCH_CAUSE_UNALLOCATED) {
channel->hangup_cause = SWITCH_CAUSE_NORMAL_CLEARING; channel->hangup_cause = SWITCH_CAUSE_NORMAL_CLEARING;
} }
if (state < CS_HANGUP) {
if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) { switch_event *event;
switch_channel_event_set_data(channel, event); if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) {
switch_event_fire(&event); switch_channel_event_set_data(channel, event);
switch_event_fire(&event);
}
} }
if (state < CS_DONE) { if (state < CS_DONE) {
@ -700,9 +696,12 @@ SWITCH_DECLARE(switch_channel_state) switch_channel_hangup(switch_channel *chann
if (channel->state < CS_HANGUP) { if (channel->state < CS_HANGUP) {
switch_event *event; switch_event *event;
switch_channel_state last_state = channel->state;
channel->state = CS_HANGUP; channel->state = CS_HANGUP;
channel->hangup_cause = hangup_cause; 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) { if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event); switch_channel_event_set_data(channel, event);
switch_event_fire(&event); switch_event_fire(&event);

View File

@ -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) { 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_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 { } else {
if (!switch_strlen_zero(caller_profile->dialplan)) { if (!switch_strlen_zero(caller_profile->dialplan)) {
dialplan_interface = switch_loadable_module_get_dialplan_interface(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"); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Standard EXECUTE\n");
if ((extension = switch_channel_get_caller_extension(session->channel)) == 0) { if ((extension = switch_channel_get_caller_extension(session->channel)) == 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Extension!\n"); 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; 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_loadable_module_get_application_interface(extension->current_application->application_name)) == 0) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Application %s\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Application %s\n",
extension->current_application->application_name); 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; return;
} }
if (!application_interface->application_function) { if (!application_interface->application_function) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Function for %s\n", switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Function for %s\n",
extension->current_application->application_name); 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; 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); application_interface->application_function(session, extension->current_application->application_data);
extension->current_application = extension->current_application->next; extension->current_application = extension->current_application->next;
} }
if (switch_channel_get_state(session->channel) == CS_EXECUTE) { 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);
} }
} }

View File

@ -780,6 +780,7 @@ static void *audio_bridge_thread(switch_thread *thread, void *obj)
switch_core_session_receive_message(session_a, &msg); switch_core_session_receive_message(session_a, &msg);
data->running = 0; 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_a, CF_ORIGINATOR)) {
if (switch_channel_test_flag(chan_b, CF_TRANSFER)) { 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_hangup(chan_b, SWITCH_CAUSE_NORMAL_CLEARING);
} }
switch_channel_clear_flag(chan_a, CF_ORIGINATOR); 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; data->running = 0;
return NULL; return NULL;
} }