diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index 46b3069f8e7ad4b4a39412a1c01f0ff183a32446..63c5448bc3f670bbcbe51571a15119538717b8ea 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -112,6 +112,7 @@ enum tone_e { TONE_NONE=0, TONE_DIAL, TONE_ALERTING, + TONE_FAR_ALERTING, TONE_BUSY, TONE_CUSTOM, TONE_FILE @@ -186,6 +187,8 @@ struct chan_list { int zero_read_cnt; int dropped_frame_cnt; + int far_alerting; + const struct tone_zone_sound *ts; struct chan_list *peer; @@ -1263,6 +1266,8 @@ static int read_config(struct chan_list *ch, int orig) { misdn_cfg_get( port, MISDN_CFG_NEED_MORE_INFOS, &bc->need_more_infos, sizeof(int)); + misdn_cfg_get( port, MISDN_CFG_FAR_ALERTING, &ch->far_alerting, sizeof(int)); + int hdlc=0; misdn_cfg_get( port, MISDN_CFG_HDLC, &hdlc, sizeof(int)); @@ -1705,6 +1710,8 @@ static int misdn_answer(struct ast_channel *ast) } p->state = MISDN_CONNECTED; + misdn_lib_echo(p->bc,0); + tone_indicate(p, TONE_NONE); if ( ast_strlen_zero(p->bc->cad) ) { chan_misdn_log(2,p->bc->port," --> empty cad using dad\n"); @@ -2058,7 +2065,6 @@ static struct ast_frame *misdn_read(struct ast_channel *ast) read(tmp->pipe[0],blah,sizeof(blah)); - len = misdn_ibuf_usedcount(tmp->bc->astbuf); if (!len) { @@ -2141,7 +2147,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame) if ( !(frame->subclass & prefformat)) { chan_misdn_log(-1, ch->bc->port, "Got Unsupported Frame with Format:%d\n", frame->subclass); - return -1; + return 0; } @@ -2184,7 +2190,7 @@ static int misdn_write(struct ast_channel *ast, struct ast_frame *frame) return 0; } - + chan_misdn_log(9, ch->bc->port, "Sending :%d bytes 2 MISDN\n",frame->samples); /*if speech flip bits*/ if ( misdn_cap_is_speech(ch->bc->capability) ) @@ -2318,6 +2324,13 @@ static int tone_indicate( struct chan_list *cl, enum tone_e tone) ts=ast_get_indication_tone(ast->zone,"ring"); misdn_lib_tone_generator_stop(cl->bc); break; + case TONE_FAR_ALERTING: + /* VERY UGLY HACK, BECAUSE CHAN_SIP DOES NOT GENERATE TONES */ + chan_misdn_log(2,cl->bc->port," --> Ring\n"); + ts=ast_get_indication_tone(ast->zone,"ring"); + misdn_lib_tone_generator_start(cl->bc); + misdn_lib_echo(cl->bc,1); + break; case TONE_BUSY: chan_misdn_log(2,cl->bc->port," --> Busy\n"); ts=ast_get_indication_tone(ast->zone,"busy"); @@ -2611,7 +2624,9 @@ static struct ast_channel *misdn_new(struct chan_list *chlist, int state, char tmp->nativeformats = prefformat; tmp->readformat = format; + tmp->rawreadformat = format; tmp->writeformat = format; + tmp->rawwriteformat = format; tmp->tech_pvt = chlist; @@ -3533,7 +3548,15 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) cb_log(1,bc->port,"Set State Ringing\n"); if ( misdn_cap_is_speech(bc->capability) && misdn_inband_avail(bc)) { + cb_log(1,bc->port,"Starting Tones, we have inband Data\n"); start_bc_tones(ch); + } else { + cb_log(1,bc->port,"We have no inband Data, the other end must create ringing\n"); + if (ch->far_alerting) { + cb_log(1,bc->port,"The other end can not do ringing eh ?.. we must do all ourself.."); + start_bc_tones(ch); + tone_indicate(ch, TONE_FAR_ALERTING); + } } } break; @@ -3543,6 +3566,9 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) struct ast_channel *bridged=AST_BRIDGED_P(ch->ast); + misdn_lib_echo(bc,0); + tone_indicate(ch, TONE_NONE); + if (bridged && strcasecmp(bridged->tech->type,"mISDN")) { struct chan_list *bridged_ch=MISDN_ASTERISK_TECH_PVT(bridged); diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h index 9717e7846987b773983dcbb93a37997c53bb005b..a2ff16b3acfbd6c7c745378e27ce4dee29ad11bb 100644 --- a/channels/misdn/chan_misdn_config.h +++ b/channels/misdn/chan_misdn_config.h @@ -23,6 +23,7 @@ enum misdn_cfg_elements { /* port config items */ MISDN_CFG_FIRST = 0, MISDN_CFG_GROUPNAME, /* char[] */ + MISDN_CFG_FAR_ALERTING, /* int (bool) */ MISDN_CFG_RXGAIN, /* int */ MISDN_CFG_TXGAIN, /* int */ MISDN_CFG_TE_CHOOSE_CHANNEL, /* int (bool) */ diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c index 824fc59cd5058350df6f60f412dc24177415e69b..51ccce3f3c0685e5724b2d760186f9adce6e5ea1 100644 --- a/channels/misdn/isdn_lib.c +++ b/channels/misdn/isdn_lib.c @@ -3064,8 +3064,6 @@ int handle_err(msg_t *msg) int queue_l2l3(msg_t *msg) { iframe_t *frm= (iframe_t*)msg->data; struct misdn_stack *stack; - int err=0; - stack=find_stack_by_addr( frm->addr ); @@ -3261,7 +3259,6 @@ void manager_event_handler(void *arg) stack=stack->next ) { while ( (msg=msg_dequeue(&stack->upqueue)) ) { - int res=0; /** Handle L2/3 Signalling after bchans **/ if (!handle_frm_nt(msg)) { /* Maybe it's TE */ @@ -3848,3 +3845,13 @@ void misdn_lib_split_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel } } + + + +void misdn_lib_echo(struct misdn_bchannel *bc, int onoff) +{ + cb_log(1,bc->port, " --> ECHO %s\n", onoff?"ON":"OFF"); + manager_ph_control(bc, onoff?CMX_ECHO_ON:CMX_ECHO_OFF, 0); +} + + diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h index 444ae62ffa834855b8bc571464f5ed21b4385034..c6324d37e40e7765c89e9848a66918ea805a1d80 100644 --- a/channels/misdn/isdn_lib.h +++ b/channels/misdn/isdn_lib.h @@ -392,6 +392,8 @@ void misdn_lib_setup_bc(struct misdn_bchannel *bc); void misdn_lib_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2); void misdn_lib_split_bridge( struct misdn_bchannel * bc1, struct misdn_bchannel *bc2); +void misdn_lib_echo(struct misdn_bchannel *bc, int onoff); + unsigned char * flip_buf_bits ( unsigned char * buf , int len); int misdn_lib_is_ptp(int port); diff --git a/channels/misdn_config.c b/channels/misdn_config.c index 96156099cca491f8d9a36abef67a7718802a2c65..a94f3478106db18ef9b81c5e1256bc348dcec4c9 100644 --- a/channels/misdn_config.c +++ b/channels/misdn_config.c @@ -87,6 +87,7 @@ static const struct misdn_cfg_spec port_spec[] = { { "rxgain", MISDN_CFG_RXGAIN, MISDN_CTYPE_INT, "0", NONE }, { "txgain", MISDN_CFG_TXGAIN, MISDN_CTYPE_INT, "0", NONE }, { "te_choose_channel", MISDN_CFG_TE_CHOOSE_CHANNEL, MISDN_CTYPE_BOOL, "no", NONE }, + { "far_alerting", MISDN_CFG_FAR_ALERTING, MISDN_CTYPE_BOOL, "no", NONE }, { "pmp_l1_check", MISDN_CFG_PMP_L1_CHECK, MISDN_CTYPE_BOOL, "yes", NONE }, { "hdlc", MISDN_CFG_HDLC, MISDN_CTYPE_BOOL, "no", NONE }, { "context", MISDN_CFG_CONTEXT, MISDN_CTYPE_STR, "default", NONE }, diff --git a/configs/misdn.conf.sample b/configs/misdn.conf.sample index 6dd59c8052746916f5c7a882cfe8903137670fb3..1fb07193066cc594069902773169c55a1a5649b5 100644 --- a/configs/misdn.conf.sample +++ b/configs/misdn.conf.sample @@ -108,6 +108,12 @@ musicclass=default ; senddtmf=yes +; +; If we should generate Ringing for chan_sip and others +; +far_alerting=no + + ; Prefixes for national and international, those are put before the ; oad if an according dialplan is set by the other end. ;