Resample slinear audio. More...
#include "asterisk.h"
#include <values.h>
#include <limits.h>
#include <libresample.h>
#include "asterisk/module.h"
#include "asterisk/translate.h"
#include "asterisk/slin.h"
Go to the source code of this file.
Data Structures | |
struct | slin16_to_slin8_pvt |
struct | slin8_to_slin16_pvt |
Defines | |
#define | OUTBUF_SIZE 8096 |
#define | RESAMPLER_QUALITY 1 |
Functions | |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"SLIN Resampling Codec") | |
static int | load_module (void) |
static int | resample_frame (struct ast_trans_pvt *pvt, void *resampler, float resample_factor, struct ast_frame *f) |
static void | slin16_to_slin8_destroy (struct ast_trans_pvt *pvt) |
static int | slin16_to_slin8_framein (struct ast_trans_pvt *pvt, struct ast_frame *f) |
static int | slin16_to_slin8_new (struct ast_trans_pvt *pvt) |
static void | slin8_to_slin16_destroy (struct ast_trans_pvt *pvt) |
static int | slin8_to_slin16_framein (struct ast_trans_pvt *pvt, struct ast_frame *f) |
static int | slin8_to_slin16_new (struct ast_trans_pvt *pvt) |
static int | unload_module (void) |
Variables | |
static struct ast_translator | slin16_to_slin8 |
static struct ast_translator | slin8_to_slin16 |
Resample slinear audio.
$ svn co http://svn.digium.com/svn/thirdparty/libresample/trunk
Definition in file codec_resample.c.
#define OUTBUF_SIZE 8096 |
Definition at line 57 of file codec_resample.c.
#define RESAMPLER_QUALITY 1 |
Definition at line 55 of file codec_resample.c.
Referenced by slin16_to_slin8_new(), and slin8_to_slin16_new().
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"SLIN Resampling Codec" | ||||
) |
static int load_module | ( | void | ) | [static] |
Definition at line 208 of file codec_resample.c.
References AST_MODULE_LOAD_SUCCESS, and ast_register_translator.
00209 { 00210 int res = 0; 00211 00212 res |= ast_register_translator(&slin16_to_slin8); 00213 res |= ast_register_translator(&slin8_to_slin16); 00214 00215 return AST_MODULE_LOAD_SUCCESS; 00216 }
static int resample_frame | ( | struct ast_trans_pvt * | pvt, | |
void * | resampler, | |||
float | resample_factor, | |||
struct ast_frame * | f | |||
) | [static] |
Definition at line 109 of file codec_resample.c.
References ARRAY_LEN, ast_log(), ast_frame::data, ast_trans_pvt::datalen, ast_trans_pvt::i16, LOG_ERROR, ast_trans_pvt::outbuf, ast_frame::ptr, ast_frame::samples, and ast_trans_pvt::samples.
Referenced by slin16_to_slin8_framein(), and slin8_to_slin16_framein().
00111 { 00112 int total_in_buf_used = 0; 00113 int total_out_buf_used = 0; 00114 int16_t *in_buf = (int16_t *) f->data.ptr; 00115 int16_t *out_buf = pvt->outbuf.i16 + pvt->samples; 00116 float in_buf_f[f->samples]; 00117 float out_buf_f[2048]; 00118 int res = 0; 00119 int i; 00120 00121 for (i = 0; i < f->samples; i++) 00122 in_buf_f[i] = in_buf[i] * (FLT_MAX / SHRT_MAX); 00123 00124 while (total_in_buf_used < f->samples) { 00125 int in_buf_used, out_buf_used; 00126 00127 out_buf_used = resample_process(resampler, resample_factor, 00128 &in_buf_f[total_in_buf_used], f->samples - total_in_buf_used, 00129 0, &in_buf_used, 00130 &out_buf_f[total_out_buf_used], ARRAY_LEN(out_buf_f) - total_out_buf_used); 00131 00132 if (out_buf_used < 0) 00133 break; 00134 00135 total_out_buf_used += out_buf_used; 00136 total_in_buf_used += in_buf_used; 00137 00138 if (total_out_buf_used == ARRAY_LEN(out_buf_f)) { 00139 ast_log(LOG_ERROR, "Output buffer filled ... need to increase its size\n"); 00140 res = -1; 00141 break; 00142 } 00143 } 00144 00145 for (i = 0; i < total_out_buf_used; i++) 00146 out_buf[i] = out_buf_f[i] * (SHRT_MAX / FLT_MAX); 00147 00148 pvt->samples += total_out_buf_used; 00149 pvt->datalen += (total_out_buf_used * sizeof(int16_t)); 00150 00151 return res; 00152 }
static void slin16_to_slin8_destroy | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 93 of file codec_resample.c.
References ast_trans_pvt::pvt, and slin16_to_slin8_pvt::resampler.
00094 { 00095 struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt; 00096 00097 if (resamp_pvt->resampler) 00098 resample_close(resamp_pvt->resampler); 00099 }
static int slin16_to_slin8_framein | ( | struct ast_trans_pvt * | pvt, | |
struct ast_frame * | f | |||
) | [static] |
Definition at line 154 of file codec_resample.c.
References ast_trans_pvt::pvt, slin16_to_slin8_pvt::resample_factor, resample_frame(), and slin16_to_slin8_pvt::resampler.
00155 { 00156 struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt; 00157 void *resampler = resamp_pvt->resampler; 00158 float resample_factor = resamp_pvt->resample_factor; 00159 00160 return resample_frame(pvt, resampler, resample_factor, f); 00161 }
static int slin16_to_slin8_new | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 69 of file codec_resample.c.
References ast_trans_pvt::pvt, slin16_to_slin8_pvt::resample_factor, slin16_to_slin8_pvt::resampler, and RESAMPLER_QUALITY.
00070 { 00071 struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt; 00072 00073 resamp_pvt->resample_factor = 8000.0 / 16000.0; 00074 00075 if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor))) 00076 return -1; 00077 00078 return 0; 00079 }
static void slin8_to_slin16_destroy | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 101 of file codec_resample.c.
References ast_trans_pvt::pvt, and slin8_to_slin16_pvt::resampler.
00102 { 00103 struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt; 00104 00105 if (resamp_pvt->resampler) 00106 resample_close(resamp_pvt->resampler); 00107 }
static int slin8_to_slin16_framein | ( | struct ast_trans_pvt * | pvt, | |
struct ast_frame * | f | |||
) | [static] |
Definition at line 163 of file codec_resample.c.
References ast_trans_pvt::pvt, slin8_to_slin16_pvt::resample_factor, resample_frame(), and slin8_to_slin16_pvt::resampler.
00164 { 00165 struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt; 00166 void *resampler = resamp_pvt->resampler; 00167 float resample_factor = resamp_pvt->resample_factor; 00168 00169 return resample_frame(pvt, resampler, resample_factor, f); 00170 }
static int slin8_to_slin16_new | ( | struct ast_trans_pvt * | pvt | ) | [static] |
Definition at line 81 of file codec_resample.c.
References ast_trans_pvt::pvt, slin8_to_slin16_pvt::resample_factor, slin8_to_slin16_pvt::resampler, and RESAMPLER_QUALITY.
00082 { 00083 struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt; 00084 00085 resamp_pvt->resample_factor = 16000.0 / 8000.0; 00086 00087 if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor))) 00088 return -1; 00089 00090 return 0; 00091 }
static int unload_module | ( | void | ) | [static] |
Definition at line 198 of file codec_resample.c.
References ast_unregister_translator().
00199 { 00200 int res = 0; 00201 00202 res |= ast_unregister_translator(&slin16_to_slin8); 00203 res |= ast_unregister_translator(&slin8_to_slin16); 00204 00205 return res; 00206 }
struct ast_translator slin16_to_slin8 [static] |
Definition at line 172 of file codec_resample.c.
struct ast_translator slin8_to_slin16 [static] |
Definition at line 185 of file codec_resample.c.