]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
...
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 16 Apr 2007 19:32:08 +0000 (19:32 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 16 Apr 2007 19:32:08 +0000 (19:32 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4945 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_wanpipe/mod_wanpipe.c
src/switch_ivr_bridge.c
src/switch_ivr_originate.c

index d6a03afd59b03a7ad38b1ec02e907934c2b24985..7a482ce051fdbf39deafc81af1a3f76f600857fa 100644 (file)
@@ -1016,7 +1016,15 @@ static switch_call_cause_t wanpipe_outgoing_channel(switch_core_session_t *sessi
        char *protocol = NULL;
        char *dest;
        int ready = 0, is_pri = 0, is_boost = 0, is_raw = 0;
-       switch_call_cause_t cause = SWITCH_CAUSE_SUCCESS;
+       switch_call_cause_t cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+       private_object_t *tech_pvt;
+       switch_channel_t *channel;
+       switch_caller_profile_t *caller_profile = NULL;
+       int callno = 0;
+       struct sangoma_pri *spri;
+       int span = 0, autospan = 0, autochan = 0;
+       char *num, *p;
+       struct channel_map *chanmap = NULL;
        
        if (!outbound_profile) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Doh! no caller profile\n");
@@ -1025,6 +1033,7 @@ static switch_call_cause_t wanpipe_outgoing_channel(switch_core_session_t *sessi
        }
 
        protocol = strdup(outbound_profile->destination_number);
+       assert(protocol != NULL);
 
        if (!(dest = strchr(protocol, '/'))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error No protocol specified!\n");
@@ -1059,225 +1068,219 @@ static switch_call_cause_t wanpipe_outgoing_channel(switch_core_session_t *sessi
 
        outbound_profile->destination_number = dest;
 
-       if ((*new_session = switch_core_session_request(&wanpipe_endpoint_interface, pool))) {
-               private_object_t *tech_pvt;
-               switch_channel_t *channel;
-               switch_caller_profile_t *caller_profile = NULL;
-               int callno = 0;
-               struct sangoma_pri *spri;
-               int span = 0, autospan = 0, autochan = 0;
-               char *num, *p;
-               struct channel_map *chanmap = NULL;
-
+       if (!(*new_session = switch_core_session_request(&wanpipe_endpoint_interface, pool))) {
+               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+        goto error;
+       }
 
-               switch_core_session_add_stream(*new_session, NULL);
-               if ((tech_pvt = (private_object_t *) switch_core_session_alloc(*new_session, sizeof(private_object_t)))) {
-                       memset(tech_pvt, 0, sizeof(*tech_pvt));
-                       switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(*new_session));
-                       channel = switch_core_session_get_channel(*new_session);
-                       switch_core_session_set_private(*new_session, tech_pvt);
-                       tech_pvt->session = *new_session;
-               } else {
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
-                       switch_core_session_destroy(new_session);
-                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                       goto error;
-               }
+       switch_core_session_add_stream(*new_session, NULL);
+       if ((tech_pvt = (private_object_t *) switch_core_session_alloc(*new_session, sizeof(private_object_t)))) {
+               memset(tech_pvt, 0, sizeof(*tech_pvt));
+               switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(*new_session));
+               channel = switch_core_session_get_channel(*new_session);
+               switch_core_session_set_private(*new_session, tech_pvt);
+               tech_pvt->session = *new_session;
+       } else {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Memory Error!\n");
+               switch_core_session_destroy(new_session);
+               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+               goto error;
+       }
 
                
-               caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
-
-               if (is_pri) {
-                       num = caller_profile->destination_number;
+       caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
+
+       if (is_pri) {
+               num = caller_profile->destination_number;
+               if ((p = strchr(num, '/'))) {
+                       *p++ = '\0';
+
+                       if (*num == 'a') {
+                               span = 1;
+                               autospan = 1;
+                       } else if (*num == 'A') {
+                               span = MAX_SPANS - 1;
+                               autospan = -1;
+                       } else {
+                               if (num && *num > 47 && *num < 58) {
+                                       span = atoi(num);
+                               } else {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invlid Syntax\n");
+                                       switch_core_session_destroy(new_session);
+                                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+                                       goto error;
+                               }
+                       }
+                       num = p;
                        if ((p = strchr(num, '/'))) {
                                *p++ = '\0';
-
                                if (*num == 'a') {
-                                       span = 1;
-                                       autospan = 1;
+                                       autochan = 1;
                                } else if (*num == 'A') {
-                                       span = MAX_SPANS - 1;
-                                       autospan = -1;
-                               } else {
-                                       if (num && *num > 47 && *num < 58) {
-                                               span = atoi(num);
-                                       } else {
-                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invlid Syntax\n");
-                                               switch_core_session_destroy(new_session);
-                                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                                               goto error;
-                                       }
-                               }
-                               num = p;
-                               if ((p = strchr(num, '/'))) {
-                                       *p++ = '\0';
-                                       if (*num == 'a') {
-                                               autochan = 1;
-                                       } else if (*num == 'A') {
-                                               autochan = -1;
-                                       } else if (num && *num > 47 && *num < 58) {
-                                               callno = atoi(num);
-                                       } else {
-                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invlid Syntax\n");
-                                               switch_core_session_destroy(new_session);
-                                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                                               goto error;
-                                       }
-                                       caller_profile->destination_number = p;
+                                       autochan = -1;
+                               } else if (num && *num > 47 && *num < 58) {
+                                       callno = atoi(num);
                                } else {
                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invlid Syntax\n");
                                        switch_core_session_destroy(new_session);
                                        cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
                                        goto error;
                                }
+                               caller_profile->destination_number = p;
+                       } else {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invlid Syntax\n");
+                               switch_core_session_destroy(new_session);
+                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+                               goto error;
                        }
                }
+       }
 
-               tech_pvt->caller_profile = caller_profile;
+       tech_pvt->caller_profile = caller_profile;
 
-               if (is_raw) {
-                       int chan, span;
+       if (is_raw) {
+               int chan, span;
 
-                       if (sangoma_span_chan_fromif(bchan, &span, &chan)) {
-                               if (!wp_open(tech_pvt, span, chan)) {
-                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open fd for s%dc%d! [%s]\n", span, chan, strerror(errno));
-                                       switch_core_session_destroy(new_session);
-                                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                                       goto error;
-                               }
-                               switch_set_flag_locked(tech_pvt, TFLAG_NOSIG);
-                               snprintf(name, sizeof(name), "wanpipe/%s/nosig", bchan);
-                               switch_channel_set_name(channel, name);                 
-                               switch_channel_set_caller_profile(channel, caller_profile);
-                       } else {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid address\n");
+               if (sangoma_span_chan_fromif(bchan, &span, &chan)) {
+                       if (!wp_open(tech_pvt, span, chan)) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open fd for s%dc%d! [%s]\n", span, chan, strerror(errno));
                                switch_core_session_destroy(new_session);
-                               cause = SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL;
+                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
                                goto error;
                        }
-               } else if (is_pri) {
-                       switch_mutex_lock(globals.channel_mutex);
-                       callno = 0;
-                       while (!callno) {
-                               if (autospan > 0 && span == MAX_SPANS - 1) {
-                                       break;
-                               }
+                       switch_set_flag_locked(tech_pvt, TFLAG_NOSIG);
+                       snprintf(name, sizeof(name), "wanpipe/%s/nosig", bchan);
+                       switch_channel_set_name(channel, name);                 
+                       switch_channel_set_caller_profile(channel, caller_profile);
+               } else {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid address\n");
+                       switch_core_session_destroy(new_session);
+                       cause = SWITCH_CAUSE_REQUESTED_CHAN_UNAVAIL;
+                       goto error;
+               }
+       } else if (is_pri) {
+               switch_mutex_lock(globals.channel_mutex);
+               callno = 0;
+               while (!callno) {
+                       if (autospan > 0 && span == MAX_SPANS - 1) {
+                               break;
+                       }
 
-                               if (autospan < 0 && span == 0) {
-                                       break;
-                               }
+                       if (autospan < 0 && span == 0) {
+                               break;
+                       }
 
-                               if (SPANS[span] && (spri = &SPANS[span]->spri) && switch_test_flag(spri, SANGOMA_PRI_READY)) {
-                                       chanmap = spri->private_info;
+                       if (SPANS[span] && (spri = &SPANS[span]->spri) && switch_test_flag(spri, SANGOMA_PRI_READY)) {
+                               chanmap = spri->private_info;
                                                
-                                       if (autochan > 0) {
-                                               for(callno = 1; callno < SANGOMA_MAX_CHAN_PER_SPAN; callno++) {
-                                                       if ((SPANS[span]->bchans & (1 << callno)) && ! *chanmap->map[callno]) {
-                                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing channel s%dc%d\n", span, callno);
-                                                               goto done;
-                                                       }
+                               if (autochan > 0) {
+                                       for(callno = 1; callno < SANGOMA_MAX_CHAN_PER_SPAN; callno++) {
+                                               if ((SPANS[span]->bchans & (1 << callno)) && ! *chanmap->map[callno]) {
+                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing channel s%dc%d\n", span, callno);
+                                                       goto done;
                                                }
-                                               callno = 0;
-                                       } else if (autochan < 0) {
-                                               for(callno = SANGOMA_MAX_CHAN_PER_SPAN; callno > 0; callno--) {
-                                                       if ((SPANS[span]->bchans & (1 << callno)) && ! *chanmap->map[callno]) {
-                                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing channel s%dc%d\n", span, callno);
-                                                               goto done;
-                                                       }
+                                       }
+                                       callno = 0;
+                               } else if (autochan < 0) {
+                                       for(callno = SANGOMA_MAX_CHAN_PER_SPAN; callno > 0; callno--) {
+                                               if ((SPANS[span]->bchans & (1 << callno)) && ! *chanmap->map[callno]) {
+                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choosing channel s%dc%d\n", span, callno);
+                                                       goto done;
                                                }
-                                               callno = 0;
                                        }
-                               }
-
-                               if (autospan > 0) {
-                                       span++;
-                               } else if (autospan < 0) {
-                                       span--;
+                                       callno = 0;
                                }
                        }
-               done:
-                       switch_mutex_unlock(globals.channel_mutex);
 
-                       if (!spri || callno == 0 || callno == (SANGOMA_MAX_CHAN_PER_SPAN)) {
-                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "No Free Channels!\n");
-                               switch_core_session_destroy(new_session);
-                               cause = SWITCH_CAUSE_SWITCH_CONGESTION;
-                               goto error;
+                       if (autospan > 0) {
+                               span++;
+                       } else if (autospan < 0) {
+                               span--;
                        }
+               }
+       done:
+               switch_mutex_unlock(globals.channel_mutex);
+
+               if (!spri || callno == 0 || callno == (SANGOMA_MAX_CHAN_PER_SPAN)) {
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "No Free Channels!\n");
+                       switch_core_session_destroy(new_session);
+                       cause = SWITCH_CAUSE_SWITCH_CONGESTION;
+                       goto error;
+               }
                                
-                       tech_pvt->callno = callno;
+               tech_pvt->callno = callno;
                                
-                       if (spri && (tech_pvt->call = pri_new_call(spri->pri))) {
-                               struct pri_sr *sr;
+               if (spri && (tech_pvt->call = pri_new_call(spri->pri))) {
+                       struct pri_sr *sr;
                                        
-                               snprintf(name, sizeof(name), "wanpipe/pri/s%dc%d/%s", spri->span, callno, caller_profile->destination_number);
-                               switch_channel_set_name(channel, name);                 
-                               switch_channel_set_caller_profile(channel, caller_profile);
-                               sr = pri_sr_new();
-                               pri_sr_set_channel(sr, callno, 0, 0);
-                               pri_sr_set_bearer(sr, 0, SPANS[span]->l1);
-                               pri_sr_set_called(sr, caller_profile->destination_number, SPANS[span]->dp, 1);
-                               pri_sr_set_caller(sr,
-                                                                 caller_profile->caller_id_number,
-                                                                 caller_profile->caller_id_name,
-                                                                 SPANS[span]->dp,
-                                                                 PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN);
-                               pri_sr_set_redirecting(sr,
-                                                                          caller_profile->caller_id_number,
-                                                                          SPANS[span]->dp,
-                                                                          PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN,
-                                                                          PRI_REDIR_UNCONDITIONAL);
+                       snprintf(name, sizeof(name), "wanpipe/pri/s%dc%d/%s", spri->span, callno, caller_profile->destination_number);
+                       switch_channel_set_name(channel, name);                 
+                       switch_channel_set_caller_profile(channel, caller_profile);
+                       sr = pri_sr_new();
+                       pri_sr_set_channel(sr, callno, 0, 0);
+                       pri_sr_set_bearer(sr, 0, SPANS[span]->l1);
+                       pri_sr_set_called(sr, caller_profile->destination_number, SPANS[span]->dp, 1);
+                       pri_sr_set_caller(sr,
+                                                         caller_profile->caller_id_number,
+                                                         caller_profile->caller_id_name,
+                                                         SPANS[span]->dp,
+                                                         PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN);
+                       pri_sr_set_redirecting(sr,
+                                                                  caller_profile->caller_id_number,
+                                                                  SPANS[span]->dp,
+                                                                  PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN,
+                                                                  PRI_REDIR_UNCONDITIONAL);
                                
-                               if (pri_setup(spri->pri, tech_pvt->call , sr)) {
-                                       switch_core_session_destroy(new_session);
-                                       pri_sr_free(sr);
-                                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                                       goto error;
-                               }
-
-                               if (!wp_open(tech_pvt, spri->span, callno)) {
-                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open fd!\n");
-                                       switch_core_session_destroy(new_session);
-                                       pri_sr_free(sr);
-                                       cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
-                                       goto error;
-                               }
+                       if (pri_setup(spri->pri, tech_pvt->call , sr)) {
+                               switch_core_session_destroy(new_session);
                                pri_sr_free(sr);
-                               switch_copy_string(chanmap->map[callno],
-                                                                  switch_core_session_get_uuid(*new_session),
-                                                                  sizeof(chanmap->map[callno]));
-                               tech_pvt->spri = spri;
+                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+                               goto error;
                        }
-               } else if (is_boost) {
-                       char *p;
 
-                       if ((p = strchr(caller_profile->destination_number, '/'))) {
-                               char *grp = caller_profile->destination_number;
-                               *p = '\0';
-                               caller_profile->destination_number = p+1;
-                               tech_pvt->boost_trunk_group = atoi(grp+1) - 1;
-                               if (tech_pvt->boost_trunk_group < 0) {
-                                       tech_pvt->boost_trunk_group = 0;
-                               }
+                       if (!wp_open(tech_pvt, spri->span, callno)) {
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't open fd!\n");
+                               switch_core_session_destroy(new_session);
+                               pri_sr_free(sr);
+                               cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+                               goto error;
                        }
-                       sprintf(name, "wanpipe/ss7boost/%s", caller_profile->destination_number);
-                       switch_channel_set_name(channel, name);
-                       tech_pvt->ss7boost_handle = globals.ss7boost_handle;
+                       pri_sr_free(sr);
+                       switch_copy_string(chanmap->map[callno],
+                                                          switch_core_session_get_uuid(*new_session),
+                                                          sizeof(chanmap->map[callno]));
+                       tech_pvt->spri = spri;
+               }
+       } else if (is_boost) {
+               char *p;
 
-                       if (session && switch_core_session_compare(session, *new_session)) {
-                               private_object_t *otech_pvt = switch_core_session_get_private(session);
-                               tech_pvt->boost_pres = otech_pvt->boost_pres;
+               if ((p = strchr(caller_profile->destination_number, '/'))) {
+                       char *grp = caller_profile->destination_number;
+                       *p = '\0';
+                       caller_profile->destination_number = p+1;
+                       tech_pvt->boost_trunk_group = atoi(grp+1) - 1;
+                       if (tech_pvt->boost_trunk_group < 0) {
+                               tech_pvt->boost_trunk_group = 0;
                        }
+               }
+               sprintf(name, "wanpipe/ss7boost/%s", caller_profile->destination_number);
+               switch_channel_set_name(channel, name);
+               tech_pvt->ss7boost_handle = globals.ss7boost_handle;
 
+               if (session && switch_core_session_compare(session, *new_session)) {
+                       private_object_t *otech_pvt = switch_core_session_get_private(session);
+                       tech_pvt->boost_pres = otech_pvt->boost_pres;
                }
 
-               tech_pvt->caller_profile = caller_profile;
-               switch_channel_set_flag(channel, CF_OUTBOUND);
-               switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND);
-               switch_channel_set_state(channel, CS_INIT);
-               cause = SWITCH_CAUSE_SUCCESS;
        }
 
+       tech_pvt->caller_profile = caller_profile;
+       switch_channel_set_flag(channel, CF_OUTBOUND);
+       switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND);
+       switch_channel_set_state(channel, CS_INIT);
+       cause = SWITCH_CAUSE_SUCCESS;
+       
+
  error:
        switch_safe_free(protocol);
        return cause;
index 53a77b59c2a1f7507ed439fd06a1f23894a3c4ec..a624b219ae41adbfca74ae95b052def083126061 100644 (file)
@@ -81,18 +81,13 @@ static void *audio_bridge_thread(switch_thread_t * thread, void *obj)
                switch_channel_state_t b_state;
                switch_status_t status;
                switch_event_t *event;
-
+               
                /* if you really want to make sure it's not ready, test it twice because it might be just a break */
                if (!switch_channel_ready(chan_a) && !switch_channel_ready(chan_a)) {
                        break;
                }
 
-               b_state = switch_channel_get_state(chan_b);
-
-               switch (b_state) {
-               case CS_HANGUP:
-               case CS_DONE:
-               default:
+               if ((b_state = switch_channel_get_state(chan_b)) >= CS_HANGUP) {
                        break;
                }
 
@@ -181,11 +176,11 @@ static void *audio_bridge_thread(switch_thread_t * thread, void *obj)
                }
        }
 
-       switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
        msg.string_arg = data->b_uuid;
        msg.message_id = SWITCH_MESSAGE_INDICATE_UNBRIDGE;
        msg.from = __FILE__;
        switch_core_session_receive_message(session_a, &msg);
+       switch_core_session_kill_channel(session_b, SWITCH_SIG_BREAK);
 
        switch_channel_set_variable(chan_a, SWITCH_BRIDGE_VARIABLE, NULL);
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "BRIDGE THREAD DONE [%s]\n", switch_channel_get_name(chan_a));
index 7cd6319060e19bd3b3afd4592c7415d052ccd895..654008176a04a9f54c59dea41c002cae5dfa8c04 100644 (file)
@@ -246,8 +246,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
        switch_status_t status = SWITCH_STATUS_SUCCESS;
        switch_channel_t *caller_channel = NULL;
        char *peer_names[MAX_PEERS] = { 0 };
-       switch_core_session_t *peer_session, *peer_sessions[MAX_PEERS] = { 0 };
-       switch_caller_profile_t *caller_profiles[MAX_PEERS] = { 0 }, *caller_caller_profile;
+       switch_core_session_t *new_session = NULL, *peer_session, *peer_sessions[MAX_PEERS] = { 0 };
+       switch_caller_profile_t *new_profile = NULL, *caller_profiles[MAX_PEERS] = { 0 }, *caller_caller_profile;
        char *chan_type = NULL, *chan_data;
        switch_channel_t *peer_channel = NULL, *peer_channels[MAX_PEERS] = { 0 };
        ringback_t ringback = { 0 };
@@ -427,6 +427,8 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
                        memset(peer_sessions, 0, sizeof(peer_sessions));
                        memset(peer_channels, 0, sizeof(peer_channels));
                        memset(caller_profiles, 0, sizeof(caller_profiles));
+                       new_profile = NULL;
+                       new_session = NULL;
                        chan_type = NULL;
                        chan_data = NULL;
                        peer_channel = NULL;
@@ -474,16 +476,16 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
                                                cid_num_override = caller_caller_profile->caller_id_number;
                                        }
 
-                                       caller_profiles[i] = switch_caller_profile_new(switch_core_session_get_pool(session),
-                                                                                                                                  caller_caller_profile->username,
-                                                                                                                                  caller_caller_profile->dialplan,
-                                                                                                                                  cid_name_override,
-                                                                                                                                  cid_num_override,
-                                                                                                                                  caller_caller_profile->network_addr,
-                                                                                                                                  NULL,
-                                                                                                                                  NULL,
-                                                                                                                                  caller_caller_profile->rdnis,
-                                                                                                                                  caller_caller_profile->source, caller_caller_profile->context, chan_data);
+                                       new_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
+                                                                                                                       caller_caller_profile->username,
+                                                                                                                       caller_caller_profile->dialplan,
+                                                                                                                       cid_name_override,
+                                                                                                                       cid_num_override,
+                                                                                                                       caller_caller_profile->network_addr,
+                                                                                                                       NULL,
+                                                                                                                       NULL,
+                                                                                                                       caller_caller_profile->rdnis,
+                                                                                                                       caller_caller_profile->source, caller_caller_profile->context, chan_data);
                                        caller_profiles[i]->flags = caller_caller_profile->flags;
                                        pool = NULL;
                                } else {
@@ -501,42 +503,44 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess
                                        }
 
                                        if (caller_profile_override) {
-                                               caller_profiles[i] = switch_caller_profile_new(pool,
-                                                                                                                                          caller_profile_override->username,
-                                                                                                                                          caller_profile_override->dialplan,
-                                                                                                                                          caller_profile_override->caller_id_name,
-                                                                                                                                          caller_profile_override->caller_id_number,
-                                                                                                                                          caller_profile_override->network_addr,
-                                                                                                                                          caller_profile_override->ani,
-                                                                                                                                          caller_profile_override->aniii,
-                                                                                                                                          caller_profile_override->rdnis,
-                                                                                                                                          caller_profile_override->source, caller_profile_override->context, chan_data);
+                                               new_profile = switch_caller_profile_new(pool,
+                                                                                                                                caller_profile_override->username,
+                                                                                                                                caller_profile_override->dialplan,
+                                                                                                                                caller_profile_override->caller_id_name,
+                                                                                                                                caller_profile_override->caller_id_number,
+                                                                                                                                caller_profile_override->network_addr,
+                                                                                                                                caller_profile_override->ani,
+                                                                                                                                caller_profile_override->aniii,
+                                                                                                                                caller_profile_override->rdnis,
+                                                                                                                                caller_profile_override->source, caller_profile_override->context, chan_data);
                                        } else {
-                                               caller_profiles[i] = switch_caller_profile_new(pool,
-                                                                                                                                          NULL,
-                                                                                                                                          NULL,
-                                                                                                                                          cid_name_override, cid_num_override, NULL, NULL, NULL, NULL, __FILE__, NULL,
-                                                                                                                                          chan_data);
+                                               new_profile = switch_caller_profile_new(pool,
+                                                                                                                                NULL,
+                                                                                                                                NULL,
+                                                                                                                                cid_name_override, cid_num_override, NULL, NULL, NULL, NULL, __FILE__, NULL,
+                                                                                                                                chan_data);
                                        }
                                }
-
-                               if ((reason =
-                                        switch_core_session_outgoing_channel(session, chan_type, caller_profiles[i], &peer_sessions[i], &pool)) != SWITCH_CAUSE_SUCCESS) {
-                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Create Outgoing Channel! cause: %s\n",
-                                                                         switch_channel_cause2str(reason));
+                               
+                               caller_profiles[i] = NULL;
+                               peer_channels[i] = NULL;
+                               peer_sessions[i] = NULL;
+                               new_session = NULL;
+                               
+                               if ((reason = switch_core_session_outgoing_channel(session, chan_type, new_profile, &new_session, &pool)) != SWITCH_CAUSE_SUCCESS) {
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot Create Outgoing Channel! cause: %s\n", switch_channel_cause2str(reason));
                                        if (pool) {
                                                switch_core_destroy_memory_pool(&pool);
                                        }
-                                       caller_profiles[i] = NULL;
-                                       peer_channels[i] = NULL;
-                                       peer_sessions[i] = NULL;
                                        continue;
                                }
 
                                switch_core_session_read_lock(peer_sessions[i]);
                                pool = NULL;
 
-                               peer_channels[i] = switch_core_session_get_channel(peer_sessions[i]);
+                               caller_profiles[i] = new_profile;
+                               peer_sessions[i] = new_session;
+                               peer_channels[i] = switch_core_session_get_channel(new_session);
                                assert(peer_channels[i] != NULL);
 
                                if (!table) {