]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_test] add tts mock 985/head
authorSeven Du <dujinfang@x-y-t.cn>
Mon, 14 Dec 2020 04:51:27 +0000 (12:51 +0800)
committerSeven Du <dujinfang@x-y-t.cn>
Mon, 14 Dec 2020 05:24:26 +0000 (13:24 +0800)
.gitignore
src/mod/applications/mod_test/Makefile.am
src/mod/applications/mod_test/mod_test.c
src/mod/applications/mod_test/test/test_tts.c [new file with mode: 0644]

index 0cc7c405b5717a85680f1023a22a42b28ff06e03..a4fb5ca6f64bfcfd246f63c79b678cbe39c596a5 100644 (file)
@@ -261,6 +261,7 @@ libs/sofia-sip*/
 libs/sofia-sip*
 
 src/mod/applications/mod_test/test/test_asr
+src/mod/applications/mod_test/test/test_tts
 src/mod/event_handlers/mod_rayo/test/test_iks
 src/mod/event_handlers/mod_rayo/test/test_nlsml
 src/mod/event_handlers/mod_rayo/test/test_srgs
index 5a961aad713fee93f206ed3036db93a532e2f8c8..c4be7246436046652bbb7a578da4711a8fdc6849 100644 (file)
@@ -10,12 +10,17 @@ mod_test_la_SOURCES =
 mod_test_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SOFIALA) libtestmod.la
 mod_test_la_LDFLAGS = -avoid-version -module -no-undefined -shared
 
-noinst_PROGRAMS = test/test_asr
+noinst_PROGRAMS = test/test_asr test/test_tts
 
 test_test_asr_SOURCES = test/test_asr.c
 test_test_asr_CFLAGS = $(AM_CFLAGS) -I. -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
 test_test_asr_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
 test_test_asr_LDADD = libtestmod.la
 
+test_test_tts_SOURCES = test/test_tts.c
+test_test_tts_CFLAGS = $(AM_CFLAGS) -I. -DSWITCH_TEST_BASE_DIR_FOR_CONF=\"${abs_builddir}/test\" -DSWITCH_TEST_BASE_DIR_OVERRIDE=\"${abs_builddir}/test\"
+test_test_tts_LDFLAGS = $(AM_LDFLAGS) -avoid-version -no-undefined $(freeswitch_LDFLAGS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
+test_test_tts_LDADD = libtestmod.la
+
 TESTS = $(noinst_PROGRAMS)
 
index c8ce62c39f77cfa5464fd39578ce376b5355dbc7..9791d7a611614e5b56c37b25b6024f9c6cd1bb7c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
- * Copyright (C) 2005-2018, Anthony Minessale II <anthm@freeswitch.org>
+ * Copyright (C) 2005-2020, Anthony Minessale II <anthm@freeswitch.org>
  *
  * Version: MPL 1.1
  *
@@ -23,6 +23,7 @@
  *
  * Contributor(s):
  * Chris Rienzo <chris@signalwire.com>
+ * Seven Du <dujinfang@gmail.com>
  *
  *
  * mod_test.c -- mock module interfaces for testing
@@ -37,6 +38,10 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_test_shutdown);
 SWITCH_MODULE_RUNTIME_FUNCTION(mod_test_runtime);
 SWITCH_MODULE_DEFINITION(mod_test, mod_test_load, mod_test_shutdown, mod_test_runtime);
 
+typedef struct {
+       char *text;
+       int samples;
+} test_tts_t;
 
 typedef enum {
        ASRFLAG_READY = (1 << 0),
@@ -360,9 +365,77 @@ static void test_asr_text_param(switch_asr_handle_t *ah, char *param, const char
        }
 }
 
