Added mod_bert module
This commit is contained in:
parent
61a3997b26
commit
fa3a1a0bdd
|
@ -1,5 +1,6 @@
|
|||
#applications/mod_abstraction
|
||||
#applications/mod_avmd
|
||||
#applications/mod_bert
|
||||
#applications/mod_blacklist
|
||||
#applications/mod_callcenter
|
||||
#applications/mod_cidlookup
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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:
|
||||
*/
|
Loading…
Reference in New Issue