diff options
author | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-07-20 16:19:47 +0000 |
---|---|---|
committer | mattf <mattf@5390a7c7-147a-4af0-8ec9-7488f05a26cb> | 2007-07-20 16:19:47 +0000 |
commit | b1acf2d381141c8b547821b2c15f0405380d1d08 (patch) | |
tree | df25ce4ee633b1a20db7bff2125c7839349d30b5 /zaptel-base.c | |
parent | 5f9e02f2f237393c4be0ccddbca008087e1c2efe (diff) |
New product support, new echo canceler and new boards
git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@2761 5390a7c7-147a-4af0-8ec9-7488f05a26cb
Diffstat (limited to 'zaptel-base.c')
-rw-r--r-- | zaptel-base.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/zaptel-base.c b/zaptel-base.c index 256a66a..6166759 100644 --- a/zaptel-base.c +++ b/zaptel-base.c @@ -1035,13 +1035,14 @@ static void close_channel(struct zt_chan *chan) memset(chan->conflast1, 0, sizeof(chan->conflast1)); memset(chan->conflast2, 0, sizeof(chan->conflast2)); - if (chan->span && chan->span->echocan) - chan->span->echocan(chan, 0); if (chan->span && chan->span->dacs && oldconf) chan->span->dacs(chan, NULL); spin_unlock_irqrestore(&chan->lock, flags); + if (chan->span && chan->span->echocan) + chan->span->echocan(chan, 0); + if (rxgain) kfree(rxgain); if (ec) @@ -2193,9 +2194,11 @@ static int initialize_channel(struct zt_chan *chan) chan->ringcadence[0] = chan->starttime; chan->ringcadence[1] = ZT_RINGOFFTIME; } + + spin_unlock_irqrestore(&chan->lock, flags); + if (chan->span && chan->span->echocan) chan->span->echocan(chan, 0); - spin_unlock_irqrestore(&chan->lock, flags); if (rxgain) kfree(rxgain); @@ -4166,9 +4169,10 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm chan->txgain = defgain; chan->gainalloc = 0; /* Disable any native echo cancellation as well */ + spin_unlock_irqrestore(&chan->lock, flags); + if (chan->span && chan->span->echocan) chan->span->echocan(chan, 0); - spin_unlock_irqrestore(&chan->lock, flags); if (rxgain) kfree(rxgain); @@ -4272,10 +4276,13 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm tec = chan->ec; chan->ec = NULL; /* Attempt hardware native echo can */ + spin_unlock_irqrestore(&chan->lock, flags); + if (chan->span && chan->span->echocan) ret = chan->span->echocan(chan, j); else ret = -ENOTTY; + if (ret) { /* Use built-in echo can */ if ((j == 32) || @@ -4286,7 +4293,6 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm } else { j = deftaps; } - spin_unlock_irqrestore(&chan->lock, flags); ec = echo_can_create(j, 0); if (!ec) return -ENOMEM; @@ -4298,8 +4304,8 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm chan->echotimer = 0; echo_can_disable_detector_init(&chan->txecdis); echo_can_disable_detector_init(&chan->rxecdis); + spin_unlock_irqrestore(&chan->lock, flags); } - spin_unlock_irqrestore(&chan->lock, flags); if (tec) echo_can_free(tec); } else { @@ -4310,10 +4316,10 @@ static int zt_chan_ioctl(struct inode *inode, struct file *file, unsigned int cm chan->echostate = ECHO_STATE_IDLE; chan->echolastupdate = 0; chan->echotimer = 0; + spin_unlock_irqrestore(&chan->lock, flags); /* Attempt hardware native echo can */ if (chan->span && chan->span->echocan) chan->span->echocan(chan, 0); - spin_unlock_irqrestore(&chan->lock, flags); if (tec) echo_can_free(tec); } |