]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Added mod_bert module
authorMoises Silva <moy@sangoma.com>
Mon, 5 Aug 2013 03:49:33 +0000 (23:49 -0400)
committerMoises Silva <moy@sangoma.com>
Tue, 9 Sep 2014 08:07:02 +0000 (04:07 -0400)
build/modules.conf.in
configure.ac
src/mod/applications/mod_bert/Makefile.am [new file with mode: 0644]
src/mod/applications/mod_bert/mod_bert.c [new file with mode: 0644]

index 44b386f151075afdf1156324dd7be991af8d2c4d..71ece983ef69a622f05a166a0e6c05dd6c0c845c 100644 (file)
@@ -1,5 +1,6 @@
 #applications/mod_abstraction
 #applications/mod_avmd
+#applications/mod_bert
 #applications/mod_blacklist
 #applications/mod_callcenter
 #applications/mod_cidlookup
index 02b5e7159c26f88386a733be728dc3e1a7947af2..e8f9efade0365268c7169bb0ec3fb84d550f9c52 100644 (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
diff --git a/src/mod/applications/mod_bert/Makefile.am b/src/mod/applications/mod_bert/Makefile.am
new file mode 100644 (file)
index 0000000..97fefcc
--- /dev/null
@@ -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
diff --git a/src/mod/applications/mod_bert/mod_bert.c b/src/mod/applications/mod_bert/mod_bert.c
new file mode 100644 (file)
index 0000000..db3ac1e
--- /dev/null
@@ -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:
+ */