From d1a23b700129412bce8916429fd06791d7be2b74 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 8 Oct 2008 16:39:43 +0000 Subject: [PATCH] fix cng frame issue git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9894 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_loopback/mod_loopback.c | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c index c28642719e..fe76098396 100644 --- a/src/mod/endpoints/mod_loopback/mod_loopback.c +++ b/src/mod/endpoints/mod_loopback/mod_loopback.c @@ -468,6 +468,8 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch goto end; } + *frame = NULL; + while(switch_test_flag(tech_pvt, TFLAG_LINKED) && tech_pvt->other_tech_pvt && !switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) { if (!switch_channel_ready(channel)) { goto end; @@ -478,17 +480,23 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch switch_yield(1000); } - if (switch_test_flag(tech_pvt, TFLAG_CNG)) { - *frame = &tech_pvt->cng_frame; - switch_clear_flag_locked(tech_pvt, TFLAG_CNG); - } else if (tech_pvt->other_tech_pvt && switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) { - *frame = &tech_pvt->other_tech_pvt->write_frame; - switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); + if (switch_test_flag(tech_pvt, TFLAG_LINKED)) { + if (switch_test_flag(tech_pvt, TFLAG_CNG)) { + *frame = &tech_pvt->cng_frame; + tech_pvt->cng_frame.codec = &tech_pvt->read_codec; + switch_set_flag((&tech_pvt->cng_frame), SFF_CNG); + switch_clear_flag_locked(tech_pvt, TFLAG_CNG); + } else if (tech_pvt->other_tech_pvt && switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) { + *frame = &tech_pvt->other_tech_pvt->write_frame; + switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_WRITE); + } } - //printf("READ %s %d\n", switch_channel_get_name(channel), (*frame)->datalen); - status = SWITCH_STATUS_SUCCESS; - + if (*frame) { + status = SWITCH_STATUS_SUCCESS; + } else { + status = SWITCH_STATUS_FALSE; + } end: