Thu Sep 7 01:03:26 2017

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

 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

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

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 }


Variable Documentation

Definition at line 172 of file codec_resample.c.

Definition at line 185 of file codec_resample.c.


Generated on 7 Sep 2017 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1