summaryrefslogtreecommitdiff
path: root/zaptel.c
diff options
context:
space:
mode:
authormarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-06-29 04:27:14 +0000
committermarkster <markster@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2004-06-29 04:27:14 +0000
commit19b6e02ceaa74830357aa8b47f97cbd1707e573d (patch)
tree998a09bd1127f6e494cfd0b046089439789e0698 /zaptel.c
parent045580fe74b31768c97a2e2b772c5ba843fa0d6a (diff)
Add signalling freeze/unfreeze ioctl (and get)
git-svn-id: http://svn.digium.com/svn/zaptel/trunk@427 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'zaptel.c')
-rwxr-xr-xzaptel.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/zaptel.c b/zaptel.c
index 5230bf4..b12229b 100755
--- a/zaptel.c
+++ b/zaptel.c
@@ -926,7 +926,7 @@ static void close_channel(struct zt_chan *chan)
chan->txgain = defgain;
chan->gainalloc = 0;
chan->eventinidx = chan->eventoutidx = 0;
- chan->flags &= ~(ZT_FLAG_LINEAR | ZT_FLAG_PPP);
+ chan->flags &= ~(ZT_FLAG_LINEAR | ZT_FLAG_PPP | ZT_FLAG_SIGFREEZE);
zt_set_law(chan,0);
@@ -3722,6 +3722,25 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm
return -ENOSYS;
switch(cmd) {
+ case ZT_SIGFREEZE:
+ get_user(j, (int *)data);
+ spin_lock_irqsave(&chan->lock, flags);
+ if (j) {
+ chan->flags |= ZT_FLAG_SIGFREEZE;
+ } else {
+ chan->flags &= ~ZT_FLAG_SIGFREEZE;
+ }
+ spin_unlock_irqrestore(&chan->lock, flags);
+ break;
+ case ZT_GETSIGFREEZE:
+ spin_lock_irqsave(&chan->lock, flags);
+ if (chan->flags & ZT_FLAG_SIGFREEZE)
+ j = 1;
+ else
+ j = 0;
+ spin_unlock_irqrestore(&chan->lock, flags);
+ put_user(j, (int *)data);
+ break;
case ZT_AUDIOMODE:
/* Only literal clear channels can be put in */
if (chan->sig != ZT_SIG_CLEAR) return (-EINVAL);
@@ -4820,6 +4839,8 @@ static void __zt_hooksig_pvt(struct zt_chan *chan, zt_rxsig_t rxsig)
called with chan->lock held */
if ((chan->rxhooksig) == rxsig) return;
+
+ if ((chan->flags & ZT_FLAG_SIGFREEZE)) return;
chan->rxhooksig = rxsig;
switch(chan->sig) {
@@ -4939,6 +4960,8 @@ void zt_rbsbits(struct zt_chan *chan, int cursig)
if (cursig == chan->rxsig)
return;
+ if ((chan->flags & ZT_FLAG_SIGFREEZE)) return;
+
spin_lock_irqsave(&chan->lock, flags);
switch(chan->sig) {
case ZT_SIG_FXOGS: /* FXO Groundstart */