#include "asterisk.h"
#include "asterisk/translate.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/utils.h"
#include <gsm/gsm.h>
#include "../formats/msgsm.h"
#include "asterisk/slin.h"
#include "ex_gsm.h"
Go to the source code of this file.
Data Structures | |
struct | gsm_translator_pvt |
Defines | |
#define | BUFFER_SAMPLES 8000 |
#define | GSM_FRAME_LEN 33 |
#define | GSM_SAMPLES 160 |
#define | MSGSM_FRAME_LEN 65 |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static void | gsm_destroy_stuff (struct ast_trans_pvt *pvt) |
static int | gsm_new (struct ast_trans_pvt *pvt) |
static int | gsmtolin_framein (struct ast_trans_pvt *pvt, struct ast_frame *f) |
decode and store in outbuf. | |
static int | lintogsm_framein (struct ast_trans_pvt *pvt, struct ast_frame *f) |
store samples into working buffer for later decode | |
static struct ast_frame * | lintogsm_frameout (struct ast_trans_pvt *pvt) |
encode and produce a frame | |
static int | load_module (void) |
static int | reload (void) |
standard module glue | |
static int | unload_module (void) |
Variables | |
static struct ast_module_info | __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "GSM Coder/Decoder" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .reload = reload, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_translator | gsmtolin |
static struct ast_translator | lintogsm |
Definition in file codec_gsm.c.
#define BUFFER_SAMPLES 8000 |
Definition at line 50 of file codec_gsm.c.
#define GSM_FRAME_LEN 33 |
Definition at line 52 of file codec_gsm.c.
Referenced by gsmtolin_framein(), and lintogsm_frameout().
#define GSM_SAMPLES 160 |
Definition at line 51 of file codec_gsm.c.
Referenced by gsm_read(), gsm_sample(), gsm_seek(), gsm_tell(), gsmtolin_framein(), lintogsm_frameout(), and wav_read().
#define MSGSM_FRAME_LEN 65 |
static void __reg_module | ( | void | ) | [static] |
Definition at line 230 of file codec_gsm.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 230 of file codec_gsm.c.
static void gsm_destroy_stuff | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 162 of file codec_gsm.c.
References gsm_translator_pvt::gsm, and ast_trans_pvt::pvt.
00163 { 00164 struct gsm_translator_pvt *tmp = pvt->pvt; 00165 if (tmp->gsm) 00166 gsm_destroy(tmp->gsm); 00167 }
static int gsm_new | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 64 of file codec_gsm.c.
References gsm_translator_pvt::gsm, and ast_trans_pvt::pvt.
00065 { 00066 struct gsm_translator_pvt *tmp = pvt->pvt; 00067 00068 return (tmp->gsm = gsm_create()) ? 0 : -1; 00069 }
static int gsmtolin_framein | ( | struct ast_trans_pvt * | pvt, | |
struct ast_frame * | f | |||
) | [static] |
decode and store in outbuf.
Definition at line 72 of file codec_gsm.c.
References ast_log(), BUFFER_SAMPLES, conv65(), ast_trans_pvt::datalen, f, gsm_translator_pvt::gsm, GSM_FRAME_LEN, GSM_SAMPLES, ast_trans_pvt::i16, len(), LOG_WARNING, MSGSM_FRAME_LEN, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00073 { 00074 struct gsm_translator_pvt *tmp = pvt->pvt; 00075 int x; 00076 int16_t *dst = pvt->outbuf.i16; 00077 /* guess format from frame len. 65 for MSGSM, 33 for regular GSM */ 00078 int flen = (f->datalen % MSGSM_FRAME_LEN == 0) ? 00079 MSGSM_FRAME_LEN : GSM_FRAME_LEN; 00080 00081 for (x=0; x < f->datalen; x += flen) { 00082 unsigned char data[2 * GSM_FRAME_LEN]; 00083 unsigned char *src; 00084 int len; 00085 if (flen == MSGSM_FRAME_LEN) { 00086 len = 2*GSM_SAMPLES; 00087 src = data; 00088 /* Translate MSGSM format to Real GSM format before feeding in */ 00089 /* XXX what's the point here! we should just work 00090 * on the full format. 00091 */ 00092 conv65(f->data.ptr + x, data); 00093 } else { 00094 len = GSM_SAMPLES; 00095 src = f->data.ptr + x; 00096 } 00097 /* XXX maybe we don't need to check */ 00098 if (pvt->samples + len > BUFFER_SAMPLES) { 00099 ast_log(LOG_WARNING, "Out of buffer space\n"); 00100 return -1; 00101 } 00102 if (gsm_decode(tmp->gsm, src, dst + pvt->samples)) { 00103 ast_log(LOG_WARNING, "Invalid GSM data (1)\n"); 00104 return -1; 00105 } 00106 pvt->samples += GSM_SAMPLES; 00107 pvt->datalen += 2 * GSM_SAMPLES; 00108 if (flen == MSGSM_FRAME_LEN) { 00109 if (gsm_decode(tmp->gsm, data + GSM_FRAME_LEN, dst + pvt->samples)) { 00110 ast_log(LOG_WARNING, "Invalid GSM data (2)\n"); 00111 return -1; 00112 } 00113 pvt->samples += GSM_SAMPLES; 00114 pvt->datalen += 2 * GSM_SAMPLES; 00115 } 00116 } 00117 return 0; 00118 }
static int lintogsm_framein | ( | struct ast_trans_pvt * | pvt, | |
struct ast_frame * | f | |||
) | [static] |
store samples into working buffer for later decode
Definition at line 121 of file codec_gsm.c.
References ast_log(), gsm_translator_pvt::buf, BUFFER_SAMPLES, f, LOG_WARNING, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00122 { 00123 struct gsm_translator_pvt *tmp = pvt->pvt; 00124 00125 /* XXX We should look at how old the rest of our stream is, and if it 00126 is too old, then we should overwrite it entirely, otherwise we can 00127 get artifacts of earlier talk that do not belong */ 00128 if (pvt->samples + f->samples > BUFFER_SAMPLES) { 00129 ast_log(LOG_WARNING, "Out of buffer space\n"); 00130 return -1; 00131 } 00132 memcpy(tmp->buf + pvt->samples, f->data.ptr, f->datalen); 00133 pvt->samples += f->samples; 00134 return 0; 00135 }
static struct ast_frame* lintogsm_frameout | ( | struct ast_trans_pvt * | pvt | ) | [static] |
encode and produce a frame
Definition at line 138 of file codec_gsm.c.
References ast_trans_frameout(), gsm_translator_pvt::buf, ast_trans_pvt::c, gsm_translator_pvt::gsm, GSM_FRAME_LEN, GSM_SAMPLES, ast_trans_pvt::outbuf, ast_trans_pvt::pvt, and ast_trans_pvt::samples.
00139 { 00140 struct gsm_translator_pvt *tmp = pvt->pvt; 00141 int datalen = 0; 00142 int samples = 0; 00143 00144 /* We can't work on anything less than a frame in size */ 00145 if (pvt->samples < GSM_SAMPLES) 00146 return NULL; 00147 while (pvt->samples >= GSM_SAMPLES) { 00148 /* Encode a frame of data */ 00149 gsm_encode(tmp->gsm, tmp->buf + samples, (gsm_byte *) pvt->outbuf.c + datalen); 00150 datalen += GSM_FRAME_LEN; 00151 samples += GSM_SAMPLES; 00152 pvt->samples -= GSM_SAMPLES; 00153 } 00154 00155 /* Move the data at the end of the buffer to the front */ 00156 if (pvt->samples) 00157 memmove(tmp->buf, tmp->buf + samples, pvt->samples * 2); 00158 00159 return ast_trans_frameout(pvt, datalen, samples); 00160 }
static int load_module | ( | void | ) | [static] |
Definition at line 212 of file codec_gsm.c.
References AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_translator, ast_unregister_translator(), gsmtolin, and lintogsm.
00213 { 00214 int res; 00215 00216 res = ast_register_translator(&gsmtolin); 00217 if (!res) 00218 res=ast_register_translator(&lintogsm); 00219 else 00220 ast_unregister_translator(&gsmtolin); 00221 if (res) 00222 return AST_MODULE_LOAD_FAILURE; 00223 return AST_MODULE_LOAD_SUCCESS; 00224 }
static int reload | ( | void | ) | [static] |
standard module glue
Definition at line 196 of file codec_gsm.c.
References AST_MODULE_LOAD_SUCCESS.
00197 { 00198 return AST_MODULE_LOAD_SUCCESS; 00199 }
static int unload_module | ( | void | ) | [static] |
Definition at line 201 of file codec_gsm.c.
References ast_unregister_translator(), gsmtolin, and lintogsm.
00202 { 00203 int res; 00204 00205 res = ast_unregister_translator(&lintogsm); 00206 if (!res) 00207 res = ast_unregister_translator(&gsmtolin); 00208 00209 return res; 00210 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "GSM Coder/Decoder" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .reload = reload, } [static] |
Definition at line 230 of file codec_gsm.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 230 of file codec_gsm.c.
struct ast_translator gsmtolin [static] |
struct ast_translator lintogsm [static] |