From 8331f4a0b5c6015a2ec336246f2165dd9590ee8c Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 9 Mar 2012 12:54:57 -0600 Subject: [PATCH] FS-3980 --resolve --- src/mod/codecs/mod_speex/mod_speex.c | 129 ++++++++++++++++++++++++++- src/switch_core_io.c | 2 + 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/src/mod/codecs/mod_speex/mod_speex.c b/src/mod/codecs/mod_speex/mod_speex.c index 6e21939d33..aaec0a6602 100644 --- a/src/mod/codecs/mod_speex/mod_speex.c +++ b/src/mod/codecs/mod_speex/mod_speex.c @@ -1,6 +1,6 @@ /* * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application - * Copyright (C) 2005-2011, Anthony Minessale II + * Copyright (C) 2005-2012, Anthony Minessale II * * Version: MPL 1.1 * @@ -24,6 +24,7 @@ * Contributor(s): * * Anthony Minessale II + * Chris Rienzo * * * mod_speex.c -- Speex Codec Module @@ -279,10 +280,11 @@ static switch_status_t switch_speex_encode(switch_codec_t *codec, if (is_speech) { switch_clear_flag(context, SWITCH_CODEC_FLAG_SILENCE); *flag |= SWITCH_CODEC_FLAG_SILENCE_STOP; + *flag &= ~SFF_CNG; } else { if (switch_test_flag(context, SWITCH_CODEC_FLAG_SILENCE)) { *encoded_data_len = 0; - *flag |= SWITCH_CODEC_FLAG_SILENCE; + *flag |= SWITCH_CODEC_FLAG_SILENCE | SFF_CNG; return SWITCH_STATUS_SUCCESS; } @@ -353,6 +355,126 @@ static switch_status_t switch_speex_destroy(switch_codec_t *codec) return SWITCH_STATUS_SUCCESS; } +/** + * read default settings from speex.conf + */ +static void load_configuration() +{ + switch_xml_t xml = NULL, cfg = NULL; + + if ((xml = switch_xml_open_cfg("speex.conf", &cfg, NULL))) { + switch_xml_t x_lists; + if ((x_lists = switch_xml_child(cfg, "settings"))) { + const char *settings_name = switch_xml_attr(x_lists, "name"); + switch_xml_t x_list; + if (zstr(settings_name)) { + settings_name = ""; + } + for (x_list = switch_xml_child(x_lists, "param"); x_list; x_list = x_list->next) { + const char *name = switch_xml_attr(x_list, "name"); + const char *value = switch_xml_attr(x_list, "value"); + if (zstr(name)) { + continue; + } + + if (zstr(value)) { + continue; + } + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s %s = %s\n", settings_name, name, value); + + if (!strcasecmp("quality", name)) { + /* compression quality, integer 0-10 */ + int tmp = atoi(value); + if (switch_is_number(value) && tmp >= 0 && tmp <= 10) { + default_codec_settings.quality = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid quality value: %s\n", value); + } + } else if (!strcasecmp("complexity", name)) { + /* compression complexity, integer 1-10 */ + int tmp = atoi(value); + if (switch_is_number(value) && tmp >= 1 && tmp <= 10) { + default_codec_settings.complexity = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid complexity value: %s\n", value); + } + } else if (!strcasecmp("enhancement", name)) { + /* enable perceptual enhancement, boolean */ + default_codec_settings.enhancement = switch_true(value); + } else if (!strcasecmp("vad", name)) { + /* enable voice activity detection, boolean */ + default_codec_settings.vad = switch_true(value); + } else if (!strcasecmp("vbr", name)) { + /* enable variable bit rate, boolean */ + default_codec_settings.vbr = switch_true(value); + } else if (!strcasecmp("vbr-quality", name)) { + /* variable bit rate quality, float 0-10 */ + float tmp = atof(value); + if (switch_is_number(value) && tmp >= 0 && tmp <= 10) { + default_codec_settings.vbr_quality = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid vbr-quality value: %s\n", value); + } + } else if (!strcasecmp("abr", name)) { + /* average bit rate, integer bits per sec */ + int tmp = atoi(value); + if (switch_is_number(value) && tmp >= 0) { + default_codec_settings.abr = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid abr value: %s\n", value); + } + } else if (!strcasecmp("dtx", name)) { + /* discontinuous transmit, boolean */ + default_codec_settings.dtx = switch_true(value); + } else if (!strcasecmp("preproc", name)) { + /* enable preprocessor, boolean */ + default_codec_settings.preproc = switch_true(value); + } else if (!strcasecmp("pp-vad", name)) { + /* enable preprocessor VAD, boolean */ + default_codec_settings.pp_vad = switch_true(value); + } else if (!strcasecmp("pp-agc", name)) { + /* enable preprocessor automatic gain control, boolean */ + default_codec_settings.pp_agc = switch_true(value); + } else if (!strcasecmp("pp-agc-level", name)) { + /* agc level, float */ + float tmp = atof(value); + if (switch_is_number(value) && tmp >= 0.0f) { + default_codec_settings.pp_agc_level = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid pp-agc-level value: %s\n", value); + } + } else if (!strcasecmp("pp-denoise", name)) { + /* enable preprocessor denoiser, boolean */ + default_codec_settings.pp_denoise = switch_true(value); + } else if (!strcasecmp("pp-dereverb", name)) { + /* enable preprocessor reverberation removal, boolean */ + default_codec_settings.pp_dereverb = switch_true(value); + } else if (!strcasecmp("pp-dereverb-decay", name)) { + /* reverberation removal decay, float */ + float tmp = atof(value); + if (switch_is_number(value) && tmp >= 0.0f) { + default_codec_settings.pp_dereverb_decay = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid pp-dereverb-decay value: %s\n", value); + } + } else if (!strcasecmp("pp-dereverb-level", name)) { + /* reverberation removal level, float */ + float tmp = atof(value); + if (switch_is_number(value) && tmp >= 0.0f) { + default_codec_settings.pp_dereverb_level = tmp; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid pp-dereverb-level value: %s\n", value); + } + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ignoring invalid unknown param: %s = %s\n", name, value); + } + } + } + switch_xml_free(xml); + } +} + SWITCH_MODULE_LOAD_FUNCTION(mod_speex_load) { switch_codec_interface_t *codec_interface; @@ -361,6 +483,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_speex_load) int bps[4] = { 0, 24600, 42200, 44000 }; /* connect my internal structure to the blank pointer passed to me */ *module_interface = switch_loadable_module_create_module_interface(pool, modname); + + load_configuration(); + SWITCH_ADD_CODEC(codec_interface, "Speex"); codec_interface->parse_fmtp = switch_speex_fmtp_parse; for (counta = 1; counta <= 3; counta++) { diff --git a/src/switch_core_io.c b/src/switch_core_io.c index 3a1b433c46..8b147327a2 100644 --- a/src/switch_core_io.c +++ b/src/switch_core_io.c @@ -1059,6 +1059,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess session->enc_write_frame.m = frame->m; session->enc_write_frame.ssrc = frame->ssrc; session->enc_write_frame.seq = frame->seq; + session->enc_write_frame.flags = 0; write_frame = &session->enc_write_frame; break; case SWITCH_STATUS_NOOP: @@ -1173,6 +1174,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_write_frame(switch_core_sess session->enc_write_frame.m = frame->m; session->enc_write_frame.ssrc = frame->ssrc; session->enc_write_frame.payload = session->write_impl.ianacode; + session->enc_write_frame.flags = 0; write_frame = &session->enc_write_frame; break; case SWITCH_STATUS_NOOP: