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