Wed Apr 6 11:30:03 2011

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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .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 56 of file codec_resample.c.

#define RESAMPLER_QUALITY   1

Definition at line 54 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 217 of file codec_resample.c.

static void __unreg_module ( void   )  [static]

Definition at line 217 of file codec_resample.c.

static int load_module ( void   )  [static]

Definition at line 207 of file codec_resample.c.

References AST_MODULE_LOAD_SUCCESS, ast_register_translator, slin16_to_slin8, and slin8_to_slin16.

00208 {
00209    int res = 0;
00210 
00211    res |= ast_register_translator(&slin16_to_slin8);
00212    res |= ast_register_translator(&slin8_to_slin16);
00213 
00214    return AST_MODULE_LOAD_SUCCESS;
00215 }

static int resample_frame ( struct ast_trans_pvt pvt,
void *  resampler,
float  resample_factor,
struct ast_frame f 
) [static]

Definition at line 108 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().

00110 {
00111    int total_in_buf_used = 0;
00112    int total_out_buf_used = 0;
00113    int16_t *in_buf = (int16_t *) f->data.ptr;
00114    int16_t *out_buf = pvt->outbuf.i16 + pvt->samples;
00115    float in_buf_f[f->samples];
00116    float out_buf_f[2048];
00117    int res = 0;
00118    int i;
00119 
00120    for (i = 0; i < f->samples; i++)
00121       in_buf_f[i] = in_buf[i] * (FLT_MAX / SHRT_MAX);
00122 
00123    while (total_in_buf_used < f->samples) {
00124       int in_buf_used, out_buf_used;
00125 
00126       out_buf_used = resample_process(resampler, resample_factor,
00127          &in_buf_f[total_in_buf_used], f->samples - total_in_buf_used,
00128          0, &in_buf_used,
00129          &out_buf_f[total_out_buf_used], ARRAY_LEN(out_buf_f) - total_out_buf_used);
00130 
00131       if (out_buf_used < 0)
00132          break;
00133 
00134       total_out_buf_used += out_buf_used;
00135       total_in_buf_used += in_buf_used;
00136 
00137       if (total_out_buf_used == ARRAY_LEN(out_buf_f)) {
00138          ast_log(LOG_ERROR, "Output buffer filled ... need to increase its size\n");
00139          res = -1;
00140          break;
00141       }
00142    }
00143 
00144    for (i = 0; i < total_out_buf_used; i++)
00145       out_buf[i] = out_buf_f[i] * (SHRT_MAX / FLT_MAX);  
00146 
00147    pvt->samples += total_out_buf_used;
00148    pvt->datalen += (total_out_buf_used * sizeof(int16_t));
00149 
00150    return res;
00151 }

static void slin16_to_slin8_destroy ( struct ast_trans_pvt pvt  )  [static]

Definition at line 92 of file codec_resample.c.

References ast_trans_pvt::pvt, and slin16_to_slin8_pvt::resampler.

00093 {
00094    struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;
00095 
00096    if (resamp_pvt->resampler)
00097       resample_close(resamp_pvt->resampler);
00098 }

static int slin16_to_slin8_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

Definition at line 153 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.

00154 {
00155    struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;
00156    void *resampler = resamp_pvt->resampler;
00157    float resample_factor = resamp_pvt->resample_factor;
00158 
00159    return resample_frame(pvt, resampler, resample_factor, f);
00160 }

static int slin16_to_slin8_new ( struct ast_trans_pvt pvt  )  [static]

Definition at line 68 of file codec_resample.c.

References ast_trans_pvt::pvt, slin16_to_slin8_pvt::resample_factor, slin16_to_slin8_pvt::resampler, and RESAMPLER_QUALITY.

00069 {
00070    struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;
00071 
00072    resamp_pvt->resample_factor = 8000.0 / 16000.0;
00073 
00074    if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor)))
00075       return -1;
00076 
00077    return 0;
00078 }

static void slin8_to_slin16_destroy ( struct ast_trans_pvt pvt  )  [static]

Definition at line 100 of file codec_resample.c.

References ast_trans_pvt::pvt, and slin8_to_slin16_pvt::resampler.

00101 {
00102    struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;
00103 
00104    if (resamp_pvt->resampler)
00105       resample_close(resamp_pvt->resampler);
00106 }

static int slin8_to_slin16_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

Definition at line 162 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.

00163 {
00164    struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;
00165    void *resampler = resamp_pvt->resampler;
00166    float resample_factor = resamp_pvt->resample_factor;
00167 
00168    return resample_frame(pvt, resampler, resample_factor, f);
00169 }

static int slin8_to_slin16_new ( struct ast_trans_pvt pvt  )  [static]

Definition at line 80 of file codec_resample.c.

References ast_trans_pvt::pvt, slin8_to_slin16_pvt::resample_factor, slin8_to_slin16_pvt::resampler, and RESAMPLER_QUALITY.

00081 {
00082    struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;
00083 
00084    resamp_pvt->resample_factor = 16000.0 / 8000.0;
00085 
00086    if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor)))
00087       return -1;
00088 
00089    return 0;
00090 }

static int unload_module ( void   )  [static]

Definition at line 197 of file codec_resample.c.

References ast_unregister_translator(), slin16_to_slin8, and slin8_to_slin16.

00198 {
00199    int res = 0;
00200 
00201    res |= ast_unregister_translator(&slin16_to_slin8);
00202    res |= ast_unregister_translator(&slin8_to_slin16);
00203 
00204    return res;
00205 }


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 = "8586c2a7d357cb591cc3a6607a8f62d1" , .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, } [static]

Definition at line 217 of file codec_resample.c.

struct ast_module_info* ast_module_info = &__mod_info [static]

Definition at line 217 of file codec_resample.c.

struct ast_translator slin16_to_slin8 [static]

Definition at line 171 of file codec_resample.c.

Referenced by load_module(), and unload_module().

struct ast_translator slin8_to_slin16 [static]

Definition at line 184 of file codec_resample.c.

Referenced by load_module(), and unload_module().


Generated on Wed Apr 6 11:30:03 2011 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7