/ added new function to use the Asterisk callerid functions.
authorBen Kramer <bkramer@voicetronix.com.au>
Mon, 29 Nov 2004 23:20:16 +0000 (23:20 +0000)
committerBen Kramer <bkramer@voicetronix.com.au>
Mon, 29 Nov 2004 23:20:16 +0000 (23:20 +0000)
/ 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

channels/chan_vpb.c

index b0e2d95..da3be5b 100755 (executable)
@@ -18,6 +18,8 @@
  */
 
 
+extern "C" {
+
 #include <stdio.h>
 #include <string.h>
 #include <asterisk/lock.h>
 #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>
 
 #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
-*/
+/**/