Browse Source

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.
master
Samuel Thibault 3 years ago
parent
commit
1228094127
2 changed files with 20 additions and 1 deletions
  1. 16
    0
      src/libespeak-ng/phonemelist.c
  2. 4
    1
      src/libespeak-ng/synthdata.c

+ 16
- 0
src/libespeak-ng/phonemelist.c View File

@@ -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;

+ 4
- 1
src/libespeak-ng/synthdata.c View File

@@ -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;

Loading…
Cancel
Save