Added mod_bert module

This commit is contained in:
Moises Silva 2013-08-04 23:49:33 -04:00
parent 61a3997b26
commit fa3a1a0bdd
4 changed files with 153 additions and 0 deletions

View File

@ -1,5 +1,6 @@
#applications/mod_abstraction
#applications/mod_avmd
#applications/mod_bert
#applications/mod_blacklist
#applications/mod_callcenter
#applications/mod_cidlookup

View File

@ -1455,6 +1455,7 @@ AC_CONFIG_FILES([Makefile
src/mod/Makefile
src/mod/applications/mod_abstraction/Makefile
src/mod/applications/mod_avmd/Makefile
src/mod/applications/mod_bert/Makefile
src/mod/applications/mod_blacklist/Makefile
src/mod/applications/mod_callcenter/Makefile
src/mod/applications/mod_cidlookup/Makefile

View File

@ -0,0 +1,8 @@
include $(top_srcdir)/build/modmake.rulesam
MODNAME=mod_bert
mod_LTLIBRARIES = mod_bert.la
mod_bert_la_SOURCES = mod_bert.c
mod_bert_la_CFLAGS = $(AM_CFLAGS)
mod_bert_la_LIBADD = $(switch_builddir)/libfreeswitch.la
mod_bert_la_LDFLAGS = -avoid-version -module -no-undefined -shared

View File

@ -0,0 +1,143 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Oreka Recording Module
*
* The Initial Developer of the Original Code is
* Moises Silva <moises.silva@gmail.com>
* Portions created by the Initial Developer are Copyright (C)
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Moises Silva <moises.silva@gmail.com>
*
* mod_g711_bert -- Naive BERT tester
*
*/
#include <switch.h>
SWITCH_MODULE_LOAD_FUNCTION(mod_bert_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_bert_shutdown);
SWITCH_MODULE_DEFINITION(mod_bert, mod_bert_load, mod_bert_shutdown, NULL);
SWITCH_STANDARD_APP(g711_bert_function)
{
switch_status_t status;
switch_frame_t *read_frame = NULL, write_frame = { 0 };
switch_codec_implementation_t read_impl = { 0 };
switch_channel_t *channel = NULL;
int i = 0;
uint32_t interval = 0;
uint32_t ts = 0;
struct {
uint64_t sync;
uint32_t bytes_since_sync;
uint32_t min_sync_samples;
uint32_t max_sync_err;
uint32_t sync_err;
int16_t tx_sample;
int16_t test_data;
} bert;
memset(&bert, 0, sizeof(bert));
channel = switch_core_session_get_channel(session);
switch_channel_answer(channel);
switch_core_session_get_read_impl(session, &read_impl);
interval = read_impl.microseconds_per_packet / 1000;
write_frame.codec = switch_core_session_get_read_codec(session);
write_frame.data = switch_core_session_alloc(session, SWITCH_RECOMMENDED_BUFFER_SIZE);
write_frame.buflen = SWITCH_RECOMMENDED_BUFFER_SIZE;
bert.min_sync_samples = (read_impl.samples_per_packet * 40);
bert.max_sync_err = (read_impl.samples_per_packet * 20);
while (switch_channel_ready(channel)) {
int16_t *read_samples = NULL;
int16_t *write_samples = NULL;
status = switch_core_session_read_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
/* BERT Sync */
read_samples = read_frame->data;
write_samples = write_frame.data;
for (i = 0; i < (read_frame->datalen / 2); i++) {
if (bert.sync < bert.min_sync_samples) {
if (bert.test_data == read_samples[i]) {
bert.sync++;
}
} else {
if (bert.sync == bert.min_sync_samples) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "G.711 synced (%lu)\n", bert.sync);
bert.bytes_since_sync = 0;
bert.sync_err = 0;
}
bert.bytes_since_sync++;
if (bert.test_data != read_samples[i]) {
bert.sync_err++;
if (bert.sync_err >= bert.max_sync_err) {
bert.sync = 0;
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "G.711 sync lost (%u)\n", bert.bytes_since_sync);
}
} else {
bert.sync++;
}
}
bert.test_data = (read_samples[i] + 1);
write_samples[i] = bert.tx_sample++;
}
write_frame.datalen = read_frame->datalen;
write_frame.samples = i;
write_frame.timestamp = ts;
status = switch_core_session_write_frame(session, &write_frame, SWITCH_IO_FLAG_NONE, 0);
if (!SWITCH_READ_ACCEPTABLE(status)) {
break;
}
ts += read_impl.samples_per_packet;
}
}
SWITCH_MODULE_LOAD_FUNCTION(mod_bert_load)
{
switch_application_interface_t *app_interface = NULL;
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
SWITCH_ADD_APP(app_interface, "bert_test", "Start BERT Test", "Start BERT Test", g711_bert_function, "", SAF_NONE);
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_bert_shutdown)
{
return SWITCH_STATUS_UNLOAD;
}
/* For Emacs:
* Local Variables:
* mode:c
* indent-tabs-mode:nil
* tab-width:4
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
*/