diff options
author | Tzafrir Cohen <tzafrir@cohens.org.il> | 2010-01-05 20:12:48 +0200 |
---|---|---|
committer | Tzafrir Cohen <tzafrir@cohens.org.il> | 2010-01-05 20:12:48 +0200 |
commit | a4ee69b5300fddb961c6f0c521d204d849e52a0c (patch) | |
tree | 844e20af088a4c7a6799b93e1b07617848641a98 /drivers/dahdi/dahdi_echocan_oslec.c | |
parent | 7f2c8c423162af1f81bfbea5a3185b457d2cdcb5 (diff) |
Introduce the build system
The Makefile supports either building modules locally or generating a
patch vs. dahdi-linux SVN.
* drivers/dahdi/{Kbuild,Kconfig} - will be merged with existing ones
* dahdi_echocan_oslec.c: Copied as-is from dahdi. Provides a better
sanity check that the 'echo' module was built OK.
Diffstat (limited to 'drivers/dahdi/dahdi_echocan_oslec.c')
-rw-r--r-- | drivers/dahdi/dahdi_echocan_oslec.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/drivers/dahdi/dahdi_echocan_oslec.c b/drivers/dahdi/dahdi_echocan_oslec.c new file mode 100644 index 0000000..a8d38b9 --- /dev/null +++ b/drivers/dahdi/dahdi_echocan_oslec.c @@ -0,0 +1,143 @@ +/* + * DAHDI Telephony Interface to the Open Source Line Echo Canceller (OSLEC) + * + * Written by Tzafrir Cohen <tzafrir.cohen@xorcom.com> + * Copyright (C) 2008 Xorcom, Inc. + * + * All rights reserved. + * + * Based on dahdi_echocan_hpec.c, Copyright (C) 2006-2008 Digium, Inc. + * + * 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. + */ + +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/ctype.h> +#include <linux/moduleparam.h> + +/* Fix this if OSLEC is elsewhere */ +#include "../staging/echo/oslec.h" +//#include <linux/oslec.h> + +#include <dahdi/kernel.h> + +#define module_printk(level, fmt, args...) printk(level "%s: " fmt, THIS_MODULE->name, ## args) + +static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, + struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec); +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); + +static const struct dahdi_echocan_factory my_factory = { + .name = "OSLEC", + .owner = THIS_MODULE, + .echocan_create = echo_can_create, +}; + +static const struct dahdi_echocan_ops my_ops = { + .name = "OSLEC", + .echocan_free = echo_can_free, + .echocan_process = echo_can_process, + .echocan_traintap = echo_can_traintap, +}; + +struct ec_pvt { + struct oslec_state *oslec; + struct dahdi_echocan_state dahdi; +}; + +#define dahdi_to_pvt(a) container_of(a, struct ec_pvt, dahdi) + +static void echo_can_free(struct dahdi_chan *chan, struct dahdi_echocan_state *ec) +{ + struct ec_pvt *pvt = dahdi_to_pvt(ec); + + oslec_free(pvt->oslec); + kfree(pvt); +} + +static void echo_can_process(struct dahdi_echocan_state *ec, short *isig, const short *iref, u32 size) +{ + struct ec_pvt *pvt = dahdi_to_pvt(ec); + u32 SampleNum; + + for (SampleNum = 0; SampleNum < size; SampleNum++, iref++) { + short iCleanSample; + + iCleanSample = oslec_update(pvt->oslec, *iref, *isig); + *isig++ = iCleanSample; + } +} + +static int echo_can_create(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, + struct dahdi_echocanparam *p, struct dahdi_echocan_state **ec) +{ + struct ec_pvt *pvt; + + if (ecp->param_count > 0) { + printk(KERN_WARNING "OSLEC does not support parameters; failing request\n"); + return -EINVAL; + } + + pvt = kzalloc(sizeof(*pvt), GFP_KERNEL); + if (!pvt) + return -ENOMEM; + + pvt->dahdi.ops = &my_ops; + + pvt->oslec = oslec_create(ecp->tap_length, ECHO_CAN_USE_ADAPTION | ECHO_CAN_USE_NLP | ECHO_CAN_USE_CLIP | ECHO_CAN_USE_TX_HPF | ECHO_CAN_USE_RX_HPF); + + if (!pvt->oslec) { + kfree(pvt); + *ec = NULL; + return -ENOTTY; + } else { + *ec = &pvt->dahdi; + return 0; + } +} + +static int echo_can_traintap(struct dahdi_echocan_state *ec, int pos, short val) +{ + return 1; +} + +static int __init mod_init(void) +{ + if (dahdi_register_echocan_factory(&my_factory)) { + module_printk(KERN_ERR, "could not register with DAHDI core\n"); + + return -EPERM; + } + + module_printk(KERN_INFO, "Registered echo canceler '%s'\n", my_factory.name); + + return 0; +} + +static void __exit mod_exit(void) +{ + dahdi_unregister_echocan_factory(&my_factory); +} + +MODULE_DESCRIPTION("DAHDI OSLEC wrapper"); +MODULE_AUTHOR("Tzafrir Cohen <tzafrir.cohen@xorcom.com>"); +MODULE_LICENSE("GPL"); + +module_init(mod_init); +module_exit(mod_exit); |