Added option far_alerting. This option makes it possible to generate a Ringing on...
authorChristian Richter <christian.richter@beronet.com>
Fri, 5 May 2006 16:38:15 +0000 (16:38 +0000)
committerChristian Richter <christian.richter@beronet.com>
Fri, 5 May 2006 16:38:15 +0000 (16:38 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@24879 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_misdn.c
channels/misdn/chan_misdn_config.h
channels/misdn/isdn_lib.c
channels/misdn/isdn_lib.h
channels/misdn_config.c
configs/misdn.conf.sample

index 46b3069..63c5448 100644 (file)
@@ -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);
 
index 9717e78..a2ff16b 100644 (file)
@@ -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) */
index 824fc59..51ccce3 100644 (file)
@@ -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);
+}
+
+
index 444ae62..c6324d3 100644 (file)
@@ -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);
index 9615609..a94f347 100644 (file)
@@ -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 },
index 6dd59c8..1fb0719 100644 (file)
@@ -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. 
 ;