Sat Apr 26 2014 22:02:44

Asterisk developer's documentation


codec_resample.c File Reference

Resample slinear audio. More...

#include "asterisk.h"
#include "speex/speex_resampler.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.

Defines

#define OUTBUF_SIZE   8096

Functions

static void __reg_module (void)
static void __unreg_module (void)
static int load_module (void)
static void resamp_destroy (struct ast_trans_pvt *pvt)
static int resamp_framein (struct ast_trans_pvt *pvt, struct ast_frame *f)
static int resamp_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 = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, }
static struct ast_module_infoast_module_info = &__mod_info
static int id_list []
static int trans_size
static struct ast_translatortranslators

Detailed Description

Resample slinear audio.

Definition in file codec_resample.c.


Define Documentation

#define OUTBUF_SIZE   8096

Definition at line 41 of file codec_resample.c.

Referenced by load_module(), and resamp_framein().


Function Documentation

static void __reg_module ( void  ) [static]

Definition at line 151 of file codec_resample.c.

static void __unreg_module ( void  ) [static]

Definition at line 151 of file codec_resample.c.

static int load_module ( void  ) [static]

Definition at line 111 of file codec_resample.c.

References ARRAY_LEN, ast_calloc, ast_format_rate(), ast_format_set(), AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, ast_register_translator, ast_translator::buf_size, ast_translator::buffer_samples, ast_translator::desc_size, ast_translator::destroy, ast_translator::dst_format, ast_translator::framein, name, ast_translator::newpvt, OUTBUF_SIZE, resamp_destroy(), resamp_framein(), resamp_new(), ast_translator::src_format, and unload_module().

{
   int res = 0;
   int x, y, idx = 0;

   trans_size = ARRAY_LEN(id_list) * (ARRAY_LEN(id_list) - 1);
   if (!(translators = ast_calloc(1, sizeof(struct ast_translator) * trans_size))) {
      return AST_MODULE_LOAD_FAILURE;
   }

   for (x = 0; x < ARRAY_LEN(id_list); x++) {
      for (y = 0; y < ARRAY_LEN(id_list); y++) {
         if (x == y) {
            continue;
         }
         translators[idx].newpvt = resamp_new;
         translators[idx].destroy = resamp_destroy;
         translators[idx].framein = resamp_framein;
         translators[idx].desc_size = 0;
         translators[idx].buffer_samples = (OUTBUF_SIZE / sizeof(int16_t));
         translators[idx].buf_size = OUTBUF_SIZE;
         ast_format_set(&translators[idx].src_format, id_list[x], 0);
         ast_format_set(&translators[idx].dst_format, id_list[y], 0);
         snprintf(translators[idx].name, sizeof(translators[idx].name), "slin %dkhz -> %dkhz",
            ast_format_rate(&translators[idx].src_format), ast_format_rate(&translators[idx].dst_format));
         res |= ast_register_translator(&translators[idx]);
         idx++;
      }

   }
   /* in case ast_register_translator() failed, we call unload_module() and
   ast_unregister_translator won't fail.*/
   if (res) {
      unload_module();
      return AST_MODULE_LOAD_FAILURE;
   }

   return AST_MODULE_LOAD_SUCCESS;
}
static void resamp_destroy ( struct ast_trans_pvt pvt) [static]

Definition at line 68 of file codec_resample.c.

References ast_trans_pvt::pvt.

Referenced by load_module().

{
   SpeexResamplerState *resamp_pvt = pvt->pvt;
   speex_resampler_destroy(resamp_pvt);
}
static int resamp_framein ( struct ast_trans_pvt pvt,
struct ast_frame f 
) [static]

Definition at line 74 of file codec_resample.c.

References ast_frame::data, ast_frame::datalen, ast_trans_pvt::datalen, ast_trans_pvt::i16, ast_trans_pvt::outbuf, OUTBUF_SIZE, ast_frame::ptr, ast_trans_pvt::pvt, and ast_trans_pvt::samples.

Referenced by load_module().

{
   SpeexResamplerState *resamp_pvt = pvt->pvt;
   unsigned int out_samples = (OUTBUF_SIZE / sizeof(int16_t)) - pvt->samples;
   unsigned int in_samples;

   if (!f->datalen) {
      return -1;
   }
   in_samples = f->datalen / 2;

   speex_resampler_process_int(resamp_pvt,
      0,
      f->data.ptr,
      &in_samples,
      pvt->outbuf.i16 + pvt->samples,
      &out_samples);

   pvt->samples += out_samples;
   pvt->datalen += out_samples * 2;

   return 0;
}
static int resamp_new ( struct ast_trans_pvt pvt) [static]

Definition at line 57 of file codec_resample.c.

References ast_format_rate(), ast_translator::dst_format, ast_trans_pvt::pvt, ast_translator::src_format, and ast_trans_pvt::t.

Referenced by load_module().

{
   int err;

   if (!(pvt->pvt = speex_resampler_init(1, ast_format_rate(&pvt->t->src_format), ast_format_rate(&pvt->t->dst_format), 5, &err))) {
      return -1;
   }

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

Definition at line 98 of file codec_resample.c.

References ast_free, ast_unregister_translator(), and trans_size.

Referenced by load_module().

{
   int res = 0;
   int idx;

   for (idx = 0; idx < trans_size; idx++) {
      res |= ast_unregister_translator(&translators[idx]);
   }
   ast_free(translators);

   return res;
}

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

Definition at line 151 of file codec_resample.c.

Definition at line 151 of file codec_resample.c.

int id_list[] [static]

Definition at line 45 of file codec_resample.c.

int trans_size [static]

Definition at line 44 of file codec_resample.c.

Referenced by unload_module().

struct ast_translator* translators [static]

Definition at line 43 of file codec_resample.c.