From 122809412760172b4835608c3964563934e1483c Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Mon, 4 Apr 2022 23:58:19 +0200 Subject: [PATCH] Mark re-used phoneme_tab array as undefined And make sure that the unfilled entries are NULL to catch any spurious reference. Also fix some missing phoneme table switch according to language changes. --- src/libespeak-ng/phonemelist.c | 16 ++++++++++++++++ src/libespeak-ng/synthdata.c | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/libespeak-ng/phonemelist.c b/src/libespeak-ng/phonemelist.c index 7446ea30..8fe9ef40 100644 --- a/src/libespeak-ng/phonemelist.c +++ b/src/libespeak-ng/phonemelist.c @@ -66,6 +66,9 @@ static int SubstitutePhonemes(PHONEME_LIST *plist_out) deleted_sourceix = -1; } + if (plist2->phcode == phonSWITCH) + SelectPhonemeTable(plist2->tone_ph); + // don't do any substitution if the language has been temporarily changed if (!(plist2->synthflags & SFLAG_SWITCHED_LANG)) { if (ix < (n_ph_list2 -1)) @@ -205,6 +208,8 @@ void MakePhonemeList(Translator *tr, int post_pause, bool start_sentence) } n_ph_list2 -= delete_count; + SelectPhonemeTable(current_phoneme_tab); + if ((regression = tr->langopts.param[LOPT_REGRESSIVE_VOICING]) != 0) { // set consonant clusters to all voiced or all unvoiced // Regressive @@ -213,6 +218,17 @@ void MakePhonemeList(Translator *tr, int post_pause, bool start_sentence) voicing = 0; for (j = n_ph_list2-1; j >= 0; j--) { + if (plist2[j].phcode == phonSWITCH) { + /* Find previous phonSWITCH to determine language we're switching back to */ + int k; + for (k = j-1; k >= 0; k--) + if (plist2[k].phcode == phonSWITCH) + break; + if (k >= 0) + SelectPhonemeTable(plist2[k].tone_ph); + else + SelectPhonemeTable(tr->phoneme_tab_ix); + } ph = phoneme_tab[plist2[j].phcode]; if (ph == NULL) continue; diff --git a/src/libespeak-ng/synthdata.c b/src/libespeak-ng/synthdata.c index 3870edf5..128073a4 100644 --- a/src/libespeak-ng/synthdata.c +++ b/src/libespeak-ng/synthdata.c @@ -342,14 +342,17 @@ static void SetUpPhonemeTable(int number) for (ix = 0; ix < phoneme_tab_list[number].n_phonemes; ix++) { ph_code = phtab[ix].code; phoneme_tab[ph_code] = &phtab[ix]; - if (ph_code > n_phoneme_tab) + if (ph_code > n_phoneme_tab) { + memset(&phoneme_tab[n_phoneme_tab+1], 0, (ph_code - (n_phoneme_tab+1)) * sizeof(*phoneme_tab)); n_phoneme_tab = ph_code; + } } } void SelectPhonemeTable(int number) { n_phoneme_tab = 0; + MAKE_MEM_UNDEFINED(&phoneme_tab, sizeof(phoneme_tab)); SetUpPhonemeTable(number); // recursively for included phoneme tables n_phoneme_tab++; current_phoneme_table = number;