Revert inadvertant code commit to app_originate
[asterisk/asterisk.git] / codecs / codec_ulaw.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief codec_ulaw.c - translate between signed linear and ulaw
22  * 
23  * \ingroup codecs
24  */
25
26 #include "asterisk.h"
27
28 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
29
30 #include "asterisk/module.h"
31 #include "asterisk/config.h"
32 #include "asterisk/translate.h"
33 #include "asterisk/ulaw.h"
34 #include "asterisk/utils.h"
35
36 #define BUFFER_SAMPLES   8096   /* size for the translation buffers */
37
38 /* Sample frame data */
39 #include "asterisk/slin.h"
40 #include "ex_ulaw.h"
41
42 /*! \brief convert and store samples in outbuf */
43 static int ulawtolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
44 {
45         int i = f->samples;
46         unsigned char *src = f->data.ptr;
47         int16_t *dst = pvt->outbuf.i16 + pvt->samples;
48
49         pvt->samples += i;
50         pvt->datalen += i * 2;  /* 2 bytes/sample */
51
52         /* convert and copy in outbuf */
53         while (i--)
54                 *dst++ = AST_MULAW(*src++);
55
56         return 0;
57 }
58
59 /*! \brief convert and store samples in outbuf */
60 static int lintoulaw_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
61 {
62         int i = f->samples;
63         char *dst = pvt->outbuf.c + pvt->samples;
64         int16_t *src = f->data.ptr;
65
66         pvt->samples += i;
67         pvt->datalen += i;      /* 1 byte/sample */
68
69         while (i--)
70                 *dst++ = AST_LIN2MU(*src++);
71
72         return 0;
73 }
74
75 /*!
76  * \brief The complete translator for ulawToLin.
77  */
78
79 static struct ast_translator ulawtolin = {
80         .name = "ulawtolin",
81         .srcfmt = AST_FORMAT_ULAW,
82         .dstfmt = AST_FORMAT_SLINEAR,
83         .framein = ulawtolin_framein,
84         .sample = ulaw_sample,
85         .buffer_samples = BUFFER_SAMPLES,
86         .buf_size = BUFFER_SAMPLES * 2,
87         .plc_samples = 160,
88 };
89
90 /*!
91  * \brief The complete translator for LinToulaw.
92  */
93
94 static struct ast_translator lintoulaw = {
95         .name = "lintoulaw",
96         .srcfmt = AST_FORMAT_SLINEAR,
97         .dstfmt = AST_FORMAT_ULAW,
98         .framein = lintoulaw_framein,
99         .sample = slin8_sample,
100         .buf_size = BUFFER_SAMPLES,
101         .buffer_samples = BUFFER_SAMPLES,
102 };
103
104 static int parse_config(int reload)
105 {
106         struct ast_variable *var;
107         struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
108         struct ast_config *cfg = ast_config_load("codecs.conf", config_flags);
109         if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID)
110                 return 0;
111         for (var = ast_variable_browse(cfg, "plc"); var; var = var->next) {
112                 if (!strcasecmp(var->name, "genericplc")) {
113                         ulawtolin.useplc = ast_true(var->value) ? 1 : 0;
114                         ast_verb(3, "codec_ulaw: %susing generic PLC\n", ulawtolin.useplc ? "" : "not ");
115                 }
116         }
117         ast_config_destroy(cfg);
118         return 0;
119 }
120
121 static int reload(void)
122 {
123         if (parse_config(1))
124                 return AST_MODULE_LOAD_DECLINE;
125         return AST_MODULE_LOAD_SUCCESS;
126 }
127
128 static int unload_module(void)
129 {
130         int res;
131
132         res = ast_unregister_translator(&lintoulaw);
133         res |= ast_unregister_translator(&ulawtolin);
134
135         return res;
136 }
137
138 static int load_module(void)
139 {
140         int res;
141
142         if (parse_config(0))
143                 return AST_MODULE_LOAD_DECLINE;
144         res = ast_register_translator(&ulawtolin);
145         if (!res)
146                 res = ast_register_translator(&lintoulaw);
147         else
148                 ast_unregister_translator(&ulawtolin);
149         if (res)
150                 return AST_MODULE_LOAD_FAILURE;
151         return AST_MODULE_LOAD_SUCCESS;
152 }
153
154 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "mu-Law Coder/Decoder",
155                 .load = load_module,
156                 .unload = unload_module,
157                 .reload = reload,
158                );