"CHANNEL_CREATE",
"CHANNEL_DESTROY",
"CHANNEL_STATE",
+ "CHANNEL_CALLSTATE",
"CHANNEL_ANSWER",
"CHANNEL_HANGUP",
"CHANNEL_HANGUP_COMPLETE",
"CHANNEL_EXECUTE",
"CHANNEL_EXECUTE_COMPLETE",
+ "CHANNEL_HOLD",
+ "CHANNEL_UNHOLD",
"CHANNEL_BRIDGE",
"CHANNEL_UNBRIDGE",
"CHANNEL_PROGRESS",
"CHANNEL_PARK",
"CHANNEL_UNPARK",
"CHANNEL_APPLICATION",
- "CHANNEL_HOLD",
- "CHANNEL_UNHOLD",
"CHANNEL_ORIGINATE",
"CHANNEL_UUID",
"API",
ESL_EVENT_CHANNEL_CREATE,
ESL_EVENT_CHANNEL_DESTROY,
ESL_EVENT_CHANNEL_STATE,
+ ESL_EVENT_CHANNEL_CALLSTATE,
ESL_EVENT_CHANNEL_ANSWER,
ESL_EVENT_CHANNEL_HANGUP,
ESL_EVENT_CHANNEL_HANGUP_COMPLETE,
ESL_EVENT_CHANNEL_EXECUTE,
ESL_EVENT_CHANNEL_EXECUTE_COMPLETE,
+ ESL_EVENT_CHANNEL_HOLD,
+ ESL_EVENT_CHANNEL_UNHOLD,
ESL_EVENT_CHANNEL_BRIDGE,
ESL_EVENT_CHANNEL_UNBRIDGE,
ESL_EVENT_CHANNEL_PROGRESS,
SWITCH_DECLARE(char *) switch_channel_get_cap_string(switch_channel_t *channel);
SWITCH_DECLARE(int) switch_channel_state_change_pending(switch_channel_t *channel);
-SWITCH_DECLARE(void) switch_channel_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate);
+SWITCH_DECLARE(void) switch_channel_perform_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate,
+ const char *file, const char *func, int line);
+#define switch_channel_set_callstate(channel, state) switch_channel_perform_set_callstate(channel, state, __FILE__, __SWITCH_FUNC__, __LINE__)
SWITCH_DECLARE(switch_channel_callstate_t) switch_channel_get_callstate(switch_channel_t *channel);
SWITCH_DECLARE(const char *) switch_channel_callstate2str(switch_channel_callstate_t callstate);
SWITCH_DECLARE(switch_call_cause_t) switch_channel_str2callstate(const char *str);
SWITCH_EVENT_CHANNEL_CREATE,
SWITCH_EVENT_CHANNEL_DESTROY,
SWITCH_EVENT_CHANNEL_STATE,
+ SWITCH_EVENT_CHANNEL_CALLSTATE,
SWITCH_EVENT_CHANNEL_ANSWER,
SWITCH_EVENT_CHANNEL_HANGUP,
SWITCH_EVENT_CHANNEL_HANGUP_COMPLETE,
};
-SWITCH_DECLARE(void) switch_channel_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate)
+SWITCH_DECLARE(void) switch_channel_perform_set_callstate(switch_channel_t *channel, switch_channel_callstate_t callstate,
+ const char *file, const char *func, int line)
{
+ switch_event_t *event;
+ switch_channel_callstate_t o_callstate = channel->callstate;
+
+ if (o_callstate == callstate) return;
+
channel->callstate = callstate;
+
+ switch_log_printf(SWITCH_CHANNEL_ID_LOG, file, func, line, switch_channel_get_uuid(channel), SWITCH_LOG_DEBUG,
+ "(%s) Callstate Change %s -> %s\n", channel->name,
+ switch_channel_callstate2str(o_callstate), switch_channel_callstate2str(callstate));
+
+ if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_CALLSTATE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Original-Channel-Call-State", switch_channel_callstate2str(o_callstate));
+ switch_channel_event_set_data(channel, event);
+ switch_event_fire(&event);
+ }
}
SWITCH_DECLARE(switch_channel_callstate_t) switch_channel_get_callstate(switch_channel_t *channel)
if (state <= CS_DESTROY) {
switch_event_t *event;
- if (state == CS_ROUTING) {
- switch_channel_set_callstate(channel, CCS_RINGING);
- } else if (switch_channel_test_flag(channel, CF_ANSWERED)) {
- switch_channel_set_callstate(channel, CCS_ACTIVE);
- } else if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
- switch_channel_set_callstate(channel, CCS_EARLY);
+ if (state < CS_HANGUP) {
+ if (state == CS_ROUTING) {
+ switch_channel_set_callstate(channel, CCS_RINGING);
+ } else if (switch_channel_test_flag(channel, CF_ANSWERED)) {
+ switch_channel_set_callstate(channel, CCS_ACTIVE);
+ } else if (switch_channel_test_flag(channel, CF_EARLY_MEDIA)) {
+ switch_channel_set_callstate(channel, CCS_EARLY);
+ }
}
if (switch_event_create(&event, SWITCH_EVENT_CHANNEL_STATE) == SWITCH_STATUS_SUCCESS) {
int silly = 0;
int index = 0;
+ switch_channel_set_callstate(session->channel, CCS_DOWN);
+
switch_assert(session != NULL);
switch_channel_set_running_state(session->channel, CS_DESTROY);
switch_channel_clear_flag(session->channel, CF_TRANSFER);
"CHANNEL_CREATE",
"CHANNEL_DESTROY",
"CHANNEL_STATE",
+ "CHANNEL_CALLSTATE",
"CHANNEL_ANSWER",
"CHANNEL_HANGUP",
"CHANNEL_HANGUP_COMPLETE",