/ added new function to use the Asterisk callerid functions.

/ set callerid=v23|bell to use the asterisk based function
/ set callerid=on to use the vpb caller id function


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4354 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Ben Kramer 21 years ago
parent 46927aa38b
commit 862cebad5c

@ -18,6 +18,8 @@
*/
extern "C" {
#include <stdio.h>
#include <string.h>
#include <asterisk/lock.h>
@ -29,6 +31,10 @@
#include <asterisk/module.h>
#include <asterisk/pbx.h>
#include <asterisk/options.h>
#include <asterisk/callerid.h>
}
#include <sys/socket.h>
#include <sys/time.h>
#include <errno.h>
@ -58,11 +64,11 @@
#define MAX_VPB_GAIN 12.0
/*
/**/
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
*/
/**/
static char *desc = "VoiceTronix V6PCI/V12PCI/V4PCI API Support";
static char *type = "vpb";
@ -476,12 +482,9 @@ static void get_callerid(struct vpb_pvt *p)
double cid_record_time;
int rc;
struct ast_channel *owner = p->owner;
void * ws;
char * file="cidsams.wav";
if(!strcasecmp(p->callerid, "on")) {
if (option_verbose>3)
ast_verbose(VERBOSE_PREFIX_4 "Caller ID disabled\n");
return;
}
if( ast_mutex_trylock(&p->record_lock) == 0 ) {
@ -503,6 +506,11 @@ static void get_callerid(struct vpb_pvt *p)
vpb_record_buf_start(p->handle, VPB_LINEAR);
rc = vpb_record_buf_sync(p->handle, (char*)buf, sizeof(buf));
vpb_record_buf_finish(p->handle);
/*
vpb_wave_open_write(&ws, file, VPB_LINEAR);
vpb_wave_write(ws,(char*)buf,sizeof(buf));
vpb_wave_close_write(ws);
*/
if (option_verbose>3)
ast_verbose(VERBOSE_PREFIX_4 "CID record - recorded %fms between rings\n",
@ -546,6 +554,91 @@ static void get_callerid(struct vpb_pvt *p)
} else
ast_log(LOG_ERROR, "CID record - Failed to set record mode for caller id on %s\n", p->dev );
}
static void get_callerid_ast(struct vpb_pvt *p)
{
struct callerid_state *cs;
char buf[1024];
char *name=NULL, *number=NULL;
int flags;
int rc=0,vrc;
int sam_count=0;
struct ast_channel *owner = p->owner;
float old_gain;
int which_cid;
void * ws;
char * file="cidsams.wav";
if(!strcasecmp(p->callerid, "on")) {
if (option_verbose>3) ast_verbose(VERBOSE_PREFIX_4 "Collected caller ID already\n");
return;
}
else if(!strcasecmp(p->callerid, "v23")) {
which_cid=CID_SIG_V23;
if (option_verbose>3) ast_verbose(VERBOSE_PREFIX_4 "Collecting Caller ID v23[%s/%d]...\n",p->callerid,which_cid);
}
else if(!strcasecmp(p->callerid, "bell")) {
which_cid=CID_SIG_BELL;
if (option_verbose>3) ast_verbose(VERBOSE_PREFIX_4 "Collecting Caller ID bell[%s/%d]...\n",p->callerid,which_cid);
}
else {
if (option_verbose>3)
ast_verbose(VERBOSE_PREFIX_4 "Caller ID disabled\n");
return;
}
if (option_verbose>3) ast_verbose(VERBOSE_PREFIX_4 "Collecting Caller ID type[%s/%d]...\n",p->callerid,which_cid);
// vpb_sleep(RING_SKIP);
// vpb_record_get_gain(p->handle, &old_gain);
cs = callerid_new(which_cid);
if (cs){
// vpb_wave_open_write(&ws, file, VPB_MULAW);
// vpb_record_set_gain(p->handle, 3.0);
// vpb_record_set_hw_gain(p->handle,12.0);
vpb_record_buf_start(p->handle, VPB_MULAW);
while((rc == 0)&&(sam_count<8000*3)){
vrc = vpb_record_buf_sync(p->handle, (char*)buf, sizeof(buf));
if (vrc != VPB_OK)
ast_log(LOG_ERROR, "%s: Caller ID couldnt read audio buffer!\n",p->dev);
rc = callerid_feed(cs,(unsigned char *)buf,sizeof(buf),AST_FORMAT_ULAW);
vpb_wave_write(ws,(char*)buf,sizeof(buf));
sam_count+=sizeof(buf);
if (option_verbose>3) ast_verbose(VERBOSE_PREFIX_4 "Collecting Caller ID samples [%d][%d]...\n",sam_count,rc);
}
vpb_record_buf_finish(p->handle);
// vpb_wave_close_write(ws);
if (rc == 1){
callerid_get(cs, &name, &number, &flags);
if (option_verbose>0)
ast_verbose(VERBOSE_PREFIX_1 "%s: Caller ID name [%s] number [%s] flags [%d]\n",p->dev,name, number,flags);
}
else {
ast_log(LOG_ERROR, "%s: Failed to decode Caller ID \n", p->dev );
}
// vpb_record_set_gain(p->handle, old_gain);
// vpb_record_set_hw_gain(p->handle,6.0);
}
else {
ast_log(LOG_ERROR, "%s: Failed to create Caller ID struct\n", p->dev );
}
if (owner->cid.cid_num) {
free(owner->cid.cid_num);
owner->cid.cid_num = NULL;
}
if (owner->cid.cid_name) {
free(owner->cid.cid_name);
owner->cid.cid_name = NULL;
}
if (number)
ast_shrink_phone_number(number);
if (number && !ast_strlen_zero(number)) {
owner->cid.cid_num = strdup(number);
owner->cid.cid_ani = strdup(number);
}
if (name && !ast_strlen_zero(name))
owner->cid.cid_name = strdup(name);
if (cs)
callerid_free(cs);
}
// Terminate any tones we are presently playing
static void stoptone( int handle)
@ -807,7 +900,12 @@ static inline int monitor_handle_notowned(struct vpb_pvt *p, VPB_EVENT *e)
case VPB_RING:
if (p->mode == MODE_FXO) /* FXO port ring, start * */ {
vpb_new(p, AST_STATE_RING, p->context);
get_callerid(p); /* Australian Caller ID only between 1st and 2nd ring */
if(!strcasecmp(p->callerid, "on")) {
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
}
get_callerid_ast(p); // Caller ID using the ast functions
}
break;
@ -949,27 +1047,27 @@ static void *do_monitor(void *unused)
p = NULL;
ast_mutex_lock(&monlock); {
vpb_translate_event(&e, str);
if (e.type == VPB_NULL_EVENT) {
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Monitor got null event\n");
goto done; /* Nothing to do, just a wakeup call.*/
}
if (strlen(str)>1){
str[(strlen(str)-1)]='\0';
}
else {
vpb_translate_event(&e, str);
if (strlen(str)>1){
str[(strlen(str)-1)]='\0';
}
ast_mutex_lock(&iflock); {
p = iflist;
while (p && p->handle != e.handle)
p = p->next;
} ast_mutex_unlock(&iflock);
ast_mutex_lock(&iflock); {
p = iflist;
while (p && p->handle != e.handle)
p = p->next;
} ast_mutex_unlock(&iflock);
if (p && (option_verbose > 3))
ast_verbose(VERBOSE_PREFIX_4 "%s: Event [%d=>%s] \n",
p ? p->dev : "null", e.type, str );
done: (void)0;
if (p && (option_verbose > 3))
ast_verbose(VERBOSE_PREFIX_4 "%s: Event [%d=>%s] \n",
p ? p->dev : "null", e.type, str );
}
} ast_mutex_unlock(&monlock);
@ -1042,32 +1140,31 @@ static int restart_monitor(void)
error = -1;
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Monitor trying to kill monitor\n");
goto done;
}
if (mthreadactive != -1) {
/* Why do other drivers kill the thread? No need says I, simply awake thread with event. */
VPB_EVENT e;
e.handle = 0;
e.type = VPB_NULL_EVENT;
e.data = 0;
else {
if (mthreadactive != -1) {
/* Why do other drivers kill the thread? No need says I, simply awake thread with event. */
VPB_EVENT e;
e.handle = 0;
e.type = VPB_NULL_EVENT;
e.data = 0;
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Trying to reawake monitor\n");
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Trying to reawake monitor\n");
vpb_put_event(&e);
} else {
/* Start a new monitor */
int pid = ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL);
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Created new monitor thread %d\n",pid);
if (pid < 0) {
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
error = -1;
goto done;
} else
mthreadactive = 0; /* Started the thread!*/
vpb_put_event(&e);
} else {
/* Start a new monitor */
int pid = ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL);
if (option_verbose > 3)
ast_verbose(VERBOSE_PREFIX_4 "Created new monitor thread %d\n",pid);
if (pid < 0) {
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
error = -1;
} else
mthreadactive = 0; /* Started the thread!*/
}
}
done: (void)0;
} ast_mutex_unlock(&monlock);
if (option_verbose > 3)
@ -2241,8 +2338,7 @@ int load_module()
tmp->next = iflist;
iflist = tmp;
} else {
ast_log(LOG_ERROR,
"Unable to register channel '%s'\n", v->value);
ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value);
error = -1;
goto done;
}
@ -2399,8 +2495,8 @@ char *key()
return ASTERISK_GPL_KEY;
}
/*
/**/
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
*/
/**/

Loading…
Cancel
Save