aboutsummaryrefslogtreecommitdiffstats
path: root/codecs
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-17 17:23:43 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-06-17 17:23:43 +0000
commit637447be7d05aaac944171053df4f82e2cb8ab07 (patch)
tree200243a6d4e70905af7d2e36981d2928f03e6936 /codecs
parenta4f9ce35cfe885eb10082d20c46884da7891c3c1 (diff)
adds speex 16khz audio support
(closes issue #17501) Reported by: fabled Patches: asterisk-trunk-speex-wideband-v2.patch uploaded by fabled (license 448) Tested by: malcolmd, fabled, dvossel git-svn-id: http://svn.digium.com/svn/asterisk/trunk@271231 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'codecs')
-rw-r--r--codecs/codec_speex.c82
1 files changed, 65 insertions, 17 deletions
diff --git a/codecs/codec_speex.c b/codecs/codec_speex.c
index 2966a7a0c..85f231f9b 100644
--- a/codecs/codec_speex.c
+++ b/codecs/codec_speex.c
@@ -97,12 +97,11 @@ struct speex_coder_pvt {
#endif
};
-
-static int lintospeex_new(struct ast_trans_pvt *pvt)
+static int speex_encoder_construct(struct ast_trans_pvt *pvt, const SpeexMode *profile, int sampling_rate)
{
struct speex_coder_pvt *tmp = pvt->pvt;
- if (!(tmp->speex = speex_encoder_init(&speex_nb_mode)))
+ if (!(tmp->speex = speex_encoder_init(profile)))
return -1;
speex_bits_init(&tmp->bits);
@@ -111,7 +110,7 @@ static int lintospeex_new(struct ast_trans_pvt *pvt)
speex_encoder_ctl(tmp->speex, SPEEX_SET_COMPLEXITY, &complexity);
#ifdef _SPEEX_TYPES_H
if (preproc) {
- tmp->pp = speex_preprocess_state_init(tmp->framesize, 8000); /* XXX what is this 8000 ? */
+ tmp->pp = speex_preprocess_state_init(tmp->framesize, sampling_rate);
speex_preprocess_ctl(tmp->pp, SPEEX_PREPROCESS_SET_VAD, &pp_vad);
speex_preprocess_ctl(tmp->pp, SPEEX_PREPROCESS_SET_AGC, &pp_agc);
speex_preprocess_ctl(tmp->pp, SPEEX_PREPROCESS_SET_AGC_LEVEL, &pp_agc_level);
@@ -139,11 +138,21 @@ static int lintospeex_new(struct ast_trans_pvt *pvt)
return 0;
}
-static int speextolin_new(struct ast_trans_pvt *pvt)
+static int lintospeex_new(struct ast_trans_pvt *pvt)
+{
+ return speex_encoder_construct(pvt, &speex_nb_mode, 8000);
+}
+
+static int lin16tospeexwb_new(struct ast_trans_pvt *pvt)
+{
+ return speex_encoder_construct(pvt, &speex_wb_mode, 16000);
+}
+
+static int speex_decoder_construct(struct ast_trans_pvt *pvt, const SpeexMode *profile)
{
struct speex_coder_pvt *tmp = pvt->pvt;
- if (!(tmp->speex = speex_decoder_init(&speex_nb_mode)))
+ if (!(tmp->speex = speex_decoder_init(profile)))
return -1;
speex_bits_init(&tmp->bits);
@@ -154,6 +163,16 @@ static int speextolin_new(struct ast_trans_pvt *pvt)
return 0;
}
+static int speextolin_new(struct ast_trans_pvt *pvt)
+{
+ return speex_decoder_construct(pvt, &speex_nb_mode);
+}
+
+static int speexwbtolin16_new(struct ast_trans_pvt *pvt)
+{
+ return speex_decoder_construct(pvt, &speex_wb_mode);
+}
+
/*! \brief convert and store into outbuf */
static int speextolin_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
{
@@ -337,6 +356,34 @@ static struct ast_translator lintospeex = {
.buf_size = BUFFER_SAMPLES * 2, /* XXX maybe a lot less ? */
};
+static struct ast_translator speexwbtolin16 = {
+ .name = "speexwbtolin16",
+ .srcfmt = AST_FORMAT_SPEEX16,
+ .dstfmt = AST_FORMAT_SLINEAR16,
+ .newpvt = speexwbtolin16_new,
+ .framein = speextolin_framein,
+ .destroy = speextolin_destroy,
+ .sample = speex_sample,
+ .desc_size = sizeof(struct speex_coder_pvt),
+ .buffer_samples = BUFFER_SAMPLES,
+ .buf_size = BUFFER_SAMPLES * 2,
+ .native_plc = 1,
+};
+
+static struct ast_translator lin16tospeexwb = {
+ .name = "lin16tospeexwb",
+ .srcfmt = AST_FORMAT_SLINEAR16,
+ .dstfmt = AST_FORMAT_SPEEX16,
+ .newpvt = lin16tospeexwb_new,
+ .framein = lintospeex_framein,
+ .frameout = lintospeex_frameout,
+ .destroy = lintospeex_destroy,
+ .sample = slin8_sample,
+ .desc_size = sizeof(struct speex_coder_pvt),
+ .buffer_samples = BUFFER_SAMPLES,
+ .buf_size = BUFFER_SAMPLES * 2, /* XXX maybe a lot less ? */
+};
+
static int parse_config(int reload)
{
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
@@ -441,28 +488,29 @@ static int reload(void)
static int unload_module(void)
{
- int res;
+ int res = 0;
- res = ast_unregister_translator(&lintospeex);
res |= ast_unregister_translator(&speextolin);
+ res |= ast_unregister_translator(&lintospeex);
+ res |= ast_unregister_translator(&speexwbtolin16);
+ res |= ast_unregister_translator(&lin16tospeexwb);
return res;
}
static int load_module(void)
{
- int res;
+ int res = 0;
if (parse_config(0))
return AST_MODULE_LOAD_DECLINE;
- res=ast_register_translator(&speextolin);
- if (!res)
- res=ast_register_translator(&lintospeex);
- else
- ast_unregister_translator(&speextolin);
- if (res)
- return AST_MODULE_LOAD_FAILURE;
- return AST_MODULE_LOAD_SUCCESS;
+
+ res |= ast_register_translator(&speextolin);
+ res |= ast_register_translator(&lintospeex);
+ res |= ast_register_translator(&speexwbtolin16);
+ res |= ast_register_translator(&lin16tospeexwb);
+
+ return res;
}
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Speex Coder/Decoder",