diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp.h ./dsp.h --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp.h 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp.h 2008-01-12 21:44:00.000000000 +0100 @@ -115,7 +115,7 @@ #define DSP_DTMF_NPOINTS 102 -#define ECHOCAN_BUFLEN 4*128 +#define ECHOCAN_BUFLEN 10*128 typedef struct _dtmf_t { int treshold; /* above this is dtmf (square of) */ diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_cancel.h ./dsp_cancel.h --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_cancel.h 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_cancel.h 2008-01-12 22:19:27.000000000 +0100 @@ -55,14 +55,13 @@ uint16_t echolastupdate; char txbuf[ECHOCAN_BUFLEN]; int txbuflen; - char rxbuf[ECHOCAN_BUFLEN]; - int rxbuflen; int underrun; int overflow; + int delay; } ec_prv_t; static inline void * -dsp_cancel_new(int deftaps, int training) +dsp_cancel_new(int deftaps, int training, int delay) { ec_prv_t *p; @@ -78,10 +77,17 @@ p->echostate = training ? ECHO_STATE_PRETRAINING : ECHO_STATE_IDLE; p->echolastupdate = 0; p->txbuflen = 0; - p->rxbuflen = 0; p->underrun = 0; p->overflow = 0; + if (delay < 0) { + delay = 0; + } else if (delay > 512) { + delay = 512; + } + + p->delay = delay; + return p; err2: @@ -166,7 +172,7 @@ if (!p || !data) return; - if (len <= p->txbuflen) { + if (len + p->delay <= p->txbuflen) { char tmp[ECHOCAN_BUFLEN]; int delta = p->txbuflen - len; @@ -177,7 +183,7 @@ memcpy(p->txbuf, tmp, delta); p->txbuflen = delta; } else { - if (p->underrun >= 4000) { + if (p->underrun >= 4000 + p->delay) { printk("ECHOCAN: TXBUF Underrun:%d txbuflen:%d " "rxcancellen:%d\n", p->underrun, p->txbuflen, len); p->underrun = 0; diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_kb1ec.c ./dsp_kb1ec.c --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_kb1ec.c 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_kb1ec.c 2008-01-12 21:38:29.000000000 +0100 @@ -34,6 +34,7 @@ { int deftaps = 128, training = 0, + delay = 0, len; if (!arg) @@ -66,13 +67,16 @@ } else if (!strcmp(name, "training")) { if (sscanf(val, "%d", &tmp) == 1) training = tmp; + } else if (!strcmp(name, "delay")) { + if (sscanf(val, "%d", &tmp) == 1) + delay = tmp; } } } _out: - printk(KERN_DEBUG "%s: creating %s with deftaps=%d and training=%d\n", __FUNCTION__, EC_TYPE, deftaps, training); - return dsp_cancel_new(deftaps, training); + printk(KERN_DEBUG "%s: creating %s with deftaps=%d, training=%d and delay=%d\n", __FUNCTION__, EC_TYPE, deftaps, training, delay); + return dsp_cancel_new(deftaps, training, delay); } static void free (void *p) @@ -93,6 +97,7 @@ static mISDN_dsp_element_arg_t args[] = { { "deftaps", "128", "Set the number of taps of cancellation." }, { "training", "0", "Enable echotraining (0: disabled, 1: enabled)." }, + { "delay", "0", "Compensate for driver delay (number of taps)." }, }; static mISDN_dsp_element_t dsp_kb1ec = { diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_mec2.c ./dsp_mec2.c --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_mec2.c 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_mec2.c 2008-01-12 21:39:13.000000000 +0100 @@ -35,6 +35,7 @@ { int deftaps = 128, training = 0, + delay = 0, len; if (!arg) @@ -67,13 +68,16 @@ } else if (!strcmp(name, "training")) { if (sscanf(val, "%d", &tmp) == 1) training = tmp; + } else if (!strcmp(name, "delay")) { + if (sscanf(val, "%d", &tmp) == 1) + delay = tmp; } } } _out: - printk(KERN_DEBUG "%s: creating %s with deftaps=%d and training=%d\n", __FUNCTION__, EC_TYPE, deftaps, training); - return dsp_cancel_new(deftaps, training); + printk(KERN_DEBUG "%s: creating %s with deftaps=%d, training=%d and delay=%d\n", __FUNCTION__, EC_TYPE, deftaps, training, delay); + return dsp_cancel_new(deftaps, training, delay); } static void free (void *p) @@ -94,6 +98,7 @@ static mISDN_dsp_element_arg_t args[] = { { "deftaps", "128", "Set the number of taps of cancellation." }, { "training", "0", "Enable echotraining (0: disabled, 1: enabled)." }, + { "delay", "0", "Compensate for driver delay (number of taps)." }, }; static mISDN_dsp_element_t dsp_mec2 = { diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_mg2ec.c ./dsp_mg2ec.c --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_mg2ec.c 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_mg2ec.c 2008-01-12 22:22:46.000000000 +0100 @@ -34,6 +34,7 @@ { int deftaps = 128, training = 0, + delay = 0, len; if (!arg) @@ -66,13 +67,16 @@ } else if (!strcmp(name, "training")) { if (sscanf(val, "%d", &tmp) == 1) training = tmp; + } else if (!strcmp(name, "delay")) { + if (sscanf(val, "%d", &tmp) == 1) + delay = tmp; } } } _out: - printk(KERN_DEBUG "%s: creating %s with deftaps=%d and training=%d\n", __FUNCTION__, EC_TYPE, deftaps, training); - return dsp_cancel_new(deftaps, training); + printk(KERN_DEBUG "%s: creating %s with deftaps=%d, training=%d and delay=%d\n", __FUNCTION__, EC_TYPE, deftaps, training, delay); + return dsp_cancel_new(deftaps, training, delay); } static void free (void *p) @@ -93,6 +97,7 @@ static mISDN_dsp_element_arg_t args[] = { { "deftaps", "128", "Set the number of taps of cancellation." }, { "training", "0", "Enable echotraining (0: disabled, 1: enabled)." }, + { "delay", "0", "Compensate for driver delay (number of taps)." }, }; static mISDN_dsp_element_t dsp_mg2ec = { diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_octwareec.c ./dsp_octwareec.c --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_octwareec.c 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_octwareec.c 2008-01-12 22:23:38.000000000 +0100 @@ -35,6 +35,7 @@ { int deftaps = 128, training = 0, + delay = 0, len; if (!arg) @@ -67,13 +68,16 @@ } else if (!strcmp(name, "training")) { if (sscanf(val, "%d", &tmp) == 1) training = tmp; + } else if (!strcmp(name, "delay")) { + if (sscanf(val, "%d", &tmp) == 1) + delay = tmp; } } } _out: - printk(KERN_DEBUG "%s: creating %s with deftaps=%d and training=%d\n", __FUNCTION__, EC_TYPE, deftaps, training); - return dsp_cancel_new(deftaps, training); + printk(KERN_DEBUG "%s: creating %s with deftaps=%d, training=%d and delay=%d\n", __FUNCTION__, EC_TYPE, deftaps, training, delay); + return dsp_cancel_new(deftaps, training, delay); } static void free (void *p) @@ -94,6 +98,7 @@ static mISDN_dsp_element_arg_t args[] = { { "deftaps", "128", "Set the number of taps of cancellation." }, { "training", "0", "Enable echotraining (0: disabled, 1: enabled)." }, + { "delay", "0", "Compensate for driver delay (number of taps)." }, }; static mISDN_dsp_element_t dsp_octwareec = { diff -ur /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_oslec.c ./dsp_oslec.c --- /home/peter/src/mISDN.git/mISDN/drivers/isdn/hardware/mISDN/dsp_oslec.c 2008-01-03 21:45:40.000000000 +0100 +++ ./dsp_oslec.c 2008-01-12 21:49:05.000000000 +0100 @@ -41,7 +41,7 @@ static void* new (const char *arg) { int deftaps = 128, - training = 0, + delay = 0, len; if (!arg) @@ -71,16 +71,16 @@ if (!strcmp(name, "deftaps")) { if (sscanf(val, "%d", &tmp) == 1) deftaps = tmp; - } else if (!strcmp(name, "training")) { + } else if (!strcmp(name, "delay")) { if (sscanf(val, "%d", &tmp) == 1) - training = tmp; + delay = tmp; } } } _out: - printk(KERN_DEBUG "%s: creating %s with deftaps=%d and training=%d\n", __FUNCTION__, EC_TYPE, deftaps, training); - return dsp_cancel_new(deftaps, training); + printk(KERN_DEBUG "%s: creating %s with deftaps=%d and delay=%d\n", __FUNCTION__, EC_TYPE, deftaps, delay); + return dsp_cancel_new(deftaps, 0, delay); } static void free (void *p) @@ -100,7 +100,7 @@ static mISDN_dsp_element_arg_t args[] = { { "deftaps", "128", "Set the number of taps of cancellation." }, - { "training", "0", "Enable echotraining (0: disabled, 1: enabled)." }, + { "delay", "0", "Compensate for driver delay (number of taps)." }, }; static mISDN_dsp_element_t dsp_oslec = {