diff options
author | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-09-27 19:50:03 +0000 |
---|---|---|
committer | markster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2004-09-27 19:50:03 +0000 |
commit | ecc3317016685aaf284ae70ffa7afb6ac1e02523 (patch) | |
tree | 5089219209dc6f21cedc7d518cf5fedb4d27e559 | |
parent | 1d7d247ab9d612f392b8f812e2afe33c1204a43d (diff) |
Fix negative cadences
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@461 5390a7c7-147a-4af0-8ec9-7488f05a26cb
-rwxr-xr-x | zaptel.c | 25 | ||||
-rwxr-xr-x | zaptel.h | 1 |
2 files changed, 23 insertions, 3 deletions
@@ -1989,7 +1989,8 @@ static int initialize_channel(struct zt_chan *chan) chan->afterdialingtimer = 0; chan->cadencepos = 0; - + chan->firstcadencepos = 0; /* By default loop back to first cadence position */ + /* HDLC & FCS stuff */ fasthdlc_init(&chan->rxhdlc); fasthdlc_init(&chan->txhdlc); @@ -3782,10 +3783,28 @@ static int zt_chanandpseudo_ioctl(struct inode *inode, struct file *file, unsign if (copy_from_user(&stack.cad, (struct zt_ring_cadence *)data, sizeof(stack.cad))) return -EIO; memcpy(chan->ringcadence, &stack.cad, sizeof(chan->ringcadence)); + chan->firstcadencepos = 0; + /* Looking for negative ringing time indicating where to loop back into ringcadence */ + for (i=0; i<ZT_MAX_CADENCE; i+=2 ) { + if (chan->ringcadence[i]<0) { + chan->ringcadence[i] *= -1; + chan->firstcadencepos = i; + break; + } + } } else { /* Reset to default */ + chan->firstcadencepos = 0; if (chan->curzone) { memcpy(chan->ringcadence, chan->curzone->ringcadence, sizeof(chan->ringcadence)); + /* Looking for negative ringing time indicating where to loop back into ringcadence */ + for (i=0; i<ZT_MAX_CADENCE; i+=2 ) { + if (chan->ringcadence[i]<0) { + chan->ringcadence[i] *= -1; + chan->firstcadencepos = i; + break; + } + } } else { memset(chan->ringcadence, 0, sizeof(chan->ringcadence)); chan->ringcadence[0] = chan->starttime; @@ -4888,11 +4907,11 @@ static inline void __rbs_otimer_expire(struct zt_chan *chan) /* Turn on the ringer now that the silent time has passed */ ++chan->cadencepos; if (chan->cadencepos >= ZT_MAX_CADENCE) - chan->cadencepos = 0; + chan->cadencepos = chan->firstcadencepos; len = chan->ringcadence[chan->cadencepos]; if (!len) { - chan->cadencepos = 0; + chan->cadencepos = chan->firstcadencepos; len = chan->ringcadence[chan->cadencepos]; } @@ -1021,6 +1021,7 @@ struct zt_chan { /* Ring cadence */ int ringcadence[ZT_MAX_CADENCE]; + int firstcadencepos; /* Where to restart ring cadence */ /* Digit string dialing stuff */ int digitmode; /* What kind of tones are we sending? */ |