| @@ -18,52 +18,42 @@ | |||
| #include "config.h" | |||
| #include <errno.h> | |||
| #include <stdint.h> | |||
| #include <string.h> | |||
| #include <espeak-ng/espeak_ng.h> | |||
| #include <espeak-ng/speak_lib.h> | |||
| #include "phoneme.h" | |||
| #include "speech.h" | |||
| #include "error.h" | |||
| #define FEATURE(a, b, c) ((a << 16) | (b << 8) | (c)) | |||
| // See docs/phonemes.md for the list of supported features. | |||
| enum feature_t { | |||
| // invalid phoneme feature name | |||
| inv, // Not in docs/phonemes.md. This is used to signal an unknown feature name. | |||
| // manner of articulation | |||
| nas, | |||
| stp, | |||
| afr, | |||
| frc, | |||
| flp, | |||
| trl, | |||
| apr, | |||
| clk, | |||
| ejc, | |||
| imp, | |||
| vwl, | |||
| lat, | |||
| sib, | |||
| nas = FEATURE('n', 'a', 's'), | |||
| stp = FEATURE('s', 't', 'p'), | |||
| afr = FEATURE('a', 'f', 'r'), | |||
| frc = FEATURE('f', 'r', 'c'), | |||
| flp = FEATURE('f', 'l', 'p'), | |||
| trl = FEATURE('t', 'r', 'l'), | |||
| apr = FEATURE('a', 'p', 'r'), | |||
| clk = FEATURE('c', 'l', 'k'), | |||
| ejc = FEATURE('e', 'j', 'c'), | |||
| imp = FEATURE('i', 'm', 'p'), | |||
| vwl = FEATURE('v', 'w', 'l'), | |||
| lat = FEATURE('l', 'a', 't'), | |||
| sib = FEATURE('s', 'i', 'b'), | |||
| }; | |||
| static MNEM_TAB features[] = { | |||
| // manner of articulation | |||
| { "nas", nas }, | |||
| { "stp", stp }, | |||
| { "frc", frc }, | |||
| { "afr", afr }, | |||
| { "flp", flp }, | |||
| { "trl", trl }, | |||
| { "apr", apr }, | |||
| { "clk", clk }, | |||
| { "ejc", ejc }, | |||
| { "imp", imp }, | |||
| { "vwl", vwl }, | |||
| { "lat", lat }, | |||
| { "sib", sib }, | |||
| // invalid phoneme feature | |||
| { NULL, inv }, | |||
| }; | |||
| uint32_t lookup_feature(const char *feature) { | |||
| if (strlen(feature) != 3) | |||
| return inv; | |||
| return FEATURE(feature[0], feature[1], feature[2]); | |||
| } | |||
| espeak_ng_STATUS | |||
| phoneme_add_feature(PHONEME_TAB *phoneme, | |||
| @@ -72,7 +62,7 @@ phoneme_add_feature(PHONEME_TAB *phoneme, | |||
| { | |||
| if (!phoneme || !feature) return EINVAL; | |||
| switch (LookupMnem(features, feature)) | |||
| switch (lookup_feature(feature)) | |||
| { | |||
| // manner of articulation | |||
| case nas: | |||