+static switch_status_t test_speech_open(switch_speech_handle_t *sh, const char *voice_name, int rate, int channels, switch_speech_flag_t *flags)
+{
+       test_tts_t *context = switch_core_alloc(sh->memory_pool, sizeof(test_tts_t));
+       switch_assert(context);
+       context->samples = sh->samplerate;
+       sh->private_info = context;
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_speech_close(switch_speech_handle_t *sh, switch_speech_flag_t *flags)
+{
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_speech_feed_tts(switch_speech_handle_t *sh, char *text, switch_speech_flag_t *flags)
+{
+       test_tts_t *context = (test_tts_t *)sh->private_info;
+
+       if (!zstr(text)) {
+               char *p = strstr(text, "silence://");
+
+               if (p) {
+                       p += strlen("silence://");
+                       context->samples = atoi(p) * sh->samplerate / 1000;
+               }
+
+               context->text = switch_core_strdup(sh->memory_pool, text);
+       }
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static switch_status_t test_speech_read_tts(switch_speech_handle_t *sh, void *data, switch_size_t *datalen, switch_speech_flag_t *flags)
+{
+       test_tts_t *context = (test_tts_t *)sh->private_info;
+
+       if (context->samples <= 0) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       if (context->samples < *datalen / 2 / sh->channels) {
+               *datalen = context->samples * 2 * sh->channels;
+       }
+
+       context->samples -= *datalen / 2 / sh->channels;
+       memset(data, 0, *datalen);
+
+       return SWITCH_STATUS_SUCCESS;
+}
+
+static void test_speech_flush_tts(switch_speech_handle_t *sh)
+{
+}
+
+static void test_speech_text_param_tts(switch_speech_handle_t *sh, char *param, const char *val)
+{
+}
+
+static void test_speech_numeric_param_tts(switch_speech_handle_t *sh, char *param, int val)
+{
+}
+
+static void test_speech_float_param_tts(switch_speech_handle_t *sh, char *param, double val)
+{
+}
+
 SWITCH_MODULE_LOAD_FUNCTION(mod_test_load)
 {
        switch_asr_interface_t *asr_interface;
+       switch_speech_interface_t *speech_interface = NULL;
 
        *module_interface = switch_loadable_module_create_module_interface(pool, modname);
 
@@ -380,6 +453,17 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_test_load)
        asr_interface->asr_start_input_timers = test_asr_start_input_timers;
        asr_interface->asr_text_param = test_asr_text_param;
 
+       speech_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_SPEECH_INTERFACE);
+       speech_interface->interface_name = "test";
+       speech_interface->speech_open = test_speech_open;
+       speech_interface->speech_close = test_speech_close;
+       speech_interface->speech_feed_tts = test_speech_feed_tts;
+       speech_interface->speech_read_tts = test_speech_read_tts;
+       speech_interface->speech_flush_tts = test_speech_flush_tts;
+       speech_interface->speech_text_param_tts = test_speech_text_param_tts;
+       speech_interface->speech_numeric_param_tts = test_speech_numeric_param_tts;
+       speech_interface->speech_float_param_tts = test_speech_float_param_tts;
+
        return SWITCH_STATUS_SUCCESS;
 }
 
diff --git a/src/mod/applications/mod_test/test/test_tts.c b/src/mod/applications/mod_test/test/test_tts.c
new file mode 100644 (file)
index 0000000..f1e4205
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
+ * Copyright (C) 2005-2020, 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 / Soft-Switch Application
+ *
+ * The Initial Developer of the Original Code is
+ * Anthony Minessale II <anthm@freeswitch.org>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Seven Du <dujinfang@gmail.com>
+ *
+ *
+ * test_tts.c -- tests for mock test tts interface
+ *
+ */
+#include <switch.h>
+#include <test/switch_test.h>
+
+FST_CORE_BEGIN(".")
+
+FST_MODULE_BEGIN(mod_test, test_asr)
+
+FST_SETUP_BEGIN()
+{
+       fst_requires_module("mod_tone_stream");
+       fst_requires_module("mod_sndfile");
+       fst_requires_module("mod_dptools");
+}
+FST_SETUP_END()
+
+FST_TEARDOWN_BEGIN()
+{
+}
+FST_TEARDOWN_END()
+
+
+FST_TEST_BEGIN(tts_8000)
+{
+    switch_speech_handle_t sh = { 0 };
+    switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
+    switch_status_t status;
+    int sample_rate = 8000;
+    int interval = 20;
+    uint8_t data[320];
+    size_t datalen = sizeof(data);
+    int read = 0;
+
+    status = switch_core_speech_open(&sh, "test", "default", sample_rate, interval, 1, &flags, NULL);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    status = switch_core_speech_feed_tts(&sh, "text", &flags);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    do {
+        status = switch_core_speech_read_tts(&sh, data, &datalen, &flags);
+        read++;
+    } while (status == SWITCH_STATUS_SUCCESS);
+
+    fst_check(read = sample_rate / interval); // samples of 1 second
+    switch_core_speech_close(&sh, &flags);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(tts_48000)
+{
+    switch_speech_handle_t sh = { 0 };
+    switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
+    switch_status_t status;
+    int sample_rate = 48000;
+    int interval = 20;
+    uint8_t data[320];
+    size_t datalen = sizeof(data);
+    int read = 0;
+
+    status = switch_core_speech_open(&sh, "test", "default", sample_rate, interval, 1, &flags, NULL);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    status = switch_core_speech_feed_tts(&sh, "text", &flags);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    do {
+        status = switch_core_speech_read_tts(&sh, data, &datalen, &flags);
+        read++;
+    } while (status == SWITCH_STATUS_SUCCESS);
+
+    fst_check(read = sample_rate / interval); // samples of 1 second
+    switch_core_speech_close(&sh, &flags);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(tts_48000_2)
+{
+    switch_speech_handle_t sh = { 0 };
+    switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
+    switch_status_t status;
+    int sample_rate = 48000;
+    int interval = 20;
+    uint8_t data[320];
+    size_t datalen = sizeof(data);
+    int read = 0;
+
+    status = switch_core_speech_open(&sh, "test", "default", sample_rate, interval, 2, &flags, NULL);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    status = switch_core_speech_feed_tts(&sh, "text", &flags);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    do {
+        status = switch_core_speech_read_tts(&sh, data, &datalen, &flags);
+        read++;
+    } while (status == SWITCH_STATUS_SUCCESS);
+
+    fst_check(read = sample_rate / interval); // samples of 1 second
+    switch_core_speech_close(&sh, &flags);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(tts_time)
+{
+    switch_speech_handle_t sh = { 0 };
+    switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_NONE;
+    switch_status_t status;
+    int sample_rate = 8000;
+    int interval = 20;
+    uint8_t data[320];
+    size_t datalen = sizeof(data);
+    int read = 0;
+
+    status = switch_core_speech_open(&sh, "test", "default", sample_rate, interval, 1, &flags, NULL);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    status = switch_core_speech_feed_tts(&sh, "silence://3000", &flags);
+    fst_requires(status == SWITCH_STATUS_SUCCESS);
+    do {
+        status = switch_core_speech_read_tts(&sh, data, &datalen, &flags);
+        read++;
+        switch_yield(interval * 1000);
+    } while (status == SWITCH_STATUS_SUCCESS);
+
+    fst_check(read = sample_rate / interval * 3); // samples of 3 second
+    fst_check_duration(3000, 500);
+    switch_core_speech_close(&sh, &flags);
+}
+FST_TEST_END()
+
+FST_TEST_BEGIN(unload_test)
+{
+       const char *err = NULL;
+       switch_sleep(1000000);
+       fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_test", SWITCH_FALSE, &err) == SWITCH_STATUS_SUCCESS);
+}
+FST_TEST_END()
+
+
+FST_MODULE_END()
+
+FST_CORE_END()