TONE_NONE=0,
TONE_DIAL,
TONE_ALERTING,
+ TONE_FAR_ALERTING,
TONE_BUSY,
TONE_CUSTOM,
TONE_FILE
int zero_read_cnt;
int dropped_frame_cnt;
+ int far_alerting;
+
const struct tone_zone_sound *ts;
struct chan_list *peer;
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));
}
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");
read(tmp->pipe[0],blah,sizeof(blah));
-
len = misdn_ibuf_usedcount(tmp->bc->astbuf);
if (!len) {
if ( !(frame->subclass & prefformat)) {
chan_misdn_log(-1, ch->bc->port, "Got Unsupported Frame with Format:%d\n", frame->subclass);
- return -1;
+ return 0;
}
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) )
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");
tmp->nativeformats = prefformat;
tmp->readformat = format;
+ tmp->rawreadformat = format;
tmp->writeformat = format;
+ tmp->rawwriteformat = format;
tmp->tech_pvt = chlist;
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;
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);
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 );
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 */
}
}
+
+
+
+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);
+}
+
+
{ "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 },