From 072ccc9b69a0c80313c7b70ffe58f916e9eb14d8 Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Wed, 20 Oct 2010 12:23:11 +0000 Subject: [PATCH] dahdi_echocan_oslec: Call olsec_hpf_tx if CONFIG_DAHDI_PROCESS_ECHOCAN_TX is defined. It can be necessary to have low frequency filter for tx signal of DAHDI. Otherwise, low-frequency signal from IP can reach a leased line, and return back with nonlinear distortions. This will break an echo canceler. (closes issue #13562) Reported by: biohumanoid Patches: dahdi_echocan_oslec.c.patch uploaded by biohumanoid (license 459) I slightly modified the above patch in order to use echocan_process_tx as the interface. Signed-off-by: Shaun Ruffell Acked-by: Kinsey Moore Acked-by: Russ Meyerriecks git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@9443 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/dahdi_echocan_oslec.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/dahdi/dahdi_echocan_oslec.c b/drivers/dahdi/dahdi_echocan_oslec.c index abbeb51..661877c 100644 --- a/drivers/dahdi/dahdi_echocan_oslec.c +++ b/drivers/dahdi/dahdi_echocan_oslec.c @@ -43,6 +43,10 @@ static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams * static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec); static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size); static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val); +#ifdef CONFIG_DAHDI_ECHOCAN_PROCESS_TX +static void echo_can_hpf_tx(struct dahdi_echocan_state *ec, + short *tx, u32 size); +#endif static const struct dahdi_echocan_factory my_factory = { .name = "OSLEC", @@ -55,6 +59,9 @@ static const struct dahdi_echocan_ops my_ops = { .echocan_free = echo_can_free, .echocan_process = echo_can_process, .echocan_traintap = echo_can_traintap, +#ifdef CONFIG_DAHDI_ECHOCAN_PROCESS_TX + .echocan_process_tx = echo_can_hpf_tx, +#endif }; struct ec_pvt { @@ -118,6 +125,21 @@ static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val) return 1; } +#ifdef CONFIG_DAHDI_ECHOCAN_PROCESS_TX +static void echo_can_hpf_tx(struct dahdi_echocan_state *ec, short *tx, u32 size) +{ + struct ec_pvt *pvt = dahdi_to_pvt(ec); + u32 SampleNum; + + for (SampleNum = 0; SampleNum < size; SampleNum++, tx++) { + short iCleanSample; + + iCleanSample = oslec_hpf_tx(pvt->oslec, *tx); + *tx = iCleanSample; + } +} +#endif + static int __init mod_init(void) { if (dahdi_register_echocan_factory(&my_factory)) {