Add support for Sigma Designs cards. These basically allow you to offload dialtone...
authorJoshua Colp <jcolp@digium.com>
Tue, 8 Aug 2006 17:02:45 +0000 (17:02 +0000)
committerJoshua Colp <jcolp@digium.com>
Tue, 8 Aug 2006 17:02:45 +0000 (17:02 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@39349 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_phone.c
configs/phone.conf.sample

index 668db2f..0e1548c 100644 (file)
@@ -128,8 +128,9 @@ static int restart_monitor(void);
    
 #define MODE_DIALTONE  1
 #define MODE_IMMEDIATE 2
-#define MODE_FXO               3
+#define MODE_FXO       3
 #define MODE_FXS        4
+#define MODE_SIGMA      5
 
 static struct phone_pvt {
        int fd;                                                 /* Raw file descriptor for this device */
@@ -915,7 +916,7 @@ static void phone_check_exception(struct phone_pvt *i)
        phonee.bytes = ioctl(i->fd, PHONE_EXCEPTION);
        if (phonee.bits.dtmf_ready)  {
                digit[0] = ioctl(i->fd, PHONE_GET_DTMF_ASCII);
-               if (i->mode == MODE_DIALTONE || i->mode == MODE_FXS) {
+               if (i->mode == MODE_DIALTONE || i->mode == MODE_FXS || i->mode == MODE_SIGMA) {
                        ioctl(i->fd, PHONE_PLAY_STOP);
                        ioctl(i->fd, PHONE_REC_STOP);
                        ioctl(i->fd, PHONE_CPT_STOP);
@@ -967,6 +968,16 @@ static void phone_check_exception(struct phone_pvt *i)
                                ioctl(i->fd, PHONE_PLAY_CODEC, ULAW);
                                ioctl(i->fd, PHONE_PLAY_START);
                                i->lastformat = -1;
+                       } else if (i->mode == MODE_SIGMA) {
+                               ast_mutex_lock(&usecnt_lock);
+                               usecnt++;
+                               ast_mutex_unlock(&usecnt_lock);
+                               ast_update_use_count();
+                               /* Reset the extension */
+                               i->ext[0] = '\0';
+                               /* Play the dialtone */
+                               i->dialtone++;
+                               ioctl(i->fd, PHONE_DIALTONE);
                        }
                } else {
                        if (i->dialtone) {
@@ -1032,7 +1043,7 @@ static void *do_monitor(void *data)
                                FD_SET(i->fd, &efds);
                                if (i->fd > n)
                                        n = i->fd;
-                               if (i->dialtone) {
+                               if (i->dialtone && i->mode != MODE_SIGMA) {
                                        /* Remember we're going to have to come back and play
                                           more dialtones */
                                        if (ast_tvzero(tv)) {
@@ -1050,7 +1061,7 @@ static void *do_monitor(void *data)
                ast_mutex_unlock(&iflock);
 
                /* Wait indefinitely for something to happen */
-               if (dotone) {
+               if (dotone && i->mode != MODE_SIGMA) {
                        /* If we're ready to recycle the time, set it to 30 ms */
                        tonepos += 240;
                        if (tonepos >= sizeof(DialTone))
@@ -1366,6 +1377,8 @@ static int load_module(void *mod)
                } else if (!strcasecmp(v->name, "mode")) {
                        if (!strncasecmp(v->value, "di", 2)) 
                                mode = MODE_DIALTONE;
+                       else if (!strncasecmp(v->value, "sig", 3))
+                               mode = MODE_SIGMA;
                        else if (!strncasecmp(v->value, "im", 2))
                                mode = MODE_IMMEDIATE;
                        else if (!strncasecmp(v->value, "fxs", 3)) {
index ca028f9..82909f2 100644 (file)
 ; immediately provides the PBX without reading any digits or providing 
 ; any dialtone (this is the immediate mode, the default).  Also, you
 ; can set the mode to "fxo" if you have a linejack to make it operate
-; properly.
+; properly. If you are using a Sigma Designs board you may set this to
+; "sig".
 ;
 mode=immediate
 ;mode=dialtone
 ;mode=fxo
+;mode=sig
 ;
 ; You can decide which format to use by default, "g723.1" or "slinear".
 ; XXX Be careful, sometimes the card causes kernel panics when running