aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_phone.c
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2006-08-08 17:02:45 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2006-08-08 17:02:45 +0000
commit20239ec3e733f155fe4dd6f17affb8e858bcaf15 (patch)
tree7557ae2f009c08305e18ef6c3ac0544be9caa2a8 /channels/chan_phone.c
parent19338ec7929d5207adda4b4611f95cfec4cc27fc (diff)
Add support for Sigma Designs cards. These basically allow you to offload dialtone generation to the board. If you're using a quicknet board where this might work, give it a try as well. (issue #6092 reported by ywalther - minor mods by moi)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@39349 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_phone.c')
-rw-r--r--channels/chan_phone.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/channels/chan_phone.c b/channels/chan_phone.c
index 668db2fb3..0e1548cc3 100644
--- a/channels/chan_phone.c
+++ b/channels/chan_phone.c
@@ -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)) {