From f8247040e6231c4b3b5099ea3a526348b7941566 Mon Sep 17 00:00:00 2001 From: russell Date: Sat, 19 Jan 2008 00:19:29 +0000 Subject: Creating tag for the release of asterisk-1.6.0-beta1 git-svn-id: http://svn.digium.com/svn/asterisk/tags/1.6.0-beta1@99163 f38db490-d61c-443f-a65b-d21fe96a405b --- trunk/codecs/codec_a_mu.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 trunk/codecs/codec_a_mu.c (limited to 'trunk/codecs/codec_a_mu.c') diff --git a/trunk/codecs/codec_a_mu.c b/trunk/codecs/codec_a_mu.c new file mode 100644 index 000000000..a478dc7af --- /dev/null +++ b/trunk/codecs/codec_a_mu.c @@ -0,0 +1,159 @@ +/* + * Asterisk -- An open source telephony toolkit. + * + * Copyright (C) 1999 - 2005, Digium, Inc. + * + * Mark Spencer + * + * See http://www.asterisk.org for more information about + * the Asterisk project. Please do not directly contact + * any of the maintainers of this project for assistance; + * the project provides a web site, mailing lists and IRC + * channels for your use. + * + * This program is free software, distributed under the terms of + * the GNU General Public License Version 2. See the LICENSE file + * at the top of the source tree. + */ + +/*! \file + * + * \brief codec_a_mu.c - translate between alaw and ulaw directly + * + * \ingroup codecs + */ + +#include "asterisk.h" + +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") + +#include "asterisk/module.h" +#include "asterisk/translate.h" +#include "asterisk/alaw.h" +#include "asterisk/ulaw.h" +#include "asterisk/utils.h" + +#define BUFFER_SAMPLES 8000 /* size for the translation buffers */ + +static unsigned char mu2a[256]; +static unsigned char a2mu[256]; + +/* Sample frame data (Mu data is okay) */ + +#include "ulaw_slin_ex.h" + +/*! \brief convert frame data and store into the buffer */ +static int alawtoulaw_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) +{ + int x = f->samples; + unsigned char *src = f->data; + unsigned char *dst = (unsigned char *)pvt->outbuf + pvt->samples; + + pvt->samples += x; + pvt->datalen += x; + + while (x--) + *dst++ = a2mu[*src++]; + + return 0; +} + +/*! \brief convert frame data and store into the buffer */ +static int ulawtoalaw_framein(struct ast_trans_pvt *pvt, struct ast_frame *f) +{ + int x = f->samples; + unsigned char *src = f->data; + unsigned char *dst = (unsigned char *)pvt->outbuf + pvt->samples; + + pvt->samples += x; + pvt->datalen += x; + + while (x--) + *dst++ = mu2a[*src++]; + + return 0; +} + +/* + * alawToLin_Sample. Just random data, somehow... + */ +static struct ast_frame *alawtoulaw_sample(void) +{ + static struct ast_frame f; + f.frametype = AST_FRAME_VOICE; + f.subclass = AST_FORMAT_ALAW; + f.datalen = sizeof(ulaw_slin_ex); + f.samples = sizeof(ulaw_slin_ex); + f.mallocd = 0; + f.offset = 0; + f.src = __PRETTY_FUNCTION__; + f.data = ulaw_slin_ex; /* XXX what ? */ + return &f; +} + +static struct ast_frame *ulawtoalaw_sample(void) +{ + static struct ast_frame f; + f.frametype = AST_FRAME_VOICE; + f.subclass = AST_FORMAT_ULAW; + f.datalen = sizeof(ulaw_slin_ex); + f.samples = sizeof(ulaw_slin_ex); + f.mallocd = 0; + f.offset = 0; + f.src = __PRETTY_FUNCTION__; + f.data = ulaw_slin_ex; + return &f; +} + +static struct ast_translator alawtoulaw = { + .name = "alawtoulaw", + .srcfmt = AST_FORMAT_ALAW, + .dstfmt = AST_FORMAT_ULAW, + .framein = alawtoulaw_framein, + .sample = alawtoulaw_sample, + .buffer_samples = BUFFER_SAMPLES, + .buf_size = BUFFER_SAMPLES, +}; + +static struct ast_translator ulawtoalaw = { + .name = "ulawtoalaw", + .srcfmt = AST_FORMAT_ULAW, + .dstfmt = AST_FORMAT_ALAW, + .framein = ulawtoalaw_framein, + .sample = ulawtoalaw_sample, + .buffer_samples = BUFFER_SAMPLES, + .buf_size = BUFFER_SAMPLES, +}; + +/*! \brief standard module glue */ + +static int unload_module(void) +{ + int res; + + res = ast_unregister_translator(&ulawtoalaw); + res |= ast_unregister_translator(&alawtoulaw); + + return res; +} + +static int load_module(void) +{ + int res; + int x; + + for (x=0;x<256;x++) { + mu2a[x] = AST_LIN2A(AST_MULAW(x)); + a2mu[x] = AST_LIN2MU(AST_ALAW(x)); + } + res = ast_register_translator(&alawtoulaw); + if (!res) + res = ast_register_translator(&ulawtoalaw); + else + ast_unregister_translator(&alawtoulaw); + if (res) + return AST_MODULE_LOAD_FAILURE; + return AST_MODULE_LOAD_SUCCESS; +} + +AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "A-law and Mulaw direct Coder/Decoder"); -- cgit v1.2.3