Mon Mar 19 11:30:46 2012

Asterisk developer's documentation


codec_resample.c File Reference

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

static void __reg_module (void)
static void __unreg_module (void)
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_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "SLIN Resampling Codec" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_module_info = &__mod_info
static struct ast_translator slin16_to_slin8
static struct ast_translator slin8_to_slin16


Detailed Description

Resample slinear audio.

Note:
To install libresample, check it out of the following repository: $ svn co http://svn.digium.com/svn/thirdparty/libresample/trunk

Definition in file codec_resample.c.


Define Documentation

#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().


Function Documentation

static void __reg_module ( void   )  [static]

Definition at line 218 of file codec_resample.c.

static void __unreg_module ( void   )  [static]

Definition at line 218 of file codec_resample.c.

static int load_module ( void   )  [static]

Definition at line 208 of file codec_resample.c.

References AST_MODULE_LOAD_SUCCESS, ast_register_translator, slin16_to_slin8, and slin8_to_slin16.

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_trans_pvt::datalen, f, ast_trans_pvt::i16, LOG_ERROR, ast_trans_pvt::outbuf, 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 f, 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 f, 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(), slin16_to_slin8, and slin8_to_slin16.

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 }


Variable Documentation

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "SLIN Resampling Codec" , .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 = "88eaa8f5c1bd988bedd71113385e0886" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 218 of file codec_resample.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 218 of file codec_resample.c.

struct ast_translator slin16_to_slin8 [static]

Definition at line 172 of file codec_resample.c.

Referenced by load_module(), and unload_module().

struct ast_translator slin8_to_slin16 [static]

Definition at line 185 of file codec_resample.c.

Referenced by load_module(), and unload_module().


Generated on Mon Mar 19 11:30:46 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7