diff options
author | Christian Richter <christian.richter@beronet.com> | 2006-08-08 09:19:06 +0000 |
---|---|---|
committer | Christian Richter <christian.richter@beronet.com> | 2006-08-08 09:19:06 +0000 |
commit | 52e13956906f1b517d09d5af01d19fdf3b4cbcd5 (patch) | |
tree | 48ba7b57fade51ead7cb2528e844e9ea26ee4d9b /channels/chan_misdn.c | |
parent | 07c8e65a6de49e7a64c8bf1257936669d4000285 (diff) |
* added possibility to change echocancel settings during calls
* removed the holded element from the chan_list struct, we know this from the
state already
* added a few tweaks to make HOLD/RETRIEVE work again (TRANSFER does not work
yet)
* added possibility to debug mISDN frames via syslog
* added misdn_lib_port_is_blocked function to check if a port is blocked
* removed ec_training=1 from empty_bc, we don't use ec_training anymore
* removed unused misdn_lib_get_l2_status function
* added the nt bit to dummy misdn_bchannel objects
* setting bc->out_fac_type to FACILITY_NONE defaultly
* removed HANDLER_DEBUG stuff for better readability
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@39295 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r-- | channels/chan_misdn.c | 125 |
1 files changed, 84 insertions, 41 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 21edb0d5b..72a26c843 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -142,11 +142,12 @@ struct chan_list { int need_hangup; int need_busy; - int holded; int orginator; int norxtone; int notxtone; + + int toggle_ec; int incoming_early_audio; @@ -337,6 +338,8 @@ int add_out_calls(int port); int add_in_calls(int port); +static int update_ec_config(struct misdn_bchannel *bc); + /*************** Helpers *****************/ static struct chan_list * get_chan_by_ast(struct ast_channel *ast) @@ -987,6 +990,13 @@ static void print_bc_info (int fd, struct chan_list* help, struct misdn_bchannel " --> state: %s\n" " --> capability: %s\n" " --> echo_cancel: %d\n" +#ifdef WITH_BEROEC + " --> bnec_tail: %d\n" + " --> bnec_nlp: %d\n" + " --> bnec_ah: %d\n" + " --> bnec_td: %d\n" + " --> bnec_zerocoeff: %d\n" +#endif " --> notone : rx %d tx:%d\n" " --> bc_hold: %d holded_bc :%d\n", help->ast->name, @@ -1000,6 +1010,14 @@ static void print_bc_info (int fd, struct chan_list* help, struct misdn_bchannel bc_state2str(bc->bc_state), bearer2str(bc->capability), bc->ec_enable, + +#ifdef WITH_BEROEC + bc->bnec_tail, + bc->bnec_nlp, + bc->bnec_ah, + bc->bnec_td, + bc->bnec_zero, +#endif help->norxtone,help->notxtone, bc->holded, help->holded_bc?1:0 ); @@ -1205,9 +1223,11 @@ static int misdn_toggle_echocancel (int fd, int argc, char *argv[]) ast_cli(fd, "Toggling EchoCancel %s failed Channel does not exist\n", channame); return 0; } else { - tmp->bc->ec_enable=tmp->bc->ec_enable?0:1; + + tmp->toggle_ec=tmp->toggle_ec?0:1; - if (tmp->bc->ec_enable) { + if (tmp->toggle_ec) { + update_ec_config(tmp->bc); manager_ec_enable(tmp->bc); } else { manager_ec_disable(tmp->bc); @@ -1649,6 +1669,44 @@ void debug_numplan(int port, int numplan, char *type) +static int update_ec_config(struct misdn_bchannel *bc) +{ + int ec; + int port=bc->port; + + misdn_cfg_get( port, MISDN_CFG_ECHOCANCEL, &ec, sizeof(int)); + + if (ec == 1 ) { + bc->ec_enable=1; + } else if ( ec > 1 ) { + bc->ec_enable=1; + bc->ec_deftaps=ec; + } +#ifdef WITH_ECHOTRAINING + int ectr; + misdn_cfg_get( port, MISDN_CFG_ECHOTRAINING, &ectr, sizeof(int)); + + if ( ectr >= 0 ) { + bc->ec_training=ectr; + } +#endif + +#ifdef WITH_BEROEC + misdn_cfg_get(port, MISDN_CFG_BNECHOCANCEL,&bc->bnec_tail, sizeof(int)); + misdn_cfg_get(port, MISDN_CFG_BNEC_ANTIHOWL, &bc->bnec_ah, sizeof(int)); + misdn_cfg_get(port, MISDN_CFG_BNEC_NLP, &bc->bnec_nlp, sizeof(int)); + misdn_cfg_get(port, MISDN_CFG_BNEC_TD, &bc->bnec_td, sizeof(int)); + misdn_cfg_get(port, MISDN_CFG_BNEC_ADAPT, &bc->bnec_adapt, sizeof(int)); + misdn_cfg_get(port, MISDN_CFG_BNEC_ZEROCOEFF, &bc->bnec_zero, sizeof(int)); + + if (bc->bnec_tail && bc->ec_enable) { + ast_log(LOG_WARNING,"Are you sure you wan't to mix BNEC with Zapec ? This might cause bad audio quality!\n"); + bc->ec_enable=0; + } +#endif + return 0; +} + static int read_config(struct chan_list *ch, int orig) { @@ -1718,41 +1776,9 @@ static int read_config(struct chan_list *ch, int orig) { misdn_cfg_get( bc->port, MISDN_CFG_CONTEXT, ch->context, sizeof(ch->context)); ast_copy_string (ast->context,ch->context,sizeof(ast->context)); - { - int ec; - - misdn_cfg_get( port, MISDN_CFG_ECHOCANCEL, &ec, sizeof(int)); - - if (ec == 1 ) { - bc->ec_enable=1; - } else if ( ec > 1 ) { - bc->ec_enable=1; - bc->ec_deftaps=ec; - } -#ifdef WITH_ECHOTRAINING - int ectr; - misdn_cfg_get( port, MISDN_CFG_ECHOTRAINING, &ectr, sizeof(int)); - - if ( ectr >= 0 ) { - bc->ec_training=ectr; - } -#endif -#ifdef WITH_BEROEC - misdn_cfg_get(port, MISDN_CFG_BNECHOCANCEL,&bc->bnec_tail, sizeof(int)); - misdn_cfg_get(port, MISDN_CFG_BNEC_ANTIHOWL, &bc->bnec_ah, sizeof(int)); - misdn_cfg_get(port, MISDN_CFG_BNEC_NLP, &bc->bnec_nlp, sizeof(int)); - misdn_cfg_get(port, MISDN_CFG_BNEC_TD, &bc->bnec_td, sizeof(int)); - misdn_cfg_get(port, MISDN_CFG_BNEC_ADAPT, &bc->bnec_adapt, sizeof(int)); - misdn_cfg_get(port, MISDN_CFG_BNEC_ZEROCOEFF, &bc->bnec_zero, sizeof(int)); - - if (bc->bnec_tail && bc->ec_enable) { - ast_log(LOG_WARNING,"Are you sure you wan't to mix BNEC with Zapec ? This might cause bad audio quality!\n"); - bc->ec_enable=0; - } -#endif - } - + update_ec_config(bc); + { int eb3; @@ -2141,7 +2167,7 @@ static int misdn_fixup(struct ast_channel *oldast, struct ast_channel *ast) if (!ast || ! (p=MISDN_ASTERISK_TECH_PVT(ast) )) return -1; - chan_misdn_log(1, p->bc?p->bc->port:0, "* IND: Got Fixup State:%s Holded:%d L3id:%x\n", misdn_get_ch_state(p), p->holded, p->l3id); + chan_misdn_log(1, p->bc?p->bc->port:0, "* IND: Got Fixup State:%s L3id:%x\n", misdn_get_ch_state(p), p->l3id); p->ast = ast ; p->state=MISDN_CONNECTED; @@ -2539,7 +2565,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame) return -1; } - if (ch->holded ) { + if (ch->state == MISDN_HOLDED) { chan_misdn_log(7, ch->bc->port, "misdn_write: Returning because holded\n"); return 0; } @@ -3349,7 +3375,6 @@ static void misdn_transfer_bc(struct chan_list *tmp_ch, struct chan_list *holded ast_moh_stop(AST_BRIDGED_P(holded_chan->ast)); holded_chan->state=MISDN_CONNECTED; - holded_chan->holded=0; misdn_lib_transfer(holded_chan->bc?holded_chan->bc:holded_chan->holded_bc); ast_channel_masquerade(holded_chan->ast, AST_BRIDGED_P(tmp_ch->ast)); } @@ -3559,6 +3584,8 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) case EVENT_SETUP: case EVENT_DISCONNECT: case EVENT_PORT_ALARM: + case EVENT_RETRIEVE: + case EVENT_NEW_BC: break; case EVENT_RELEASE_COMPLETE: chan_misdn_log(1, bc->port, " --> no Ch, so we've already released.\n"); @@ -3620,6 +3647,15 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) break; case EVENT_NEW_BC: + if (!ch) { + ch=find_holded(cl_te,bc); + } + + if (!ch) { + ast_log(LOG_WARNING,"NEW_BC without chan_list?\n"); + break; + } + if (bc) ch->bc=(struct misdn_bchannel*)user_data; break; @@ -4147,7 +4183,8 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) if (ch->state == MISDN_CONNECTED ) { misdn_transfer_bc(ch, holded_ch) ; } - misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); + hangup_chan(ch); + release_chan(bc); break; } @@ -4333,6 +4370,12 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) /***************************/ case EVENT_RETRIEVE: { + ch=find_holded(cl_te, bc); + if (!ch) { + ast_log(LOG_WARNING, "Found no Holded channel, cannot Retrieve\n"); + misdn_lib_send_event(bc, EVENT_RETRIEVE_REJECT); + break; + } struct ast_channel *hold_ast=AST_BRIDGED_P(ch->ast); ch->state = MISDN_CONNECTED; |