aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbkramer <bkramer@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-01 23:20:46 +0000
committerbkramer <bkramer@f38db490-d61c-443f-a65b-d21fe96a405b>2005-11-01 23:20:46 +0000
commitdf0305756f9773a764e02ce8539e5425cff92b99 (patch)
treefc4d410ff4635f88f051f67bc34cf072a56dd1cc
parentb72c011da6ec4a79a956bbe695f5ef81f8d2cc2a (diff)
added patched to support collecting caller ID before first ring using
line voltage detection (tested in Gibralta) added further support for Line Voltage events on OpenLine4 cards updated to use ast_codn functions git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6941 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xchannels/chan_vpb.c69
1 files changed, 56 insertions, 13 deletions
diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c
index 2920e4d3f..05e45f6d6 100755
--- a/channels/chan_vpb.c
+++ b/channels/chan_vpb.c
@@ -152,6 +152,9 @@ static VPB_TONE Ringbacktone = {440, 480, 0, -20, -20, -100, 2000, 4000};
static VPB_DETECT toned_grunt = { 3, VPB_GRUNT, 1, 2000, 3000, 0, 0, -40, 0, 0, 0, 40, { { VPB_DELAY, 1000, 0, 0 }, { VPB_RISING, 0, 40, 0 }, { 0, 100, 0, 0 } } };
static VPB_DETECT toned_ungrunt = { 2, VPB_GRUNT, 1, 2000, 1, 0, 0, -40, 0, 0, 30, 40, { { 0, 0, 0, 0 } } };
+/* Use loop polarity detection for CID */
+static int UsePolarityCID=0;
+
/* Use loop drop detection */
static int UseLoopDrop=1;
@@ -234,7 +237,7 @@ typedef struct {
struct ast_frame **fo;
int flags;
ast_mutex_t lock;
- pthread_cond_t cond;
+ ast_cond_t cond;
int endbridge;
} vpb_bridge_t;
@@ -283,6 +286,8 @@ static struct vpb_pvt {
char language[MAX_LANGUAGE]; /* language being used */
char callerid[AST_MAX_EXTENSION]; /* CallerId used for directly connected phone */
int callerid_type; /* Caller ID type: 0=>none 1=>vpb 2=>AstV23 3=>AstBell */
+ char cid_num[AST_MAX_EXTENSION];
+ char cid_name[AST_MAX_EXTENSION];
int dtmf_caller_pos; /* DTMF CallerID detection (Brazil)*/
@@ -613,10 +618,10 @@ static void get_callerid(struct vpb_pvt *p)
int rc;
struct ast_channel *owner = p->owner;
/*
- void * ws;
char callerid[AST_MAX_EXTENSION] = "";
*/
#ifdef ANALYSE_CID
+ void * ws;
char * file="cidsams.wav";
#endif
@@ -628,7 +633,9 @@ static void get_callerid(struct vpb_pvt *p)
ast_verbose(VERBOSE_PREFIX_4 "CID record - start\n");
/* Skip any trailing ringtone */
- vpb_sleep(RING_SKIP);
+ if (UsePolarityCID != 1){
+ vpb_sleep(RING_SKIP);
+ }
if (option_verbose>3)
ast_verbose(VERBOSE_PREFIX_4 "CID record - skipped %ldms trailing ring\n",
@@ -675,7 +682,13 @@ static void get_callerid(struct vpb_pvt *p)
owner->cid.cid_num = strdup(cli_struct->cldn);
owner->cid.cid_name = strdup(cli_struct->cn);
*/
- ast_set_callerid(owner, cli_struct->cldn, cli_struct->cn, cli_struct->cldn);
+ if (owner){
+ ast_set_callerid(owner, cli_struct->cldn, cli_struct->cn, cli_struct->cldn);
+ } else {
+ strcpy(p->cid_num, cli_struct->cldn);
+ strcpy(p->cid_name, cli_struct->cn);
+
+ }
if (option_verbose>3)
ast_verbose(VERBOSE_PREFIX_4 "CID record - got [%s] [%s]\n",owner->cid.cid_num,owner->cid.cid_name );
snprintf(p->callerid,sizeof(p->callerid)-1,"%s %s",cli_struct->cldn,cli_struct->cn);
@@ -963,6 +976,12 @@ static inline int monitor_handle_owned(struct vpb_pvt *p, VPB_EVENT *e)
f.frametype = -1;
}
break;
+ case VPB_LOOP_ONHOOK:
+ if (p->owner->_state == AST_STATE_UP)
+ f.subclass = AST_CONTROL_HANGUP;
+ else
+ f.frametype = -1;
+ break;
case VPB_STATION_ONHOOK:
f.subclass = AST_CONTROL_HANGUP;
break;
@@ -1038,7 +1057,7 @@ static inline int monitor_handle_owned(struct vpb_pvt *p, VPB_EVENT *e)
ast_mutex_lock(&p->bridge->lock); {
p->bridge->endbridge = 1;
- pthread_cond_signal(&p->bridge->cond);
+ ast_cond_signal(&p->bridge->cond);
} ast_mutex_unlock(&p->bridge->lock);
}
}
@@ -1097,15 +1116,37 @@ static inline int monitor_handle_notowned(struct vpb_pvt *p, VPB_EVENT *e)
}
switch(e->type) {
+ case VPB_LOOP_ONHOOK:
+ case VPB_LOOP_POLARITY:
+ if (UsePolarityCID == 1){
+ if (option_verbose>3)
+ ast_verbose(VERBOSE_PREFIX_4 "Polarity reversal\n");
+ if(p->callerid_type == 1) {
+ if (option_verbose>3)
+ ast_verbose(VERBOSE_PREFIX_4 "Using VPB Caller ID\n");
+ get_callerid(p); /* UK CID before 1st ring*/
+ }
+/* get_callerid_ast(p); /* Caller ID using the ast functions */
+ }
+ break;
case VPB_RING:
if (p->mode == MODE_FXO) /* FXO port ring, start * */ {
vpb_new(p, AST_STATE_RING, p->context);
- if(p->callerid_type == 1) {
- if (option_verbose>3)
- ast_verbose(VERBOSE_PREFIX_4 "Using VPB Caller ID\n");
- get_callerid(p); /* Australian Caller ID only between 1st and 2nd ring */
+ if (UsePolarityCID != 1){
+ if(p->callerid_type == 1) {
+ if (option_verbose>3)
+ ast_verbose(VERBOSE_PREFIX_4 "Using VPB Caller ID\n");
+ get_callerid(p); /* Australian CID only between 1st and 2nd ring */
+ }
+ get_callerid_ast(p); /* Caller ID using the ast functions */
}
- get_callerid_ast(p); /* Caller ID using the ast functions */
+ else {
+ ast_log(LOG_ERROR, "Setting caller ID: %s %s\n",p->cid_num, p->cid_name);
+ ast_set_callerid(p->owner, p->cid_num, p->cid_name, p->cid_num);
+ p->cid_num[0]=0;
+ p->cid_name[0]=0;
+ }
+
vpb_timer_stop(p->ring_timer);
vpb_timer_start(p->ring_timer);
}
@@ -1460,7 +1501,7 @@ static void mkbrd(vpb_model_t model, int echo_cancel)
memset(bridges,0,max_bridges * sizeof(vpb_bridge_t));
for(int i = 0; i < max_bridges; i++ ) {
ast_mutex_init(&bridges[i].lock);
- pthread_cond_init(&bridges[i].cond, NULL);
+ ast_cond_init(&bridges[i].cond, NULL);
}
}
}
@@ -1477,7 +1518,7 @@ static void mkbrd(vpb_model_t model, int echo_cancel)
vpb_echo_canc_enable();
ast_log(LOG_NOTICE, "Voicetronix echo cancellation ON\n");
if (ec_supp_threshold > -1){
- vpb_echo_canc_set_sup_thresh((short *)&ec_supp_threshold);
+ vpb_echo_canc_set_sup_thresh(0,(short *)&ec_supp_threshold);
ast_log(LOG_NOTICE, "Voicetronix EC Sup Thres set\n");
}
}
@@ -2781,6 +2822,8 @@ int load_module()
callgroup = ast_get_group(v->value);
} else if (strcasecmp(v->name, "pickupgroup") == 0){
pickupgroup = ast_get_group(v->value);
+ } else if (strcasecmp(v->name, "usepolaritycid") == 0){
+ UsePolarityCID = atoi(v->value);
} else if (strcasecmp(v->name, "useloopdrop") == 0){
UseLoopDrop = atoi(v->value);
} else if (strcasecmp(v->name, "usenativebridge") == 0){
@@ -2949,7 +2992,7 @@ int unload_module()
ast_mutex_destroy(&bridge_lock);
for(int i = 0; i < max_bridges; i++ ) {
ast_mutex_destroy(&bridges[i].lock);
- pthread_cond_destroy(&bridges[i].cond);
+ ast_cond_destroy(&bridges[i].cond);
}
free(bridges);