packages: zaptel-alt/zaptel-alt.spec, zaptel-alt/zaptel-1.4.12.1.patch (NEW...
arekm
arekm at pld-linux.org
Tue Jan 19 10:48:27 CET 2010
Author: arekm Date: Tue Jan 19 09:48:27 2010 GMT
Module: packages Tag: HEAD
---- Log message:
- update oslec patch
---- Files affected:
packages/zaptel-alt:
zaptel-alt.spec (1.22 -> 1.23) , zaptel-1.4.12.1.patch (NONE -> 1.1) (NEW), zaptel-alt-oslec.patch (1.1 -> NONE) (REMOVED)
---- Diffs:
================================================================
Index: packages/zaptel-alt/zaptel-alt.spec
diff -u packages/zaptel-alt/zaptel-alt.spec:1.22 packages/zaptel-alt/zaptel-alt.spec:1.23
--- packages/zaptel-alt/zaptel-alt.spec:1.22 Tue Jan 19 10:44:10 2010
+++ packages/zaptel-alt/zaptel-alt.spec Tue Jan 19 10:48:21 2010
@@ -51,7 +51,8 @@
Source6: %{FIRMWARE_URL}/zaptel-fw-tc400m-MR6.12.tar.gz
# Source6-md5: c57f41fae88f129e14fcaf41e4df90dc
Patch0: %{name}-make.patch
-Patch1: %{name}-oslec.patch
+# http://svn.astfin.org/software/oslec/trunk/kernel/zaptel-1.4.12.1.patch
+Patch1: zaptel-1.4.12.1.patch
Patch2: %{name}-bristuff.patch
Patch3: %{name}-sparc.patch
Patch4: %{name}-kernel.patch
@@ -340,6 +341,9 @@
All persons listed below can be reached at <cvs_login>@pld-linux.org
$Log$
+Revision 1.23 2010/01/19 09:48:21 arekm
+- update oslec patch
+
Revision 1.22 2010/01/19 09:44:10 arekm
- agressive echo cancellation
================================================================
Index: packages/zaptel-alt/zaptel-1.4.12.1.patch
diff -u /dev/null packages/zaptel-alt/zaptel-1.4.12.1.patch:1.1
--- /dev/null Tue Jan 19 10:48:27 2010
+++ packages/zaptel-alt/zaptel-1.4.12.1.patch Tue Jan 19 10:48:21 2010
@@ -0,0 +1,373 @@
+diff -ruN zaptel-1.4.12.1-orig/kernel/oslec.h zaptel-1.4.12.1/kernel/oslec.h
+--- zaptel-1.4.12.1-orig/kernel/oslec.h 1970-01-01 02:00:00.000000000 +0200
++++ zaptel-1.4.12.1/kernel/oslec.h 2009-03-05 17:24:10.000000000 +0200
+@@ -0,0 +1,44 @@
++/*
++ oslec.h
++ David Rowe
++ 7 Feb 2007
++
++ Interface for OSLEC module.
++*/
++
++/*
++ Copyright (C) 2007 David Rowe
++
++ All rights reserved.
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License version 2, as
++ published by the Free Software Foundation.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __OSLEC__
++#define __OSLEC__
++
++struct echo_can_state {
++ void *ec;
++};
++
++struct echo_can_state *oslec_echo_can_create(int len, int adaption_mode);
++void oslec_echo_can_free(struct echo_can_state *ec);
++short oslec_echo_can_update(struct echo_can_state *ec, short iref, short isig);
++int oslec_echo_can_traintap(struct echo_can_state *ec, int pos, short val);
++void oslec_echo_can_identify(char *buf, size_t len);
++static inline void echo_can_init(void) { printk("Zaptel Echo Canceller: OSLEC\n"); }
++static inline void echo_can_shutdown(void) {}
++short oslec_hpf_tx(struct echo_can_state *ec, short txlin);
++
++#endif
+diff -ruN zaptel-1.4.12.1-orig/kernel/zaptel-base.c zaptel-1.4.12.1/kernel/zaptel-base.c
+--- zaptel-1.4.12.1-orig/kernel/zaptel-base.c 2009-03-05 16:40:01.000000000 +0200
++++ zaptel-1.4.12.1/kernel/zaptel-base.c 2009-03-06 16:10:39.000000000 +0200
+@@ -444,10 +444,35 @@
+ #include "kb1ec.h"
+ #elif defined(ECHO_CAN_MG2)
+ #include "mg2ec.h"
++/* Start Open Source Line Echo Canceller (OSLEC) -----------------*/
++#elif defined(ECHO_CAN_OSLEC)
++#include "oslec.h"
++#define echo_can_create_noparams oslec_echo_can_create
++#define echo_can_free oslec_echo_can_free
++#define echo_can_update oslec_echo_can_update
++#define echo_can_traintap oslec_echo_can_traintap
++#define echo_can_identify oslec_echo_can_identify
++#define ECHO_CAN_NO_PARAMS
++/* End Open Source Line Echo Canceller (OSLEC) -------------------*/
+ #elif defined(ECHO_CAN_JP1)
+ #include "jpah.h"
+ #endif
+
++#ifdef ECHO_CAN_NO_PARAMS
++/* A wrapper to the original echo can interface, with no parameters */
++static int echo_can_create(struct zt_echocanparams *ecp, struct zt_echocanparam *p,
++ struct echo_can_state **ec)
++{
++ /* ignore the parameters */
++ /* TODO: maybe fail if the user passes us parameters? or at
++ * least list their number? */
++ *ec = echo_can_create_noparams(ecp->tap_length, 0);
++ if (!ec)
++ return -EINVAL; /* an arbitrary error */
++ return 0;
++}
++#endif
++
+ static inline void rotate_sums(void)
+ {
+ /* Rotate where we sum and so forth */
+@@ -6299,6 +6324,70 @@
+ spin_unlock_irqrestore(&chan->lock, flags);
+ }
+
++/* Zaptap code -----------------------------------------------------------*/
++
++#define SAMPLE_BUF_SZ 1000
++#define SAMPLE_IDLE 0
++#define SAMPLE_PING 1
++#define SAMPLE_PONG 2
++
++DECLARE_WAIT_QUEUE_HEAD(sample_wait);
++static int sample_state = 0;
++static int samples = 0;
++static short *psample;
++static short ping[3*SAMPLE_BUF_SZ];
++static short pong[3*SAMPLE_BUF_SZ];
++static int sample_ch = 1;
++static int sample_impulse = 0;
++static int tmp1,tmp2;
++
++static inline void sample_echo_before(int channo, short rxlin, short txlin) {
++
++ // Sample echo canceller signals
++ // Notes:
++ // 1. Samples are multiplexed in buffer:
++ // tx sample
++ // rx sample
++ // ec sample
++ // 2. We needs to sample rx here before echo can as it is
++ // overwritten.
++
++ tmp1++;
++ tmp2 = channo;
++ if ((sample_state != SAMPLE_IDLE) && (channo == sample_ch)) {
++ *psample++ = txlin;
++ *psample++ = rxlin;
++ }
++}
++
++static inline void sample_echo_after(int channo, short rxlin) {
++
++ if ((sample_state != SAMPLE_IDLE) && (channo == sample_ch)) {
++
++ *psample++ = rxlin;
++
++ // sample collection ping-pong buffer logic
++
++ samples++;
++ if (samples >= SAMPLE_BUF_SZ) {
++ // time to swap buffers
++ samples = 0;
++
++ if (sample_state == SAMPLE_PING) {
++ sample_state = SAMPLE_PONG;
++ psample = pong;
++ }
++ else {
++ sample_state = SAMPLE_PING;
++ psample = ping;
++ }
++ wake_up_interruptible(&sample_wait);
++ }
++ }
++}
++
++/* end Zaptap code -----------------------------------------------------*/
++
+ static inline void __zt_ec_chunk(struct zt_chan *ss, unsigned char *rxchunk, const unsigned char *txchunk)
+ {
+ short rxlin, txlin;
+@@ -6349,7 +6438,9 @@
+ #if !defined(ZT_EC_ARRAY_UPDATE)
+ for (x=0;x<ZT_CHUNKSIZE;x++) {
+ rxlin = ZT_XLAW(rxchunk[x], ss);
++ sample_echo_before(ss->channo, rxlin, ZT_XLAW(txchunk[x], ss)); /* Zaptap code */
+ rxlin = echo_can_update(ss->ec, ZT_XLAW(txchunk[x], ss), rxlin);
++ sample_echo_after(ss->channo, rxlin); /* Zaptap code */
+ rxchunk[x] = ZT_LIN2X((int) rxlin, ss);
+ }
+ #else /* defined(ZT_EC_ARRAY_UPDATE) */
+@@ -7251,6 +7342,8 @@
+ static void __zt_transmit_chunk(struct zt_chan *chan, unsigned char *buf)
+ {
+ unsigned char silly[ZT_CHUNKSIZE];
++ int x;
++
+ /* Called with chan->lock locked */
+ #ifdef OPTIMIZE_CHANMUTE
+ if(likely(chan->chanmute))
+@@ -7269,10 +7362,29 @@
+ kernel_fpu_end();
+ #endif
+ }
++
++ /* Start Zaptap code -----------------------------------------*/
++
++ if (sample_impulse && (samples == 0)) {
++
++ // option impulse insertion, tx stream becomes one
++ // impulse followed by SAMPLE_BUF_SZ-1 0's
++
++ buf[0] = ZT_LIN2MU(10000);
++ for (x=1;x<ZT_CHUNKSIZE;x++) {
++ buf[x] = ZT_LIN2MU(0);
++ }
++ }
++
++ /* End Zaptap code -----------------------------------------*/
++
+ }
+
+ static inline void __zt_real_transmit(struct zt_chan *chan)
+ {
++ short txlin;
++ int x;
++
+ /* Called with chan->lock held */
+ #ifdef OPTIMIZE_CHANMUTE
+ if(likely(chan->chanmute))
+@@ -7284,6 +7396,19 @@
+ } else {
+ __zt_transmit_chunk(chan, chan->writechunk);
+ }
++
++ /* return, if no echo canceler have been allocated. */
++
++ if (!chan->ec) return;
++
++ /* hook to allow HPF filtering of audio leaving tx (D/A) port, this
++ inproves performance when using soft phones */
++
++ for (x=0;x<ZT_CHUNKSIZE;x++) {
++ txlin = ZT_XLAW(chan->writechunk[x], chan);
++ txlin = oslec_hpf_tx(chan->ec, txlin);
++ chan->writechunk[x] = ZT_LIN2X((int)txlin, chan);
++ }
+ }
+
+ static void __zt_getempty(struct zt_chan *ms, unsigned char *buf)
+@@ -7733,6 +7858,104 @@
+ return 0;
+ }
+
++/* Zaptap code -----------------------------------------------------*/
++
++static int sample_open (struct inode *inode, struct file *file) {
++ printk("sample_open:\n");
++ tmp1 = tmp2 = -1;
++
++ psample = ping;
++ samples = 0;
++ sample_state = SAMPLE_PING;
++
++ return 0;
++}
++
++static int sample_release (struct inode *inode, struct file *file) {
++ printk("sample_release: tmp1 = %d tmp2 = %d\n", tmp1, tmp2);
++
++ sample_state = SAMPLE_IDLE;
++ sample_impulse = 0;
++ samples = 0;
++
++ return 0;
++}
++
++static ssize_t sample_read(struct file *file, char *buf,
++ size_t count, loff_t *ppos) {
++ int err, len;
++ short *pread;
++
++ /* wait for next buffer to be prepared by ISR, we read
++ alternate buffer just after transition.
++ */
++ interruptible_sleep_on(&sample_wait);
++
++ if (sample_state == SAMPLE_PING) {
++ pread = pong;
++ }
++ else {
++ pread = ping;
++ }
++
++ len = 3*sizeof(short)*SAMPLE_BUF_SZ;
++ err = copy_to_user(buf, pread, len);
++
++ if (err != 0)
++ return -EFAULT;
++
++ return len;
++}
++
++/* ioctls for sample */
++
++#define SAMPLE_SET_CHANNEL 0
++#define SAMPLE_TX_IMPULSE 1
++
++static int sample_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg) {
++ int retval = 0;
++
++ switch ( cmd ) {
++ case SAMPLE_SET_CHANNEL:
++ if (copy_from_user(&sample_ch, (int *)arg, sizeof(int)))
++ return -EFAULT;
++ printk("sample_ioctl: sample_ch = %d\n", sample_ch);
++ break;
++ case SAMPLE_TX_IMPULSE:
++ sample_impulse = 1;
++ printk("sample_ioctl: under impulse power\n");
++ break;
++ default:
++ retval = -EINVAL;
++ }
++
++ return retval;
++}
++
++// define which file operations are supported
++struct file_operations sample_fops = {
++ .owner = THIS_MODULE,
++ .llseek = NULL,
++ .read = sample_read,
++ .write = NULL,
++ .readdir= NULL,
++ .poll = NULL,
++ .ioctl = sample_ioctl,
++ .mmap = NULL,
++ .open = sample_open,
++ .flush = NULL,
++ .release= sample_release,
++ .fsync = NULL,
++ .fasync = NULL,
++ .lock = NULL
++};
++
++#define SAMPLE_NAME "sample"
++#define SAMPLE_MAJOR 33
++
++/* end Zaptap code -----------------------------------------------------*/
++
+ static int __init zt_init(void) {
+ int res = 0;
+
+@@ -7777,12 +8000,27 @@
+ #ifdef CONFIG_ZAPTEL_WATCHDOG
+ watchdog_init();
+ #endif
++
++ /* start Zaptap code ----------------------------------------*/
++
++ sample_state = SAMPLE_IDLE;
++ sample_impulse = 0;
++ if ((res = register_chrdev (SAMPLE_MAJOR, SAMPLE_NAME, &sample_fops))) {
++ printk(KERN_ERR "Zaptap unable to register 'sample' char driver on %d\n", SAMPLE_MAJOR);
++ return res;
++ }
++ printk("Zaptap registered 'sample' char driver on major %d\n", SAMPLE_MAJOR);
++
++ /* end Zaptap code ------------------------------------------*/
++
+ return res;
+ }
+
+ static void __exit zt_cleanup(void) {
+ int x;
+
++ unregister_chrdev (SAMPLE_MAJOR, SAMPLE_NAME); /* Zaptap code */
++
+ #ifdef CONFIG_PROC_FS
+ remove_proc_entry("zaptel", NULL);
+ #endif
+diff -ruN zaptel-1.4.12.1-orig/kernel/zconfig.h zaptel-1.4.12.1/kernel/zconfig.h
+--- zaptel-1.4.12.1-orig/kernel/zconfig.h 2009-03-05 16:40:01.000000000 +0200
++++ zaptel-1.4.12.1/kernel/zconfig.h 2009-03-05 17:18:55.000000000 +0200
+@@ -78,7 +78,8 @@
+ /* #define ECHO_CAN_STEVE2 */
+ /* #define ECHO_CAN_KB1 */
+ /* This is the new latest and greatest */
+-#define ECHO_CAN_MG2
++//#define ECHO_CAN_MG2
++#define ECHO_CAN_OSLEC
+
+ /*
+ * This is only technically an "echo canceller"...
================================================================
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/zaptel-alt/zaptel-alt.spec?r1=1.22&r2=1.23&f=u
More information about the pld-cvs-commit
mailing list