[mod_test] add tts mock

This commit is contained in:
Seven Du 2020-12-14 12:51:27 +08:00
parent 8045c96458
commit 70571a440a
4 changed files with 257 additions and 2 deletions

1
.gitignore vendored
View File

@ -261,6 +261,7 @@ libs/sofia-sip*/
libs/sofia-sip* libs/sofia-sip*
src/mod/applications/mod_test/test/test_asr 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_iks
src/mod/event_handlers/mod_rayo/test/test_nlsml src/mod/event_handlers/mod_rayo/test/test_nlsml
src/mod/event_handlers/mod_rayo/test/test_srgs src/mod/event_handlers/mod_rayo/test/test_srgs

View File

@ -10,12 +10,17 @@ mod_test_la_SOURCES =
mod_test_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SOFIALA) libtestmod.la mod_test_la_LIBADD = $(switch_builddir)/libfreeswitch.la $(SOFIALA) libtestmod.la
mod_test_la_LDFLAGS = -avoid-version -module -no-undefined -shared 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_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_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_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_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) TESTS = $(noinst_PROGRAMS)

View File

@ -1,6 +1,6 @@
/* /*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application * 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 * Version: MPL 1.1
* *
@ -23,6 +23,7 @@
* *
* Contributor(s): * Contributor(s):
* Chris Rienzo <chris@signalwire.com> * Chris Rienzo <chris@signalwire.com>
* Seven Du <dujinfang@gmail.com>
* *
* *
* mod_test.c -- mock module interfaces for testing * 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_RUNTIME_FUNCTION(mod_test_runtime);
SWITCH_MODULE_DEFINITION(mod_test, mod_test_load, mod_test_shutdown, 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 { typedef enum {
ASRFLAG_READY = (1 << 0), 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_MODULE_LOAD_FUNCTION(mod_test_load)
{ {
switch_asr_interface_t *asr_interface; switch_asr_interface_t *asr_interface;
switch_speech_interface_t *speech_interface = NULL;
*module_interface = switch_loadable_module_create_module_interface(pool, modname); *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_start_input_timers = test_asr_start_input_timers;
asr_interface->asr_text_param = test_asr_text_param; 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; return SWITCH_STATUS_SUCCESS;
} }

View File

@ -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()