\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
\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
};
-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";
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;
case CS_TRANSMIT:
case CS_RING:
case CS_EXECUTE:
- case CS_HANGUP:
ok++;
default:
break;
case CS_TRANSMIT:
case CS_RING:
case CS_EXECUTE:
- case CS_HANGUP:
ok++;
default:
break;
case CS_LOOPBACK:
case CS_RING:
case CS_EXECUTE:
- case CS_HANGUP:
ok++;
default:
break;
switch (state) {
case CS_LOOPBACK:
case CS_EXECUTE:
- case CS_HANGUP:
case CS_TRANSMIT:
ok++;
default:
case CS_LOOPBACK:
case CS_TRANSMIT:
case CS_RING:
- case CS_HANGUP:
ok++;
default:
break;
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]);
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) {
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);
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);
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;
}
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;
}
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);
}
}
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)) {
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;
}