From 8585b0b47d14cec6a921c402feab897a5bdf4d35 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Sat, 19 Aug 2017 12:27:39 +0100 Subject: [PATCH] Fix the return status code from Synthesize when the voices cannot be found. --- CHANGELOG.md | 1 + src/libespeak-ng/speech.c | 2 +- tests/api.c | 70 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 574dcf4f..0c32d3a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ bug fixes: * Fix running `make clean ; make`. * Fix reading stdin buffers larger than 1000. * Fixed various language and parent BCP 47 codes (`jp` is now `ja`). +* Fixed several crashes and bugs in `espeak_SetVoiceByName/Properties`. new languages: diff --git a/src/libespeak-ng/speech.c b/src/libespeak-ng/speech.c index bd8cd294..1def1073 100644 --- a/src/libespeak-ng/speech.c +++ b/src/libespeak-ng/speech.c @@ -400,7 +400,7 @@ static espeak_ng_STATUS Synthesize(unsigned int unique_identifier, const void *t espeak_ng_STATUS status; if (translator == NULL) { - status = espeak_SetVoiceByName("en"); + status = espeak_ng_SetVoiceByName("en"); if (status != ENS_OK) return status; } diff --git a/tests/api.c b/tests/api.c index cff84996..6a509711 100644 --- a/tests/api.c +++ b/tests/api.c @@ -117,7 +117,70 @@ test_espeak_synth_no_voices(const char *path) assert(p_decoder == NULL); const char *test = "One two three."; - assert(espeak_Synth(test, strlen(test)+1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, NULL, NULL) == EE_INTERNAL_ERROR); + assert(espeak_Synth(test, strlen(test)+1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, NULL, NULL) == EE_NOT_FOUND); + assert(translator == NULL); + assert(p_decoder == NULL); + + assert(espeak_Synchronize() == EE_OK); + assert(translator == NULL); + assert(p_decoder == NULL); + + assert(espeak_Terminate() == EE_OK); + assert(event_list == NULL); + assert(translator == NULL); + assert(p_decoder == NULL); +} + +// endregion +// region espeak_ng_Synthesize + +void +test_espeak_ng_synthesize() +{ + printf("testing espeak_ng_Synthesize\n"); + + assert(event_list == NULL); + assert(translator == NULL); + assert(p_decoder == NULL); + + assert(espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL, 0, NULL, 0) == 22050); + assert(event_list != NULL); + assert(translator == NULL); + assert(p_decoder == NULL); + + const char *test = "One two three."; + assert(espeak_ng_Synthesize(test, strlen(test)+1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, NULL, NULL) == ENS_OK); + assert(translator != NULL); + assert(strcmp(translator->dictionary_name, "en") == 0); + assert(p_decoder != NULL); + + assert(espeak_Synchronize() == EE_OK); + assert(translator != NULL); + assert(strcmp(translator->dictionary_name, "en") == 0); + assert(p_decoder != NULL); + + assert(espeak_Terminate() == EE_OK); + assert(event_list == NULL); + assert(translator == NULL); + assert(p_decoder == NULL); +} + +void +test_espeak_ng_synthesize_no_voices(const char *path) +{ + printf("testing espeak_ng_Synthesize in path with no voices\n"); + + assert(event_list == NULL); + assert(translator == NULL); + assert(p_decoder == NULL); + + assert(espeak_Initialize(AUDIO_OUTPUT_RETRIEVAL, 0, path, espeakINITIALIZE_DONT_EXIT) == 22050); + assert(event_list != NULL); + assert(translator == NULL); + assert(p_decoder == NULL); + + const char *test = "One two three."; + assert(espeak_ng_Synthesize(test, strlen(test)+1, 0, POS_CHARACTER, 0, espeakCHARS_AUTO, NULL, NULL) == ENS_VOICE_NOT_FOUND); assert(translator == NULL); assert(p_decoder == NULL); @@ -489,6 +552,11 @@ main(int argc, char **argv) test_espeak_synth_no_voices(progdir); test_espeak_synth(); + test_espeak_ng_synthesize(); + test_espeak_ng_synthesize(); // Check that this does not crash when run a second time. + test_espeak_ng_synthesize_no_voices(progdir); + test_espeak_ng_synthesize(); + test_espeak_set_voice_by_name_null_voice(); test_espeak_set_voice_by_name_blank_voice(); test_espeak_set_voice_by_name_valid_voice();