tweak
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9635 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
e963a5a751
commit
36caace8ff
|
@ -48,7 +48,8 @@ static switch_memory_pool_t *module_pool = NULL;
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TFLAG_LINKED = (1 << 0),
|
TFLAG_LINKED = (1 << 0),
|
||||||
TFLAG_OUTBOUND = (1 << 1),
|
TFLAG_OUTBOUND = (1 << 1),
|
||||||
TFLAG_WRITE = (1 << 2)
|
TFLAG_WRITE = (1 << 2),
|
||||||
|
TFLAG_CNG = (1 << 3)
|
||||||
} TFLAGS;
|
} TFLAGS;
|
||||||
|
|
||||||
struct private_object {
|
struct private_object {
|
||||||
|
@ -299,7 +300,9 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CHANNEL HANGUP\n", switch_channel_get_name(channel));
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CHANNEL HANGUP\n", switch_channel_get_name(channel));
|
||||||
|
|
||||||
switch_clear_flag_locked(tech_pvt, TFLAG_LINKED);
|
switch_clear_flag_locked(tech_pvt, TFLAG_LINKED);
|
||||||
switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_LINKED);
|
if (tech_pvt->other_tech_pvt) {
|
||||||
|
switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_LINKED);
|
||||||
|
}
|
||||||
|
|
||||||
switch_channel_hangup(tech_pvt->other_channel, switch_channel_get_cause(channel));
|
switch_channel_hangup(tech_pvt->other_channel, switch_channel_get_cause(channel));
|
||||||
switch_core_session_rwunlock(tech_pvt->other_session);
|
switch_core_session_rwunlock(tech_pvt->other_session);
|
||||||
|
@ -319,8 +322,18 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int
|
||||||
assert(tech_pvt != NULL);
|
assert(tech_pvt != NULL);
|
||||||
|
|
||||||
switch (sig) {
|
switch (sig) {
|
||||||
|
case SWITCH_SIG_BREAK:
|
||||||
|
switch_set_flag_locked(tech_pvt, TFLAG_CNG);
|
||||||
|
if (tech_pvt->other_tech_pvt) {
|
||||||
|
switch_set_flag_locked(tech_pvt->other_tech_pvt, TFLAG_CNG);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SWITCH_SIG_KILL:
|
case SWITCH_SIG_KILL:
|
||||||
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||||
|
switch_clear_flag_locked(tech_pvt, TFLAG_LINKED);
|
||||||
|
if (tech_pvt->other_tech_pvt) {
|
||||||
|
switch_clear_flag_locked(tech_pvt->other_tech_pvt, TFLAG_LINKED);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -398,15 +411,23 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) {
|
while(tech_pvt->other_tech_pvt && !switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) {
|
||||||
if (!switch_channel_ready(channel)) {
|
if (!switch_channel_ready(channel)) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
|
||||||
|
*frame = &tech_pvt->cng_frame;
|
||||||
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
|
switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
switch_yield(1000);
|
switch_yield(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
*frame = &tech_pvt->other_tech_pvt->write_frame;
|
if (tech_pvt->other_tech_pvt && switch_test_flag(tech_pvt->other_tech_pvt, TFLAG_WRITE)) {
|
||||||
switch_clear_flag_locked(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);
|
//printf("READ %s %d\n", switch_channel_get_name(channel), (*frame)->datalen);
|
||||||
status = SWITCH_STATUS_SUCCESS;
|
status = SWITCH_STATUS_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue