Thu Apr 28 2011 17:16:02

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"
Include dependency graph for codec_resample.c:

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
__MODULE_INFO_SECTION 
__mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "SLIN Resampling Codec" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, }
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]
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_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().

{
   int total_in_buf_used = 0;
   int total_out_buf_used = 0;
   int16_t *in_buf = (int16_t *) f->data.ptr;
   int16_t *out_buf = pvt->outbuf.i16 + pvt->samples;
   float in_buf_f[f->samples];
   float out_buf_f[2048];
   int res = 0;
   int i;

   for (i = 0; i < f->samples; i++)
      in_buf_f[i] = in_buf[i] * (FLT_MAX / SHRT_MAX);

   while (total_in_buf_used < f->samples) {
      int in_buf_used, out_buf_used;

      out_buf_used = resample_process(resampler, resample_factor,
         &in_buf_f[total_in_buf_used], f->samples - total_in_buf_used,
         0, &in_buf_used,
         &out_buf_f[total_out_buf_used], ARRAY_LEN(out_buf_f) - total_out_buf_used);

      if (out_buf_used < 0)
         break;

      total_out_buf_used += out_buf_used;
      total_in_buf_used += in_buf_used;

      if (total_out_buf_used == ARRAY_LEN(out_buf_f)) {
         ast_log(LOG_ERROR, "Output buffer filled ... need to increase its size\n");
         res = -1;
         break;
      }
   }

   for (i = 0; i < total_out_buf_used; i++)
      out_buf[i] = out_buf_f[i] * (SHRT_MAX / FLT_MAX);  

   pvt->samples += total_out_buf_used;
   pvt->datalen += (total_out_buf_used * sizeof(int16_t));

   return res;
}
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.

{
   struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;

   if (resamp_pvt->resampler)
      resample_close(resamp_pvt->resampler);
}
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 ast_trans_pvt::pvt, slin16_to_slin8_pvt::resample_factor, resample_frame(), and slin16_to_slin8_pvt::resampler.

{
   struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;
   void *resampler = resamp_pvt->resampler;
   float resample_factor = resamp_pvt->resample_factor;

   return resample_frame(pvt, resampler, resample_factor, f);
}
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.

{
   struct slin16_to_slin8_pvt *resamp_pvt = pvt->pvt;

   resamp_pvt->resample_factor = 8000.0 / 16000.0;

   if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor)))
      return -1;

   return 0;
}
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.

{
   struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;

   if (resamp_pvt->resampler)
      resample_close(resamp_pvt->resampler);
}
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 ast_trans_pvt::pvt, slin8_to_slin16_pvt::resample_factor, resample_frame(), and slin8_to_slin16_pvt::resampler.

{
   struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;
   void *resampler = resamp_pvt->resampler;
   float resample_factor = resamp_pvt->resample_factor;

   return resample_frame(pvt, resampler, resample_factor, f);
}
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.

{
   struct slin8_to_slin16_pvt *resamp_pvt = pvt->pvt;

   resamp_pvt->resample_factor = 16000.0 / 8000.0;

   if (!(resamp_pvt->resampler = resample_open(RESAMPLER_QUALITY, resamp_pvt->resample_factor, resamp_pvt->resample_factor)))
      return -1;

   return 0;
}
static int unload_module ( void  ) [static]

Definition at line 197 of file codec_resample.c.

References ast_unregister_translator().


Variable Documentation

struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "SLIN Resampling Codec" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static]

Definition at line 217 of file codec_resample.c.

Definition at line 217 of file codec_resample.c.

Definition at line 171 of file codec_resample.c.

Definition at line 184 of file codec_resample.c.