| @@ -42,66 +42,66 @@ | |||
| static const char *help_text = | |||
| "\nespeak-ng [options] [\"<words>\"]\n\n" | |||
| "-f <text file> Text file to speak\n" | |||
| "--stdin Read text input from stdin instead of a file\n\n" | |||
| "If neither -f nor --stdin, then <words> are spoken, or if none then text\n" | |||
| "is spoken from stdin, each line separately.\n\n" | |||
| "-a <integer>\n" | |||
| "\t Amplitude, 0 to 200, default is 100\n" | |||
| "-g <integer>\n" | |||
| "\t Word gap. Pause between words, units of 10mS at the default speed\n" | |||
| "-k <integer>\n" | |||
| "\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" | |||
| "\t higher values indicate a pitch increase (try -k20).\n" | |||
| "-l <integer>\n" | |||
| "\t Line length. If not zero (which is the default), consider\n" | |||
| "\t lines less than this length as end-of-clause\n" | |||
| "-p <integer>\n" | |||
| "\t Pitch adjustment, 0 to 99, default is 50\n" | |||
| "-s <integer>\n" | |||
| "\t Speed in approximate words per minute. The default is 175\n" | |||
| "-v <voice name>\n" | |||
| "\t Use voice file of this name from espeak-data/voices\n" | |||
| "-w <wave file name>\n" | |||
| "\t Write speech to this WAV file, rather than speaking it directly\n" | |||
| "-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n" | |||
| "-m\t Interpret SSML markup, and ignore other < > tags\n" | |||
| "-q\t Quiet, don't produce any speech (may be useful with -x)\n" | |||
| "-x\t Write phoneme mnemonics to stdout\n" | |||
| "-X\t Write phonemes mnemonics and translation trace to stdout\n" | |||
| "-z\t No final sentence pause at the end of the text\n" | |||
| "--compile=<voice name>\n" | |||
| "\t Compile pronunciation rules and dictionary from the current\n" | |||
| "\t directory. <voice name> specifies the language\n" | |||
| "--compile-mbrola=<voice name>\n" | |||
| "\t Compile an MBROLA voice\n" | |||
| "--compile-intonations\n" | |||
| "\t Compile the intonation data\n" | |||
| "--compile-phonemes\n" | |||
| "\t Compile the phoneme data\n" | |||
| "--ipa Write phonemes to stdout using International Phonetic Alphabet\n" | |||
| "--path=\"<path>\"\n" | |||
| "\t Specifies the directory containing the espeak-data directory\n" | |||
| "--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n" | |||
| "--phonout=\"<filename>\"\n" | |||
| "\t Write phoneme output from -x -X --ipa and --pho to this file\n" | |||
| "--punct=\"<characters>\"\n" | |||
| "\t Speak the names of punctuation characters during speaking. If\n" | |||
| "\t =<characters> is omitted, all punctuation is spoken.\n" | |||
| "--sep=<character>\n" | |||
| "\t Separate phonemes (from -x --ipa) with <character>.\n" | |||
| "\t Default is space, z means ZWJN character.\n" | |||
| "--split=<minutes>\n" | |||
| "\t Starts a new WAV file every <minutes>. Used with -w\n" | |||
| "--stdout Write speech output to stdout\n" | |||
| "--tie=<character>\n" | |||
| "\t Use a tie character within multi-letter phoneme names.\n" | |||
| "\t Default is U+361, z means ZWJ character.\n" | |||
| "--version Shows version number and date, and location of espeak-data\n" | |||
| "--voices=<language>\n" | |||
| "\t List the available voices for the specified language.\n" | |||
| "\t If <language> is omitted, then list all voices.\n"; | |||
| "\nespeak-ng [options] [\"<words>\"]\n\n" | |||
| "-f <text file> Text file to speak\n" | |||
| "--stdin Read text input from stdin instead of a file\n\n" | |||
| "If neither -f nor --stdin, then <words> are spoken, or if none then text\n" | |||
| "is spoken from stdin, each line separately.\n\n" | |||
| "-a <integer>\n" | |||
| "\t Amplitude, 0 to 200, default is 100\n" | |||
| "-g <integer>\n" | |||
| "\t Word gap. Pause between words, units of 10mS at the default speed\n" | |||
| "-k <integer>\n" | |||
| "\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" | |||
| "\t higher values indicate a pitch increase (try -k20).\n" | |||
| "-l <integer>\n" | |||
| "\t Line length. If not zero (which is the default), consider\n" | |||
| "\t lines less than this length as end-of-clause\n" | |||
| "-p <integer>\n" | |||
| "\t Pitch adjustment, 0 to 99, default is 50\n" | |||
| "-s <integer>\n" | |||
| "\t Speed in approximate words per minute. The default is 175\n" | |||
| "-v <voice name>\n" | |||
| "\t Use voice file of this name from espeak-data/voices\n" | |||
| "-w <wave file name>\n" | |||
| "\t Write speech to this WAV file, rather than speaking it directly\n" | |||
| "-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n" | |||
| "-m\t Interpret SSML markup, and ignore other < > tags\n" | |||
| "-q\t Quiet, don't produce any speech (may be useful with -x)\n" | |||
| "-x\t Write phoneme mnemonics to stdout\n" | |||
| "-X\t Write phonemes mnemonics and translation trace to stdout\n" | |||
| "-z\t No final sentence pause at the end of the text\n" | |||
| "--compile=<voice name>\n" | |||
| "\t Compile pronunciation rules and dictionary from the current\n" | |||
| "\t directory. <voice name> specifies the language\n" | |||
| "--compile-mbrola=<voice name>\n" | |||
| "\t Compile an MBROLA voice\n" | |||
| "--compile-intonations\n" | |||
| "\t Compile the intonation data\n" | |||
| "--compile-phonemes\n" | |||
| "\t Compile the phoneme data\n" | |||
| "--ipa Write phonemes to stdout using International Phonetic Alphabet\n" | |||
| "--path=\"<path>\"\n" | |||
| "\t Specifies the directory containing the espeak-data directory\n" | |||
| "--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n" | |||
| "--phonout=\"<filename>\"\n" | |||
| "\t Write phoneme output from -x -X --ipa and --pho to this file\n" | |||
| "--punct=\"<characters>\"\n" | |||
| "\t Speak the names of punctuation characters during speaking. If\n" | |||
| "\t =<characters> is omitted, all punctuation is spoken.\n" | |||
| "--sep=<character>\n" | |||
| "\t Separate phonemes (from -x --ipa) with <character>.\n" | |||
| "\t Default is space, z means ZWJN character.\n" | |||
| "--split=<minutes>\n" | |||
| "\t Starts a new WAV file every <minutes>. Used with -w\n" | |||
| "--stdout Write speech output to stdout\n" | |||
| "--tie=<character>\n" | |||
| "\t Use a tie character within multi-letter phoneme names.\n" | |||
| "\t Default is U+361, z means ZWJ character.\n" | |||
| "--version Shows version number and date, and location of espeak-data\n" | |||
| "--voices=<language>\n" | |||
| "\t List the available voices for the specified language.\n" | |||
| "\t If <language> is omitted, then list all voices.\n"; | |||
| @@ -231,7 +231,7 @@ void DisplayVoices(FILE *f_out, char *language) | |||
| break; | |||
| } | |||
| fprintf(f_out,"%2d %-12s%s%c %-20s %-13s ", | |||
| p[0],lang_name,age_buf,genders[v->gender],buf,v->identifier); | |||
| p[0],lang_name,age_buf,genders[v->gender],buf,v->identifier); | |||
| } | |||
| else | |||
| { | |||
| @@ -266,7 +266,8 @@ int OpenWavFile(char *path, int rate) | |||
| static unsigned char wave_hdr[44] = { | |||
| 'R','I','F','F',0x24,0xf0,0xff,0x7f,'W','A','V','E','f','m','t',' ', | |||
| 0x10,0,0,0,1,0,1,0, 9,0x3d,0,0,0x12,0x7a,0,0, | |||
| 2,0,0x10,0,'d','a','t','a', 0x00,0xf0,0xff,0x7f}; | |||
| 2,0,0x10,0,'d','a','t','a', 0x00,0xf0,0xff,0x7f | |||
| }; | |||
| if(path == NULL) | |||
| return(2); | |||
| @@ -281,7 +282,7 @@ int OpenWavFile(char *path, int rate) | |||
| else | |||
| f_wavfile = fopen(path,"wb"); | |||
| } | |||
| if(f_wavfile == NULL) | |||
| { | |||
| fprintf(stderr,"Can't write to: '%s'\n",path); | |||
| @@ -389,16 +390,16 @@ static void PrintVersion() | |||
| #ifdef NEED_GETOPT | |||
| struct option { | |||
| char *name; | |||
| int has_arg; | |||
| int *flag; | |||
| int val; | |||
| }; | |||
| int optind; | |||
| static int optional_argument; | |||
| static const char *arg_opts = "abfgklpsvw"; // which options have arguments | |||
| static char *opt_string=""; | |||
| struct option { | |||
| char *name; | |||
| int has_arg; | |||
| int *flag; | |||
| int val; | |||
| }; | |||
| int optind; | |||
| static int optional_argument; | |||
| static const char *arg_opts = "abfgklpsvw"; // which options have arguments | |||
| static char *opt_string=""; | |||
| #define no_argument 0 | |||
| #define required_argument 1 | |||
| #define optional_argument 2 | |||
| @@ -407,7 +408,7 @@ static void PrintVersion() | |||
| int main (int argc, char **argv) | |||
| { | |||
| static struct option long_options[] = | |||
| { | |||
| { | |||
| {"help", no_argument, 0, 'h'}, | |||
| {"stdin", no_argument, 0, 0x100}, | |||
| {"compile-debug", optional_argument, 0, 0x101}, | |||
| @@ -427,7 +428,7 @@ int main (int argc, char **argv) | |||
| {"compile-intonations", no_argument, 0, 0x10f}, | |||
| {"compile-phonemes", no_argument, 0, 0x110}, | |||
| {0, 0, 0, 0} | |||
| }; | |||
| }; | |||
| static const char* err_load = "Failed to read "; | |||
| @@ -496,7 +497,7 @@ int main (int argc, char **argv) | |||
| break; // -- means don't interpret further - as commands | |||
| opt_string=""; | |||
| for(ix=0; ;ix++) | |||
| for(ix=0;; ix++) | |||
| { | |||
| if(long_options[ix].name == 0) | |||
| break; | |||
| @@ -528,7 +529,7 @@ int main (int argc, char **argv) | |||
| while(true) | |||
| { | |||
| c = getopt_long (argc, argv, "a:b:f:g:hk:l:mp:qs:v:w:xXz", | |||
| long_options, &option_index); | |||
| long_options, &option_index); | |||
| /* Detect the end of the options. */ | |||
| if (c == -1) | |||
| @@ -610,23 +611,23 @@ int main (int argc, char **argv) | |||
| synth_flags &= ~espeakENDPAUSE; | |||
| break; | |||
| case 0x100: // --stdin | |||
| case 0x100: // --stdin | |||
| flag_stdin = 1; | |||
| break; | |||
| case 0x105: // --stdout | |||
| case 0x105: // --stdout | |||
| option_waveout = 1; | |||
| strcpy(wavefile,"stdout"); | |||
| break; | |||
| case 0x101: // --compile-debug | |||
| case 0x102: // --compile | |||
| case 0x102: // --compile | |||
| strncpy0(voicename,optarg2,sizeof(voicename)); | |||
| flag_compile = c; | |||
| quiet = 1; | |||
| break; | |||
| case 0x103: // --punct | |||
| case 0x103: // --punct | |||
| option_punctuation = 1; | |||
| if(optarg2 != NULL) | |||
| { | |||
| @@ -671,34 +672,34 @@ int main (int argc, char **argv) | |||
| // deprecated and obsolete | |||
| switch(atoi(optarg2)) | |||
| { | |||
| case 1: | |||
| phonemes_separator = '_'; | |||
| break; | |||
| case 2: | |||
| phonemes_separator = 0x0361; | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 3: | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 1: | |||
| phonemes_separator = '_'; | |||
| break; | |||
| case 2: | |||
| phonemes_separator = 0x0361; | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 3: | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| } | |||
| } | |||
| break; | |||
| case 0x10b: // --version | |||
| PrintVersion(); | |||
| exit(0); | |||
| case 0x10c: // --sep | |||
| phoneme_options |= espeakPHONEMES_SHOW; | |||
| if(optarg2 == 0) | |||
| phonemes_separator = ' '; | |||
| else | |||
| utf8_in(&phonemes_separator, optarg2); | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200c; // ZWNJ | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200c; // ZWNJ | |||
| break; | |||
| case 0x10d: // --tie | |||
| @@ -707,8 +708,8 @@ int main (int argc, char **argv) | |||
| phonemes_separator = 0x0361; // default: combining-double-inverted-breve | |||
| else | |||
| utf8_in(&phonemes_separator, optarg2); | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| break; | |||
| case 0x10e: // --compile-mbrola | |||
| @@ -755,7 +756,7 @@ int main (int argc, char **argv) | |||
| // play the sound output | |||
| samplerate = espeak_Initialize(AUDIO_OUTPUT_PLAYBACK,0,data_path,0); | |||
| } | |||
| if(voicename[0] == 0) | |||
| strcpy(voicename,"default"); | |||
| @@ -795,7 +796,7 @@ int main (int argc, char **argv) | |||
| espeak_SetParameter(espeakLINELENGTH,option_linelength,0); | |||
| if(option_punctuation == 2) | |||
| espeak_SetPunctuationList(option_punctlist); | |||
| espeak_SetPhonemeTrace(phoneme_options | (phonemes_separator << 8), f_phonemes_out); | |||
| @@ -40,8 +40,8 @@ | |||
| #endif | |||
| typedef struct { | |||
| unsigned int value; | |||
| char *name; | |||
| unsigned int value; | |||
| char *name; | |||
| } NAMETAB; | |||
| NAMETAB *manifest = NULL; | |||
| @@ -322,29 +322,29 @@ static keywtab_t keywords[] = { | |||
| {"flag3", tPHONEME_FLAG, phFLAG3}, | |||
| // voiced / unvoiced | |||
| {"vcd", tPHONEME_FLAG, phVOICED}, | |||
| {"vls", tPHONEME_FLAG, phFORTIS}, | |||
| {"vcd", tPHONEME_FLAG, phVOICED}, | |||
| {"vls", tPHONEME_FLAG, phFORTIS}, | |||
| // place of articulation, set bits 16-19 of phflags | |||
| {"blb", tPLACE, 1}, | |||
| {"lbd", tPLACE, 2}, | |||
| {"dnt", tPLACE, 3}, | |||
| {"alv", tPLACE, 4}, | |||
| {"rfx", tPLACE, 5}, | |||
| {"pla", tPLACE, 6}, | |||
| {"pal", tPLACE, 7}, | |||
| {"vel", tPLACE, 8}, | |||
| {"lbv", tPLACE, 9}, | |||
| {"uvl", tPLACE, 10}, | |||
| {"phr", tPLACE, 11}, | |||
| {"glt", tPLACE, 12}, | |||
| {"blb", tPLACE, 1}, | |||
| {"lbd", tPLACE, 2}, | |||
| {"dnt", tPLACE, 3}, | |||
| {"alv", tPLACE, 4}, | |||
| {"rfx", tPLACE, 5}, | |||
| {"pla", tPLACE, 6}, | |||
| {"pal", tPLACE, 7}, | |||
| {"vel", tPLACE, 8}, | |||
| {"lbv", tPLACE, 9}, | |||
| {"uvl", tPLACE, 10}, | |||
| {"phr", tPLACE, 11}, | |||
| {"glt", tPLACE, 12}, | |||
| // vowel transition attributes | |||
| {"len=", tTRANSITION, 1}, | |||
| {"rms=", tTRANSITION, 2}, | |||
| {"f1=", tTRANSITION, 3}, | |||
| {"len=", tTRANSITION, 1}, | |||
| {"rms=", tTRANSITION, 2}, | |||
| {"f1=", tTRANSITION, 3}, | |||
| {"f2=", tTRANSITION, 4}, | |||
| {"f3=", tTRANSITION, 5}, | |||
| {"f3=", tTRANSITION, 5}, | |||
| {"brk", tTRANSITION, 6}, | |||
| {"rate", tTRANSITION, 7}, | |||
| {"glstop", tTRANSITION, 8}, | |||
| @@ -359,7 +359,8 @@ static keywtab_t keywords[] = { | |||
| static keywtab_t *keyword_tabs[] = { | |||
| keywords, k_conditions, k_properties, k_intonation }; | |||
| keywords, k_conditions, k_properties, k_intonation | |||
| }; | |||
| static PHONEME_TAB *phoneme_out; | |||
| @@ -376,7 +377,7 @@ static char equivalence_buf[20000]; | |||
| #define N_PROCS 50 | |||
| int n_procs; | |||
| int proc_addr[N_PROCS]; | |||
| int proc_addr[N_PROCS]; | |||
| char proc_names[40][N_PROCS]; | |||
| #define MAX_PROG_BUF 2000 | |||
| @@ -386,54 +387,54 @@ USHORT prog_buf[MAX_PROG_BUF+20]; | |||
| static void ReadPhondataManifest() | |||
| { | |||
| // Read the phondata-manifest file | |||
| FILE *f; | |||
| int n_lines=0; | |||
| int ix; | |||
| char *p; | |||
| unsigned int value; | |||
| char buf[sizeof(path_home)+40]; | |||
| char name[120]; | |||
| // Read the phondata-manifest file | |||
| FILE *f; | |||
| int n_lines=0; | |||
| int ix; | |||
| char *p; | |||
| unsigned int value; | |||
| char buf[sizeof(path_home)+40]; | |||
| char name[120]; | |||
| sprintf(buf,"%s%c%s",path_home,PATHSEP,"phondata-manifest"); | |||
| if((f = fopen(buf, "r")) == NULL) | |||
| return; | |||
| while(fgets(buf, sizeof(buf), f) != NULL) | |||
| n_lines++; | |||
| rewind(f); | |||
| if(manifest != NULL) | |||
| { | |||
| for(ix=0; ix < n_manifest; ix++) | |||
| free(manifest[ix].name); | |||
| } | |||
| if((manifest = (NAMETAB *)realloc(manifest, n_lines * sizeof(NAMETAB))) == NULL) | |||
| { | |||
| fclose(f); | |||
| return; | |||
| } | |||
| n_manifest = 0; | |||
| while(fgets(buf, sizeof(buf), f) != NULL) | |||
| { | |||
| if(!isalpha(buf[0])) | |||
| continue; | |||
| if(sscanf(&buf[2], "%x %s", &value, name) == 2) | |||
| { | |||
| if((p = (char *)malloc(strlen(name)+1)) != NULL) | |||
| { | |||
| strcpy(p, name); | |||
| manifest[n_manifest].value = value; | |||
| manifest[n_manifest].name = p; | |||
| n_manifest++; | |||
| } | |||
| } | |||
| } | |||
| fclose(f); | |||
| if((f = fopen(buf, "r")) == NULL) | |||
| return; | |||
| while(fgets(buf, sizeof(buf), f) != NULL) | |||
| n_lines++; | |||
| rewind(f); | |||
| if(manifest != NULL) | |||
| { | |||
| for(ix=0; ix < n_manifest; ix++) | |||
| free(manifest[ix].name); | |||
| } | |||
| if((manifest = (NAMETAB *)realloc(manifest, n_lines * sizeof(NAMETAB))) == NULL) | |||
| { | |||
| fclose(f); | |||
| return; | |||
| } | |||
| n_manifest = 0; | |||
| while(fgets(buf, sizeof(buf), f) != NULL) | |||
| { | |||
| if(!isalpha(buf[0])) | |||
| continue; | |||
| if(sscanf(&buf[2], "%x %s", &value, name) == 2) | |||
| { | |||
| if((p = (char *)malloc(strlen(name)+1)) != NULL) | |||
| { | |||
| strcpy(p, name); | |||
| manifest[n_manifest].value = value; | |||
| manifest[n_manifest].name = p; | |||
| n_manifest++; | |||
| } | |||
| } | |||
| } | |||
| fclose(f); | |||
| } | |||
| static const char *KeyToMnem(keywtab_t *ktab, int type, int value) | |||
| @@ -467,7 +468,8 @@ static void DecompilePhoneme(FILE *f_out, PHONEME_TAB *ph, int compile_phoneme) | |||
| "", "", "IF", "IF OR", | |||
| "", "", "", "", | |||
| "", "", "", "FMT", | |||
| "WAV", "NextVowelStart", "PrevVowelEnd", "+wav" }; | |||
| "WAV", "NextVowelStart", "PrevVowelEnd", "+wav" | |||
| }; | |||
| static const char *nextPh_string[6] = { | |||
| "prevPh", "thisPh", "nextPh", "next2Ph", "nextPhW", "**", | |||
| @@ -483,15 +485,17 @@ static void DecompilePhoneme(FILE *f_out, PHONEME_TAB *ph, int compile_phoneme) | |||
| static const char *instn_jumps[] = { | |||
| "JMP", "Invalid", "Invalid", "Invalid", | |||
| "JMP false", "SwitchNextVowelType", "SwitchPrevVowelType", "Invalid"}; | |||
| "JMP false", "SwitchNextVowelType", "SwitchPrevVowelType", "Invalid" | |||
| }; | |||
| static char instn1_paramtype[] = { | |||
| 0, 3, 3, 3, 3, 3, 3, 1, | |||
| 1, 1, 1, 1, 1, 0, 0, 0, | |||
| 3, 3, 3, 3, 3, 3, 3, 3, | |||
| 0, 0, 0, 0, 0, 0, 0, 0}; | |||
| 0, 0, 0, 0, 0, 0, 0, 0 | |||
| }; | |||
| return; | |||
| return; | |||
| if(compile_phoneme) | |||
| { | |||
| @@ -715,7 +719,7 @@ unsigned char envelope_dat[N_ENVELOPES][ENV_LEN]; | |||
| typedef struct { | |||
| FILE *file; | |||
| int linenum; | |||
| int linenum; | |||
| char fname[80]; | |||
| } STACK; | |||
| @@ -728,7 +732,7 @@ int if_level; | |||
| typedef struct { | |||
| USHORT *p_then; | |||
| USHORT *p_else; | |||
| int returned; | |||
| int returned; | |||
| } IF_STACK; | |||
| IF_STACK if_stack[N_IF_STACK]; | |||
| @@ -785,8 +789,8 @@ static void CompileReport(void) | |||
| int procedure_num; | |||
| int prev_mnemonic; | |||
| if(f_report == NULL) | |||
| return; | |||
| if(f_report == NULL) | |||
| return; | |||
| // make a list of all the references and sort it | |||
| list = (REF_HASH_TAB **)malloc((count_references)* sizeof(REF_HASH_TAB *)); | |||
| @@ -794,7 +798,7 @@ static void CompileReport(void) | |||
| return; | |||
| fprintf(f_report,"\n%d phoneme tables\n",n_phoneme_tabs); | |||
| fprintf(f_report," new total\n"); | |||
| fprintf(f_report," new total\n"); | |||
| for(ix=0; ix<n_phoneme_tabs; ix++) | |||
| { | |||
| fprintf(f_report,"%8s %3d %4d\n",phoneme_tab_list2[ix].name, phoneme_tab_list2[ix].n_phonemes, n_phcodes_list[ix]+1); | |||
| @@ -872,7 +876,7 @@ int strcasecmp(const char *s1, const char *s2) | |||
| int ix=0; | |||
| int diff; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if((diff = (tolower(s1[ix]) - tolower(s2[ix]))) != 0) | |||
| return(diff); | |||
| @@ -905,7 +909,7 @@ static int ph_sorter(char **a, char **b) | |||
| return(ix); | |||
| strcpy(mnem1,WordToString(p1->mnemonic)); | |||
| return(strcasecmp(mnem1,WordToString(p2->mnemonic))); | |||
| return(strcasecmp(mnem1,WordToString(p2->mnemonic))); | |||
| } | |||
| @@ -1015,7 +1019,7 @@ static FILE *fopen_log(FILE *f_log, const char *fname,const char *access) | |||
| static unsigned int StringToWord(const char *string) | |||
| { | |||
| // Pack 4 characters into a word | |||
| int ix; | |||
| int ix; | |||
| unsigned char c; | |||
| unsigned int word; | |||
| @@ -1067,7 +1071,8 @@ static MNEM_TAB reserved_phonemes[] = { | |||
| {"#i", phonVOWELTYPES+3}, | |||
| {"#o", phonVOWELTYPES+4}, | |||
| {"#u", phonVOWELTYPES+5}, | |||
| {NULL, 0} }; | |||
| {NULL, 0} | |||
| }; | |||
| static void ReservePhCodes() | |||
| @@ -1096,9 +1101,9 @@ static int LookupPhoneme(const char *string, int control) | |||
| // control = 1 declare phoneme if not found | |||
| // control = 2 start looking after control & stress phonemes | |||
| int ix; | |||
| int start; | |||
| int use; | |||
| int ix; | |||
| int start; | |||
| int use; | |||
| unsigned int word; | |||
| if(strcmp(string,"NULL")==0) | |||
| @@ -1116,7 +1121,7 @@ static int LookupPhoneme(const char *string, int control) | |||
| if(control==2) | |||
| start = 8; // don't look for control and stress phonemes (allows these characters to be | |||
| // used for other purposes) | |||
| // used for other purposes) | |||
| use = 0; | |||
| for(ix=start; ix<n_phcodes; ix++) | |||
| @@ -1176,11 +1181,11 @@ int CheckNextChar() | |||
| static int NextItem(int type) | |||
| { | |||
| int acc; | |||
| unsigned char c=0; | |||
| int acc; | |||
| unsigned char c=0; | |||
| unsigned char c2; | |||
| int ix; | |||
| int sign; | |||
| int ix; | |||
| int sign; | |||
| char *p; | |||
| keywtab_t *pk; | |||
| @@ -1308,17 +1313,17 @@ static int NextItem(int type) | |||
| static int NextItemMax(int max) | |||
| { | |||
| // Get a number, but restrict value to max | |||
| int value; | |||
| char msg[80]; | |||
| value = NextItem(tNUMBER); | |||
| if(value > max) | |||
| { | |||
| sprintf(msg, "Value %d is greater than maximum %d", value, max); | |||
| error(msg, NULL); | |||
| value = max; | |||
| } | |||
| return(value); | |||
| int value; | |||
| char msg[80]; | |||
| value = NextItem(tNUMBER); | |||
| if(value > max) | |||
| { | |||
| sprintf(msg, "Value %d is greater than maximum %d", value, max); | |||
| error(msg, NULL); | |||
| value = max; | |||
| } | |||
| return(value); | |||
| } | |||
| @@ -1415,7 +1420,7 @@ int CompileVowelTransition(int which) | |||
| rms = 16 / 2; | |||
| } | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| key = NextItem(tKEYWORD); | |||
| if(item_type != tTRANSITION) | |||
| @@ -1724,10 +1729,10 @@ static int LoadWavefile(FILE *f, const char *fname) | |||
| if((sr1 != samplerate_native) || (sr2 != sr1*2)) | |||
| { | |||
| int fd_temp; | |||
| char command[sizeof(path_home)+250]; | |||
| int fd_temp; | |||
| char command[sizeof(path_home)+250]; | |||
| failed = 0; | |||
| failed = 0; | |||
| #ifdef PLATFORM_POSIX | |||
| strcpy(fname_temp,"/tmp/espeakXXXXXX"); | |||
| @@ -1739,52 +1744,52 @@ static int LoadWavefile(FILE *f, const char *fname) | |||
| strcpy(fname_temp,tmpnam(NULL)); | |||
| #endif | |||
| fname2 = fname; | |||
| len = strlen(fname); | |||
| if(strcmp(&fname[len-4], ".wav") == 0) | |||
| { | |||
| strcpy(msg, fname); | |||
| msg[len-4] = 0; | |||
| fname2 = msg; | |||
| } | |||
| sprintf(command,"sox \"%s/../phsource/%s.wav\" -r %d -c1 -t wav %s\n",path_home,fname2,samplerate_native, fname_temp); | |||
| if(system(command) != 0) | |||
| { | |||
| failed = 1; | |||
| } | |||
| if(failed || (GetFileLength(fname_temp) <= 0)) | |||
| { | |||
| if(resample_fails < 2) | |||
| error("Resample command failed: %s", command); | |||
| resample_fails++; | |||
| if(sr1 != samplerate_native) | |||
| { | |||
| sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname); | |||
| error("%s", msg); | |||
| } | |||
| else | |||
| { | |||
| error("WAV file is not mono: %s", fname); | |||
| } | |||
| remove(fname_temp); | |||
| return(0); | |||
| } | |||
| f = fopen(fname_temp,"rb"); | |||
| if(f == NULL) | |||
| { | |||
| error("Can't read temp file: %s",fname_temp); | |||
| return(0); | |||
| } | |||
| if(f_report != NULL) | |||
| fprintf(f_report, "resampled %s\n", fname); | |||
| resample_count++; | |||
| resample_wav = 1; | |||
| fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length" | |||
| fname2 = fname; | |||
| len = strlen(fname); | |||
| if(strcmp(&fname[len-4], ".wav") == 0) | |||
| { | |||
| strcpy(msg, fname); | |||
| msg[len-4] = 0; | |||
| fname2 = msg; | |||
| } | |||
| sprintf(command,"sox \"%s/../phsource/%s.wav\" -r %d -c1 -t wav %s\n",path_home,fname2,samplerate_native, fname_temp); | |||
| if(system(command) != 0) | |||
| { | |||
| failed = 1; | |||
| } | |||
| if(failed || (GetFileLength(fname_temp) <= 0)) | |||
| { | |||
| if(resample_fails < 2) | |||
| error("Resample command failed: %s", command); | |||
| resample_fails++; | |||
| if(sr1 != samplerate_native) | |||
| { | |||
| sprintf(msg, "Can't resample (%d to %d): %s", sr1, samplerate_native, fname); | |||
| error("%s", msg); | |||
| } | |||
| else | |||
| { | |||
| error("WAV file is not mono: %s", fname); | |||
| } | |||
| remove(fname_temp); | |||
| return(0); | |||
| } | |||
| f = fopen(fname_temp,"rb"); | |||
| if(f == NULL) | |||
| { | |||
| error("Can't read temp file: %s",fname_temp); | |||
| return(0); | |||
| } | |||
| if(f_report != NULL) | |||
| fprintf(f_report, "resampled %s\n", fname); | |||
| resample_count++; | |||
| resample_wav = 1; | |||
| fseek(f,40,SEEK_SET); // skip past the WAV header, up to before "data length" | |||
| } | |||
| displ = ftell(f_phdata); | |||
| @@ -1833,7 +1838,7 @@ static int LoadWavefile(FILE *f, const char *fname) | |||
| if(feof(f)) break; | |||
| if(scale_factor <= MIN_FACTOR) | |||
| if(scale_factor <= MIN_FACTOR) | |||
| { | |||
| fputc(sample & 0xff,f_phdata); | |||
| fputc(sample >> 8,f_phdata); | |||
| @@ -1897,19 +1902,19 @@ static int LoadEnvelope(FILE *f, const char *fname) | |||
| /* Generate a hash code from the specified string */ | |||
| static int Hash8(const char *string) | |||
| { | |||
| int c; | |||
| int chars=0; | |||
| int hash=0; | |||
| while((c = *string++) != 0) | |||
| { | |||
| c = tolower(c) - 'a'; | |||
| hash = hash * 8 + c; | |||
| hash = (hash & 0x1ff) ^ (hash >> 8); /* exclusive or */ | |||
| int c; | |||
| int chars=0; | |||
| int hash=0; | |||
| while((c = *string++) != 0) | |||
| { | |||
| c = tolower(c) - 'a'; | |||
| hash = hash * 8 + c; | |||
| hash = (hash & 0x1ff) ^ (hash >> 8); /* exclusive or */ | |||
| chars++; | |||
| } | |||
| } | |||
| return((hash+chars) & 0xff); | |||
| return((hash+chars) & 0xff); | |||
| } | |||
| @@ -2182,16 +2187,16 @@ int CompileSound(int keyword, int isvowel) | |||
| /* | |||
| Condition | |||
| bits 14,15 1 | |||
| bit 13 1 = AND, 0 = OR | |||
| bit 12 spare | |||
| bit 8-11 | |||
| =0-3 p,t,n,n2 data=phoneme code | |||
| =4-7 p,t,n,n2 data=(bits5-7: phtype, place, property, special) (bits0-4: data) | |||
| =8 data = stress bitmap | |||
| =9 special tests | |||
| */ | |||
| Condition | |||
| bits 14,15 1 | |||
| bit 13 1 = AND, 0 = OR | |||
| bit 12 spare | |||
| bit 8-11 | |||
| =0-3 p,t,n,n2 data=phoneme code | |||
| =4-7 p,t,n,n2 data=(bits5-7: phtype, place, property, special) (bits0-4: data) | |||
| =8 data = stress bitmap | |||
| =9 special tests | |||
| */ | |||
| int CompileIf(int elif) | |||
| { | |||
| @@ -2233,9 +2238,9 @@ int CompileIf(int elif) | |||
| // prevPh(), thisPh(), nextPh(), next2Ph() etc | |||
| if(key >= 6) | |||
| { | |||
| // put the 'which' code in the next instruction | |||
| word2 = key; | |||
| key = 6; | |||
| // put the 'which' code in the next instruction | |||
| word2 = key; | |||
| key = 6; | |||
| } | |||
| key = key << 8; | |||
| @@ -2763,19 +2768,19 @@ int CompilePhoneme(int compile_phoneme) | |||
| count = 0; | |||
| ix = 1; | |||
| for(p=item_string; *p != 0;) | |||
| for(p=item_string; *p != 0; ) | |||
| { | |||
| p += utf8_in(&c, p); | |||
| if((c == '|') && (count > 0)) | |||
| { | |||
| // '|' means don't allow a tie or joiner before this letter | |||
| flags |= (1 << (count -1)); | |||
| } | |||
| else | |||
| p += utf8_in(&c, p); | |||
| if((c == '|') && (count > 0)) | |||
| { | |||
| // '|' means don't allow a tie or joiner before this letter | |||
| flags |= (1 << (count -1)); | |||
| } | |||
| else | |||
| if((c=='U') && (p[0]=='+')) | |||
| { | |||
| int j; | |||
| int j; | |||
| // U+9999 | |||
| p++; | |||
| memcpy(number_buf,p,4); // U+ should be followed by 4 hex digits | |||
| @@ -2786,25 +2791,25 @@ int CompilePhoneme(int compile_phoneme) | |||
| // move past the 4 hexdecimal digits | |||
| for(j=0; j<4; j++) | |||
| { | |||
| if(!isalnum(*p)) | |||
| break; | |||
| p++; | |||
| if(!isalnum(*p)) | |||
| break; | |||
| p++; | |||
| } | |||
| ix += utf8_out(c, &ipa_buf[ix]); | |||
| count++; | |||
| } | |||
| else | |||
| { | |||
| ix += utf8_out(c, &ipa_buf[ix]); | |||
| ix += utf8_out(c, &ipa_buf[ix]); | |||
| count++; | |||
| } | |||
| } | |||
| ipa_buf[0] = flags; | |||
| ipa_buf[ix] = 0; | |||
| start = 1; | |||
| if(flags != 0) | |||
| start = 0; // only include the flags byte if bits are set | |||
| start = 1; | |||
| if(flags != 0) | |||
| start = 0; // only include the flags byte if bits are set | |||
| value = strlen(&ipa_buf[start]); // number of UTF-8 bytes | |||
| *prog_out++ = (i_IPA_NAME << 8) + value; | |||
| @@ -3089,7 +3094,7 @@ static void WritePhonemeTables() | |||
| static void EndPhonemeTable() | |||
| { | |||
| int ix; | |||
| int ix; | |||
| int *pw; | |||
| int length; | |||
| @@ -3104,7 +3109,7 @@ static void EndPhonemeTable() | |||
| if(phoneme_tab2[ix].type == phINVALID) | |||
| { | |||
| fprintf(f_errors,"%3d: Phoneme [%s] not declared, referenced at line %d\n",linenum, | |||
| WordToString(phoneme_tab2[ix].mnemonic),(int)(phoneme_tab2[ix].program)); | |||
| WordToString(phoneme_tab2[ix].mnemonic),(int)(phoneme_tab2[ix].program)); | |||
| error_count++; | |||
| phoneme_tab2[ix].type = 0; // prevent the error message repeating | |||
| } | |||
| @@ -3157,7 +3162,7 @@ static void StartPhonemeTable(const char *name) | |||
| if(n_phoneme_tabs > 0) | |||
| { | |||
| NextItem(tSTRING); // name of base phoneme table | |||
| NextItem(tSTRING); // name of base phoneme table | |||
| for(ix=0; ix<n_phoneme_tabs; ix++) | |||
| { | |||
| if(strcmp(item_string,phoneme_tab_list2[ix].name)==0) | |||
| @@ -3307,7 +3312,7 @@ static void CompilePhonemeFiles() | |||
| count_frames = 0; | |||
| n_procs = 0; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if(feof(f_in)) | |||
| { | |||
| @@ -3326,8 +3331,8 @@ static void CompilePhonemeFiles() | |||
| switch(item) | |||
| { | |||
| case kUTF8_BOM: | |||
| break; // ignore bytes 0xef 0xbb 0xbf | |||
| case kUTF8_BOM: | |||
| break; // ignore bytes 0xef 0xbb 0xbf | |||
| case kINCLUDE: | |||
| NextItem(tSTRING); | |||
| @@ -3353,7 +3358,7 @@ static void CompilePhonemeFiles() | |||
| case kPHONEMETABLE: | |||
| EndPhonemeTable(); | |||
| NextItem(tSTRING); // name of the new phoneme table | |||
| NextItem(tSTRING); // name of the new phoneme table | |||
| StartPhonemeTable(item_string); | |||
| break; | |||
| @@ -3391,7 +3396,7 @@ static espeak_ng_STATUS CompilePhonemeData2(const char *source, FILE *log) | |||
| sprintf(fname,"%s/../phsource",path_home); | |||
| #ifdef MAKE_ENVELOPES | |||
| make_envs(); | |||
| make_envs(); | |||
| #endif | |||
| fprintf(log,"Compiling phoneme data: %s\n",fname); | |||
| @@ -3431,19 +3436,19 @@ make_envs(); | |||
| f_phcontents = stderr; | |||
| fprintf (f_phcontents, | |||
| "# This file lists the type of data that has been compiled into the\n" | |||
| "# phondata file\n" | |||
| "#\n" | |||
| "# The first character of a line indicates the type of data:\n" | |||
| "# S - A SPECT_SEQ structure\n" | |||
| "# W - A wavefile segment\n" | |||
| "# E - An envelope\n" | |||
| "# Q - Phoneme equivalence tables\n" | |||
| "#\n" | |||
| "# Address is the displacement within phondata of this item\n" | |||
| "#\n" | |||
| "# Address Data file\n" | |||
| "# ------- ---------\n"); | |||
| "# This file lists the type of data that has been compiled into the\n" | |||
| "# phondata file\n" | |||
| "#\n" | |||
| "# The first character of a line indicates the type of data:\n" | |||
| "# S - A SPECT_SEQ structure\n" | |||
| "# W - A wavefile segment\n" | |||
| "# E - An envelope\n" | |||
| "# Q - Phoneme equivalence tables\n" | |||
| "#\n" | |||
| "# Address is the displacement within phondata of this item\n" | |||
| "#\n" | |||
| "# Address Data file\n" | |||
| "# ------- ---------\n"); | |||
| fprintf(f_errors, "Source data path = '%s/../phsource'\n", path_home); | |||
| @@ -3484,11 +3489,11 @@ make_envs(); | |||
| EndPhonemeTable(); | |||
| WritePhonemeTables(); | |||
| fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references); | |||
| fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references); | |||
| fclose(f_in); | |||
| fclose(f_phdata); | |||
| if(f_prog_log != NULL) | |||
| fclose(f_prog_log); | |||
| if(f_prog_log != NULL) | |||
| fclose(f_prog_log); | |||
| fclose(f_phindex); | |||
| fclose(f_phtab); | |||
| fclose(f_phcontents); | |||
| @@ -3502,37 +3507,38 @@ fprintf(f_errors,"\nRefs %d, Reused %d\n",count_references,duplicate_references | |||
| if(resample_count > 0) | |||
| { | |||
| fprintf(f_errors, "\n%d WAV files resampled to %d Hz\n", resample_count, samplerate_native); | |||
| fprintf(log,"Compiled phonemes: %d errors, %d files resampled to %d Hz.\n",error_count, resample_count, samplerate_native); | |||
| fprintf(f_errors, "\n%d WAV files resampled to %d Hz\n", resample_count, samplerate_native); | |||
| fprintf(log,"Compiled phonemes: %d errors, %d files resampled to %d Hz.\n",error_count, resample_count, samplerate_native); | |||
| } | |||
| else | |||
| { | |||
| fprintf(log,"Compiled phonemes: %d errors.\n",error_count); | |||
| fprintf(log,"Compiled phonemes: %d errors.\n",error_count); | |||
| } | |||
| if(f_errors != stderr) | |||
| fclose(f_errors); | |||
| fclose(f_errors); | |||
| ReadPhondataManifest(); | |||
| return ENS_OK; | |||
| ReadPhondataManifest(); | |||
| return ENS_OK; | |||
| } | |||
| static const char *preset_tune_names[] = { | |||
| "s1", "c1", "q1", "e1", NULL}; | |||
| "s1", "c1", "q1", "e1", NULL | |||
| }; | |||
| static const TUNE default_tune = { | |||
| {0,0,0,0,0,0,0,0,0,0,0,0}, | |||
| {0,0,0,0}, | |||
| {0, 40, 24, 8, 0, 0, 0, 0}, | |||
| 46, 57, PITCHfall, 16, 0, 0, | |||
| 255, 78, 50, 255, | |||
| 3, 5, | |||
| {-7,-7,-7}, {-7,-7,-7}, | |||
| PITCHfall, 64, 8, | |||
| PITCHfall, 70, 18, 24, 12, | |||
| PITCHfall, 70, 18, 24, 12, 0, | |||
| {0,0,0,0,0,0,0,0}, 0 | |||
| {0,0,0,0,0,0,0,0,0,0,0,0}, | |||
| {0,0,0,0}, | |||
| {0, 40, 24, 8, 0, 0, 0, 0}, | |||
| 46, 57, PITCHfall, 16, 0, 0, | |||
| 255, 78, 50, 255, | |||
| 3, 5, | |||
| {-7,-7,-7}, {-7,-7,-7}, | |||
| PITCHfall, 64, 8, | |||
| PITCHfall, 70, 18, 24, 12, | |||
| PITCHfall, 70, 18, 24, 12, 0, | |||
| {0,0,0,0,0,0,0,0}, 0 | |||
| }; | |||
| #define N_TUNE_NAMES 100 | |||
| @@ -3548,7 +3554,8 @@ MNEM_TAB envelope_names[] = { | |||
| {"fall2", 14}, | |||
| {"rise2", 16}, | |||
| {"rise-fall-rise", 18}, | |||
| {NULL, -1} }; | |||
| {NULL, -1} | |||
| }; | |||
| int LookupEnvelopeName(const char *name) | |||
| { | |||
| @@ -3860,7 +3867,7 @@ espeak_ng_STATUS espeak_ng_CompileIntonation(FILE *log) | |||
| espeak_ng_STATUS espeak_ng_CompilePhonemeData(long rate, FILE *log) | |||
| { | |||
| WavegenInit(rate, 0); | |||
| WavegenInit(rate, 0); | |||
| WavegenSetVoice(voice); | |||
| return CompilePhonemeData2("phonemes", log); | |||
| } | |||
| @@ -238,15 +238,15 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| unsigned char c; | |||
| char *p; | |||
| char *p_end; | |||
| int ix; | |||
| int match_type; | |||
| int finished=0; | |||
| int value; | |||
| int linenum=0; | |||
| int flags; | |||
| int suffix_char; | |||
| int condition_num=0; | |||
| int at_start = 0; | |||
| int ix; | |||
| int match_type; | |||
| int finished=0; | |||
| int value; | |||
| int linenum=0; | |||
| int flags; | |||
| int suffix_char; | |||
| int condition_num=0; | |||
| int at_start = 0; | |||
| const char *name; | |||
| char buf[200]; | |||
| char buf_pre[200]; | |||
| @@ -254,9 +254,8 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| static char output[80]; | |||
| static char symbols[] = | |||
| {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', | |||
| '&','%','+','#','S','D','Z','A','L','!',' ','@','?','J','N','K','V','?','T','X','?','W' | |||
| }; | |||
| {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', | |||
| '&','%','+','#','S','D','Z','A','L','!',' ','@','?','J','N','K','V','?','T','X','?','W'}; | |||
| static char symbols_lg[] = {'A','B','C','H','F','G','Y'}; | |||
| @@ -409,25 +408,25 @@ char *DecodeRule(const char *group_chars, int group_length, char *rule, int cont | |||
| static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
| { | |||
| // Compile a line in the language_list file | |||
| unsigned char c; | |||
| unsigned char c; | |||
| char *p; | |||
| char *word; | |||
| char *phonetic; | |||
| unsigned int ix; | |||
| int step; | |||
| unsigned int n_flag_codes = 0; | |||
| unsigned int ix; | |||
| int step; | |||
| unsigned int n_flag_codes = 0; | |||
| int flagnum; | |||
| int flag_offset; | |||
| int length; | |||
| int multiple_words = 0; | |||
| int multiple_numeric_hyphen = 0; | |||
| int flag_offset; | |||
| int length; | |||
| int multiple_words = 0; | |||
| int multiple_numeric_hyphen = 0; | |||
| char *multiple_string = NULL; | |||
| char *multiple_string_end = NULL; | |||
| int len_word; | |||
| int len_phonetic; | |||
| int text_not_phonemes; // this word specifies replacement text, not phonemes | |||
| unsigned int wc; | |||
| unsigned int wc; | |||
| int all_upper_case; | |||
| char *mnemptr; | |||
| @@ -679,7 +678,7 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
| all_upper_case = 1; | |||
| p = word; | |||
| for(p=word;;) | |||
| for(p=word;; ) | |||
| { | |||
| // this assumes that the lower case char is the same length as the upper case char | |||
| // OK, except for Turkish "I", but use towlower() rather than towlower2() | |||
| @@ -823,10 +822,10 @@ static void compile_dictlist_end(FILE *f_out) | |||
| static int compile_dictlist_file(const char *path, const char* filename) | |||
| { | |||
| int length; | |||
| int hash; | |||
| int length; | |||
| int hash; | |||
| char *p; | |||
| int count=0; | |||
| int count=0; | |||
| FILE *f_in; | |||
| char buf[200]; | |||
| char fname[sizeof(path_home)+45]; | |||
| @@ -890,7 +889,7 @@ static char rule_phonemes[80]; | |||
| static char group_name[LEN_GROUP_NAME+1]; | |||
| static int group3_ix; | |||
| #define N_RULES 3000 // max rules for each group | |||
| #define N_RULES 3000 // max rules for each group | |||
| @@ -917,10 +916,10 @@ static void copy_rule_string(char *string, int *state_out) | |||
| int len; | |||
| char c; | |||
| int c2, c3; | |||
| int sxflags; | |||
| int value; | |||
| int literal; | |||
| int hexdigit_input = 0; | |||
| int sxflags; | |||
| int value; | |||
| int literal; | |||
| int hexdigit_input = 0; | |||
| int state = *state_out; | |||
| MNEM_TAB *mr; | |||
| @@ -937,7 +936,7 @@ static void copy_rule_string(char *string, int *state_out) | |||
| } | |||
| sxflags = 0x808000; // to ensure non-zero bytes | |||
| for(p=string,ix=0;;) | |||
| for(p=string,ix=0;; ) | |||
| { | |||
| literal = 0; | |||
| c = *p++; | |||
| @@ -1127,7 +1126,7 @@ static void copy_rule_string(char *string, int *state_out) | |||
| case 'i': | |||
| sxflags |= SUFX_I; | |||
| break; | |||
| case 'p': // obsolete, replaced by 'P' above | |||
| case 'p': // obsolete, replaced by 'P' above | |||
| sxflags |= SUFX_P; | |||
| break; | |||
| case 'v': | |||
| @@ -1209,14 +1208,14 @@ static char *compile_rule(char *input) | |||
| switch(c = input[ix]) | |||
| { | |||
| case ')': // end of prefix section | |||
| case ')': // end of prefix section | |||
| *p = 0; | |||
| state = 1; | |||
| copy_rule_string(buf,&state); | |||
| p = buf; | |||
| break; | |||
| case '(': // start of suffix section | |||
| case '(': // start of suffix section | |||
| *p = 0; | |||
| state = 2; | |||
| copy_rule_string(buf,&state); | |||
| @@ -1229,15 +1228,15 @@ static char *compile_rule(char *input) | |||
| } | |||
| break; | |||
| case '\n': // end of line | |||
| case '\n': // end of line | |||
| case '\r': | |||
| case 0: // end of line | |||
| case 0: // end of line | |||
| *p = 0; | |||
| copy_rule_string(buf,&state); | |||
| finish=1; | |||
| break; | |||
| case '\t': // end of section section | |||
| case '\t': // end of section section | |||
| case ' ': | |||
| *p = 0; | |||
| copy_rule_string(buf,&state); | |||
| @@ -1533,7 +1532,7 @@ static void output_rule_group(FILE *f_out, int n_rules, char **rules, char *name | |||
| if((common[0] != 0) && (strcmp(p,common)==0)) | |||
| { | |||
| fwrite(p2,len2,1,f_out); | |||
| fputc(0,f_out); // no phoneme string, it's the same as previous rule | |||
| fputc(0,f_out); // no phoneme string, it's the same as previous rule | |||
| } | |||
| else | |||
| { | |||
| @@ -1671,7 +1670,7 @@ static int compile_dictrules(FILE *f_in, FILE *f_out, char *fname_temp) | |||
| if((f_temp = fopen_log(fname_temp,"wb")) == NULL) | |||
| return(1); | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| linenum++; | |||
| buf = fgets(buf1,sizeof(buf1),f_in); | |||
| @@ -40,7 +40,7 @@ static const char *basename(const char *filename) | |||
| static unsigned int StringToWord(const char *string) | |||
| { | |||
| // Pack 4 characters into a word | |||
| int ix; | |||
| int ix; | |||
| unsigned char c; | |||
| unsigned int word; | |||
| @@ -18,51 +18,51 @@ void debug_init() | |||
| void debug_enter(const char* text) | |||
| { | |||
| struct timeval tv; | |||
| struct timeval tv; | |||
| gettimeofday(&tv, NULL); | |||
| gettimeofday(&tv, NULL); | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| fprintf(fd_log, "%03d.%03dms > ENTER %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| fprintf(fd_log, "%03d.%03dms > ENTER %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); | |||
| } | |||
| } | |||
| void debug_show(const char *format, ...) | |||
| { | |||
| va_list args; | |||
| va_start(args, format); | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| vfprintf(fd_log, format, args); | |||
| } | |||
| va_end(args); | |||
| va_list args; | |||
| va_start(args, format); | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| vfprintf(fd_log, format, args); | |||
| } | |||
| va_end(args); | |||
| } | |||
| void debug_time(const char* text) | |||
| { | |||
| struct timeval tv; | |||
| struct timeval tv; | |||
| gettimeofday(&tv, NULL); | |||
| gettimeofday(&tv, NULL); | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| fprintf(fd_log, "%03d.%03dms > %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); | |||
| } | |||
| if (!fd_log) | |||
| { | |||
| debug_init(); | |||
| } | |||
| if (fd_log) | |||
| { | |||
| fprintf(fd_log, "%03d.%03dms > %s\n",(int)(tv.tv_sec%1000), (int)(tv.tv_usec/1000), text); | |||
| } | |||
| } | |||
| #endif | |||
| @@ -49,7 +49,7 @@ static unsigned char remove_accent[N_REMOVE_ACCENT] = { | |||
| 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0c0 | |||
| 'd','n','o','o','o','o','o', 0, 'o','u','u','u','u','y','t','s', // 0d0 | |||
| 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i', // 0e0 | |||
| 'd','n','o','o','o','o','o', 0 ,'o','u','u','u','u','y','t','y', // 0f0 | |||
| 'd','n','o','o','o','o','o', 0,'o','u','u','u','u','y','t','y', // 0f0 | |||
| 'a','a','a','a','a','a','c','c','c','c','c','c','c','c','d','d', // 100 | |||
| 'd','d','e','e','e','e','e','e','e','e','e','e','g','g','g','g', // 110 | |||
| @@ -125,7 +125,7 @@ static void InitGroups(Translator *tr) | |||
| // for single-letters and two-letter combinations | |||
| int ix; | |||
| int ix; | |||
| char *p; | |||
| char *p_name; | |||
| unsigned int *pw; | |||
| @@ -280,7 +280,7 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) | |||
| } | |||
| if((Reverse4Bytes(pw[0]) != N_HASH_DICT) || | |||
| (length <= 0) || (length > 0x8000000)) | |||
| (length <= 0) || (length > 0x8000000)) | |||
| { | |||
| fprintf(stderr,"Bad data: '%s' (%x length=%x)\n",fname,Reverse4Bytes(pw[0]),length); | |||
| return(2); | |||
| @@ -313,13 +313,13 @@ int LoadDictionary(Translator *tr, const char *name, int no_error) | |||
| /* Generate a hash code from the specified string | |||
| This is used to access the dictionary_2 word-lookup dictionary | |||
| */ | |||
| This is used to access the dictionary_2 word-lookup dictionary | |||
| */ | |||
| int HashDictionary(const char *string) | |||
| { | |||
| int c; | |||
| int chars=0; | |||
| int hash=0; | |||
| int c; | |||
| int chars=0; | |||
| int hash=0; | |||
| while((c = (*string++ & 0xff)) != 0) | |||
| { | |||
| @@ -338,16 +338,16 @@ int HashDictionary(const char *string) | |||
| Returns advanced 'p' | |||
| outptr contains encoded phonemes, unrecognized phoneme stops the encoding | |||
| bad_phoneme must point to char array of length 2 of more | |||
| */ | |||
| */ | |||
| const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme) | |||
| { | |||
| int ix; | |||
| unsigned char c; | |||
| int count; /* num. of matching characters */ | |||
| int max; /* highest num. of matching found so far */ | |||
| int max_ph; /* corresponding phoneme with highest matching */ | |||
| int consumed; | |||
| unsigned int mnemonic_word; | |||
| unsigned char c; | |||
| int count; /* num. of matching characters */ | |||
| int max; /* highest num. of matching found so far */ | |||
| int max_ph; /* corresponding phoneme with highest matching */ | |||
| int consumed; | |||
| unsigned int mnemonic_word; | |||
| if(bad_phoneme != NULL) | |||
| *bad_phoneme = 0; | |||
| @@ -396,11 +396,11 @@ const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme) | |||
| mnemonic_word = phoneme_tab[ix]->mnemonic; | |||
| while(((c = p[count]) > ' ') && (count < 4) && | |||
| (c == ((mnemonic_word >> (count*8)) & 0xff))) | |||
| (c == ((mnemonic_word >> (count*8)) & 0xff))) | |||
| count++; | |||
| if((count > max) && | |||
| ((count == 4) || (((mnemonic_word >> (count*8)) & 0xff)==0))) | |||
| ((count == 4) || (((mnemonic_word >> (count*8)) & 0xff)==0))) | |||
| { | |||
| max = count; | |||
| max_ph = phoneme_tab[ix]->code; | |||
| @@ -461,7 +461,7 @@ void DecodePhonemes(const char *inptr, char *outptr) | |||
| // Translate from internal phoneme codes into phoneme mnemonics | |||
| unsigned char phcode; | |||
| unsigned char c; | |||
| unsigned int mnem; | |||
| unsigned int mnem; | |||
| PHONEME_TAB *ph; | |||
| static const char *stress_chars = "==,,'* "; | |||
| @@ -627,12 +627,12 @@ const char *GetTranslatedPhonemeString(int phoneme_mode) | |||
| bit 7: use tie between letters in multi-character phoneme names | |||
| bits 8-23 tie or separator character | |||
| */ | |||
| */ | |||
| int ix; | |||
| unsigned int len; | |||
| int phon_out_ix=0; | |||
| int stress; | |||
| int ix; | |||
| unsigned int len; | |||
| int phon_out_ix=0; | |||
| int stress; | |||
| int c; | |||
| char *p; | |||
| char *buf; | |||
| @@ -719,7 +719,7 @@ const char *GetTranslatedPhonemeString(int phoneme_mode) | |||
| flags = 0; | |||
| count = 0; | |||
| for(p=phon_buf2; *p != 0;) | |||
| for(p=phon_buf2; *p != 0; ) | |||
| { | |||
| p += utf8_in(&c, p); | |||
| if(use_tie != 0) | |||
| @@ -783,7 +783,7 @@ static int IsLetterGroup(Translator *tr, char *word, int group, int pre) | |||
| // match the word against a list of utf-8 strings | |||
| char *p; | |||
| char *w; | |||
| int len=0; | |||
| int len=0; | |||
| p = tr->letterGroups[group]; | |||
| if(p == NULL) | |||
| @@ -862,7 +862,7 @@ int IsVowel(Translator *tr, int letter) | |||
| static int Unpronouncable2(Translator *tr, char *word) | |||
| { | |||
| int c; | |||
| int c; | |||
| int end_flags; | |||
| char ph_buf[N_WORD_PHONEMES]; | |||
| @@ -880,16 +880,16 @@ static int Unpronouncable2(Translator *tr, char *word) | |||
| int Unpronouncable(Translator *tr, char *word, int posn) | |||
| { | |||
| /* Determines whether a word in 'unpronouncable', i.e. whether it should | |||
| be spoken as individual letters. | |||
| be spoken as individual letters. | |||
| This function may be language specific. This is a generic version. | |||
| */ | |||
| This function may be language specific. This is a generic version. | |||
| */ | |||
| int c; | |||
| int c1=0; | |||
| int vowel_posn=9; | |||
| int index; | |||
| int count; | |||
| int c; | |||
| int c1=0; | |||
| int vowel_posn=9; | |||
| int index; | |||
| int count; | |||
| ALPHABET *alphabet; | |||
| utf8_in(&c,word); | |||
| @@ -913,7 +913,7 @@ int Unpronouncable(Translator *tr, char *word, int posn) | |||
| index = 0; | |||
| count = 0; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| index += utf8_in(&c,&word[index]); | |||
| if((c==0) || (c==' ')) | |||
| @@ -1093,17 +1093,16 @@ static int GetVowelStress(Translator *tr, unsigned char *phonemes, signed char * | |||
| static char stress_phonemes[] = {phonSTRESS_D, phonSTRESS_U, phonSTRESS_2, phonSTRESS_3, | |||
| phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC | |||
| }; | |||
| phonSTRESS_P, phonSTRESS_P2, phonSTRESS_TONIC}; | |||
| void ChangeWordStress(Translator *tr, char *word, int new_stress) | |||
| { | |||
| int ix; | |||
| unsigned char *p; | |||
| int max_stress; | |||
| int vowel_count; // num of vowels + 1 | |||
| int stressed_syllable=0; // position of stressed syllable | |||
| int max_stress; | |||
| int vowel_count; // num of vowels + 1 | |||
| int stressed_syllable=0; // position of stressed syllable | |||
| unsigned char phonetic[N_WORD_PHONEMES]; | |||
| signed char vowel_stress[N_WORD_PHONEMES/2]; | |||
| @@ -1158,28 +1157,28 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| 'output' is used for input and output | |||
| 'dictionary_flags' has bits 0-3 position of stressed vowel (if > 0) | |||
| or unstressed (if == 7) or syllables 1 and 2 (if == 6) | |||
| bits 8... dictionary flags | |||
| or unstressed (if == 7) or syllables 1 and 2 (if == 6) | |||
| bits 8... dictionary flags | |||
| If 'tonic' is set (>= 0), replace highest stress by this value. | |||
| control: bit 0 This is an individual symbol, not a word | |||
| control: bit 0 This is an individual symbol, not a word | |||
| bit 1 Suffix phonemes are still to be added | |||
| */ | |||
| */ | |||
| unsigned char phcode; | |||
| unsigned char *p; | |||
| PHONEME_TAB *ph; | |||
| int stress; | |||
| int max_stress; | |||
| int max_stress_input; // any stress specified in the input? | |||
| int vowel_count; // num of vowels + 1 | |||
| int ix; | |||
| int v; | |||
| int v_stress; | |||
| int stressed_syllable; // position of stressed syllable | |||
| int max_stress_posn; | |||
| int unstressed_word = 0; | |||
| int stress; | |||
| int max_stress; | |||
| int max_stress_input; // any stress specified in the input? | |||
| int vowel_count; // num of vowels + 1 | |||
| int ix; | |||
| int v; | |||
| int v_stress; | |||
| int stressed_syllable; // position of stressed syllable | |||
| int max_stress_posn; | |||
| int unstressed_word = 0; | |||
| char *max_output; | |||
| int final_ph; | |||
| int final_ph2; | |||
| @@ -1201,11 +1200,11 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| /* stress numbers STRESS_BASE + | |||
| 0 diminished, unstressed within a word | |||
| 1 unstressed, weak | |||
| 2 | |||
| 3 secondary stress | |||
| 4 main stress */ | |||
| 0 diminished, unstressed within a word | |||
| 1 unstressed, weak | |||
| 2 | |||
| 3 secondary stress | |||
| 4 main stress */ | |||
| stressflags = tr->langopts.stress_flags; | |||
| @@ -1281,7 +1280,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| // stress on first syllable, unless it is a light syllable followed by a heavy syllable | |||
| if((syllable_weight[1] > 0) || (syllable_weight[2] == 0)) | |||
| break; | |||
| // else drop through to case 1 | |||
| // else drop through to case 1 | |||
| case 1: | |||
| // stress on second syllable | |||
| if((stressed_syllable == 0) && (vowel_count > 2)) | |||
| @@ -1305,7 +1304,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| break; | |||
| } | |||
| } | |||
| // drop through to next case | |||
| // drop through to next case | |||
| case 2: | |||
| // a language with stress on penultimate vowel | |||
| @@ -1549,8 +1548,8 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| break; | |||
| } | |||
| if((stressflags & S_FINAL_VOWEL_UNSTRESSED) && ((control & 2) == 0) && (vowel_count > 2) && (max_stress_input < 3) && (vowel_stress[vowel_count - 1] == 4)) | |||
| { | |||
| if((stressflags & S_FINAL_VOWEL_UNSTRESSED) && ((control & 2) == 0) && (vowel_count > 2) && (max_stress_input < 3) && (vowel_stress[vowel_count - 1] == 4)) | |||
| { | |||
| // Don't allow stress on a word-final vowel | |||
| // Only do this if there is no suffix phonemes to be added, and if a stress position was not given explicitly | |||
| if(phoneme_tab[final_ph]->type == phVOWEL) | |||
| @@ -1558,7 +1557,7 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| vowel_stress[vowel_count - 1] = 1; | |||
| vowel_stress[vowel_count - 2] = 4; | |||
| } | |||
| } | |||
| } | |||
| /* now guess the complete stress pattern */ | |||
| if(max_stress < 4) | |||
| @@ -1680,19 +1679,19 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| ph = phoneme_tab[p[0]]; | |||
| } | |||
| if((tr->langopts.vowel_pause & 0x30) && (ph->type == phVOWEL)) | |||
| { | |||
| // word starts with a vowel | |||
| if((tr->langopts.vowel_pause & 0x30) && (ph->type == phVOWEL)) | |||
| { | |||
| // word starts with a vowel | |||
| if((tr->langopts.vowel_pause & 0x20) && (vowel_stress[1] >= 4)) | |||
| { | |||
| *output++ = phonPAUSE_NOLINK; // not to be replaced by link | |||
| } | |||
| else | |||
| { | |||
| *output++ = phonPAUSE_VSHORT; // break, but no pause | |||
| } | |||
| if((tr->langopts.vowel_pause & 0x20) && (vowel_stress[1] >= 4)) | |||
| { | |||
| *output++ = phonPAUSE_NOLINK; // not to be replaced by link | |||
| } | |||
| else | |||
| { | |||
| *output++ = phonPAUSE_VSHORT; // break, but no pause | |||
| } | |||
| } | |||
| } | |||
| p = phonetic; | |||
| @@ -1800,12 +1799,12 @@ void SetWordStress(Translator *tr, char *output, unsigned int *dictionary_flags, | |||
| void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) | |||
| { | |||
| /* Add new phoneme string "ph" to "string" | |||
| Keeps count of the number of vowel phonemes in the word, and whether these | |||
| Keeps count of the number of vowel phonemes in the word, and whether these | |||
| can be stressed syllables. These values can be used in translation rules | |||
| */ | |||
| */ | |||
| const char *p; | |||
| unsigned char c; | |||
| int unstress_mark; | |||
| unsigned char c; | |||
| int unstress_mark; | |||
| int length; | |||
| length = strlen(ph) + strlen(string); | |||
| @@ -1831,7 +1830,7 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) | |||
| if(phoneme_tab[c]->type == phVOWEL) | |||
| { | |||
| if(((phoneme_tab[c]->phflags & phUNSTRESSED) == 0) && | |||
| (unstress_mark == 0)) | |||
| (unstress_mark == 0)) | |||
| { | |||
| tr->word_stressed_count++; | |||
| } | |||
| @@ -1850,19 +1849,19 @@ void AppendPhonemes(Translator *tr, char *string, int size, const char *ph) | |||
| static void MatchRule(Translator *tr, char *word[], char *word_start, int group_length, char *rule, MatchRecord *match_out, int word_flags, int dict_flags) | |||
| { | |||
| /* Checks a specified word against dictionary rules. | |||
| Returns with phoneme code string, or NULL if no match found. | |||
| Returns with phoneme code string, or NULL if no match found. | |||
| word (indirect) points to current character group within the input word | |||
| This is advanced by this procedure as characters are consumed | |||
| word (indirect) points to current character group within the input word | |||
| This is advanced by this procedure as characters are consumed | |||
| group: the initial characters used to choose the rules group | |||
| group: the initial characters used to choose the rules group | |||
| rule: address of dictionary rule data for this character group | |||
| rule: address of dictionary rule data for this character group | |||
| match_out: returns best points score | |||
| match_out: returns best points score | |||
| word_flags: indicates whether this is a retranslation after a suffix has been removed | |||
| */ | |||
| word_flags: indicates whether this is a retranslation after a suffix has been removed | |||
| */ | |||
| unsigned char rb; // current instuction from rule | |||
| unsigned char letter; // current letter from input word, single byte | |||
| @@ -1875,19 +1874,19 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| char *rule_start; /* start of current match template */ | |||
| char *p; | |||
| int ix; | |||
| int match_type; /* left, right, or consume */ | |||
| int failed; | |||
| int unpron_ignore; | |||
| int consumed; /* number of letters consumed from input */ | |||
| int syllable_count; | |||
| int vowel; | |||
| int letter_group; | |||
| int distance_right; | |||
| int distance_left; | |||
| int lg_pts; | |||
| int n_bytes; | |||
| int ix; | |||
| int match_type; /* left, right, or consume */ | |||
| int failed; | |||
| int unpron_ignore; | |||
| int consumed; /* number of letters consumed from input */ | |||
| int syllable_count; | |||
| int vowel; | |||
| int letter_group; | |||
| int distance_right; | |||
| int distance_left; | |||
| int lg_pts; | |||
| int n_bytes; | |||
| int add_points; | |||
| int command; | |||
| int check_atstart; | |||
| @@ -1896,7 +1895,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| MatchRecord match; | |||
| static MatchRecord best; | |||
| int total_consumed; /* letters consumed for best match */ | |||
| int total_consumed; /* letters consumed for best match */ | |||
| unsigned char condition_num; | |||
| char *common_phonemes; /* common to a group of entries */ | |||
| @@ -2268,7 +2267,7 @@ static void MatchRule(Translator *tr, char *word[], char *word_start, int group_ | |||
| end_type = (rule[0] << 16) + ((rule[1] & 0x7f) << 8) + (rule[2] & 0x7f); | |||
| if((tr->word_vowel_count == 0) && !(end_type & SUFX_P) && (tr->langopts.param[LOPT_SUFFIX] & 1)) | |||
| failed = 1; // don't match a suffix rule if there are no previous syllables (needed for lang=tr). | |||
| failed = 1; // don't match a suffix rule if there are no previous syllables (needed for lang=tr). | |||
| else | |||
| { | |||
| match.end_type = end_type; | |||
| @@ -2551,22 +2550,22 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| /* Translate a word bounded by space characters | |||
| Append the result to 'phonemes' and any standard prefix/suffix in 'end_phonemes' */ | |||
| unsigned char c, c2; | |||
| unsigned int c12; | |||
| unsigned char c, c2; | |||
| unsigned int c12; | |||
| int wc=0; | |||
| int wc_bytes; | |||
| char *p2; /* copy of p for use in double letter chain match */ | |||
| int found; | |||
| int g; /* group chain number */ | |||
| int g1; /* first group for this letter */ | |||
| int n; | |||
| int letter; | |||
| int any_alpha=0; | |||
| int ix; | |||
| unsigned int digit_count=0; | |||
| int found; | |||
| int g; /* group chain number */ | |||
| int g1; /* first group for this letter */ | |||
| int n; | |||
| int letter; | |||
| int any_alpha=0; | |||
| int ix; | |||
| unsigned int digit_count=0; | |||
| char *p; | |||
| ALPHABET *alphabet; | |||
| int dict_flags0=0; | |||
| int dict_flags0=0; | |||
| MatchRecord match1; | |||
| MatchRecord match2; | |||
| char ph_buf[40]; | |||
| @@ -2579,7 +2578,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| if(dict_flags != NULL) | |||
| dict_flags0 = dict_flags[0]; | |||
| for(ix=0; ix<(N_WORD_BYTES-1);) | |||
| for(ix=0; ix<(N_WORD_BYTES-1); ) | |||
| { | |||
| c = p_start[ix]; | |||
| word_copy[ix++] = c; | |||
| @@ -2592,7 +2591,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| if((option_phonemes & espeakPHONEMES_TRACE) && ((word_flags & FLAG_NO_TRACE)==0)) | |||
| { | |||
| char wordbuf[120]; | |||
| unsigned int ix; | |||
| unsigned int ix; | |||
| for(ix=0; ((c = p_start[ix]) != ' ') && (c != 0) && (ix < (sizeof(wordbuf)-1)); ix++) | |||
| { | |||
| @@ -2814,7 +2813,7 @@ int TranslateRules(Translator *tr, char *p_start, char *phonemes, int ph_size, c | |||
| if((option_phonemes & espeakPHONEMES_TRACE) && ((word_flags & FLAG_NO_TRACE)==0)) | |||
| { | |||
| fprintf(f_trans,"\n"); | |||
| fprintf(f_trans,"\n"); | |||
| } | |||
| match1.end_type &= ~SUFX_UNPRON; | |||
| @@ -3005,30 +3004,30 @@ int TransposeAlphabet(Translator *tr, char *text) | |||
| /* Find an entry in the word_dict file for a specified word. | |||
| Returns NULL if no match, else returns 'word_end' | |||
| word zero terminated word to match | |||
| word2 pointer to next word(s) in the input text (terminated by space) | |||
| word zero terminated word to match | |||
| word2 pointer to next word(s) in the input text (terminated by space) | |||
| flags: returns dictionary flags which are associated with a matched word | |||
| flags: returns dictionary flags which are associated with a matched word | |||
| end_flags: indicates whether this is a retranslation after removing a suffix | |||
| */ | |||
| end_flags: indicates whether this is a retranslation after removing a suffix | |||
| */ | |||
| static const char *LookupDict2(Translator *tr, const char *word, const char *word2, | |||
| char *phonetic, unsigned int *flags, int end_flags, WORD_TAB *wtab) | |||
| char *phonetic, unsigned int *flags, int end_flags, WORD_TAB *wtab) | |||
| { | |||
| char *p; | |||
| char *next; | |||
| int hash; | |||
| int phoneme_len; | |||
| int wlen; | |||
| int hash; | |||
| int phoneme_len; | |||
| int wlen; | |||
| unsigned char flag; | |||
| unsigned int dictionary_flags; | |||
| unsigned int dictionary_flags2; | |||
| int condition_failed=0; | |||
| int n_chars; | |||
| int no_phonemes; | |||
| int skipwords; | |||
| int ix; | |||
| int c; | |||
| unsigned int dictionary_flags; | |||
| unsigned int dictionary_flags2; | |||
| int condition_failed=0; | |||
| int n_chars; | |||
| int no_phonemes; | |||
| int skipwords; | |||
| int ix; | |||
| int c; | |||
| const char *word_end; | |||
| const char *word1; | |||
| int wflags = 0; | |||
| @@ -3261,7 +3260,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
| else | |||
| { | |||
| /* don't use the 'verb' pronunciation unless we are | |||
| expecting a verb */ | |||
| expecting a verb */ | |||
| continue; | |||
| } | |||
| } | |||
| @@ -3270,7 +3269,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
| if(!tr->expect_past) | |||
| { | |||
| /* don't use the 'past' pronunciation unless we are | |||
| expecting past tense */ | |||
| expecting past tense */ | |||
| continue; | |||
| } | |||
| } | |||
| @@ -3279,7 +3278,7 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
| if((!tr->expect_noun) || (end_flags & SUFX_V)) | |||
| { | |||
| /* don't use the 'noun' pronunciation unless we are | |||
| expecting a noun */ | |||
| expecting a noun */ | |||
| continue; | |||
| } | |||
| } | |||
| @@ -3363,16 +3362,16 @@ static const char *LookupDict2(Translator *tr, const char *word, const char *wor | |||
| Returns phonetic data in 'phonetic' and bits in 'flags' | |||
| end_flags: indicates if a suffix has been removed | |||
| */ | |||
| */ | |||
| int LookupDictList(Translator *tr, char **wordptr, char *ph_out, unsigned int *flags, int end_flags, WORD_TAB *wtab) | |||
| { | |||
| int length; | |||
| int length; | |||
| const char *found; | |||
| const char *word1; | |||
| const char *word2; | |||
| unsigned char c; | |||
| int nbytes; | |||
| int len; | |||
| int nbytes; | |||
| int len; | |||
| char word[N_WORD_BYTES]; | |||
| static char word_replacement[N_WORD_BYTES]; | |||
| @@ -3567,19 +3566,19 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| { | |||
| /* Removes a standard suffix from a word, once it has been indicated by the dictionary rules. | |||
| end_type: bits 0-6 number of letters | |||
| bits 8-14 suffix flags | |||
| bits 8-14 suffix flags | |||
| word_copy: make a copy of the original word | |||
| This routine is language specific. In English it deals with reversing y->i and e-dropping | |||
| that were done when the suffix was added to the original word. | |||
| */ | |||
| word_copy: make a copy of the original word | |||
| This routine is language specific. In English it deals with reversing y->i and e-dropping | |||
| that were done when the suffix was added to the original word. | |||
| */ | |||
| int i; | |||
| int i; | |||
| char *word_end; | |||
| int len_ending; | |||
| int end_flags; | |||
| const char *p; | |||
| int len; | |||
| int len; | |||
| char ending[50]; | |||
| // these lists are language specific, but are only relevent if the 'e' suffix flag is used | |||
| @@ -3606,7 +3605,7 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| } | |||
| // look for multibyte characters to increase the number of bytes to remove | |||
| for(len_ending = i = (end_type & 0x3f); i>0 ; i--) // num.of characters of the suffix | |||
| for(len_ending = i = (end_type & 0x3f); i>0; i--) // num.of characters of the suffix | |||
| { | |||
| word_end--; | |||
| while((*word_end & 0xc0) == 0x80) | |||
| @@ -3628,8 +3627,8 @@ int RemoveEnding(Translator *tr, char *word, int end_type, char *word_copy) | |||
| end_flags = (end_type & 0xfff0) | FLAG_SUFX; | |||
| /* add an 'e' to the stem if appropriate, | |||
| if stem ends in vowel+consonant | |||
| or stem ends in 'c' (add 'e' to soften it) */ | |||
| if stem ends in vowel+consonant | |||
| or stem ends in 'c' (add 'e' to soften it) */ | |||
| if(end_type & SUFX_I) | |||
| { | |||
| @@ -12,94 +12,94 @@ extern "C" | |||
| #endif | |||
| typedef enum | |||
| { | |||
| ET_TEXT, | |||
| ET_MARK, | |||
| ET_KEY, | |||
| ET_CHAR, | |||
| ET_PARAMETER, | |||
| ET_PUNCTUATION_LIST, | |||
| ET_VOICE_NAME, | |||
| ET_VOICE_SPEC, | |||
| ET_TERMINATED_MSG | |||
| } t_espeak_type; | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* text; | |||
| size_t size; | |||
| unsigned int position; | |||
| espeak_POSITION_TYPE position_type; | |||
| unsigned int end_position; | |||
| unsigned int flags; | |||
| void* user_data; | |||
| ET_TEXT, | |||
| ET_MARK, | |||
| ET_KEY, | |||
| ET_CHAR, | |||
| ET_PARAMETER, | |||
| ET_PUNCTUATION_LIST, | |||
| ET_VOICE_NAME, | |||
| ET_VOICE_SPEC, | |||
| ET_TERMINATED_MSG | |||
| } t_espeak_type; | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* text; | |||
| size_t size; | |||
| unsigned int position; | |||
| espeak_POSITION_TYPE position_type; | |||
| unsigned int end_position; | |||
| unsigned int flags; | |||
| void* user_data; | |||
| } t_espeak_text; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* text; | |||
| size_t size; | |||
| const char* index_mark; | |||
| unsigned int end_position; | |||
| unsigned int flags; | |||
| void* user_data; | |||
| unsigned int unique_identifier; | |||
| void* text; | |||
| size_t size; | |||
| const char* index_mark; | |||
| unsigned int end_position; | |||
| unsigned int flags; | |||
| void* user_data; | |||
| } t_espeak_mark; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* user_data; | |||
| wchar_t character; | |||
| wchar_t character; | |||
| } t_espeak_character; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* user_data; | |||
| const char* key_name; | |||
| const char* key_name; | |||
| } t_espeak_key; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| unsigned int unique_identifier; | |||
| void* user_data; | |||
| unsigned int unique_identifier; | |||
| void* user_data; | |||
| } t_espeak_terminated_msg; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| espeak_PARAMETER parameter; | |||
| int value; | |||
| int relative; | |||
| espeak_PARAMETER parameter; | |||
| int value; | |||
| int relative; | |||
| } t_espeak_parameter; | |||
| typedef enum | |||
| { | |||
| CS_UNDEFINED, // The command has just been created | |||
| CS_PENDING, // stored in the fifo | |||
| CS_PROCESSED // processed | |||
| CS_UNDEFINED, // The command has just been created | |||
| CS_PENDING, // stored in the fifo | |||
| CS_PROCESSED // processed | |||
| } t_command_state; | |||
| typedef struct | |||
| typedef struct | |||
| { | |||
| t_espeak_type type; | |||
| t_command_state state; | |||
| union command | |||
| { | |||
| t_espeak_text my_text; | |||
| t_espeak_mark my_mark; | |||
| t_espeak_key my_key; | |||
| t_espeak_character my_char; | |||
| t_espeak_parameter my_param; | |||
| const wchar_t* my_punctuation_list; | |||
| const char *my_voice_name; | |||
| espeak_VOICE my_voice_spec; | |||
| t_espeak_terminated_msg my_terminated_msg; | |||
| } u; | |||
| t_espeak_type type; | |||
| t_command_state state; | |||
| union command | |||
| { | |||
| t_espeak_text my_text; | |||
| t_espeak_mark my_mark; | |||
| t_espeak_key my_key; | |||
| t_espeak_character my_char; | |||
| t_espeak_parameter my_param; | |||
| const wchar_t* my_punctuation_list; | |||
| const char *my_voice_name; | |||
| espeak_VOICE my_voice_spec; | |||
| t_espeak_terminated_msg my_terminated_msg; | |||
| } u; | |||
| } t_espeak_command; | |||
| @@ -128,12 +128,12 @@ int delete_espeak_command( t_espeak_command* the_command); | |||
| void display_espeak_command(t_espeak_command* the_command); | |||
| espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, size_t size, | |||
| unsigned int position, espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, void* user_data); | |||
| espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void *text, size_t size, | |||
| const char *index_mark, unsigned int end_position, | |||
| unsigned int flags, void* user_data); | |||
| espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, size_t size, | |||
| unsigned int position, espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, void* user_data); | |||
| espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void *text, size_t size, | |||
| const char *index_mark, unsigned int end_position, | |||
| unsigned int flags, void* user_data); | |||
| void sync_espeak_Key(const char *key); | |||
| void sync_espeak_Char(wchar_t character); | |||
| void sync_espeak_SetPunctuationList(const wchar_t *punctlist); | |||
| @@ -51,15 +51,14 @@ static t_espeak_callback* my_callback = NULL; | |||
| static int my_event_is_running=0; | |||
| enum {MIN_TIMEOUT_IN_MS=10, | |||
| ACTIVITY_TIMEOUT=50, // in ms, check that the stream is active | |||
| MAX_ACTIVITY_CHECK=6 | |||
| }; | |||
| ACTIVITY_TIMEOUT=50, // in ms, check that the stream is active | |||
| MAX_ACTIVITY_CHECK=6}; | |||
| typedef struct t_node | |||
| { | |||
| void* data; | |||
| struct t_node *next; | |||
| void* data; | |||
| struct t_node *next; | |||
| } node; | |||
| static node* head=NULL; | |||
| @@ -72,40 +71,40 @@ static void* polling_thread(void*); | |||
| void event_set_callback(t_espeak_callback* SynthCallback) | |||
| { | |||
| my_callback = SynthCallback; | |||
| my_callback = SynthCallback; | |||
| } | |||
| void event_init(void) | |||
| { | |||
| ENTER("event_init"); | |||
| my_event_is_running=0; | |||
| // security | |||
| pthread_mutex_init( &my_mutex, (const pthread_mutexattr_t *)NULL); | |||
| init(); | |||
| assert(-1 != sem_init(&my_sem_start_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
| pthread_attr_t a_attrib; | |||
| if (pthread_attr_init (&a_attrib) == 0 | |||
| && pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) == 0) | |||
| { | |||
| thread_inited = (0 == pthread_create(&my_thread, | |||
| &a_attrib, | |||
| polling_thread, | |||
| (void*)NULL)); | |||
| } | |||
| assert(thread_inited); | |||
| pthread_attr_destroy(&a_attrib); | |||
| ENTER("event_init"); | |||
| my_event_is_running=0; | |||
| // security | |||
| pthread_mutex_init( &my_mutex, (const pthread_mutexattr_t *)NULL); | |||
| init(); | |||
| assert(-1 != sem_init(&my_sem_start_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
| pthread_attr_t a_attrib; | |||
| if (pthread_attr_init (&a_attrib) == 0 | |||
| && pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) == 0) | |||
| { | |||
| thread_inited = (0 == pthread_create(&my_thread, | |||
| &a_attrib, | |||
| polling_thread, | |||
| (void*)NULL)); | |||
| } | |||
| assert(thread_inited); | |||
| pthread_attr_destroy(&a_attrib); | |||
| } | |||
| static void event_display(espeak_EVENT* event) | |||
| { | |||
| ENTER("event_display"); | |||
| ENTER("event_display"); | |||
| #ifdef DEBUG_ENABLED | |||
| if (event==NULL) | |||
| @@ -115,16 +114,16 @@ ENTER("event_display"); | |||
| else | |||
| { | |||
| static const char* label[] = { | |||
| "LIST_TERMINATED", | |||
| "WORD", | |||
| "SENTENCE", | |||
| "MARK", | |||
| "PLAY", | |||
| "END", | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" | |||
| "LIST_TERMINATED", | |||
| "WORD", | |||
| "SENTENCE", | |||
| "MARK", | |||
| "PLAY", | |||
| "END", | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" | |||
| }; | |||
| SHOW("event_display > event=0x%x\n",event); | |||
| @@ -161,7 +160,7 @@ static espeak_EVENT* event_copy (espeak_EVENT* event) | |||
| { | |||
| a_event->id.name = strdup(event->id.name); | |||
| } | |||
| break; | |||
| break; | |||
| default: | |||
| break; | |||
| @@ -184,7 +183,7 @@ static espeak_EVENT* event_copy (espeak_EVENT* event) | |||
| static void event_notify(espeak_EVENT* event) | |||
| { | |||
| ENTER("event_notify"); | |||
| ENTER("event_notify"); | |||
| static unsigned int a_old_uid = 0; | |||
| espeak_EVENT events[2]; | |||
| @@ -223,16 +222,16 @@ ENTER("event_notify"); | |||
| break; | |||
| default: | |||
| case espeakEVENT_LIST_TERMINATED: | |||
| case espeakEVENT_PLAY: | |||
| break; | |||
| case espeakEVENT_LIST_TERMINATED: | |||
| case espeakEVENT_PLAY: | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| static int event_delete(espeak_EVENT* event) | |||
| { | |||
| ENTER("event_delete"); | |||
| ENTER("event_delete"); | |||
| event_display(event); | |||
| @@ -265,7 +264,7 @@ ENTER("event_delete"); | |||
| espeak_ERROR event_declare (espeak_EVENT* event) | |||
| { | |||
| ENTER("event_declare"); | |||
| ENTER("event_declare"); | |||
| event_display(event); | |||
| @@ -348,7 +347,7 @@ espeak_ERROR event_clear_all () | |||
| static int sleep_until_timeout_or_stop_request(uint32_t time_in_ms) | |||
| { | |||
| ENTER("sleep_until_timeout_or_stop_request"); | |||
| ENTER("sleep_until_timeout_or_stop_request"); | |||
| int a_stop_is_required=0; | |||
| struct timespec ts; | |||
| @@ -366,18 +365,18 @@ ENTER("sleep_until_timeout_or_stop_request"); | |||
| add_time_in_ms( &ts, time_in_ms); | |||
| SHOW("polling_thread > sleep_until_timeout_or_stop_request > start sem_timedwait from %d.%09lu to %d.%09lu \n", | |||
| to.tv_sec, to.tv_nsec, | |||
| ts.tv_sec, ts.tv_nsec); | |||
| to.tv_sec, to.tv_nsec, | |||
| ts.tv_sec, ts.tv_nsec); | |||
| while ((err = sem_timedwait(&my_sem_stop_is_required, &ts)) == -1 | |||
| && errno == EINTR) | |||
| && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| assert (gettimeofday(&tv, NULL) != -1); | |||
| SHOW("polling_thread > sleep_until_timeout_or_stop_request > stop sem_timedwait %d.%09lu \n", | |||
| tv.tv_sec, tv.tv_usec*1000); | |||
| tv.tv_sec, tv.tv_usec*1000); | |||
| if (err == 0) | |||
| { | |||
| @@ -393,7 +392,7 @@ ENTER("sleep_until_timeout_or_stop_request"); | |||
| static int get_remaining_time(uint32_t sample, uint32_t* time_in_ms, int* stop_is_required) | |||
| { | |||
| ENTER("get_remaining_time"); | |||
| ENTER("get_remaining_time"); | |||
| int err = 0; | |||
| *stop_is_required = 0; | |||
| @@ -405,23 +404,23 @@ ENTER("get_remaining_time"); | |||
| if (err || wave_is_busy(NULL) || (*time_in_ms == 0)) | |||
| { // if err, stream not available: quit | |||
| // if wave is busy, time_in_ms is known: quit | |||
| // if wave is not busy but remaining time == 0, event is reached: quit | |||
| break; | |||
| } | |||
| // if wave is busy, time_in_ms is known: quit | |||
| // if wave is not busy but remaining time == 0, event is reached: quit | |||
| break; | |||
| } | |||
| // stream opened but not active | |||
| // | |||
| // Several possible states: | |||
| // * the stream is opened but not yet started: | |||
| // | |||
| // wait for the start of stream | |||
| // | |||
| // * some samples have already been played, | |||
| // ** the end of stream is reached | |||
| // ** or there is an underrun | |||
| // | |||
| // wait for the close of stream | |||
| // stream opened but not active | |||
| // | |||
| // Several possible states: | |||
| // * the stream is opened but not yet started: | |||
| // | |||
| // wait for the start of stream | |||
| // | |||
| // * some samples have already been played, | |||
| // ** the end of stream is reached | |||
| // ** or there is an underrun | |||
| // | |||
| // wait for the close of stream | |||
| *stop_is_required = sleep_until_timeout_or_stop_request( ACTIVITY_TIMEOUT); | |||
| } | |||
| @@ -431,7 +430,7 @@ ENTER("get_remaining_time"); | |||
| static void* polling_thread(void*p) | |||
| { | |||
| ENTER("polling_thread"); | |||
| ENTER("polling_thread"); | |||
| while(1) | |||
| { | |||
| @@ -487,8 +486,8 @@ ENTER("polling_thread"); | |||
| uint32_t time_in_ms = 0; | |||
| int err = get_remaining_time((uint32_t)event->sample, | |||
| &time_in_ms, | |||
| &a_stop_is_required); | |||
| &time_in_ms, | |||
| &a_stop_is_required); | |||
| if (a_stop_is_required > 0) | |||
| { | |||
| break; | |||
| @@ -666,7 +665,7 @@ static void init() | |||
| void event_terminate() | |||
| { | |||
| ENTER("event_terminate"); | |||
| ENTER("event_terminate"); | |||
| if (thread_inited) | |||
| { | |||
| @@ -1,25 +1,25 @@ | |||
| #ifndef EVENT_H | |||
| #define EVENT_H | |||
| /* | |||
| Manage events (sentence, word, mark, end,...), is responsible of calling the external | |||
| callback as soon as the relevant audio sample is played. | |||
| /* | |||
| Manage events (sentence, word, mark, end,...), is responsible of calling the external | |||
| callback as soon as the relevant audio sample is played. | |||
| The audio stream is composed of samples from synthetised messages or audio icons. | |||
| Each event is associated to a sample. | |||
| The audio stream is composed of samples from synthetised messages or audio icons. | |||
| Each event is associated to a sample. | |||
| Scenario: | |||
| Scenario: | |||
| - event_declare is called for each expected event. | |||
| - event_declare is called for each expected event. | |||
| - A timeout is started for the first pending event. | |||
| - A timeout is started for the first pending event. | |||
| - When the timeout happens, the synth_callback is called. | |||
| - When the timeout happens, the synth_callback is called. | |||
| Note: the timeout is checked against the real progress of the audio stream, which depends on pauses or underruns. If the real progress is lower than the expected one, a new timeout starts. | |||
| Note: the timeout is checked against the real progress of the audio stream, which depends on pauses or underruns. If the real progress is lower than the expected one, a new timeout starts. | |||
| */ | |||
| */ | |||
| #include "speak_lib.h" | |||
| @@ -37,14 +37,14 @@ void event_set_callback(t_espeak_callback* cb); | |||
| // Clear any pending event. | |||
| // | |||
| // Return: EE_OK: operation achieved | |||
| // Return: EE_OK: operation achieved | |||
| // EE_INTERNAL_ERROR. | |||
| espeak_ERROR event_clear_all (); | |||
| // Declare a future event | |||
| // | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: the event can not be buffered; | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: the event can not be buffered; | |||
| // you may try after a while to call the function again. | |||
| // EE_INTERNAL_ERROR. | |||
| espeak_ERROR event_declare (espeak_EVENT* event); | |||
| @@ -59,196 +59,195 @@ static t_espeak_command* pop(); | |||
| static void init(int process_parameters); | |||
| static int node_counter=0; | |||
| enum {MAX_NODE_COUNTER=400, | |||
| INACTIVITY_TIMEOUT=50, // in ms, check that the stream is inactive | |||
| MAX_INACTIVITY_CHECK=2 | |||
| }; | |||
| INACTIVITY_TIMEOUT=50, // in ms, check that the stream is inactive | |||
| MAX_INACTIVITY_CHECK=2}; | |||
| void fifo_init() | |||
| { | |||
| ENTER("fifo_init"); | |||
| // security | |||
| pthread_mutex_init( &my_mutex, (const pthread_mutexattr_t *)NULL); | |||
| init(0); | |||
| assert(-1 != sem_init(&my_sem_start_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
| pthread_attr_t a_attrib; | |||
| if (pthread_attr_init (& a_attrib) | |||
| || pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) | |||
| || pthread_create( &my_thread, | |||
| & a_attrib, | |||
| say_thread, | |||
| (void*)NULL)) | |||
| { | |||
| assert(0); | |||
| } | |||
| pthread_attr_destroy(&a_attrib); | |||
| // leave once the thread is actually started | |||
| SHOW_TIME("fifo > wait for my_sem_stop_is_acknowledged\n"); | |||
| while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| SHOW_TIME("fifo > get my_sem_stop_is_acknowledged\n"); | |||
| ENTER("fifo_init"); | |||
| // security | |||
| pthread_mutex_init( &my_mutex, (const pthread_mutexattr_t *)NULL); | |||
| init(0); | |||
| assert(-1 != sem_init(&my_sem_start_is_required, 0, 0)); | |||
| assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
| pthread_attr_t a_attrib; | |||
| if (pthread_attr_init (&a_attrib) | |||
| || pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) | |||
| || pthread_create( &my_thread, | |||
| &a_attrib, | |||
| say_thread, | |||
| (void*)NULL)) | |||
| { | |||
| assert(0); | |||
| } | |||
| pthread_attr_destroy(&a_attrib); | |||
| // leave once the thread is actually started | |||
| SHOW_TIME("fifo > wait for my_sem_stop_is_acknowledged\n"); | |||
| while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| SHOW_TIME("fifo > get my_sem_stop_is_acknowledged\n"); | |||
| } | |||
| espeak_ERROR fifo_add_command (t_espeak_command* the_command) | |||
| { | |||
| ENTER("fifo_add_command"); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| espeak_ERROR a_error = EE_OK; | |||
| if (!a_status) | |||
| { | |||
| SHOW_TIME("fifo_add_command > locked\n"); | |||
| a_error = push(the_command); | |||
| SHOW_TIME("fifo_add_command > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| } | |||
| if (!a_status && !my_command_is_running && (a_error == EE_OK)) | |||
| { | |||
| // quit when command is actually started | |||
| // (for possible forthcoming 'end of command' checks) | |||
| SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); | |||
| sem_post(&my_sem_start_is_required); | |||
| int val=1; | |||
| while (val > 0) | |||
| ENTER("fifo_add_command"); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| espeak_ERROR a_error = EE_OK; | |||
| if (!a_status) | |||
| { | |||
| SHOW_TIME("fifo_add_command > locked\n"); | |||
| a_error = push(the_command); | |||
| SHOW_TIME("fifo_add_command > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| } | |||
| if (!a_status && !my_command_is_running && (a_error == EE_OK)) | |||
| { | |||
| usleep(50000); // TBD: event? | |||
| sem_getvalue(&my_sem_start_is_required, &val); | |||
| // quit when command is actually started | |||
| // (for possible forthcoming 'end of command' checks) | |||
| SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); | |||
| sem_post(&my_sem_start_is_required); | |||
| int val=1; | |||
| while (val > 0) | |||
| { | |||
| usleep(50000); // TBD: event? | |||
| sem_getvalue(&my_sem_start_is_required, &val); | |||
| } | |||
| } | |||
| } | |||
| if (a_status != 0) | |||
| { | |||
| a_error = EE_INTERNAL_ERROR; | |||
| } | |||
| if (a_status != 0) | |||
| { | |||
| a_error = EE_INTERNAL_ERROR; | |||
| } | |||
| SHOW_TIME("LEAVE fifo_add_command"); | |||
| return a_error; | |||
| SHOW_TIME("LEAVE fifo_add_command"); | |||
| return a_error; | |||
| } | |||
| espeak_ERROR fifo_add_commands (t_espeak_command* command1, t_espeak_command* command2) | |||
| { | |||
| ENTER("fifo_add_command"); | |||
| ENTER("fifo_add_command"); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| espeak_ERROR a_error = EE_OK; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| espeak_ERROR a_error = EE_OK; | |||
| if (!a_status) | |||
| { | |||
| SHOW_TIME("fifo_add_commands > locked\n"); | |||
| if (node_counter+1 >= MAX_NODE_COUNTER) | |||
| if (!a_status) | |||
| { | |||
| SHOW("push > %s\n", "EE_BUFFER_FULL"); | |||
| a_error = EE_BUFFER_FULL; | |||
| SHOW_TIME("fifo_add_commands > locked\n"); | |||
| if (node_counter+1 >= MAX_NODE_COUNTER) | |||
| { | |||
| SHOW("push > %s\n", "EE_BUFFER_FULL"); | |||
| a_error = EE_BUFFER_FULL; | |||
| } | |||
| else | |||
| { | |||
| push(command1); | |||
| push(command2); | |||
| } | |||
| SHOW_TIME("fifo_add_command > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| } | |||
| else | |||
| if (!a_status && !my_command_is_running && (a_error == EE_OK)) | |||
| { | |||
| push(command1); | |||
| push(command2); | |||
| // quit when one command is actually started | |||
| // (for possible forthcoming 'end of command' checks) | |||
| SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); | |||
| sem_post(&my_sem_start_is_required); | |||
| int val=1; | |||
| while (val > 0) | |||
| { | |||
| usleep(50000); // TBD: event? | |||
| sem_getvalue(&my_sem_start_is_required, &val); | |||
| } | |||
| } | |||
| SHOW_TIME("fifo_add_command > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| } | |||
| if (!a_status && !my_command_is_running && (a_error == EE_OK)) | |||
| { | |||
| // quit when one command is actually started | |||
| // (for possible forthcoming 'end of command' checks) | |||
| SHOW_TIME("fifo_add_command > post my_sem_start_is_required\n"); | |||
| sem_post(&my_sem_start_is_required); | |||
| int val=1; | |||
| while (val > 0) | |||
| if (a_status != 0) | |||
| { | |||
| usleep(50000); // TBD: event? | |||
| sem_getvalue(&my_sem_start_is_required, &val); | |||
| a_error = EE_INTERNAL_ERROR; | |||
| } | |||
| } | |||
| if (a_status != 0) | |||
| { | |||
| a_error = EE_INTERNAL_ERROR; | |||
| } | |||
| SHOW_TIME("LEAVE fifo_add_commands"); | |||
| return a_error; | |||
| SHOW_TIME("LEAVE fifo_add_commands"); | |||
| return a_error; | |||
| } | |||
| espeak_ERROR fifo_stop () | |||
| { | |||
| ENTER("fifo_stop"); | |||
| int a_command_is_running = 0; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| SHOW_TIME("fifo_stop > locked\n"); | |||
| if (a_status != 0) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (my_command_is_running) | |||
| { | |||
| a_command_is_running = 1; | |||
| my_stop_is_required = 1; | |||
| SHOW_TIME("fifo_stop > my_stop_is_required = 1\n"); | |||
| } | |||
| SHOW_TIME("fifo_stop > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (a_status != 0) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (a_command_is_running) | |||
| { | |||
| SHOW_TIME("fifo_stop > wait for my_sem_stop_is_acknowledged\n"); | |||
| while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) | |||
| ENTER("fifo_stop"); | |||
| int a_command_is_running = 0; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| SHOW_TIME("fifo_stop > locked\n"); | |||
| if (a_status != 0) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (my_command_is_running) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| a_command_is_running = 1; | |||
| my_stop_is_required = 1; | |||
| SHOW_TIME("fifo_stop > my_stop_is_required = 1\n"); | |||
| } | |||
| SHOW_TIME("fifo_stop > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (a_status != 0) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (a_command_is_running) | |||
| { | |||
| SHOW_TIME("fifo_stop > wait for my_sem_stop_is_acknowledged\n"); | |||
| while ((sem_wait(&my_sem_stop_is_acknowledged) == -1) && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| SHOW_TIME("fifo_stop > get my_sem_stop_is_acknowledged\n"); | |||
| } | |||
| SHOW_TIME("fifo_stop > get my_sem_stop_is_acknowledged\n"); | |||
| } | |||
| SHOW_TIME("fifo_stop > my_stop_is_required = 0\n"); | |||
| my_stop_is_required = 0; | |||
| SHOW_TIME("LEAVE fifo_stop\n"); | |||
| SHOW_TIME("fifo_stop > my_stop_is_required = 0\n"); | |||
| my_stop_is_required = 0; | |||
| SHOW_TIME("LEAVE fifo_stop\n"); | |||
| return EE_OK; | |||
| return EE_OK; | |||
| } | |||
| int fifo_is_busy () | |||
| { | |||
| SHOW("fifo_is_busy > aResult = %d\n",my_command_is_running); | |||
| return my_command_is_running; | |||
| SHOW("fifo_is_busy > aResult = %d\n",my_command_is_running); | |||
| return my_command_is_running; | |||
| } | |||
| static int sleep_until_start_request_or_inactivity() | |||
| { | |||
| SHOW_TIME("fifo > sleep_until_start_request_or_inactivity > ENTER"); | |||
| int a_start_is_required=0; | |||
| // Wait for the start request (my_sem_start_is_required). | |||
| // Besides this, if the audio stream is still busy, | |||
| // check from time to time its end. | |||
| // The end of the stream is confirmed by several checks | |||
| // for filtering underflow. | |||
| // | |||
| int i=0; | |||
| SHOW_TIME("fifo > sleep_until_start_request_or_inactivity > ENTER"); | |||
| int a_start_is_required=0; | |||
| // Wait for the start request (my_sem_start_is_required). | |||
| // Besides this, if the audio stream is still busy, | |||
| // check from time to time its end. | |||
| // The end of the stream is confirmed by several checks | |||
| // for filtering underflow. | |||
| // | |||
| int i=0; | |||
| while((i<= MAX_INACTIVITY_CHECK) && !a_start_is_required) | |||
| { | |||
| if (wave_is_busy( NULL) ) | |||
| { | |||
| i = 0; | |||
| } | |||
| else | |||
| else | |||
| { | |||
| i++; | |||
| } | |||
| @@ -268,18 +267,18 @@ static int sleep_until_start_request_or_inactivity() | |||
| add_time_in_ms( &ts, INACTIVITY_TIMEOUT); | |||
| SHOW("fifo > sleep_until_start_request_or_inactivity > start sem_timedwait (start_is_required) from %d.%09lu to %d.%09lu \n", | |||
| to.tv_sec, to.tv_nsec, | |||
| ts.tv_sec, ts.tv_nsec); | |||
| to.tv_sec, to.tv_nsec, | |||
| ts.tv_sec, ts.tv_nsec); | |||
| while ((err = sem_timedwait(&my_sem_start_is_required, &ts)) == -1 | |||
| && errno == EINTR) | |||
| && errno == EINTR) | |||
| { | |||
| continue; | |||
| } | |||
| assert (gettimeofday(&tv, NULL) != -1); | |||
| SHOW("fifo > sleep_until_start_request_or_inactivity > stop sem_timedwait (start_is_required, err=%d) %d.%09lu \n", err, | |||
| tv.tv_sec, tv.tv_usec*1000); | |||
| tv.tv_sec, tv.tv_usec*1000); | |||
| if (err==0) | |||
| { | |||
| @@ -292,156 +291,156 @@ static int sleep_until_start_request_or_inactivity() | |||
| static void close_stream() | |||
| { | |||
| SHOW_TIME("fifo > close_stream > ENTER\n"); | |||
| SHOW_TIME("fifo > close_stream > ENTER\n"); | |||
| // Warning: a wave_close can be already required by | |||
| // an external command (espeak_Cancel + fifo_stop), if so: | |||
| // my_stop_is_required = 1; | |||
| // Warning: a wave_close can be already required by | |||
| // an external command (espeak_Cancel + fifo_stop), if so: | |||
| // my_stop_is_required = 1; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| int a_stop_is_required = my_stop_is_required; | |||
| if (!a_stop_is_required) | |||
| { | |||
| my_command_is_running = 1; | |||
| } | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| int a_stop_is_required = my_stop_is_required; | |||
| if (!a_stop_is_required) | |||
| { | |||
| my_command_is_running = 1; | |||
| } | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (!a_stop_is_required) | |||
| { | |||
| wave_close(NULL); | |||
| if (!a_stop_is_required) | |||
| { | |||
| wave_close(NULL); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| my_command_is_running = 0; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| my_command_is_running = 0; | |||
| a_stop_is_required = my_stop_is_required; | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| a_stop_is_required = my_stop_is_required; | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (a_stop_is_required) | |||
| { | |||
| // acknowledge the stop request | |||
| SHOW_TIME("fifo > close_stream > post my_sem_stop_is_acknowledged\n"); | |||
| int a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| assert( a_status != -1); | |||
| if (a_stop_is_required) | |||
| { | |||
| // acknowledge the stop request | |||
| SHOW_TIME("fifo > close_stream > post my_sem_stop_is_acknowledged\n"); | |||
| int a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| assert( a_status != -1); | |||
| } | |||
| } | |||
| } | |||
| SHOW_TIME("fifo > close_stream > LEAVE\n"); | |||
| SHOW_TIME("fifo > close_stream > LEAVE\n"); | |||
| } | |||
| static void* say_thread(void*p) | |||
| { | |||
| ENTER("say_thread"); | |||
| SHOW_TIME("say_thread > post my_sem_stop_is_acknowledged\n"); | |||
| // announce that thread is started | |||
| sem_post(&my_sem_stop_is_acknowledged); | |||
| ENTER("say_thread"); | |||
| int look_for_inactivity=0; | |||
| SHOW_TIME("say_thread > post my_sem_stop_is_acknowledged\n"); | |||
| while(1) | |||
| { | |||
| SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); | |||
| // announce that thread is started | |||
| sem_post(&my_sem_stop_is_acknowledged); | |||
| int a_start_is_required = 0; | |||
| if (look_for_inactivity) | |||
| { | |||
| a_start_is_required = sleep_until_start_request_or_inactivity(); | |||
| if (!a_start_is_required) | |||
| { | |||
| close_stream(); | |||
| } | |||
| } | |||
| look_for_inactivity = 1; | |||
| int look_for_inactivity=0; | |||
| if (!a_start_is_required) | |||
| while(1) | |||
| { | |||
| while ((sem_wait(&my_sem_start_is_required) == -1) && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| } | |||
| SHOW_TIME("say_thread > get my_sem_start_is_required\n"); | |||
| SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); | |||
| SHOW_TIME("say_thread > my_command_is_running = 1\n"); | |||
| my_command_is_running = 1; | |||
| while( my_command_is_running) | |||
| { | |||
| SHOW_TIME("say_thread > locking\n"); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| t_espeak_command* a_command = (t_espeak_command*)pop(); | |||
| if (a_command == NULL) | |||
| { | |||
| SHOW_TIME("say_thread > text empty (talking=0) \n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| SHOW_TIME("say_thread > unlocked\n"); | |||
| SHOW_TIME("say_thread > my_command_is_running = 0\n"); | |||
| my_command_is_running = 0; | |||
| } | |||
| else | |||
| { | |||
| display_espeak_command(a_command); | |||
| // purge start semaphore | |||
| SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); | |||
| while(0 == sem_trywait(&my_sem_start_is_required)) | |||
| int a_start_is_required = 0; | |||
| if (look_for_inactivity) | |||
| { | |||
| }; | |||
| a_start_is_required = sleep_until_start_request_or_inactivity(); | |||
| if (!a_start_is_required) | |||
| { | |||
| close_stream(); | |||
| } | |||
| } | |||
| look_for_inactivity = 1; | |||
| if (my_stop_is_required) | |||
| if (!a_start_is_required) | |||
| { | |||
| SHOW_TIME("say_thread > my_command_is_running = 0\n"); | |||
| my_command_is_running = 0; | |||
| while ((sem_wait(&my_sem_start_is_required) == -1) && errno == EINTR) | |||
| { | |||
| continue; // Restart when interrupted by handler | |||
| } | |||
| } | |||
| SHOW_TIME("say_thread > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| SHOW_TIME("say_thread > get my_sem_start_is_required\n"); | |||
| SHOW_TIME("say_thread > my_command_is_running = 1\n"); | |||
| my_command_is_running = 1; | |||
| if (my_command_is_running) | |||
| while( my_command_is_running) | |||
| { | |||
| process_espeak_command(a_command); | |||
| SHOW_TIME("say_thread > locking\n"); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert (!a_status); | |||
| t_espeak_command* a_command = (t_espeak_command*)pop(); | |||
| if (a_command == NULL) | |||
| { | |||
| SHOW_TIME("say_thread > text empty (talking=0) \n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| SHOW_TIME("say_thread > unlocked\n"); | |||
| SHOW_TIME("say_thread > my_command_is_running = 0\n"); | |||
| my_command_is_running = 0; | |||
| } | |||
| else | |||
| { | |||
| display_espeak_command(a_command); | |||
| // purge start semaphore | |||
| SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); | |||
| while(0 == sem_trywait(&my_sem_start_is_required)) | |||
| { | |||
| }; | |||
| if (my_stop_is_required) | |||
| { | |||
| SHOW_TIME("say_thread > my_command_is_running = 0\n"); | |||
| my_command_is_running = 0; | |||
| } | |||
| SHOW_TIME("say_thread > unlocking\n"); | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (my_command_is_running) | |||
| { | |||
| process_espeak_command(a_command); | |||
| } | |||
| delete_espeak_command(a_command); | |||
| } | |||
| } | |||
| delete_espeak_command(a_command); | |||
| } | |||
| } | |||
| if (my_stop_is_required) | |||
| { | |||
| // no mutex required since the stop command is synchronous | |||
| // and waiting for my_sem_stop_is_acknowledged | |||
| init(1); | |||
| // purge start semaphore | |||
| SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); | |||
| while(0==sem_trywait(&my_sem_start_is_required)) | |||
| { | |||
| }; | |||
| // acknowledge the stop request | |||
| SHOW_TIME("say_thread > post my_sem_stop_is_acknowledged\n"); | |||
| int a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| assert( a_status != -1); | |||
| if (my_stop_is_required) | |||
| { | |||
| // no mutex required since the stop command is synchronous | |||
| // and waiting for my_sem_stop_is_acknowledged | |||
| init(1); | |||
| // purge start semaphore | |||
| SHOW_TIME("say_thread > purge my_sem_start_is_required\n"); | |||
| while(0==sem_trywait(&my_sem_start_is_required)) | |||
| { | |||
| }; | |||
| // acknowledge the stop request | |||
| SHOW_TIME("say_thread > post my_sem_stop_is_acknowledged\n"); | |||
| int a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| assert( a_status != -1); | |||
| } | |||
| // and wait for the next start | |||
| SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); | |||
| } | |||
| // and wait for the next start | |||
| SHOW_TIME("say_thread > wait for my_sem_start_is_required\n"); | |||
| } | |||
| return NULL; | |||
| return NULL; | |||
| } | |||
| int fifo_is_command_enabled() | |||
| { | |||
| SHOW("ENTER fifo_is_command_enabled=%d\n",(int)(0 == my_stop_is_required)); | |||
| return (0 == my_stop_is_required); | |||
| SHOW("ENTER fifo_is_command_enabled=%d\n",(int)(0 == my_stop_is_required)); | |||
| return (0 == my_stop_is_required); | |||
| } | |||
| typedef struct t_node | |||
| { | |||
| t_espeak_command* data; | |||
| struct t_node *next; | |||
| t_espeak_command* data; | |||
| struct t_node *next; | |||
| } node; | |||
| static node* head=NULL; | |||
| @@ -449,76 +448,76 @@ static node* tail=NULL; | |||
| static espeak_ERROR push(t_espeak_command* the_command) | |||
| { | |||
| ENTER("fifo > push"); | |||
| assert((!head && !tail) || (head && tail)); | |||
| if (the_command == NULL) | |||
| { | |||
| SHOW("push > command=0x%x\n", NULL); | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (node_counter >= MAX_NODE_COUNTER) | |||
| { | |||
| SHOW("push > %s\n", "EE_BUFFER_FULL"); | |||
| return EE_BUFFER_FULL; | |||
| } | |||
| node *n = (node *)malloc(sizeof(node)); | |||
| if (n == NULL) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (head == NULL) | |||
| { | |||
| head = n; | |||
| tail = n; | |||
| } | |||
| else | |||
| { | |||
| tail->next = n; | |||
| tail = n; | |||
| } | |||
| tail->next = NULL; | |||
| tail->data = the_command; | |||
| node_counter++; | |||
| SHOW("push > counter=%d\n",node_counter); | |||
| the_command->state = CS_PENDING; | |||
| display_espeak_command(the_command); | |||
| return EE_OK; | |||
| ENTER("fifo > push"); | |||
| assert((!head && !tail) || (head && tail)); | |||
| if (the_command == NULL) | |||
| { | |||
| SHOW("push > command=0x%x\n", NULL); | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (node_counter >= MAX_NODE_COUNTER) | |||
| { | |||
| SHOW("push > %s\n", "EE_BUFFER_FULL"); | |||
| return EE_BUFFER_FULL; | |||
| } | |||
| node *n = (node *)malloc(sizeof(node)); | |||
| if (n == NULL) | |||
| { | |||
| return EE_INTERNAL_ERROR; | |||
| } | |||
| if (head == NULL) | |||
| { | |||
| head = n; | |||
| tail = n; | |||
| } | |||
| else | |||
| { | |||
| tail->next = n; | |||
| tail = n; | |||
| } | |||
| tail->next = NULL; | |||
| tail->data = the_command; | |||
| node_counter++; | |||
| SHOW("push > counter=%d\n",node_counter); | |||
| the_command->state = CS_PENDING; | |||
| display_espeak_command(the_command); | |||
| return EE_OK; | |||
| } | |||
| static t_espeak_command* pop() | |||
| { | |||
| ENTER("fifo > pop"); | |||
| t_espeak_command* the_command = NULL; | |||
| ENTER("fifo > pop"); | |||
| t_espeak_command* the_command = NULL; | |||
| assert((!head && !tail) || (head && tail)); | |||
| assert((!head && !tail) || (head && tail)); | |||
| if (head != NULL) | |||
| { | |||
| node* n = head; | |||
| the_command = n->data; | |||
| head = n->next; | |||
| free(n); | |||
| node_counter--; | |||
| SHOW("pop > command=0x%x (counter=%d)\n",the_command, node_counter); | |||
| } | |||
| if (head != NULL) | |||
| { | |||
| node* n = head; | |||
| the_command = n->data; | |||
| head = n->next; | |||
| free(n); | |||
| node_counter--; | |||
| SHOW("pop > command=0x%x (counter=%d)\n",the_command, node_counter); | |||
| } | |||
| if(head == NULL) | |||
| { | |||
| tail = NULL; | |||
| } | |||
| if(head == NULL) | |||
| { | |||
| tail = NULL; | |||
| } | |||
| display_espeak_command(the_command); | |||
| display_espeak_command(the_command); | |||
| return the_command; | |||
| return the_command; | |||
| } | |||
| static void init(int process_parameters) | |||
| @@ -539,13 +538,13 @@ static void init(int process_parameters) | |||
| void fifo_terminate() | |||
| { | |||
| ENTER("fifo_terminate"); | |||
| ENTER("fifo_terminate"); | |||
| pthread_cancel(my_thread); | |||
| pthread_join(my_thread,NULL); | |||
| pthread_mutex_destroy(&my_mutex); | |||
| sem_destroy(&my_sem_start_is_required); | |||
| sem_destroy(&my_sem_stop_is_acknowledged); | |||
| pthread_cancel(my_thread); | |||
| pthread_join(my_thread,NULL); | |||
| pthread_mutex_destroy(&my_mutex); | |||
| sem_destroy(&my_sem_start_is_required); | |||
| sem_destroy(&my_sem_stop_is_acknowledged); | |||
| init(0); // purge fifo | |||
| init(0); // purge fifo | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| #ifndef FIFO_H | |||
| #define FIFO_H | |||
| // Helps to add espeak commands in a first-in first-out queue | |||
| // Helps to add espeak commands in a first-in first-out queue | |||
| // and run them asynchronously. | |||
| #include "espeak_command.h" | |||
| @@ -19,10 +19,10 @@ void fifo_init(); | |||
| // Add an espeak command. | |||
| // | |||
| // Note: this function fails if too many commands are already buffered. | |||
| // In such a case, the calling function could wait and then add again its command. | |||
| // In such a case, the calling function could wait and then add again its command. | |||
| // | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: the command can not be buffered; | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: the command can not be buffered; | |||
| // you may try after a while to call the function again. | |||
| // EE_INTERNAL_ERROR. | |||
| espeak_ERROR fifo_add_command (t_espeak_command* c); | |||
| @@ -30,16 +30,16 @@ espeak_ERROR fifo_add_command (t_espeak_command* c); | |||
| // Add two espeak commands in a single transaction. | |||
| // | |||
| // Note: this function fails if too many commands are already buffered. | |||
| // In such a case, the calling function could wait and then add again these commands. | |||
| // In such a case, the calling function could wait and then add again these commands. | |||
| // | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: at least one command can not be buffered; | |||
| // Return: EE_OK: operation achieved | |||
| // EE_BUFFER_FULL: at least one command can not be buffered; | |||
| // you may try after a while to call the function again. | |||
| // EE_INTERNAL_ERROR. | |||
| espeak_ERROR fifo_add_commands (t_espeak_command* c1, t_espeak_command* c2); | |||
| // The current running command must be stopped and the awaiting commands are cleared. | |||
| // Return: EE_OK: operation achieved | |||
| // Return: EE_OK: operation achieved | |||
| // EE_INTERNAL_ERROR. | |||
| espeak_ERROR fifo_stop (); | |||
| @@ -54,8 +54,8 @@ void fifo_terminate(); | |||
| // Indicates if the running command is still enabled. | |||
| // | |||
| // Note: this function is mainly called by the SynthCallback (speak_lib.cpp) | |||
| // It indicates if the actual wave sample can still be played. It is helpful for | |||
| // stopping speech as soon as a cancel command is applied. | |||
| // It indicates if the actual wave sample can still be played. It is helpful for | |||
| // stopping speech as soon as a cancel command is applied. | |||
| // | |||
| // Returns 1 if yes, or 0 otherwise. | |||
| int fifo_is_command_enabled(); | |||
| @@ -33,7 +33,7 @@ | |||
| /* Note this module is mostly old code that needs to be rewritten to | |||
| provide a more flexible intonation system. | |||
| */ | |||
| */ | |||
| // bits in SYLLABLE.flags | |||
| #define SYL_RISE 1 | |||
| @@ -68,125 +68,137 @@ static int tone_pitch_env; /* used to return pitch envelope */ | |||
| /* 0 fall */ | |||
| unsigned char env_fall[128] = { | |||
| 0xff, 0xfd, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, | |||
| 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc2, 0xc0, | |||
| 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0, 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0, | |||
| 0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90, 0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80, | |||
| 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60, | |||
| 0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40, | |||
| 0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, | |||
| 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x00 }; | |||
| 0xff, 0xfd, 0xfa, 0xf8, 0xf6, 0xf4, 0xf2, 0xf0, 0xee, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe2, 0xe0, | |||
| 0xde, 0xdc, 0xda, 0xd8, 0xd6, 0xd4, 0xd2, 0xd0, 0xce, 0xcc, 0xca, 0xc8, 0xc6, 0xc4, 0xc2, 0xc0, | |||
| 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4, 0xb2, 0xb0, 0xae, 0xac, 0xaa, 0xa8, 0xa6, 0xa4, 0xa2, 0xa0, | |||
| 0x9e, 0x9c, 0x9a, 0x98, 0x96, 0x94, 0x92, 0x90, 0x8e, 0x8c, 0x8a, 0x88, 0x86, 0x84, 0x82, 0x80, | |||
| 0x7e, 0x7c, 0x7a, 0x78, 0x76, 0x74, 0x72, 0x70, 0x6e, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x62, 0x60, | |||
| 0x5e, 0x5c, 0x5a, 0x58, 0x56, 0x54, 0x52, 0x50, 0x4e, 0x4c, 0x4a, 0x48, 0x46, 0x44, 0x42, 0x40, | |||
| 0x3e, 0x3c, 0x3a, 0x38, 0x36, 0x34, 0x32, 0x30, 0x2e, 0x2c, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, | |||
| 0x1e, 0x1c, 0x1a, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x00 | |||
| }; | |||
| /* 1 rise */ | |||
| unsigned char env_rise[128] = { | |||
| 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, | |||
| 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, | |||
| 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, | |||
| 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, | |||
| 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, | |||
| 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, | |||
| 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, | |||
| 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfd, 0xff }; | |||
| 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, | |||
| 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, | |||
| 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, | |||
| 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, | |||
| 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, | |||
| 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, | |||
| 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, | |||
| 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfd, 0xff | |||
| }; | |||
| unsigned char env_frise[128] = { | |||
| 0xff, 0xf4, 0xea, 0xe0, 0xd6, 0xcc, 0xc3, 0xba, 0xb1, 0xa8, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x78, | |||
| 0x71, 0x6a, 0x63, 0x5c, 0x56, 0x50, 0x4a, 0x44, 0x3f, 0x39, 0x34, 0x2f, 0x2b, 0x26, 0x22, 0x1e, | |||
| 0x1a, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x13, 0x15, 0x17, | |||
| 0x1a, 0x1d, 0x1f, 0x22, 0x25, 0x28, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3b, 0x3d, 0x40, | |||
| 0x42, 0x45, 0x47, 0x4a, 0x4c, 0x4f, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x68, 0x6b, | |||
| 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, | |||
| 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; | |||
| 0xff, 0xf4, 0xea, 0xe0, 0xd6, 0xcc, 0xc3, 0xba, 0xb1, 0xa8, 0x9f, 0x97, 0x8f, 0x87, 0x7f, 0x78, | |||
| 0x71, 0x6a, 0x63, 0x5c, 0x56, 0x50, 0x4a, 0x44, 0x3f, 0x39, 0x34, 0x2f, 0x2b, 0x26, 0x22, 0x1e, | |||
| 0x1a, 0x17, 0x13, 0x10, 0x0d, 0x0b, 0x08, 0x06, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x13, 0x15, 0x17, | |||
| 0x1a, 0x1d, 0x1f, 0x22, 0x25, 0x28, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x39, 0x3b, 0x3d, 0x40, | |||
| 0x42, 0x45, 0x47, 0x4a, 0x4c, 0x4f, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x68, 0x6b, | |||
| 0x6e, 0x71, 0x74, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, | |||
| 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 | |||
| }; | |||
| static unsigned char env_r_frise[128] = { | |||
| 0xcf, 0xcc, 0xc9, 0xc6, 0xc3, 0xc0, 0xbd, 0xb9, 0xb4, 0xb0, 0xab, 0xa7, 0xa2, 0x9c, 0x97, 0x92, | |||
| 0x8c, 0x86, 0x81, 0x7b, 0x75, 0x6f, 0x69, 0x63, 0x5d, 0x57, 0x50, 0x4a, 0x44, 0x3e, 0x38, 0x33, | |||
| 0x2d, 0x27, 0x22, 0x1c, 0x17, 0x12, 0x0d, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x12, 0x14, 0x16, | |||
| 0x19, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3f, 0x41, | |||
| 0x43, 0x46, 0x48, 0x4b, 0x4d, 0x50, 0x52, 0x55, 0x58, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, | |||
| 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, | |||
| 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 }; | |||
| 0xcf, 0xcc, 0xc9, 0xc6, 0xc3, 0xc0, 0xbd, 0xb9, 0xb4, 0xb0, 0xab, 0xa7, 0xa2, 0x9c, 0x97, 0x92, | |||
| 0x8c, 0x86, 0x81, 0x7b, 0x75, 0x6f, 0x69, 0x63, 0x5d, 0x57, 0x50, 0x4a, 0x44, 0x3e, 0x38, 0x33, | |||
| 0x2d, 0x27, 0x22, 0x1c, 0x17, 0x12, 0x0d, 0x08, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x12, 0x14, 0x16, | |||
| 0x19, 0x1b, 0x1e, 0x21, 0x24, 0x27, 0x2a, 0x2d, 0x30, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3f, 0x41, | |||
| 0x43, 0x46, 0x48, 0x4b, 0x4d, 0x50, 0x52, 0x55, 0x58, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, | |||
| 0x6f, 0x72, 0x75, 0x78, 0x7b, 0x7e, 0x81, 0x85, 0x88, 0x8b, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa0, | |||
| 0xa4, 0xa8, 0xac, 0xaf, 0xb3, 0xb7, 0xbb, 0xbf, 0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7, 0xdb, 0xe0 | |||
| }; | |||
| static unsigned char env_frise2[128] = { | |||
| 0xff, 0xf9, 0xf4, 0xee, 0xe9, 0xe4, 0xdf, 0xda, 0xd5, 0xd0, 0xcb, 0xc6, 0xc1, 0xbd, 0xb8, 0xb3, | |||
| 0xaf, 0xaa, 0xa6, 0xa1, 0x9d, 0x99, 0x95, 0x90, 0x8c, 0x88, 0x84, 0x80, 0x7d, 0x79, 0x75, 0x71, | |||
| 0x6e, 0x6a, 0x67, 0x63, 0x60, 0x5d, 0x59, 0x56, 0x53, 0x50, 0x4d, 0x4a, 0x47, 0x44, 0x41, 0x3e, | |||
| 0x3c, 0x39, 0x37, 0x34, 0x32, 0x2f, 0x2d, 0x2b, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, | |||
| 0x19, 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, | |||
| 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, | |||
| 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; | |||
| 0xff, 0xf9, 0xf4, 0xee, 0xe9, 0xe4, 0xdf, 0xda, 0xd5, 0xd0, 0xcb, 0xc6, 0xc1, 0xbd, 0xb8, 0xb3, | |||
| 0xaf, 0xaa, 0xa6, 0xa1, 0x9d, 0x99, 0x95, 0x90, 0x8c, 0x88, 0x84, 0x80, 0x7d, 0x79, 0x75, 0x71, | |||
| 0x6e, 0x6a, 0x67, 0x63, 0x60, 0x5d, 0x59, 0x56, 0x53, 0x50, 0x4d, 0x4a, 0x47, 0x44, 0x41, 0x3e, | |||
| 0x3c, 0x39, 0x37, 0x34, 0x32, 0x2f, 0x2d, 0x2b, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, | |||
| 0x19, 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, | |||
| 0x05, 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, | |||
| 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 | |||
| }; | |||
| static unsigned char env_r_frise2[128] = { | |||
| 0xd0, 0xce, 0xcd, 0xcc, 0xca, 0xc8, 0xc7, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, | |||
| 0xb0, 0xad, 0xaa, 0xa7, 0xa3, 0xa0, 0x9d, 0x99, 0x96, 0x92, 0x8f, 0x8b, 0x87, 0x84, 0x80, 0x7c, | |||
| 0x78, 0x74, 0x70, 0x6d, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x4a, 0x46, 0x42, 0x3e, | |||
| 0x3b, 0x37, 0x34, 0x31, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x19, | |||
| 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, | |||
| 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, | |||
| 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 }; | |||
| 0xd0, 0xce, 0xcd, 0xcc, 0xca, 0xc8, 0xc7, 0xc5, 0xc3, 0xc1, 0xc0, 0xbd, 0xbb, 0xb8, 0xb5, 0xb3, | |||
| 0xb0, 0xad, 0xaa, 0xa7, 0xa3, 0xa0, 0x9d, 0x99, 0x96, 0x92, 0x8f, 0x8b, 0x87, 0x84, 0x80, 0x7c, | |||
| 0x78, 0x74, 0x70, 0x6d, 0x69, 0x65, 0x61, 0x5d, 0x59, 0x55, 0x51, 0x4d, 0x4a, 0x46, 0x42, 0x3e, | |||
| 0x3b, 0x37, 0x34, 0x31, 0x2f, 0x2d, 0x2a, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1e, 0x1c, 0x1a, 0x19, | |||
| 0x17, 0x15, 0x14, 0x12, 0x11, 0x0f, 0x0e, 0x0d, 0x0c, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x05, | |||
| 0x04, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x04, 0x04, 0x05, 0x06, 0x07, 0x08, | |||
| 0x09, 0x0a, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20 | |||
| }; | |||
| static unsigned char env_risefall[128] = { | |||
| 0x98, 0x99, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, 0xa1, 0xa4, 0xa7, 0xa9, 0xac, 0xb0, 0xb3, 0xb6, 0xba, | |||
| 0xbe, 0xc1, 0xc5, 0xc9, 0xcd, 0xd1, 0xd4, 0xd8, 0xdc, 0xdf, 0xe3, 0xe6, 0xea, 0xed, 0xf0, 0xf2, | |||
| 0xf5, 0xf7, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, | |||
| 0xfb, 0xfa, 0xf8, 0xf6, 0xf3, 0xf1, 0xee, 0xec, 0xe9, 0xe6, 0xe4, 0xe0, 0xdd, 0xda, 0xd7, 0xd3, | |||
| 0xd0, 0xcc, 0xc8, 0xc4, 0xc0, 0xbc, 0xb8, 0xb4, 0xb0, 0xac, 0xa7, 0xa3, 0x9f, 0x9a, 0x96, 0x91, | |||
| 0x8d, 0x88, 0x84, 0x7f, 0x7b, 0x76, 0x72, 0x6d, 0x69, 0x65, 0x60, 0x5c, 0x58, 0x54, 0x50, 0x4c, | |||
| 0x48, 0x44, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2f, 0x2b, 0x28, 0x26, 0x23, 0x20, 0x1d, 0x1a, 0x17, | |||
| 0x15, 0x12, 0x0f, 0x0d, 0x0a, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }; | |||
| 0x98, 0x99, 0x99, 0x9a, 0x9c, 0x9d, 0x9f, 0xa1, 0xa4, 0xa7, 0xa9, 0xac, 0xb0, 0xb3, 0xb6, 0xba, | |||
| 0xbe, 0xc1, 0xc5, 0xc9, 0xcd, 0xd1, 0xd4, 0xd8, 0xdc, 0xdf, 0xe3, 0xe6, 0xea, 0xed, 0xf0, 0xf2, | |||
| 0xf5, 0xf7, 0xf9, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, | |||
| 0xfb, 0xfa, 0xf8, 0xf6, 0xf3, 0xf1, 0xee, 0xec, 0xe9, 0xe6, 0xe4, 0xe0, 0xdd, 0xda, 0xd7, 0xd3, | |||
| 0xd0, 0xcc, 0xc8, 0xc4, 0xc0, 0xbc, 0xb8, 0xb4, 0xb0, 0xac, 0xa7, 0xa3, 0x9f, 0x9a, 0x96, 0x91, | |||
| 0x8d, 0x88, 0x84, 0x7f, 0x7b, 0x76, 0x72, 0x6d, 0x69, 0x65, 0x60, 0x5c, 0x58, 0x54, 0x50, 0x4c, | |||
| 0x48, 0x44, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2f, 0x2b, 0x28, 0x26, 0x23, 0x20, 0x1d, 0x1a, 0x17, | |||
| 0x15, 0x12, 0x0f, 0x0d, 0x0a, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 | |||
| }; | |||
| static unsigned char env_rise2[128] = { | |||
| 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, | |||
| 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, | |||
| 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x22, 0x23, 0x25, 0x26, 0x28, 0x29, 0x2b, | |||
| 0x2d, 0x2f, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x47, 0x49, 0x4b, | |||
| 0x4e, 0x50, 0x52, 0x55, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x6a, 0x6d, 0x70, 0x73, 0x76, | |||
| 0x79, 0x7c, 0x7f, 0x82, 0x86, 0x89, 0x8c, 0x90, 0x93, 0x96, 0x9a, 0x9d, 0xa0, 0xa3, 0xa6, 0xa9, | |||
| 0xac, 0xaf, 0xb2, 0xb5, 0xb8, 0xbb, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, 0xd0, 0xd3, 0xd6, 0xd9, | |||
| 0xdc, 0xdf, 0xe2, 0xe4, 0xe7, 0xe9, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfb, 0xfd }; | |||
| 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x06, 0x06, | |||
| 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, | |||
| 0x16, 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1d, 0x1f, 0x20, 0x22, 0x23, 0x25, 0x26, 0x28, 0x29, 0x2b, | |||
| 0x2d, 0x2f, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x47, 0x49, 0x4b, | |||
| 0x4e, 0x50, 0x52, 0x55, 0x57, 0x5a, 0x5d, 0x5f, 0x62, 0x65, 0x67, 0x6a, 0x6d, 0x70, 0x73, 0x76, | |||
| 0x79, 0x7c, 0x7f, 0x82, 0x86, 0x89, 0x8c, 0x90, 0x93, 0x96, 0x9a, 0x9d, 0xa0, 0xa3, 0xa6, 0xa9, | |||
| 0xac, 0xaf, 0xb2, 0xb5, 0xb8, 0xbb, 0xbe, 0xc1, 0xc4, 0xc7, 0xca, 0xcd, 0xd0, 0xd3, 0xd6, 0xd9, | |||
| 0xdc, 0xdf, 0xe2, 0xe4, 0xe7, 0xe9, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfb, 0xfd | |||
| }; | |||
| static unsigned char env_fall2[128] = { | |||
| 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, | |||
| 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf0, 0xf0, 0xef, 0xee, 0xee, 0xed, 0xec, 0xeb, | |||
| 0xea, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, 0xdb, | |||
| 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd2, 0xd0, 0xce, 0xcc, 0xcb, 0xc9, 0xc7, 0xc5, 0xc3, 0xc0, 0xbe, | |||
| 0xbc, 0xb9, 0xb7, 0xb5, 0xb2, 0xaf, 0xad, 0xaa, 0xa7, 0xa4, 0xa1, 0x9e, 0x9a, 0x97, 0x94, 0x90, | |||
| 0x8d, 0x89, 0x85, 0x81, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x68, 0x64, 0x61, 0x5e, 0x5b, 0x57, 0x54, | |||
| 0x51, 0x4d, 0x4a, 0x46, 0x43, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2e, 0x2a, 0x27, 0x23, 0x1f, 0x1c, | |||
| 0x18, 0x14, 0x11, 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 }; | |||
| 0xfe, 0xfe, 0xfd, 0xfd, 0xfc, 0xfb, 0xfb, 0xfa, 0xfa, 0xf9, 0xf8, 0xf8, 0xf7, 0xf7, 0xf6, 0xf6, | |||
| 0xf5, 0xf4, 0xf4, 0xf3, 0xf3, 0xf2, 0xf2, 0xf1, 0xf0, 0xf0, 0xef, 0xee, 0xee, 0xed, 0xec, 0xeb, | |||
| 0xea, 0xea, 0xe9, 0xe8, 0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0, 0xde, 0xdd, 0xdc, 0xdb, | |||
| 0xd9, 0xd8, 0xd6, 0xd5, 0xd3, 0xd2, 0xd0, 0xce, 0xcc, 0xcb, 0xc9, 0xc7, 0xc5, 0xc3, 0xc0, 0xbe, | |||
| 0xbc, 0xb9, 0xb7, 0xb5, 0xb2, 0xaf, 0xad, 0xaa, 0xa7, 0xa4, 0xa1, 0x9e, 0x9a, 0x97, 0x94, 0x90, | |||
| 0x8d, 0x89, 0x85, 0x81, 0x7d, 0x79, 0x75, 0x71, 0x6d, 0x68, 0x64, 0x61, 0x5e, 0x5b, 0x57, 0x54, | |||
| 0x51, 0x4d, 0x4a, 0x46, 0x43, 0x40, 0x3c, 0x39, 0x35, 0x32, 0x2e, 0x2a, 0x27, 0x23, 0x1f, 0x1c, | |||
| 0x18, 0x14, 0x11, 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 | |||
| }; | |||
| static unsigned char env_fallrise3[128] = { | |||
| 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf1, 0xee, 0xeb, | |||
| 0xe8, 0xe5, 0xe1, 0xde, 0xda, 0xd6, 0xd2, 0xcd, 0xc9, 0xc4, 0xbf, 0xba, 0xb6, 0xb0, 0xab, 0xa6, | |||
| 0xa1, 0x9c, 0x96, 0x91, 0x8b, 0x86, 0x80, 0x7b, 0x75, 0x6f, 0x6a, 0x64, 0x5f, 0x59, 0x54, 0x4f, | |||
| 0x49, 0x44, 0x3f, 0x3a, 0x35, 0x30, 0x2b, 0x26, 0x22, 0x1d, 0x19, 0x15, 0x11, 0x0d, 0x0a, 0x07, | |||
| 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x05, | |||
| 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x12, 0x15, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35, | |||
| 0x3a, 0x3e, 0x43, 0x48, 0x4c, 0x51, 0x57, 0x5b, 0x5e, 0x62, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0x74, | |||
| 0x76, 0x78, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x84, 0x83, 0x83, 0x82, 0x81 }; | |||
| 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xfc, 0xfa, 0xf8, 0xf6, 0xf4, 0xf1, 0xee, 0xeb, | |||
| 0xe8, 0xe5, 0xe1, 0xde, 0xda, 0xd6, 0xd2, 0xcd, 0xc9, 0xc4, 0xbf, 0xba, 0xb6, 0xb0, 0xab, 0xa6, | |||
| 0xa1, 0x9c, 0x96, 0x91, 0x8b, 0x86, 0x80, 0x7b, 0x75, 0x6f, 0x6a, 0x64, 0x5f, 0x59, 0x54, 0x4f, | |||
| 0x49, 0x44, 0x3f, 0x3a, 0x35, 0x30, 0x2b, 0x26, 0x22, 0x1d, 0x19, 0x15, 0x11, 0x0d, 0x0a, 0x07, | |||
| 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x04, 0x05, | |||
| 0x07, 0x09, 0x0b, 0x0d, 0x10, 0x12, 0x15, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35, | |||
| 0x3a, 0x3e, 0x43, 0x48, 0x4c, 0x51, 0x57, 0x5b, 0x5e, 0x62, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0x74, | |||
| 0x76, 0x78, 0x7b, 0x7c, 0x7e, 0x80, 0x81, 0x82, 0x83, 0x83, 0x84, 0x84, 0x83, 0x83, 0x82, 0x81 | |||
| }; | |||
| static unsigned char env_fallrise4[128] = { | |||
| 0x72, 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6d, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x61, 0x5f, 0x5c, 0x5a, | |||
| 0x57, 0x54, 0x51, 0x4e, 0x4b, 0x48, 0x45, 0x42, 0x3f, 0x3b, 0x38, 0x35, 0x32, 0x2f, 0x2c, 0x29, | |||
| 0x26, 0x23, 0x20, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0b, 0x0a, 0x09, 0x08, | |||
| 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, | |||
| 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1d, 0x20, | |||
| 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x33, 0x37, 0x3b, 0x3f, 0x43, 0x47, 0x4c, 0x51, 0x56, 0x5b, 0x60, | |||
| 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7f, 0x84, 0x89, 0x8f, 0x95, 0x9b, 0xa1, 0xa7, 0xad, 0xb3, 0xba, | |||
| 0xc0, 0xc7, 0xce, 0xd5, 0xdc, 0xe3, 0xea, 0xf1, 0xf5, 0xf7, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xff }; | |||
| 0x72, 0x72, 0x71, 0x71, 0x70, 0x6f, 0x6d, 0x6c, 0x6a, 0x68, 0x66, 0x64, 0x61, 0x5f, 0x5c, 0x5a, | |||
| 0x57, 0x54, 0x51, 0x4e, 0x4b, 0x48, 0x45, 0x42, 0x3f, 0x3b, 0x38, 0x35, 0x32, 0x2f, 0x2c, 0x29, | |||
| 0x26, 0x23, 0x20, 0x1d, 0x1b, 0x18, 0x16, 0x14, 0x12, 0x10, 0x0e, 0x0c, 0x0b, 0x0a, 0x09, 0x08, | |||
| 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, | |||
| 0x07, 0x07, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0f, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1d, 0x20, | |||
| 0x23, 0x26, 0x29, 0x2c, 0x2f, 0x33, 0x37, 0x3b, 0x3f, 0x43, 0x47, 0x4c, 0x51, 0x56, 0x5b, 0x60, | |||
| 0x65, 0x6a, 0x6f, 0x74, 0x79, 0x7f, 0x84, 0x89, 0x8f, 0x95, 0x9b, 0xa1, 0xa7, 0xad, 0xb3, 0xba, | |||
| 0xc0, 0xc7, 0xce, 0xd5, 0xdc, 0xe3, 0xea, 0xf1, 0xf5, 0xf7, 0xfa, 0xfc, 0xfd, 0xfe, 0xff, 0xff | |||
| }; | |||
| static unsigned char env_risefallrise[128] = { | |||
| 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x83, 0x84, 0x87, 0x89, 0x8c, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa1, | |||
| 0xa5, 0xaa, 0xae, 0xb2, 0xb7, 0xbb, 0xc0, 0xc5, 0xc9, 0xcd, 0xd2, 0xd6, 0xda, 0xde, 0xe2, 0xe6, | |||
| 0xea, 0xed, 0xf0, 0xf3, 0xf5, 0xf8, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xfd, 0xfc, 0xfb, 0xf9, | |||
| 0xf7, 0xf4, 0xf0, 0xec, 0xe7, 0xe2, 0xdc, 0xd5, 0xce, 0xc6, 0xbd, 0xb4, 0xa9, 0x9e, 0x92, 0x88, | |||
| 0x82, 0x7d, 0x77, 0x72, 0x6c, 0x66, 0x60, 0x5a, 0x54, 0x4e, 0x49, 0x42, 0x3c, 0x37, 0x32, 0x2d, | |||
| 0x28, 0x24, 0x1f, 0x1b, 0x18, 0x14, 0x11, 0x0e, 0x0c, 0x09, 0x07, 0x06, 0x05, 0x04, 0x04, 0x04, | |||
| 0x04, 0x05, 0x06, 0x08, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1d, 0x23, 0x29, 0x2f, 0x37, 0x3e, 0x47, | |||
| 0x50, 0x5a, 0x64, 0x70, 0x7c, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x93, 0x93 }; | |||
| 0x7f, 0x7f, 0x7f, 0x80, 0x81, 0x83, 0x84, 0x87, 0x89, 0x8c, 0x8f, 0x92, 0x96, 0x99, 0x9d, 0xa1, | |||
| 0xa5, 0xaa, 0xae, 0xb2, 0xb7, 0xbb, 0xc0, 0xc5, 0xc9, 0xcd, 0xd2, 0xd6, 0xda, 0xde, 0xe2, 0xe6, | |||
| 0xea, 0xed, 0xf0, 0xf3, 0xf5, 0xf8, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xfe, 0xfd, 0xfc, 0xfb, 0xf9, | |||
| 0xf7, 0xf4, 0xf0, 0xec, 0xe7, 0xe2, 0xdc, 0xd5, 0xce, 0xc6, 0xbd, 0xb4, 0xa9, 0x9e, 0x92, 0x88, | |||
| 0x82, 0x7d, 0x77, 0x72, 0x6c, 0x66, 0x60, 0x5a, 0x54, 0x4e, 0x49, 0x42, 0x3c, 0x37, 0x32, 0x2d, | |||
| 0x28, 0x24, 0x1f, 0x1b, 0x18, 0x14, 0x11, 0x0e, 0x0c, 0x09, 0x07, 0x06, 0x05, 0x04, 0x04, 0x04, | |||
| 0x04, 0x05, 0x06, 0x08, 0x0a, 0x0d, 0x10, 0x14, 0x18, 0x1d, 0x23, 0x29, 0x2f, 0x37, 0x3e, 0x47, | |||
| 0x50, 0x5a, 0x64, 0x70, 0x7c, 0x83, 0x85, 0x88, 0x8a, 0x8c, 0x8e, 0x8f, 0x91, 0x92, 0x93, 0x93 | |||
| }; | |||
| @@ -203,7 +215,7 @@ unsigned char *envelope_data[N_ENVELOPE_DATA] = { | |||
| env_fall2, env_fall2, | |||
| env_rise2, env_rise2, | |||
| env_risefallrise, env_risefallrise | |||
| }; | |||
| }; | |||
| @@ -258,36 +270,36 @@ typedef struct { | |||
| #define T_EMPH 1 | |||
| static TONE_HEAD tone_head_table[N_TONE_HEAD_TABLE] = { | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 0 statement | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 1 comma | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 2 question | |||
| {46, 57, 90, 50, drops_0, 3, 9, 5, oflow_emf}, // 3 exclamation | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 4 statement, emphatic | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less}, // 5 statement, less intonation | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less}, // 6 comma, less intonation | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less}, // 7 comma, less intonation, less rise | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 8 pitch raises at end of sentence | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 9 comma | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 10 question | |||
| {34, 41, 41, 32, drops_0, 3, 7, 5, oflow_less}, // 11 test | |||
| {46, 57, 55, 50, drops_0, 3, 7, 5, oflow_less}, // 12 test | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 0 statement | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 1 comma | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 2 question | |||
| {46, 57, 90, 50, drops_0, 3, 9, 5, oflow_emf}, // 3 exclamation | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 4 statement, emphatic | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less},// 5 statement, less intonation | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less},// 6 comma, less intonation | |||
| {46, 57, 74, 55, drops_0, 4, 7, 5, oflow_less},// 7 comma, less intonation, less rise | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 8 pitch raises at end of sentence | |||
| {46, 57, 78, 46, drops_0, 3, 7, 5, oflow}, // 9 comma | |||
| {46, 57, 78, 50, drops_0, 3, 7, 5, oflow}, // 10 question | |||
| {34, 41, 41, 32, drops_0, 3, 7, 5, oflow_less}, // 11 test | |||
| {46, 57, 55, 50, drops_0, 3, 7, 5, oflow_less}, // 12 test | |||
| }; | |||
| static TONE_NUCLEUS tone_nucleus_table[N_TONE_NUCLEUS_TABLE] = { | |||
| {PITCHfall, 64, 8, PITCHfall, 70,18, NULL, 24, 12, 0}, // 0 statement | |||
| {PITCHfrise, 80,18, PITCHfrise2, 78,22, NULL, 34, 52, 0}, // 1 comma | |||
| {PITCHfrise, 88,22, PITCHfrise2, 82,22, NULL, 34, 64, 0}, // 2 question | |||
| {PITCHfall, 92, 8, PITCHfall, 92,80, NULL, 76, 8, T_EMPH}, // 3 exclamation | |||
| {PITCHfall, 86, 4, PITCHfall, 94,66, NULL, 34, 10, 0}, // 4 statement, emphatic | |||
| {PITCHfall, 62,10, PITCHfall, 62,20, NULL, 28, 16, 0}, // 5 statement, less intonation | |||
| {PITCHfrise, 68,18, PITCHfrise2, 68,22, NULL, 30, 44, 0}, // 6 comma, less intonation | |||
| {PITCHfrise2, 64,16, PITCHfall, 66,32, NULL, 32, 18, 0}, // 7 comma, less intonation, less rise | |||
| {PITCHrise, 68,46, PITCHfall, 42,32, NULL, 46, 58, 0}, // 8 pitch raises at end of sentence | |||
| {PITCHfrise, 78,24, PITCHfrise2, 72,22, NULL, 42, 52, 0}, // 9 comma | |||
| {PITCHfrise, 88,34, PITCHfall, 64,32, NULL, 46, 82, 0}, // 10 question | |||
| {PITCHfall, 56,12, PITCHfall, 56,20, NULL, 24, 12, 0}, // 11 test | |||
| {PITCHfall, 70,18, PITCHfall, 70,24, NULL, 32, 20, 0}, // 12 test | |||
| {PITCHfall, 64, 8, PITCHfall, 70,18, NULL, 24, 12, 0}, // 0 statement | |||
| {PITCHfrise, 80,18, PITCHfrise2, 78,22, NULL, 34, 52, 0}, // 1 comma | |||
| {PITCHfrise, 88,22, PITCHfrise2, 82,22, NULL, 34, 64, 0}, // 2 question | |||
| {PITCHfall, 92, 8, PITCHfall, 92,80, NULL, 76, 8, T_EMPH}, // 3 exclamation | |||
| {PITCHfall, 86, 4, PITCHfall, 94,66, NULL, 34, 10, 0}, // 4 statement, emphatic | |||
| {PITCHfall, 62,10, PITCHfall, 62,20, NULL, 28, 16, 0}, // 5 statement, less intonation | |||
| {PITCHfrise, 68,18, PITCHfrise2, 68,22, NULL, 30, 44, 0}, // 6 comma, less intonation | |||
| {PITCHfrise2, 64,16, PITCHfall, 66,32, NULL, 32, 18, 0}, // 7 comma, less intonation, less rise | |||
| {PITCHrise, 68,46, PITCHfall, 42,32, NULL, 46, 58, 0}, // 8 pitch raises at end of sentence | |||
| {PITCHfrise, 78,24, PITCHfrise2, 72,22, NULL, 42, 52, 0}, // 9 comma | |||
| {PITCHfrise, 88,34, PITCHfall, 64,32, NULL, 46, 82, 0}, // 10 question | |||
| {PITCHfall, 56,12, PITCHfall, 56,20, NULL, 24, 12, 0}, // 11 test | |||
| {PITCHfall, 70,18, PITCHfall, 70,24, NULL, 32, 20, 0}, // 12 test | |||
| }; | |||
| @@ -315,22 +327,22 @@ TUNE *tunes = NULL; | |||
| #define PRIMARY_LAST 7 | |||
| static int number_pre; | |||
| static int number_body; | |||
| static int number_tail; | |||
| static int last_primary; | |||
| static int tone_posn; | |||
| static int tone_posn2; | |||
| static int no_tonic; | |||
| static int number_pre; | |||
| static int number_body; | |||
| static int number_tail; | |||
| static int last_primary; | |||
| static int tone_posn; | |||
| static int tone_posn2; | |||
| static int no_tonic; | |||
| static void count_pitch_vowels(int start, int end, int clause_end) | |||
| { | |||
| int ix; | |||
| int stress; | |||
| int max_stress = 0; | |||
| int max_stress_posn = 0; // last syllable ot the highest stress | |||
| int max_stress_posn2 = 0; // penuntimate syllable of the highest stress | |||
| int ix; | |||
| int stress; | |||
| int max_stress = 0; | |||
| int max_stress_posn = 0; // last syllable ot the highest stress | |||
| int max_stress_posn2 = 0; // penuntimate syllable of the highest stress | |||
| number_pre = -1; /* number of vowels before 1st primary stress */ | |||
| number_body = 0; | |||
| @@ -396,8 +408,8 @@ static void count_pitch_vowels(int start, int end, int clause_end) | |||
| /* Count number of primary stresses up to tonic syllable or body_reset */ | |||
| static int count_increments(int ix, int end_ix, int min_stress) | |||
| { | |||
| int count = 0; | |||
| int stress; | |||
| int count = 0; | |||
| int stress; | |||
| while(ix < end_ix) | |||
| { | |||
| @@ -417,8 +429,8 @@ static int count_increments(int ix, int end_ix, int min_stress) | |||
| // Set the pitch of a vowel in syllable_tab | |||
| static void set_pitch(SYLLABLE *syl, int base, int drop) | |||
| { | |||
| int pitch1, pitch2; | |||
| int flags = 0; | |||
| int pitch1, pitch2; | |||
| int flags = 0; | |||
| if(base < 0) base = 0; | |||
| @@ -457,24 +469,24 @@ static int CountUnstressed(int start, int end, int limit) | |||
| static int SetHeadIntonation(TUNE *tune, int syl_ix, int end_ix, int control) | |||
| { | |||
| int stress; | |||
| int stress; | |||
| SYLLABLE *syl; | |||
| int ix; | |||
| int pitch=0; | |||
| int increment=0; | |||
| int n_steps=0; | |||
| int stage; // onset, head, last | |||
| int initial; | |||
| int overflow_ix=0; | |||
| int pitch_range; | |||
| int pitch_range_abs; | |||
| int ix; | |||
| int pitch=0; | |||
| int increment=0; | |||
| int n_steps=0; | |||
| int stage; // onset, head, last | |||
| int initial; | |||
| int overflow_ix=0; | |||
| int pitch_range; | |||
| int pitch_range_abs; | |||
| int *drops; | |||
| int n_unstressed=0; | |||
| int unstressed_ix=0; | |||
| int unstressed_inc; | |||
| int used_onset = 0; | |||
| int head_final = end_ix; | |||
| int secondary=2; // 2 | |||
| int n_unstressed=0; | |||
| int unstressed_ix=0; | |||
| int unstressed_inc; | |||
| int used_onset = 0; | |||
| int head_final = end_ix; | |||
| int secondary=2; // 2 | |||
| pitch_range = (tune->head_end - tune->head_start) << 8; | |||
| pitch_range_abs = abs(pitch_range); | |||
| @@ -603,20 +615,20 @@ int secondary=2; // 2 | |||
| /* Calculate pitches until next RESET or tonic syllable, or end. | |||
| Increment pitch if stress is >= min_stress. | |||
| Used for tonic segment */ | |||
| Increment pitch if stress is >= min_stress. | |||
| Used for tonic segment */ | |||
| static int calc_pitch_segment(int ix, int end_ix, TONE_HEAD *th, TONE_NUCLEUS *tn, int min_stress, int continuing) | |||
| { | |||
| int stress; | |||
| int pitch=0; | |||
| int increment=0; | |||
| int n_primary=0; | |||
| int n_steps=0; | |||
| int initial; | |||
| int overflow=0; | |||
| int n_overflow; | |||
| int pitch_range; | |||
| int pitch_range_abs; | |||
| int stress; | |||
| int pitch=0; | |||
| int increment=0; | |||
| int n_primary=0; | |||
| int n_steps=0; | |||
| int initial; | |||
| int overflow=0; | |||
| int n_overflow; | |||
| int pitch_range; | |||
| int pitch_range_abs; | |||
| int *drops; | |||
| signed char *overflow_tab; | |||
| SYLLABLE *syl; | |||
| @@ -689,7 +701,7 @@ static int calc_pitch_segment(int ix, int end_ix, TONE_HEAD *th, TONE_NUCLEUS *t | |||
| n_primary--; | |||
| if((tn->backwards) && (n_primary < 2)) | |||
| { | |||
| pitch = tn->backwards[n_primary] << 8; | |||
| pitch = tn->backwards[n_primary] << 8; | |||
| } | |||
| } | |||
| @@ -724,12 +736,12 @@ static void SetPitchGradient(int start_ix, int end_ix, int start_pitch, int end_ | |||
| // Set a linear pitch change over a number of syllables. | |||
| // Used for pre-head, unstressed syllables in the body, and the tail | |||
| int ix; | |||
| int stress; | |||
| int pitch; | |||
| int increment; | |||
| int n_increments; | |||
| int drop; | |||
| int ix; | |||
| int stress; | |||
| int pitch; | |||
| int increment; | |||
| int n_increments; | |||
| int drop; | |||
| SYLLABLE *syl; | |||
| increment = (end_pitch - start_pitch) << 8; | |||
| @@ -775,9 +787,9 @@ static void SetPitchGradient(int start_ix, int end_ix, int start_pitch, int end_ | |||
| // Calculate pitch values for the vowels in this tone group | |||
| static int calc_pitches2(int start, int end, int tune_number) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| TUNE *tune; | |||
| int drop; | |||
| int drop; | |||
| tune = &tunes[tune_number]; | |||
| ix = start; | |||
| @@ -833,10 +845,10 @@ static int calc_pitches2(int start, int end, int tune_number) | |||
| // Calculate pitch values for the vowels in this tone group | |||
| static int calc_pitches(int control, int start, int end, int tune_number) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| TONE_HEAD *th; | |||
| TONE_NUCLEUS *tn; | |||
| int drop; | |||
| int drop; | |||
| int continuing = 0; | |||
| if(control == 0) | |||
| @@ -911,11 +923,11 @@ static void CalcPitches_Tone(Translator *tr, int clause_tone) | |||
| { | |||
| // clause_tone: 0=. 1=, 2=?, 3=! 4=none | |||
| PHONEME_LIST *p; | |||
| int ix; | |||
| int count_stressed=0; | |||
| int final_stressed=0; | |||
| int ix; | |||
| int count_stressed=0; | |||
| int final_stressed=0; | |||
| int tone_ph; | |||
| int tone_ph; | |||
| int pause; | |||
| int tone_promoted; | |||
| PHONEME_TAB *tph; | |||
| @@ -923,10 +935,10 @@ static void CalcPitches_Tone(Translator *tr, int clause_tone) | |||
| PHONEME_TAB *prevw_tph; // remember across word boundary | |||
| PHONEME_LIST *prev_p; | |||
| int pitch_adjust = 0; // pitch gradient through the clause - inital value | |||
| int pitch_decrement = 0; // decrease by this for each stressed syllable | |||
| int pitch_low = 0; // until it drops to this | |||
| int pitch_high = 0; // then reset to this | |||
| int pitch_adjust = 0; // pitch gradient through the clause - inital value | |||
| int pitch_decrement = 0; // decrease by this for each stressed syllable | |||
| int pitch_low = 0; // until it drops to this | |||
| int pitch_high = 0; // then reset to this | |||
| // count number of stressed syllables | |||
| p = &phoneme_list[0]; | |||
| @@ -1091,14 +1103,14 @@ void CalcPitches(Translator *tr, int clause_type) | |||
| // clause_type: 0=. 1=, 2=?, 3=! 4=none | |||
| PHONEME_LIST *p; | |||
| SYLLABLE *syl; | |||
| int ix; | |||
| int x; | |||
| int st_ix; | |||
| int ix; | |||
| int x; | |||
| int st_ix; | |||
| int n_st; | |||
| int option; | |||
| int group_tone; | |||
| int group_tone_emph; | |||
| int group_tone_comma; | |||
| int option; | |||
| int group_tone; | |||
| int group_tone_emph; | |||
| int group_tone_comma; | |||
| int ph_start=0; | |||
| int st_start; | |||
| int st_clause_end; | |||
| @@ -1290,13 +1302,13 @@ void CalcPitches(Translator *tr, int clause_type) | |||
| p->pitch2 = x; | |||
| } | |||
| if(p->tone_ph) | |||
| { | |||
| ph = phoneme_tab[p->tone_ph]; | |||
| x = (p->pitch1 + p->pitch2)/2; | |||
| p->pitch2 = x + ph->end_type; | |||
| p->pitch1 = x + ph->start_type; | |||
| } | |||
| if(p->tone_ph) | |||
| { | |||
| ph = phoneme_tab[p->tone_ph]; | |||
| x = (p->pitch1 + p->pitch2)/2; | |||
| p->pitch2 = x + ph->end_type; | |||
| p->pitch1 = x + ph->start_type; | |||
| } | |||
| if(syl->flags & SYL_EMPHASIS) | |||
| { | |||
| @@ -64,7 +64,7 @@ static void frame_init (klatt_frame_ptr); | |||
| static void setabc (long,long,resonator_ptr); | |||
| static void setzeroabc (long,long,resonator_ptr); | |||
| static klatt_frame_t kt_frame; | |||
| static klatt_frame_t kt_frame; | |||
| static klatt_global_t kt_globals; | |||
| #define NUMBER_OF_SAMPLES 100 | |||
| @@ -72,57 +72,57 @@ static klatt_global_t kt_globals; | |||
| static int scale_wav_tab[] = {45,38,45,45,55}; // scale output from different voicing sources | |||
| // For testing, this can be overwritten in KlattInit() | |||
| static short natural_samples2[256]= { | |||
| 2583, 2516, 2450, 2384, 2319, 2254, 2191, 2127, | |||
| 2067, 2005, 1946, 1890, 1832, 1779, 1726, 1675, | |||
| 1626, 1579, 1533, 1491, 1449, 1409, 1372, 1336, | |||
| 1302, 1271, 1239, 1211, 1184, 1158, 1134, 1111, | |||
| 1089, 1069, 1049, 1031, 1013, 996, 980, 965, | |||
| 950, 936, 921, 909, 895, 881, 869, 855, | |||
| 843, 830, 818, 804, 792, 779, 766, 754, | |||
| 740, 728, 715, 702, 689, 676, 663, 651, | |||
| 637, 626, 612, 601, 588, 576, 564, 552, | |||
| 540, 530, 517, 507, 496, 485, 475, 464, | |||
| 454, 443, 434, 424, 414, 404, 394, 385, | |||
| 375, 366, 355, 347, 336, 328, 317, 308, | |||
| 299, 288, 280, 269, 260, 250, 240, 231, | |||
| 220, 212, 200, 192, 181, 172, 161, 152, | |||
| 142, 133, 123, 113, 105, 94, 86, 76, | |||
| 67, 57, 49, 39, 30, 22, 11, 4, | |||
| -5, -14, -23, -32, -41, -50, -60, -69, | |||
| -78, -87, -96, -107, -115, -126, -134, -144, | |||
| -154, -164, -174, -183, -193, -203, -213, -222, | |||
| -233, -242, -252, -262, -271, -281, -291, -301, | |||
| -310, -320, -330, -339, -349, -357, -368, -377, | |||
| -387, -397, -406, -417, -426, -436, -446, -456, | |||
| -467, -477, -487, -499, -509, -521, -532, -543, | |||
| -555, -567, -579, -591, -603, -616, -628, -641, | |||
| -653, -666, -679, -692, -705, -717, -732, -743, | |||
| -758, -769, -783, -795, -808, -820, -834, -845, | |||
| -860, -872, -885, -898, -911, -926, -939, -955, | |||
| -968, -986, -999, -1018, -1034, -1054, -1072, -1094, | |||
| -1115, -1138, -1162, -1188, -1215, -1244, -1274, -1307, | |||
| -1340, -1377, -1415, -1453, -1496, -1538, -1584, -1631, | |||
| -1680, -1732, -1783, -1839, -1894, -1952, -2010, -2072, | |||
| -2133, -2196, -2260, -2325, -2390, -2456, -2522, -2589, | |||
| static short natural_samples2[256]= { | |||
| 2583, 2516, 2450, 2384, 2319, 2254, 2191, 2127, | |||
| 2067, 2005, 1946, 1890, 1832, 1779, 1726, 1675, | |||
| 1626, 1579, 1533, 1491, 1449, 1409, 1372, 1336, | |||
| 1302, 1271, 1239, 1211, 1184, 1158, 1134, 1111, | |||
| 1089, 1069, 1049, 1031, 1013, 996, 980, 965, | |||
| 950, 936, 921, 909, 895, 881, 869, 855, | |||
| 843, 830, 818, 804, 792, 779, 766, 754, | |||
| 740, 728, 715, 702, 689, 676, 663, 651, | |||
| 637, 626, 612, 601, 588, 576, 564, 552, | |||
| 540, 530, 517, 507, 496, 485, 475, 464, | |||
| 454, 443, 434, 424, 414, 404, 394, 385, | |||
| 375, 366, 355, 347, 336, 328, 317, 308, | |||
| 299, 288, 280, 269, 260, 250, 240, 231, | |||
| 220, 212, 200, 192, 181, 172, 161, 152, | |||
| 142, 133, 123, 113, 105, 94, 86, 76, | |||
| 67, 57, 49, 39, 30, 22, 11, 4, | |||
| -5, -14, -23, -32, -41, -50, -60, -69, | |||
| -78, -87, -96, -107, -115, -126, -134, -144, | |||
| -154, -164, -174, -183, -193, -203, -213, -222, | |||
| -233, -242, -252, -262, -271, -281, -291, -301, | |||
| -310, -320, -330, -339, -349, -357, -368, -377, | |||
| -387, -397, -406, -417, -426, -436, -446, -456, | |||
| -467, -477, -487, -499, -509, -521, -532, -543, | |||
| -555, -567, -579, -591, -603, -616, -628, -641, | |||
| -653, -666, -679, -692, -705, -717, -732, -743, | |||
| -758, -769, -783, -795, -808, -820, -834, -845, | |||
| -860, -872, -885, -898, -911, -926, -939, -955, | |||
| -968, -986, -999, -1018, -1034, -1054, -1072, -1094, | |||
| -1115, -1138, -1162, -1188, -1215, -1244, -1274, -1307, | |||
| -1340, -1377, -1415, -1453, -1496, -1538, -1584, -1631, | |||
| -1680, -1732, -1783, -1839, -1894, -1952, -2010, -2072, | |||
| -2133, -2196, -2260, -2325, -2390, -2456, -2522, -2589, | |||
| }; | |||
| static short natural_samples[100]= | |||
| { | |||
| -310,-400,530,356,224,89,23,-10,-58,-16,461,599,536,701,770, | |||
| 605,497,461,560,404,110,224,131,104,-97,155,278,-154,-1165, | |||
| -598,737,125,-592,41,11,-247,-10,65,92,80,-304,71,167,-1,122, | |||
| 233,161,-43,278,479,485,407,266,650,134,80,236,68,260,269,179, | |||
| 53,140,275,293,296,104,257,152,311,182,263,245,125,314,140,44, | |||
| 203,230,-235,-286,23,107,92,-91,38,464,443,176,98,-784,-2449, | |||
| -1891,-1045,-1600,-1462,-1384,-1261,-949,-730 | |||
| }; | |||
| static short natural_samples[100]= | |||
| { | |||
| -310,-400,530,356,224,89,23,-10,-58,-16,461,599,536,701,770, | |||
| 605,497,461,560,404,110,224,131,104,-97,155,278,-154,-1165, | |||
| -598,737,125,-592,41,11,-247,-10,65,92,80,-304,71,167,-1,122, | |||
| 233,161,-43,278,479,485,407,266,650,134,80,236,68,260,269,179, | |||
| 53,140,275,293,296,104,257,152,311,182,263,245,125,314,140,44, | |||
| 203,230,-235,-286,23,107,92,-91,38,464,443,176,98,-784,-2449, | |||
| -1891,-1045,-1600,-1462,-1384,-1261,-949,-730 | |||
| }; | |||
| /* | |||
| function RESONATOR | |||
| function RESONATOR | |||
| This is a generic resonator function. Internal memory for the resonator | |||
| is stored in the globals structure. | |||
| */ | |||
| This is a generic resonator function. Internal memory for the resonator | |||
| is stored in the globals structure. | |||
| */ | |||
| static double resonator(resonator_ptr r, double input) | |||
| { | |||
| @@ -166,16 +166,16 @@ static double antiresonator2(resonator_ptr r, double input) | |||
| /* | |||
| function FLUTTER | |||
| function FLUTTER | |||
| This function adds F0 flutter, as specified in: | |||
| This function adds F0 flutter, as specified in: | |||
| "Analysis, synthesis and perception of voice quality variations among | |||
| female and male talkers" D.H. Klatt and L.C. Klatt JASA 87(2) February 1990. | |||
| "Analysis, synthesis and perception of voice quality variations among | |||
| female and male talkers" D.H. Klatt and L.C. Klatt JASA 87(2) February 1990. | |||
| Flutter is added by applying a quasi-random element constructed from three | |||
| slowly varying sine waves. | |||
| */ | |||
| Flutter is added by applying a quasi-random element constructed from three | |||
| slowly varying sine waves. | |||
| */ | |||
| static void flutter(klatt_frame_ptr frame) | |||
| { | |||
| @@ -196,11 +196,11 @@ static void flutter(klatt_frame_ptr frame) | |||
| /* | |||
| function SAMPLED_SOURCE | |||
| function SAMPLED_SOURCE | |||
| Allows the use of a glottal excitation waveform sampled from a real | |||
| voice. | |||
| */ | |||
| Allows the use of a glottal excitation waveform sampled from a real | |||
| voice. | |||
| */ | |||
| static double sampled_source(int source_num) | |||
| { | |||
| @@ -253,10 +253,10 @@ static double sampled_source(int source_num) | |||
| /* | |||
| function PARWAVE | |||
| function PARWAVE | |||
| Converts synthesis parameters to a waveform. | |||
| */ | |||
| Converts synthesis parameters to a waveform. | |||
| */ | |||
| static int parwave(klatt_frame_ptr frame) | |||
| @@ -281,14 +281,14 @@ static int parwave(klatt_frame_ptr frame) | |||
| flutter(frame); /* add f0 flutter */ | |||
| #ifdef LOG_FRAMES | |||
| if(option_log_frames) | |||
| { | |||
| FILE *f; | |||
| f=fopen("log-klatt","a"); | |||
| fprintf(f,"%4dhz %2dAV %4d %3d, %4d %3d, %4d %3d, %4d %3d, %4d, %3d, FNZ=%3d TLT=%2d\n",frame->F0hz10,frame->AVdb, | |||
| frame->Fhz[1],frame->Bhz[1],frame->Fhz[2],frame->Bhz[2],frame->Fhz[3],frame->Bhz[3],frame->Fhz[4],frame->Bhz[4],frame->Fhz[5],frame->Bhz[5],frame->Fhz[0],frame->TLTdb); | |||
| fclose(f); | |||
| } | |||
| if(option_log_frames) | |||
| { | |||
| FILE *f; | |||
| f=fopen("log-klatt","a"); | |||
| fprintf(f,"%4dhz %2dAV %4d %3d, %4d %3d, %4d %3d, %4d %3d, %4d, %3d, FNZ=%3d TLT=%2d\n",frame->F0hz10,frame->AVdb, | |||
| frame->Fhz[1],frame->Bhz[1],frame->Fhz[2],frame->Bhz[2],frame->Fhz[3],frame->Bhz[3],frame->Fhz[4],frame->Bhz[4],frame->Fhz[5],frame->Bhz[5],frame->Fhz[0],frame->TLTdb); | |||
| fclose(f); | |||
| } | |||
| #endif | |||
| /* MAIN LOOP, for each output sample of current frame: */ | |||
| @@ -299,9 +299,9 @@ if(option_log_frames) | |||
| noise = gen_noise(noise); | |||
| /* | |||
| Amplitude modulate noise (reduce noise amplitude during | |||
| second half of glottal period) if voicing simultaneously present. | |||
| */ | |||
| Amplitude modulate noise (reduce noise amplitude during | |||
| second half of glottal period) if voicing simultaneously present. | |||
| */ | |||
| if (kt_globals.nper > kt_globals.nmod) | |||
| { | |||
| @@ -312,10 +312,10 @@ if(option_log_frames) | |||
| frics = kt_globals.amp_frica * noise; | |||
| /* | |||
| Compute voicing waveform. Run glottal source simulation at 4 | |||
| times normal sample rate to minimize quantization noise in | |||
| period of female voice. | |||
| */ | |||
| Compute voicing waveform. Run glottal source simulation at 4 | |||
| times normal sample rate to minimize quantization noise in | |||
| period of female voice. | |||
| */ | |||
| for (n4=0; n4<4; n4++) | |||
| { | |||
| @@ -343,9 +343,9 @@ if(option_log_frames) | |||
| } | |||
| /* | |||
| Low-pass filter voicing waveform before downsampling from 4*samrate | |||
| to samrate samples/sec. Resonator f=.09*samrate, bw=.06*samrate | |||
| */ | |||
| Low-pass filter voicing waveform before downsampling from 4*samrate | |||
| to samrate samples/sec. Resonator f=.09*samrate, bw=.06*samrate | |||
| */ | |||
| voice = resonator(&(kt_globals.rsn[RLP]),voice); | |||
| @@ -354,18 +354,18 @@ if(option_log_frames) | |||
| } | |||
| /* | |||
| Tilt spectrum of voicing source down by soft low-pass filtering, amount | |||
| of tilt determined by TLTdb | |||
| */ | |||
| Tilt spectrum of voicing source down by soft low-pass filtering, amount | |||
| of tilt determined by TLTdb | |||
| */ | |||
| voice = (voice * kt_globals.onemd) + (vlast * kt_globals.decay); | |||
| vlast = voice; | |||
| /* | |||
| Add breathiness during glottal open phase. Amount of breathiness | |||
| determined by parameter Aturb Use nrand rather than noise because | |||
| noise is low-passed. | |||
| */ | |||
| Add breathiness during glottal open phase. Amount of breathiness | |||
| determined by parameter Aturb Use nrand rather than noise because | |||
| noise is low-passed. | |||
| */ | |||
| if (kt_globals.nper < kt_globals.nopen) | |||
| @@ -384,9 +384,9 @@ if(option_log_frames) | |||
| par_glotout += aspiration; | |||
| /* | |||
| Cascade vocal tract, excited by laryngeal sources. | |||
| Nasal antiresonator, then formants FNP, F5, F4, F3, F2, F1 | |||
| */ | |||
| Cascade vocal tract, excited by laryngeal sources. | |||
| Nasal antiresonator, then formants FNP, F5, F4, F3, F2, F1 | |||
| */ | |||
| out=0; | |||
| if(kt_globals.synthesis_model != ALL_PARALLEL) | |||
| @@ -407,11 +407,11 @@ if(option_log_frames) | |||
| sourc = par_glotout; /* Source is voicing plus aspiration */ | |||
| /* | |||
| Standard parallel vocal tract Formants F6,F5,F4,F3,F2, | |||
| outputs added with alternating sign. Sound source for other | |||
| parallel resonators is frication plus first difference of | |||
| voicing waveform. | |||
| */ | |||
| Standard parallel vocal tract Formants F6,F5,F4,F3,F2, | |||
| outputs added with alternating sign. Sound source for other | |||
| parallel resonators is frication plus first difference of | |||
| voicing waveform. | |||
| */ | |||
| out += resonator(&(kt_globals.rsn[R1p]),sourc); | |||
| out += resonator(&(kt_globals.rsn[Rnpp]),sourc); | |||
| @@ -429,7 +429,7 @@ if(option_log_frames) | |||
| out = outbypas - out; | |||
| out = resonator(&(kt_globals.rsn[Rout]),out); | |||
| temp = (int)(out * wdata.amplitude * kt_globals.amp_gain0) ; /* Convert back to integer */ | |||
| temp = (int)(out * wdata.amplitude * kt_globals.amp_gain0); /* Convert back to integer */ | |||
| // mix with a recorded WAV if required for this phoneme | |||
| @@ -539,10 +539,10 @@ void KlattReset(int control) | |||
| /* | |||
| function FRAME_INIT | |||
| function FRAME_INIT | |||
| Use parameters from the input frame to set up resonator coefficients. | |||
| */ | |||
| Use parameters from the input frame to set up resonator coefficients. | |||
| */ | |||
| static void frame_init(klatt_frame_ptr frame) | |||
| { | |||
| @@ -618,13 +618,13 @@ static void frame_init(klatt_frame_ptr frame) | |||
| /* | |||
| function IMPULSIVE_SOURCE | |||
| function IMPULSIVE_SOURCE | |||
| Generate a low pass filtered train of impulses as an approximation of | |||
| a natural excitation waveform. Low-pass filter the differentiated impulse | |||
| with a critically-damped second-order filter, time constant proportional | |||
| to Kopen. | |||
| */ | |||
| Generate a low pass filtered train of impulses as an approximation of | |||
| a natural excitation waveform. Low-pass filter the differentiated impulse | |||
| with a critically-damped second-order filter, time constant proportional | |||
| to Kopen. | |||
| */ | |||
| static double impulsive_source() | |||
| @@ -647,11 +647,11 @@ static double impulsive_source() | |||
| /* | |||
| function NATURAL_SOURCE | |||
| function NATURAL_SOURCE | |||
| Vwave is the differentiated glottal flow waveform, there is a weak | |||
| spectral zero around 800 Hz, magic constants a,b reset pitch synchronously. | |||
| */ | |||
| Vwave is the differentiated glottal flow waveform, there is a weak | |||
| spectral zero around 800 Hz, magic constants a,b reset pitch synchronously. | |||
| */ | |||
| static double natural_source() | |||
| { | |||
| @@ -678,36 +678,36 @@ static double natural_source() | |||
| /* | |||
| function PITCH_SYNC_PAR_RESET | |||
| function PITCH_SYNC_PAR_RESET | |||
| Reset selected parameters pitch-synchronously. | |||
| Reset selected parameters pitch-synchronously. | |||
| Constant B0 controls shape of glottal pulse as a function | |||
| of desired duration of open phase N0 | |||
| (Note that N0 is specified in terms of 40,000 samples/sec of speech) | |||
| Constant B0 controls shape of glottal pulse as a function | |||
| of desired duration of open phase N0 | |||
| (Note that N0 is specified in terms of 40,000 samples/sec of speech) | |||
| Assume voicing waveform V(t) has form: k1 t**2 - k2 t**3 | |||
| Assume voicing waveform V(t) has form: k1 t**2 - k2 t**3 | |||
| If the radiation characterivative, a temporal derivative | |||
| is folded in, and we go from continuous time to discrete | |||
| integers n: dV/dt = vwave[n] | |||
| If the radiation characterivative, a temporal derivative | |||
| is folded in, and we go from continuous time to discrete | |||
| integers n: dV/dt = vwave[n] | |||
| = sum over i=1,2,...,n of { a - (i * b) } | |||
| = a n - b/2 n**2 | |||
| where the constants a and b control the detailed shape | |||
| and amplitude of the voicing waveform over the open | |||
| potion of the voicing cycle "nopen". | |||
| where the constants a and b control the detailed shape | |||
| and amplitude of the voicing waveform over the open | |||
| potion of the voicing cycle "nopen". | |||
| Let integral of dV/dt have no net dc flow --> a = (b * nopen) / 3 | |||
| Let integral of dV/dt have no net dc flow --> a = (b * nopen) / 3 | |||
| Let maximum of dUg(n)/dn be constant --> b = gain / (nopen * nopen) | |||
| meaning as nopen gets bigger, V has bigger peak proportional to n | |||
| Let maximum of dUg(n)/dn be constant --> b = gain / (nopen * nopen) | |||
| meaning as nopen gets bigger, V has bigger peak proportional to n | |||
| Thus, to generate the table below for 40 <= nopen <= 263: | |||
| Thus, to generate the table below for 40 <= nopen <= 263: | |||
| B0[nopen - 40] = 1920000 / (nopen * nopen) | |||
| */ | |||
| B0[nopen - 40] = 1920000 / (nopen * nopen) | |||
| */ | |||
| static void pitch_synch_par_reset(klatt_frame_ptr frame) | |||
| { | |||
| @@ -791,9 +791,9 @@ static void pitch_synch_par_reset(klatt_frame_ptr frame) | |||
| kt_globals.rsn[RGL].a *= temp1 * temp1; | |||
| /* | |||
| Truncate skewness so as not to exceed duration of closed phase | |||
| of glottal period. | |||
| */ | |||
| Truncate skewness so as not to exceed duration of closed phase | |||
| of glottal period. | |||
| */ | |||
| temp = kt_globals.T0 - kt_globals.nopen; | |||
| @@ -807,12 +807,12 @@ static void pitch_synch_par_reset(klatt_frame_ptr frame) | |||
| } | |||
| else | |||
| { | |||
| skew = - frame->Kskew; | |||
| skew = -frame->Kskew; | |||
| } | |||
| /* Add skewness to closed portion of voicing period */ | |||
| kt_globals.T0 = kt_globals.T0 + skew; | |||
| skew = - skew; | |||
| skew = -skew; | |||
| } | |||
| else | |||
| { | |||
| @@ -846,11 +846,11 @@ static void pitch_synch_par_reset(klatt_frame_ptr frame) | |||
| /* | |||
| function SETABC | |||
| function SETABC | |||
| Convert formant freqencies and bandwidth into resonator difference | |||
| equation constants. | |||
| */ | |||
| Convert formant freqencies and bandwidth into resonator difference | |||
| equation constants. | |||
| */ | |||
| static void setabc(long int f, long int bw, resonator_ptr rp) | |||
| @@ -875,11 +875,11 @@ static void setabc(long int f, long int bw, resonator_ptr rp) | |||
| /* | |||
| function SETZEROABC | |||
| function SETZEROABC | |||
| Convert formant freqencies and bandwidth into anti-resonator difference | |||
| equation constants. | |||
| */ | |||
| Convert formant freqencies and bandwidth into anti-resonator difference | |||
| equation constants. | |||
| */ | |||
| static void setzeroabc(long int f, long int bw, resonator_ptr rp) | |||
| { | |||
| @@ -919,12 +919,12 @@ static void setzeroabc(long int f, long int bw, resonator_ptr rp) | |||
| /* | |||
| function GEN_NOISE | |||
| function GEN_NOISE | |||
| Random number generator (return a number between -8191 and +8191) | |||
| Noise spectrum is tilted down by soft low-pass filter having a pole near | |||
| the origin in the z-plane, i.e. output = input + (0.75 * lastoutput) | |||
| */ | |||
| Random number generator (return a number between -8191 and +8191) | |||
| Noise spectrum is tilted down by soft low-pass filter having a pole near | |||
| the origin in the z-plane, i.e. output = input + (0.75 * lastoutput) | |||
| */ | |||
| static double gen_noise(double noise) | |||
| @@ -943,22 +943,22 @@ static double gen_noise(double noise) | |||
| /* | |||
| function DBTOLIN | |||
| function DBTOLIN | |||
| Convert from decibels to a linear scale factor | |||
| Convert from decibels to a linear scale factor | |||
| Conversion table, db to linear, 87 dB --> 32767 | |||
| Conversion table, db to linear, 87 dB --> 32767 | |||
| 86 dB --> 29491 (1 dB down = 0.5**1/6) | |||
| ... | |||
| 81 dB --> 16384 (6 dB down = 0.5) | |||
| ... | |||
| 0 dB --> 0 | |||
| The just noticeable difference for a change in intensity of a vowel | |||
| is approximately 1 dB. Thus all amplitudes are quantized to 1 dB | |||
| steps. | |||
| */ | |||
| The just noticeable difference for a change in intensity of a vowel | |||
| is approximately 1 dB. Thus all amplitudes are quantized to 1 dB | |||
| steps. | |||
| */ | |||
| static double DBtoLIN(long dB) | |||
| @@ -966,14 +966,15 @@ static double DBtoLIN(long dB) | |||
| static short amptable[88] = | |||
| { | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, | |||
| 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 25, 28, 32, | |||
| 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 25, 28, 32, | |||
| 35, 40, 45, 51, 57, 64, 71, 80, 90, 101, 114, 128, | |||
| 142, 159, 179, 202, 227, 256, 284, 318, 359, 405, | |||
| 455, 512, 568, 638, 719, 881, 911, 1024, 1137, 1276, | |||
| 1438, 1622, 1823, 2048, 2273, 2552, 2875, 3244, 3645, | |||
| 4096, 4547, 5104, 5751, 6488, 7291, 8192, 9093, 10207, | |||
| 11502, 12976, 14582, 16384, 18350, 20644, 23429, | |||
| 26214, 29491, 32767 }; | |||
| 26214, 29491, 32767 | |||
| }; | |||
| if ((dB < 0) || (dB > 87)) | |||
| { | |||
| @@ -1132,7 +1133,7 @@ void SetSynth_Klatt(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v | |||
| if(control & 1) | |||
| { | |||
| end_wave = 1; | |||
| for(qix=wcmdq_head+1;;qix++) | |||
| for(qix=wcmdq_head+1;; qix++) | |||
| { | |||
| if(qix >= N_WCMDQ) qix = 0; | |||
| if(qix == wcmdq_tail) break; | |||
| @@ -1160,27 +1161,27 @@ void SetSynth_Klatt(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v | |||
| } | |||
| #ifdef LOG_FRAMES | |||
| if(option_log_frames) | |||
| { | |||
| FILE *f_log; | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| { | |||
| fprintf(f_log,"K %3dmS %3d %3d %4d %4d %4d %4d (%2d) to %3d %3d %4d %4d %4d %4d (%2d)\n",length*1000/samplerate, | |||
| fr1->klattp[KLATT_FNZ]*2,fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3],fr1->ffreq[4],fr1->ffreq[5], fr1->klattp[KLATT_AV], | |||
| fr2->klattp[KLATT_FNZ]*2,fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3],fr1->ffreq[4],fr1->ffreq[5], fr2->klattp[KLATT_AV] ); | |||
| fclose(f_log); | |||
| } | |||
| f_log=fopen("log-klatt","a"); | |||
| if(f_log != NULL) | |||
| if(option_log_frames) | |||
| { | |||
| fprintf(f_log,"K %3dmS %3d %3d %4d %4d (%2d) to %3d %3d %4d %4d (%2d)\n",length*1000/samplerate, | |||
| fr1->klattp[KLATT_FNZ]*2,fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3], fr1->klattp[KLATT_AV], | |||
| fr2->klattp[KLATT_FNZ]*2,fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3], fr2->klattp[KLATT_AV] ); | |||
| FILE *f_log; | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| { | |||
| fprintf(f_log,"K %3dmS %3d %3d %4d %4d %4d %4d (%2d) to %3d %3d %4d %4d %4d %4d (%2d)\n",length*1000/samplerate, | |||
| fr1->klattp[KLATT_FNZ]*2,fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3],fr1->ffreq[4],fr1->ffreq[5], fr1->klattp[KLATT_AV], | |||
| fr2->klattp[KLATT_FNZ]*2,fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3],fr1->ffreq[4],fr1->ffreq[5], fr2->klattp[KLATT_AV] ); | |||
| fclose(f_log); | |||
| } | |||
| f_log=fopen("log-klatt","a"); | |||
| if(f_log != NULL) | |||
| { | |||
| fprintf(f_log,"K %3dmS %3d %3d %4d %4d (%2d) to %3d %3d %4d %4d (%2d)\n",length*1000/samplerate, | |||
| fr1->klattp[KLATT_FNZ]*2,fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3], fr1->klattp[KLATT_AV], | |||
| fr2->klattp[KLATT_FNZ]*2,fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3], fr2->klattp[KLATT_AV] ); | |||
| fclose(f_log); | |||
| fclose(f_log); | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| if(control & 1) | |||
| @@ -36,37 +36,37 @@ typedef struct | |||
| typedef struct | |||
| { | |||
| flag synthesis_model; /* cascade-parallel or all-parallel */ | |||
| flag outsl; /* Output waveform selector */ | |||
| long samrate; /* Number of output samples per second */ | |||
| long FLPhz ; /* Frequeny of glottal downsample low-pass filter */ | |||
| long BLPhz ; /* Bandwidth of glottal downsample low-pass filter */ | |||
| flag glsource; /* Type of glottal source */ | |||
| int f0_flutter; /* Percentage of f0 flutter 0-100 */ | |||
| long nspfr; /* number of samples per frame */ | |||
| long nper; /* Counter for number of samples in a pitch period */ | |||
| long ns; | |||
| long T0; /* Fundamental period in output samples times 4 */ | |||
| long nopen; /* Number of samples in open phase of period */ | |||
| long nmod; /* Position in period to begin noise amp. modul */ | |||
| long nrand; /* Varible used by random number generator */ | |||
| double pulse_shape_a; /* Makes waveshape of glottal pulse when open */ | |||
| double pulse_shape_b; /* Makes waveshape of glottal pulse when open */ | |||
| double minus_pi_t; | |||
| double two_pi_t; | |||
| double onemd; | |||
| double decay; | |||
| double amp_bypas; /* AB converted to linear gain */ | |||
| double amp_voice; /* AVdb converted to linear gain */ | |||
| double par_amp_voice; /* AVpdb converted to linear gain */ | |||
| double amp_aspir; /* AP converted to linear gain */ | |||
| double amp_frica; /* AF converted to linear gain */ | |||
| double amp_breth; /* ATURB converted to linear gain */ | |||
| double amp_gain0; /* G0 converted to linear gain */ | |||
| int num_samples; /* number of glottal samples */ | |||
| double sample_factor; /* multiplication factor for glottal samples */ | |||
| short *natural_samples; /* pointer to an array of glottal samples */ | |||
| long original_f0; /* original value of f0 not modified by flutter */ | |||
| flag synthesis_model; /* cascade-parallel or all-parallel */ | |||
| flag outsl; /* Output waveform selector */ | |||
| long samrate; /* Number of output samples per second */ | |||
| long FLPhz; /* Frequeny of glottal downsample low-pass filter */ | |||
| long BLPhz; /* Bandwidth of glottal downsample low-pass filter */ | |||
| flag glsource; /* Type of glottal source */ | |||
| int f0_flutter; /* Percentage of f0 flutter 0-100 */ | |||
| long nspfr; /* number of samples per frame */ | |||
| long nper; /* Counter for number of samples in a pitch period */ | |||
| long ns; | |||
| long T0; /* Fundamental period in output samples times 4 */ | |||
| long nopen; /* Number of samples in open phase of period */ | |||
| long nmod; /* Position in period to begin noise amp. modul */ | |||
| long nrand; /* Varible used by random number generator */ | |||
| double pulse_shape_a; /* Makes waveshape of glottal pulse when open */ | |||
| double pulse_shape_b; /* Makes waveshape of glottal pulse when open */ | |||
| double minus_pi_t; | |||
| double two_pi_t; | |||
| double onemd; | |||
| double decay; | |||
| double amp_bypas; /* AB converted to linear gain */ | |||
| double amp_voice; /* AVdb converted to linear gain */ | |||
| double par_amp_voice; /* AVpdb converted to linear gain */ | |||
| double amp_aspir; /* AP converted to linear gain */ | |||
| double amp_frica; /* AF converted to linear gain */ | |||
| double amp_breth; /* ATURB converted to linear gain */ | |||
| double amp_gain0; /* G0 converted to linear gain */ | |||
| int num_samples; /* number of glottal samples */ | |||
| double sample_factor; /* multiplication factor for glottal samples */ | |||
| short *natural_samples; /* pointer to an array of glottal samples */ | |||
| long original_f0; /* original value of f0 not modified by flutter */ | |||
| int fadeout; // set to 64 to cause fadeout over 64 samples | |||
| int scale_wav; // depends on the voicing source | |||
| @@ -96,8 +96,8 @@ typedef struct | |||
| #define RLP 18 | |||
| #define Rout 19 | |||
| resonator_t rsn[N_RSN]; // internal storage for resonators | |||
| resonator_t rsn_next[N_RSN]; | |||
| resonator_t rsn[N_RSN]; // internal storage for resonators | |||
| resonator_t rsn_next[N_RSN]; | |||
| } klatt_global_t, *klatt_global_ptr; | |||
| @@ -136,7 +136,7 @@ typedef struct | |||
| int AVdb_tmp; //copy of AVdb, which is changed within parwave() | |||
| int Fhz_next[10]; // Fhz for the next chunk, so we can do interpolation of resonator (a,b,c) parameters | |||
| int Bhz_next[10]; | |||
| } klatt_frame_t, *klatt_frame_ptr; | |||
| } klatt_frame_t, *klatt_frame_ptr; | |||
| typedef struct { | |||
| @@ -151,7 +151,7 @@ static int start_mbrola(const char *voice_path) | |||
| dup2(p_stdout[1], 1) == -1 || | |||
| dup2(p_stderr[1], 2) == -1) { | |||
| snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), | |||
| "dup2(): %s\n", strerror(errno)); | |||
| "dup2(): %s\n", strerror(errno)); | |||
| written = write(p_stderr[1], mbr_errorbuf, strlen(mbr_errorbuf)); | |||
| (void)written; // suppress 'variable not used' warning | |||
| _exit(1); | |||
| @@ -166,10 +166,10 @@ static int start_mbrola(const char *voice_path) | |||
| snprintf(charbuf, sizeof(charbuf), "%g", mbr_volume); | |||
| execlp("mbrola", "mbrola", "-e", "-v", charbuf, | |||
| voice_path, "-", "-.wav", (char *)NULL); | |||
| voice_path, "-", "-.wav", (char *)NULL); | |||
| /* if execution reaches this point then the exec() failed */ | |||
| snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), | |||
| "mbrola: %s\n", strerror(errno)); | |||
| "mbrola: %s\n", strerror(errno)); | |||
| written = write(2, mbr_errorbuf, strlen(mbr_errorbuf)); | |||
| (void)written; // suppress 'variable not used' warning | |||
| _exit(1); | |||
| @@ -255,12 +255,12 @@ static int mbrola_died(void) | |||
| if (WIFSIGNALED(status)) { | |||
| int sig = WTERMSIG(status); | |||
| snprintf(msgbuf, sizeof(msgbuf), | |||
| "mbrola died by signal %d", sig); | |||
| "mbrola died by signal %d", sig); | |||
| msg = msgbuf; | |||
| } else if (WIFEXITED(status)) { | |||
| int exst = WEXITSTATUS(status); | |||
| snprintf(msgbuf, sizeof(msgbuf), | |||
| "mbrola exited with status %d", exst); | |||
| "mbrola exited with status %d", exst); | |||
| msg = msgbuf; | |||
| } else { | |||
| msg = "mbrola died and wait status is weird"; | |||
| @@ -274,7 +274,7 @@ static int mbrola_died(void) | |||
| snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), "%s", msg); | |||
| else | |||
| snprintf(mbr_errorbuf + len, sizeof(mbr_errorbuf) - len, | |||
| ", (%s)", msg); | |||
| ", (%s)", msg); | |||
| return -1; | |||
| } | |||
| @@ -285,9 +285,9 @@ static int mbrola_has_errors(void) | |||
| char *buf_ptr, *lf; | |||
| buf_ptr = buffer; | |||
| for (;;) { | |||
| for (;; ) { | |||
| result = read(mbr_error_fd, buf_ptr, | |||
| sizeof(buffer) - (buf_ptr - buffer) - 1); | |||
| sizeof(buffer) - (buf_ptr - buffer) - 1); | |||
| if (result == -1) { | |||
| if (errno == EAGAIN) | |||
| return 0; | |||
| @@ -312,7 +312,7 @@ static int mbrola_has_errors(void) | |||
| /* is this the last line? */ | |||
| if (lf == &buf_ptr[result - 1]) { | |||
| snprintf(mbr_errorbuf, sizeof(mbr_errorbuf), | |||
| "%s", buf_ptr); | |||
| "%s", buf_ptr); | |||
| /* don't consider this fatal at this point */ | |||
| return 0; | |||
| } | |||
| @@ -327,7 +327,7 @@ static int send_to_mbrola(const char *cmd) | |||
| { | |||
| ssize_t result; | |||
| int len; | |||
| if (!mbr_pid) | |||
| return -1; | |||
| @@ -345,7 +345,7 @@ static int send_to_mbrola(const char *cmd) | |||
| return -1; | |||
| } | |||
| } | |||
| if (result != len) { | |||
| struct datablock *data; | |||
| data = (struct datablock *)malloc(sizeof(*data) + len - result); | |||
| @@ -511,14 +511,14 @@ int init_MBR(const char *voice_path) | |||
| return -1; | |||
| } | |||
| mbr_samplerate = wavhdr[24] + (wavhdr[25]<<8) + | |||
| (wavhdr[26]<<16) + (wavhdr[27]<<24); | |||
| (wavhdr[26]<<16) + (wavhdr[27]<<24); | |||
| //log("mbrowrap: voice samplerate = %d", mbr_samplerate); | |||
| /* remember the voice path for setVolumeRatio_MBR() */ | |||
| if (mbr_voice_path != voice_path) { | |||
| free(mbr_voice_path); | |||
| mbr_voice_path = strdup(voice_path); | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| @@ -99,7 +99,8 @@ void resetError_MBR(void); | |||
| /* | |||
| * Tolerance to missing diphones (always active so this is ignored) | |||
| */ | |||
| static inline void setNoError_MBR(int no_error) { } | |||
| static inline void setNoError_MBR(int no_error) { | |||
| } | |||
| #ifdef __cplusplus | |||
| } | |||
| @@ -73,7 +73,7 @@ static int number_control; | |||
| typedef struct { | |||
| const char *name; | |||
| int accent_flags; // bit 0, say before the letter name | |||
| int accent_flags; // bit 0, say before the letter name | |||
| } ACCENTS; | |||
| // these are tokens to look up in the *_list file. | |||
| @@ -301,7 +301,7 @@ static const unsigned short letter_accents_0e0[] = { | |||
| // characters U+0250 to U+029F | |||
| static const unsigned short letter_accents_250[] = { | |||
| LETTER('a',M_TURNED,0), // U+250 | |||
| LETTER('a',M_TURNED,0), // U+250 | |||
| LETTER(L_ALPHA,0,0), | |||
| LETTER(L_ALPHA,M_TURNED,0), | |||
| LETTER('b',M_IMPLOSIVE,0), | |||
| @@ -309,7 +309,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER('c',M_CURL,0), | |||
| LETTER('d',M_RETROFLEX,0), | |||
| LETTER('d',M_IMPLOSIVE,0), | |||
| LETTER('e',M_REVERSED,0), // U+258 | |||
| LETTER('e',M_REVERSED,0), // U+258 | |||
| 0, // schwa | |||
| LETTER(L_SCHWA,M_HOOK,0), | |||
| 0, // open-e | |||
| @@ -317,7 +317,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER(L_OPEN_E,M_HOOK,M_REVERSED), | |||
| 0, | |||
| LETTER('j',M_BAR,0), | |||
| LETTER('g',M_IMPLOSIVE,0), // U+260 | |||
| LETTER('g',M_IMPLOSIVE,0), // U+260 | |||
| LETTER('g',0,0), | |||
| LETTER('g',M_SMALLCAP,0), | |||
| LETTER(L_GAMMA,0,0), | |||
| @@ -325,7 +325,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER('h',M_TURNED,0), | |||
| LETTER('h',M_HOOK,0), | |||
| 0, | |||
| LETTER('i',M_BAR,0), // U+268 | |||
| LETTER('i',M_BAR,0), // U+268 | |||
| LETTER(L_IOTA,0,0), | |||
| LETTER('i',M_SMALLCAP,0), | |||
| LETTER('l',M_TILDE,0), | |||
| @@ -341,7 +341,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER('o',M_BAR,0), | |||
| LIGATURE('o','e',M_SMALLCAP), | |||
| 0, | |||
| LETTER(L_PHI,0,0), // U+278 | |||
| LETTER(L_PHI,0,0), // U+278 | |||
| LETTER('r',M_TURNED,0), | |||
| LETTER(L_RLONG,M_TURNED,0), | |||
| LETTER('r',M_RETROFLEX,M_TURNED), | |||
| @@ -349,7 +349,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER('r',M_RETROFLEX,0), | |||
| 0, // r-tap | |||
| LETTER(L_RTAP,M_REVERSED,0), | |||
| LETTER('r',M_SMALLCAP,0), // U+280 | |||
| LETTER('r',M_SMALLCAP,0), // U+280 | |||
| LETTER('r',M_TURNED,M_SMALLCAP), | |||
| LETTER('s',M_RETROFLEX,0), | |||
| 0, // esh | |||
| @@ -357,7 +357,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER(L_ESH,M_REVERSED,0), | |||
| LETTER(L_ESH,M_CURL,0), | |||
| LETTER('t',M_TURNED,0), | |||
| LETTER('t',M_RETROFLEX,0), // U+288 | |||
| LETTER('t',M_RETROFLEX,0), // U+288 | |||
| LETTER('u',M_BAR,0), | |||
| LETTER(L_UPSILON,0,0), | |||
| LETTER('v',M_HOOK,0), | |||
| @@ -365,7 +365,7 @@ static const unsigned short letter_accents_250[] = { | |||
| LETTER('w',M_TURNED,0), | |||
| LETTER('y',M_TURNED,0), | |||
| LETTER('y',M_SMALLCAP,0), | |||
| LETTER('z',M_RETROFLEX,0), // U+290 | |||
| LETTER('z',M_RETROFLEX,0), // U+290 | |||
| LETTER('z',M_CURL,0), | |||
| 0, // ezh | |||
| LETTER(L_EZH,M_CURL,0), | |||
| @@ -588,7 +588,8 @@ static const int number_ranges[] = { | |||
| 0x660, 0x6f0, // arabic | |||
| 0x966, 0x9e6, 0xa66, 0xae6, 0xb66, 0xbe6, 0xc66, 0xce6, 0xd66, // indic | |||
| 0xe50, 0xed0, 0xf20, 0x1040, 0x1090, | |||
| 0 }; // these must be in ascending order | |||
| 0 | |||
| }; // these must be in ascending order | |||
| int NonAsciiNumber(int letter) | |||
| @@ -676,7 +677,8 @@ static unsigned short derived_letters[] = { | |||
| 0x209a, 'p'+L_SUB, | |||
| 0x209b, 's'+L_SUB, | |||
| 0x209c, 't'+L_SUB, | |||
| 0,0}; | |||
| 0,0 | |||
| }; | |||
| static const char *hex_letters[] = {"'e:j","b'i:","s'i:","d'i:","'i:","'ef"}; // names, using phonemes available to all languages | |||
| @@ -1856,7 +1858,7 @@ static int LookupNum3(Translator *tr, int value, char *ph_out, int suppress_null | |||
| found = 0; | |||
| if((ordinal) | |||
| && ((tensunits == 0) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) | |||
| && ((tensunits == 0) || (tr->langopts.numbers2 & NUM2_MULTIPLE_ORDINAL))) | |||
| { | |||
| // ordinal number | |||
| sprintf(string, "_%dCo", hundreds); | |||
| @@ -2060,7 +2062,7 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| digit_lookup = buf_digit_lookup; | |||
| number_control = control; | |||
| for(ix=0; IsDigit09(word[ix]); ix++) ; | |||
| for(ix=0; IsDigit09(word[ix]); ix++); | |||
| n_digits = ix; | |||
| value = this_value = atoi(word); | |||
| @@ -2241,16 +2243,16 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| } | |||
| else | |||
| if(speak_missing_thousands == 1) | |||
| if(speak_missing_thousands == 1) | |||
| { | |||
| // speak this thousandplex if there was no word for the previous thousandplex | |||
| sprintf(string,"_0M%d",thousandplex+1); | |||
| if(Lookup(tr, string, buf1)==0) | |||
| { | |||
| // speak this thousandplex if there was no word for the previous thousandplex | |||
| sprintf(string,"_0M%d",thousandplex+1); | |||
| if(Lookup(tr, string, buf1)==0) | |||
| { | |||
| sprintf(string,"_0M%d",thousandplex); | |||
| Lookup(tr, string, ph_append); | |||
| } | |||
| sprintf(string,"_0M%d",thousandplex); | |||
| Lookup(tr, string, ph_append); | |||
| } | |||
| } | |||
| if((ph_append[0] == 0) && (word[n_digits] == '.') && (thousandplex == 0)) | |||
| { | |||
| @@ -2328,69 +2330,69 @@ static int TranslateNumber_1(Translator *tr, char *word, char *ph_out, unsigned | |||
| while(IsDigit09(word[n_digits+decimal_count])) | |||
| decimal_count++; | |||
| max_decimal_count = 2; | |||
| switch(decimal_mode = (tr->langopts.numbers & 0xe000)) | |||
| max_decimal_count = 2; | |||
| switch(decimal_mode = (tr->langopts.numbers & 0xe000)) | |||
| { | |||
| case NUM_DFRACTION_4: | |||
| max_decimal_count = 5; | |||
| case NUM_DFRACTION_2: | |||
| // French/Polish decimal fraction | |||
| while(word[n_digits] == '0') | |||
| { | |||
| case NUM_DFRACTION_4: | |||
| max_decimal_count = 5; | |||
| case NUM_DFRACTION_2: | |||
| // French/Polish decimal fraction | |||
| while(word[n_digits] == '0') | |||
| { | |||
| Lookup(tr, "_0", buf1); | |||
| strcat(ph_out,buf1); | |||
| decimal_count--; | |||
| n_digits++; | |||
| } | |||
| if((decimal_count <= max_decimal_count) && IsDigit09(word[n_digits])) | |||
| { | |||
| LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); | |||
| strcat(ph_out,buf1); | |||
| n_digits += decimal_count; | |||
| } | |||
| break; | |||
| case NUM_DFRACTION_1: // italian, say "hundredths" if leading zero | |||
| case NUM_DFRACTION_5: // hungarian, always say "tenths" etc. | |||
| case NUM_DFRACTION_6: // kazakh, always say "tenths" etc, before the decimal fraction | |||
| LookupNum3(tr, atoi(&word[n_digits]), ph_buf, 0,0,0); | |||
| if((word[n_digits]=='0') || (decimal_mode != NUM_DFRACTION_1)) | |||
| { | |||
| // decimal part has leading zeros, so add a "hundredths" or "thousandths" suffix | |||
| sprintf(string,"_0Z%d",decimal_count); | |||
| if(Lookup(tr, string, buf1) == 0) | |||
| break; // revert to speaking single digits | |||
| if(decimal_mode == NUM_DFRACTION_6) | |||
| strcat(ph_out, buf1); | |||
| else | |||
| strcat(ph_buf, buf1); | |||
| } | |||
| strcat(ph_out,ph_buf); | |||
| Lookup(tr, "_0", buf1); | |||
| strcat(ph_out,buf1); | |||
| decimal_count--; | |||
| n_digits++; | |||
| } | |||
| if((decimal_count <= max_decimal_count) && IsDigit09(word[n_digits])) | |||
| { | |||
| LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); | |||
| strcat(ph_out,buf1); | |||
| n_digits += decimal_count; | |||
| break; | |||
| } | |||
| break; | |||
| case NUM_DFRACTION_3: | |||
| // Romanian decimal fractions | |||
| if((decimal_count <= 4) && (word[n_digits] != '0')) | |||
| { | |||
| LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); | |||
| strcat(ph_out,buf1); | |||
| n_digits += decimal_count; | |||
| } | |||
| break; | |||
| case NUM_DFRACTION_1: // italian, say "hundredths" if leading zero | |||
| case NUM_DFRACTION_5: // hungarian, always say "tenths" etc. | |||
| case NUM_DFRACTION_6: // kazakh, always say "tenths" etc, before the decimal fraction | |||
| LookupNum3(tr, atoi(&word[n_digits]), ph_buf, 0,0,0); | |||
| if((word[n_digits]=='0') || (decimal_mode != NUM_DFRACTION_1)) | |||
| { | |||
| // decimal part has leading zeros, so add a "hundredths" or "thousandths" suffix | |||
| sprintf(string,"_0Z%d",decimal_count); | |||
| if(Lookup(tr, string, buf1) == 0) | |||
| break; // revert to speaking single digits | |||
| case NUM_DFRACTION_7: | |||
| // alternative form of decimal fraction digits, except the final digit | |||
| while(decimal_count-- > 1) | |||
| { | |||
| sprintf(string,"_%cd", word[n_digits]); | |||
| if(Lookup(tr, string, buf1) == 0) | |||
| break; | |||
| n_digits++; | |||
| if(decimal_mode == NUM_DFRACTION_6) | |||
| strcat(ph_out, buf1); | |||
| } | |||
| else | |||
| strcat(ph_buf, buf1); | |||
| } | |||
| strcat(ph_out,ph_buf); | |||
| n_digits += decimal_count; | |||
| break; | |||
| case NUM_DFRACTION_3: | |||
| // Romanian decimal fractions | |||
| if((decimal_count <= 4) && (word[n_digits] != '0')) | |||
| { | |||
| LookupNum3(tr, atoi(&word[n_digits]), buf1, 0,0,0); | |||
| strcat(ph_out,buf1); | |||
| n_digits += decimal_count; | |||
| } | |||
| break; | |||
| case NUM_DFRACTION_7: | |||
| // alternative form of decimal fraction digits, except the final digit | |||
| while(decimal_count-- > 1) | |||
| { | |||
| sprintf(string,"_%cd", word[n_digits]); | |||
| if(Lookup(tr, string, buf1) == 0) | |||
| break; | |||
| n_digits++; | |||
| strcat(ph_out, buf1); | |||
| } | |||
| } | |||
| while(IsDigit09(c = word[n_digits]) && (strlen(ph_out) < (N_WORD_PHONEMES - 10))) | |||
| { | |||
| @@ -110,15 +110,15 @@ extern const unsigned char pause_phonemes[8]; // 0, vshort, short, pause, long, | |||
| // main table of phonemes, index by phoneme number (1-254) | |||
| typedef struct { | |||
| unsigned int mnemonic; // Up to 4 characters. The first char is in the l.s.byte | |||
| unsigned int phflags; // bits 16-19 place of articulation | |||
| unsigned int mnemonic; // Up to 4 characters. The first char is in the l.s.byte | |||
| unsigned int phflags; // bits 16-19 place of articulation | |||
| unsigned short program; // index into phondata file | |||
| unsigned char code; // the phoneme number | |||
| unsigned char type; // phVOWEL, phPAUSE, phSTOP etc | |||
| unsigned char start_type; | |||
| unsigned char end_type; | |||
| unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone type | |||
| unsigned char length_mod; // a length_mod group number, used to access length_mod_tab | |||
| unsigned char code; // the phoneme number | |||
| unsigned char type; // phVOWEL, phPAUSE, phSTOP etc | |||
| unsigned char start_type; | |||
| unsigned char end_type; | |||
| unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone type | |||
| unsigned char length_mod; // a length_mod group number, used to access length_mod_tab | |||
| } PHONEME_TAB; | |||
| @@ -33,7 +33,7 @@ const unsigned char pause_phonemes[8] = {0, phonPAUSE_VSHORT, phonPAUSE_SHORT, p | |||
| extern int n_ph_list2; | |||
| extern PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes | |||
| extern PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes | |||
| @@ -107,9 +107,9 @@ static int SubstitutePhonemes(Translator *tr, PHONEME_LIST *plist_out) | |||
| void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| { | |||
| int ix=0; | |||
| int j; | |||
| int insert_ph = 0; | |||
| int ix=0; | |||
| int j; | |||
| int insert_ph = 0; | |||
| PHONEME_LIST *phlist; | |||
| PHONEME_TAB *ph; | |||
| PHONEME_TAB *next, *next2; | |||
| @@ -186,10 +186,10 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| if(plist2[j].phcode == phonSWITCH) | |||
| { | |||
| if((!(plist2[j].synthflags & SFLAG_EMBEDDED)) && ( | |||
| (plist2[j].tone_ph == current_phoneme_tab) || | |||
| (plist2[j+1].phcode == phonSWITCH) || | |||
| ((plist2[j+1].phcode == phonPAUSE) && (plist2[j+2].phcode == phonSWITCH)) | |||
| )) | |||
| (plist2[j].tone_ph == current_phoneme_tab) || | |||
| (plist2[j+1].phcode == phonSWITCH) || | |||
| ((plist2[j+1].phcode == phonPAUSE) && (plist2[j+2].phcode == phonSWITCH)) | |||
| )) | |||
| { | |||
| // delete this phonSWITCH if it's switching to the current phoneme table, or | |||
| // delete this phonSWITCH if its followed by another phonSWITCH | |||
| @@ -302,7 +302,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| n_ph_list3 = SubstitutePhonemes(tr,ph_list3) - 2; | |||
| for(j=0; (j < n_ph_list3) && (ix < N_PHONEME_LIST-3);) | |||
| for(j=0; (j < n_ph_list3) && (ix < N_PHONEME_LIST-3); ) | |||
| { | |||
| if(ph_list3[j].sourceix) | |||
| { | |||
| @@ -312,7 +312,7 @@ void MakePhonemeList(Translator *tr, int post_pause, int start_sentence) | |||
| word_stress = 0; | |||
| // find the highest stress level in this word | |||
| for(nextw=j; nextw < n_ph_list3;) | |||
| for(nextw=j; nextw < n_ph_list3; ) | |||
| { | |||
| if(ph_list3[nextw].stresslevel > word_stress) | |||
| word_stress = ph_list3[nextw].stresslevel; | |||
| @@ -66,103 +66,103 @@ static int ssml_ignore_l_angle = 0; | |||
| // punctuations symbols that can end a clause | |||
| static const unsigned short punct_chars[] = {',','.','?','!',':',';', | |||
| 0x00a1, // inverted exclamation | |||
| 0x00bf, // inverted question | |||
| 0x2013, // en-dash | |||
| 0x2014, // em-dash | |||
| 0x2026, // elipsis | |||
| 0x037e, // Greek question mark (looks like semicolon) | |||
| 0x0387, // Greek semicolon, ano teleia | |||
| 0x0964, // Devanagari Danda (fullstop) | |||
| 0x0589, // Armenian period | |||
| 0x055d, // Armenian comma | |||
| 0x055c, // Armenian exclamation | |||
| 0x055e, // Armenian question | |||
| 0x055b, // Armenian emphasis mark | |||
| 0x060c, // Arabic , | |||
| 0x061b, // Arabic ; | |||
| 0x061f, // Arabic ? | |||
| 0x06d4, // Arabic . | |||
| 0x0df4, // Singhalese Kunddaliya | |||
| 0x0f0d, // Tibet Shad | |||
| 0x0f0e, | |||
| 0x1362, // Ethiopic period | |||
| 0x1363, | |||
| 0x1364, | |||
| 0x1365, | |||
| 0x1366, | |||
| 0x1367, | |||
| 0x1368, | |||
| 0x10fb, // Georgian paragraph | |||
| 0x3001, // ideograph comma | |||
| 0x3002, // ideograph period | |||
| 0xff01, // fullwidth exclamation | |||
| 0xff0c, // fullwidth comma | |||
| 0xff0e, // fullwidth period | |||
| 0xff1a, // fullwidth colon | |||
| 0xff1b, // fullwidth semicolon | |||
| 0xff1f, // fullwidth question mark | |||
| 0}; | |||
| 0x00a1, // inverted exclamation | |||
| 0x00bf, // inverted question | |||
| 0x2013, // en-dash | |||
| 0x2014, // em-dash | |||
| 0x2026, // elipsis | |||
| 0x037e, // Greek question mark (looks like semicolon) | |||
| 0x0387, // Greek semicolon, ano teleia | |||
| 0x0964, // Devanagari Danda (fullstop) | |||
| 0x0589, // Armenian period | |||
| 0x055d, // Armenian comma | |||
| 0x055c, // Armenian exclamation | |||
| 0x055e, // Armenian question | |||
| 0x055b, // Armenian emphasis mark | |||
| 0x060c, // Arabic , | |||
| 0x061b, // Arabic ; | |||
| 0x061f, // Arabic ? | |||
| 0x06d4, // Arabic . | |||
| 0x0df4, // Singhalese Kunddaliya | |||
| 0x0f0d, // Tibet Shad | |||
| 0x0f0e, | |||
| 0x1362, // Ethiopic period | |||
| 0x1363, | |||
| 0x1364, | |||
| 0x1365, | |||
| 0x1366, | |||
| 0x1367, | |||
| 0x1368, | |||
| 0x10fb, // Georgian paragraph | |||
| 0x3001, // ideograph comma | |||
| 0x3002, // ideograph period | |||
| 0xff01, // fullwidth exclamation | |||
| 0xff0c, // fullwidth comma | |||
| 0xff0e, // fullwidth period | |||
| 0xff1a, // fullwidth colon | |||
| 0xff1b, // fullwidth semicolon | |||
| 0xff1f, // fullwidth question mark | |||
| 0}; | |||
| // indexed by (entry num. in punct_chars) + 1 | |||
| // bits 0-7 pause x 10mS, bits 12-14 intonation type, bit 15 don't need following space or bracket | |||
| static const unsigned int punct_attributes [] = { 0, | |||
| CLAUSE_COMMA, CLAUSE_PERIOD, CLAUSE_QUESTION, CLAUSE_EXCLAMATION, CLAUSE_COLON, CLAUSE_SEMICOLON, | |||
| CLAUSE_SEMICOLON | 0x8000, // inverted exclamation | |||
| CLAUSE_SEMICOLON | 0x8000, // inverted question | |||
| CLAUSE_SEMICOLON, // en-dash | |||
| CLAUSE_SEMICOLON, // em-dash | |||
| CLAUSE_SEMICOLON | PUNCT_SAY_NAME | 0x8000, // elipsis | |||
| CLAUSE_QUESTION, // Greek question mark | |||
| CLAUSE_SEMICOLON, // Greek semicolon | |||
| CLAUSE_PERIOD | 0x8000, // Devanagari Danda (fullstop) | |||
| CLAUSE_PERIOD | 0x8000, // Armenian period | |||
| CLAUSE_COMMA, // Armenian comma | |||
| CLAUSE_EXCLAMATION | PUNCT_IN_WORD, // Armenian exclamation | |||
| CLAUSE_QUESTION | PUNCT_IN_WORD, // Armenian question | |||
| CLAUSE_PERIOD | PUNCT_IN_WORD, // Armenian emphasis mark | |||
| CLAUSE_COMMA, // Arabic , | |||
| CLAUSE_SEMICOLON, // Arabic ; | |||
| CLAUSE_QUESTION, // Arabic question mark | |||
| CLAUSE_PERIOD, // Arabic full stop | |||
| CLAUSE_PERIOD+0x8000, // Singhalese period | |||
| CLAUSE_PERIOD+0x8000, // Tibet period | |||
| CLAUSE_PARAGRAPH, | |||
| CLAUSE_PERIOD, // Ethiopic period | |||
| CLAUSE_COMMA, // Ethiopic comma | |||
| CLAUSE_SEMICOLON, // Ethiopic semicolon | |||
| CLAUSE_COLON, // Ethiopic colon | |||
| CLAUSE_COLON, // Ethiopic preface colon | |||
| CLAUSE_QUESTION, // Ethiopic question mark | |||
| CLAUSE_PARAGRAPH, // Ethiopic paragraph | |||
| CLAUSE_PARAGRAPH, // Georgian paragraph | |||
| CLAUSE_COMMA+0x8000, // ideograph comma | |||
| CLAUSE_PERIOD+0x8000, // ideograph period | |||
| CLAUSE_EXCLAMATION+0x8000, // fullwidth | |||
| CLAUSE_COMMA+0x8000, | |||
| CLAUSE_PERIOD+0x8000, | |||
| CLAUSE_COLON+0x8000, | |||
| CLAUSE_SEMICOLON+0x8000, | |||
| CLAUSE_QUESTION+0x8000, | |||
| CLAUSE_SEMICOLON, // spare | |||
| 0 }; | |||
| CLAUSE_COMMA, CLAUSE_PERIOD, CLAUSE_QUESTION, CLAUSE_EXCLAMATION, CLAUSE_COLON, CLAUSE_SEMICOLON, | |||
| CLAUSE_SEMICOLON | 0x8000, // inverted exclamation | |||
| CLAUSE_SEMICOLON | 0x8000, // inverted question | |||
| CLAUSE_SEMICOLON, // en-dash | |||
| CLAUSE_SEMICOLON, // em-dash | |||
| CLAUSE_SEMICOLON | PUNCT_SAY_NAME | 0x8000, // elipsis | |||
| CLAUSE_QUESTION, // Greek question mark | |||
| CLAUSE_SEMICOLON, // Greek semicolon | |||
| CLAUSE_PERIOD | 0x8000, // Devanagari Danda (fullstop) | |||
| CLAUSE_PERIOD | 0x8000, // Armenian period | |||
| CLAUSE_COMMA, // Armenian comma | |||
| CLAUSE_EXCLAMATION | PUNCT_IN_WORD, // Armenian exclamation | |||
| CLAUSE_QUESTION | PUNCT_IN_WORD, // Armenian question | |||
| CLAUSE_PERIOD | PUNCT_IN_WORD, // Armenian emphasis mark | |||
| CLAUSE_COMMA, // Arabic , | |||
| CLAUSE_SEMICOLON, // Arabic ; | |||
| CLAUSE_QUESTION, // Arabic question mark | |||
| CLAUSE_PERIOD, // Arabic full stop | |||
| CLAUSE_PERIOD+0x8000, // Singhalese period | |||
| CLAUSE_PERIOD+0x8000, // Tibet period | |||
| CLAUSE_PARAGRAPH, | |||
| CLAUSE_PERIOD, // Ethiopic period | |||
| CLAUSE_COMMA, // Ethiopic comma | |||
| CLAUSE_SEMICOLON, // Ethiopic semicolon | |||
| CLAUSE_COLON, // Ethiopic colon | |||
| CLAUSE_COLON, // Ethiopic preface colon | |||
| CLAUSE_QUESTION, // Ethiopic question mark | |||
| CLAUSE_PARAGRAPH, // Ethiopic paragraph | |||
| CLAUSE_PARAGRAPH, // Georgian paragraph | |||
| CLAUSE_COMMA+0x8000, // ideograph comma | |||
| CLAUSE_PERIOD+0x8000, // ideograph period | |||
| CLAUSE_EXCLAMATION+0x8000, // fullwidth | |||
| CLAUSE_COMMA+0x8000, | |||
| CLAUSE_PERIOD+0x8000, | |||
| CLAUSE_COLON+0x8000, | |||
| CLAUSE_SEMICOLON+0x8000, | |||
| CLAUSE_QUESTION+0x8000, | |||
| CLAUSE_SEMICOLON, // spare | |||
| 0 }; | |||
| // stack for language and voice properties | |||
| @@ -193,21 +193,21 @@ static int speech_parameters[N_SPEECH_PARAM]; // current values, from param_ | |||
| int saved_parameters[N_SPEECH_PARAM]; //Parameters saved on synthesis start | |||
| const int param_defaults[N_SPEECH_PARAM] = { | |||
| 0, // silence (internal use) | |||
| 175, // rate wpm | |||
| 100, // volume | |||
| 50, // pitch | |||
| 50, // range | |||
| 0, // punctuation | |||
| 0, // capital letters | |||
| 0, // wordgap | |||
| 0, // options | |||
| 0, // intonation | |||
| 0, | |||
| 0, | |||
| 0, // emphasis | |||
| 0, // line length | |||
| 0, // voice type | |||
| 0, // silence (internal use) | |||
| 175, // rate wpm | |||
| 100, // volume | |||
| 50, // pitch | |||
| 50, // range | |||
| 0, // punctuation | |||
| 0, // capital letters | |||
| 0, // wordgap | |||
| 0, // options | |||
| 0, // intonation | |||
| 0, | |||
| 0, | |||
| 0, // emphasis | |||
| 0, // line length | |||
| 0, // voice type | |||
| }; | |||
| @@ -217,35 +217,36 @@ const int param_defaults[N_SPEECH_PARAM] = { | |||
| // 0=not alphabetic, 0xff=lower case, 0xfe=no case, 0xfd=use wchar_tolower | |||
| // other=value to add to upper case to convert to lower case | |||
| static unsigned char walpha_tab[MAX_WALPHA-0x7f] = { | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 080 | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 090 | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xfe, 0, 0, 0, 0, 0, // 0a0 | |||
| 0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0xfe, 0, 0, 0, 0, 0, // 0b0 | |||
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 0c0 | |||
| 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0xff, // 0d0 | |||
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0e0 | |||
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0f0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 100 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 110 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 120 | |||
| 0xfd, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff, 1, // 130 | |||
| 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff, // 140 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 150 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 160 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfd, 1, 0xff, 1, 0xff, 1, 0xff, 0xff, // 170 | |||
| 0xff, 210, 1, 0xff, 1, 0xff, 206, 1, 0xff, 205, 205, 1, 0xff, 0xfe, 79, 202, // 180 | |||
| 203, 1, 0xff, 205, 207, 0xff, 211, 209, 1, 0xff, 0xff, 0xfe, 211, 213, 0xff, 214, // 190 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 218, 1, 0xff, 218, 0xfe, 0xfe, 1, 0xff, 218, 1, // 1a0 | |||
| 0xff, 217, 217, 1, 0xff, 1, 0xff, 219, 1, 0xff, 0xfe, 0xfe, 1, 0xff, 0xfe, 0xff, // 1b0 | |||
| 0xfe, 0xfe, 0xfe, 0xfe, 2, 0xff, 0xff, 2, 0xff, 0xff, 2, 0xff, 0xff, 1, 0xff, 1, // 1c0 | |||
| 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xff, 1, 0xff, // 1d0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 1e0 | |||
| 0xfe, 2, 0xff, 0xff, 1, 0xff, 0xfd, 0xfd, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 1f0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 200 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 210 | |||
| 0xfd, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 220 | |||
| 1, 0xff, 1, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 1, 0xff, 0xfd, 0xfd, 0xfe, // 230 | |||
| 0xfe, 1, 0xff, 0xfd, 69, 71, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff}; // 240 | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 080 | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 090 | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xfe, 0, 0, 0, 0, 0, // 0a0 | |||
| 0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0, 0xfe, 0, 0, 0, 0, 0, // 0b0 | |||
| 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,// 0c0 | |||
| 32, 32, 32, 32, 32, 32, 32, 0, 32, 32, 32, 32, 32, 32, 32, 0xff,// 0d0 | |||
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // 0e0 | |||
| 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,// 0f0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 100 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 110 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 120 | |||
| 0xfd, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff, 1,// 130 | |||
| 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff,// 140 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 150 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 160 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xfd, 1, 0xff, 1, 0xff, 1, 0xff, 0xff, // 170 | |||
| 0xff, 210, 1, 0xff, 1, 0xff, 206, 1, 0xff, 205, 205, 1, 0xff, 0xfe, 79, 202,// 180 | |||
| 203, 1, 0xff, 205, 207, 0xff, 211, 209, 1, 0xff, 0xff, 0xfe, 211, 213, 0xff, 214,// 190 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 218, 1, 0xff, 218, 0xfe, 0xfe, 1, 0xff, 218, 1, // 1a0 | |||
| 0xff, 217, 217, 1, 0xff, 1, 0xff, 219, 1, 0xff, 0xfe, 0xfe, 1, 0xff, 0xfe, 0xff,// 1b0 | |||
| 0xfe, 0xfe, 0xfe, 0xfe, 2, 0xff, 0xff, 2, 0xff, 0xff, 2, 0xff, 0xff, 1, 0xff, 1,// 1c0 | |||
| 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 0xff, 1, 0xff,// 1d0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 1e0 | |||
| 0xfe, 2, 0xff, 0xff, 1, 0xff, 0xfd, 0xfd, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff,// 1f0 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 200 | |||
| 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, // 210 | |||
| 0xfd, 0xfe, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff,// 220 | |||
| 1, 0xff, 1, 0xff, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd, 1, 0xff, 0xfd, 0xfd, 0xfe, // 230 | |||
| 0xfe, 1, 0xff, 0xfd, 69, 71, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff, 1, 0xff | |||
| }; // 240 | |||
| static const short wchar_tolower[] = { | |||
| 0x130, 0x069, | |||
| @@ -257,7 +258,8 @@ static const short wchar_tolower[] = { | |||
| 0x23d, 0x19a, | |||
| 0x23e, 0x2c66, | |||
| 0x243, 0x180, | |||
| 0,0 }; | |||
| 0,0 | |||
| }; | |||
| static const short wchar_toupper[] = { | |||
| 0x0b5, 0x39c, | |||
| @@ -275,7 +277,8 @@ static const short wchar_toupper[] = { | |||
| 0x1cc, 0x1ca, | |||
| 0x1dd, 0x18e, | |||
| 0x1f3, 0x1f1, | |||
| 0,0 }; | |||
| 0,0 | |||
| }; | |||
| #ifdef NEED_WCHAR_FUNCTIONS | |||
| @@ -382,13 +385,13 @@ int iswpunct(int c) | |||
| const wchar_t *wcschr(const wchar_t *str, int c) | |||
| { | |||
| while(*str != 0) | |||
| { | |||
| if(*str == c) | |||
| return(str); | |||
| str++; | |||
| } | |||
| return(NULL); | |||
| while(*str != 0) | |||
| { | |||
| if(*str == c) | |||
| return(str); | |||
| str++; | |||
| } | |||
| return(NULL); | |||
| } | |||
| #ifndef WINCE | |||
| @@ -407,17 +410,17 @@ const int wcslen(const wchar_t *str) | |||
| float wcstod(const wchar_t *str, wchar_t **tailptr) | |||
| { | |||
| int ix; | |||
| char buf[80]; | |||
| while(isspace(*str)) str++; | |||
| for(ix=0; ix<80; ix++) | |||
| { | |||
| buf[ix] = str[ix]; | |||
| if(isspace(buf[ix])) | |||
| break; | |||
| } | |||
| *tailptr = (wchar_t *)&str[ix]; | |||
| return(atof(buf)); | |||
| int ix; | |||
| char buf[80]; | |||
| while(isspace(*str)) str++; | |||
| for(ix=0; ix<80; ix++) | |||
| { | |||
| buf[ix] = str[ix]; | |||
| if(isspace(buf[ix])) | |||
| break; | |||
| } | |||
| *tailptr = (wchar_t *)&str[ix]; | |||
| return(atof(buf)); | |||
| } | |||
| #endif | |||
| @@ -700,7 +703,7 @@ static void UngetC(int c) | |||
| const char *WordToString2(unsigned int word) | |||
| { | |||
| // Convert a language mnemonic word into a string | |||
| int ix; | |||
| int ix; | |||
| static char buf[5]; | |||
| char *p; | |||
| @@ -844,7 +847,7 @@ static int LoadSoundFile(const char *fname, int index) | |||
| FILE *f; | |||
| char *p; | |||
| int *ip; | |||
| int length; | |||
| int length; | |||
| char fname_temp[100]; | |||
| char fname2[sizeof(path_home)+13+40]; | |||
| @@ -1059,7 +1062,7 @@ static int AnnouncePunctuation(Translator *tr, int c1, int *c2_ptr, char *output | |||
| else | |||
| { | |||
| sprintf(buf," %s %d %s", | |||
| punctname,punct_count,punctname); | |||
| punctname,punct_count,punctname); | |||
| } | |||
| } | |||
| else | |||
| @@ -1163,7 +1166,8 @@ static MNEM_TAB ssmltags[] = { | |||
| {"strong", HTML_NOSPACE}, | |||
| {"em", HTML_NOSPACE}, | |||
| {"code", HTML_NOSPACE}, | |||
| {NULL,0}}; | |||
| {NULL,0} | |||
| }; | |||
| @@ -1311,7 +1315,7 @@ static void ProcessParamStack(char *outbuf, int *outix) | |||
| static PARAM_STACK *PushParamStack(int tag_type) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| PARAM_STACK *sp; | |||
| sp = ¶m_stack[n_param_stack]; | |||
| @@ -1389,7 +1393,7 @@ static wchar_t *GetSsmlAttribute(wchar_t *pw, const char *name) | |||
| static int attrcmp(const wchar_t *string1, const char *string2) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| if(string1 == NULL) | |||
| return(1); | |||
| @@ -1602,7 +1606,8 @@ static int GetVoiceAttributes(wchar_t *pw, int tag_type) | |||
| {"male", 1}, | |||
| {"female", 2}, | |||
| {"neutral", 3}, | |||
| {NULL, 0}}; | |||
| {NULL, 0} | |||
| }; | |||
| if(tag_type & SSML_CLOSE) | |||
| { | |||
| @@ -1673,7 +1678,8 @@ static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) | |||
| {"medium",100}, | |||
| {"loud",150}, | |||
| {"x-loud",230}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_rate[] = { | |||
| {"default",100}, | |||
| @@ -1682,7 +1688,8 @@ static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) | |||
| {"medium",100}, | |||
| {"fast",125}, | |||
| {"x-fast",160}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_pitch[] = { | |||
| {"default",100}, | |||
| @@ -1691,7 +1698,8 @@ static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) | |||
| {"medium",100}, | |||
| {"high",110}, | |||
| {"x-high",120}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_range[] = { | |||
| {"default",100}, | |||
| @@ -1700,10 +1708,12 @@ static void SetProsodyParameter(int param_type, wchar_t *attr1, PARAM_STACK *sp) | |||
| {"medium",100}, | |||
| {"high",140}, | |||
| {"x-high",180}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB *mnem_tabs[5] = { | |||
| NULL, mnem_rate, mnem_volume, mnem_pitch, mnem_range }; | |||
| NULL, mnem_rate, mnem_volume, mnem_pitch, mnem_range | |||
| }; | |||
| if((value = attrlookup(attr1,mnem_tabs[param_type])) >= 0) | |||
| @@ -1736,11 +1746,12 @@ static int ReplaceKeyName(char *outbuf, int index, int *outix) | |||
| { | |||
| // Replace some key-names by single characters, so they can be pronounced in different languages | |||
| static MNEM_TAB keynames[] = { | |||
| {"space ",0xe020}, | |||
| {"tab ", 0xe009}, | |||
| {"underscore ", 0xe05f}, | |||
| {"double-quote ", '"'}, | |||
| {NULL, 0}}; | |||
| {"space ",0xe020}, | |||
| {"tab ", 0xe009}, | |||
| {"underscore ", 0xe05f}, | |||
| {"double-quote ", '"'}, | |||
| {NULL, 0} | |||
| }; | |||
| int ix; | |||
| int letter; | |||
| @@ -1785,20 +1796,23 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outb | |||
| static const MNEM_TAB mnem_phoneme_alphabet[] = { | |||
| {"espeak",1}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_punct[] = { | |||
| {"none", 1}, | |||
| {"all", 2}, | |||
| {"some", 3}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_capitals[] = { | |||
| {"no", 0}, | |||
| {"spelling", 2}, | |||
| {"icon", 1}, | |||
| {"pitch", 20}, // this is the amount by which to raise the pitch | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_interpret_as[] = { | |||
| {"characters",SAYAS_CHARS}, | |||
| @@ -1806,11 +1820,13 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outb | |||
| {"tts:key",SAYAS_KEY}, | |||
| {"tts:digits",SAYAS_DIGITS}, | |||
| {"telephone",SAYAS_DIGITS1}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_sayas_format[] = { | |||
| {"glyphs",1}, | |||
| {NULL, -1}}; | |||
| {NULL, -1} | |||
| }; | |||
| static const MNEM_TAB mnem_break[] = { | |||
| {"none",0}, | |||
| @@ -1819,7 +1835,8 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outb | |||
| {"medium",3}, | |||
| {"strong",4}, | |||
| {"x-strong",5}, | |||
| {NULL,-1}}; | |||
| {NULL,-1} | |||
| }; | |||
| static const MNEM_TAB mnem_emphasis[] = { | |||
| {"none",1}, | |||
| @@ -1827,10 +1844,12 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outb | |||
| {"moderate",3}, | |||
| {"strong",4}, | |||
| {"x-strong",5}, | |||
| {NULL,-1}}; | |||
| {NULL,-1} | |||
| }; | |||
| static const char *prosody_attr[5] = { | |||
| NULL, "rate", "volume", "pitch", "range" }; | |||
| NULL, "rate", "volume", "pitch", "range" | |||
| }; | |||
| for(ix=0; ix<(sizeof(tag_name)-1); ix++) | |||
| { | |||
| @@ -2162,7 +2181,7 @@ static int ProcessSsmlTag(wchar_t *xml_buf, char *outbuf, int *outix, int n_outb | |||
| n_ssml_stack--; | |||
| } | |||
| terminator=0; // ?? Sentence intonation, but no pause ?? | |||
| terminator=0; // ?? Sentence intonation, but no pause ?? | |||
| return(terminator + GetVoiceAttributes(px, tag_type)); | |||
| case HTML_BREAK: | |||
| @@ -2232,22 +2251,23 @@ static MNEM_TAB xml_char_mnemonics[] = { | |||
| {"quot", '"'}, | |||
| {"nbsp", ' '}, | |||
| {"apos", '\''}, | |||
| {NULL,-1}}; | |||
| {NULL,-1} | |||
| }; | |||
| int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix_top, int n_buf, int *tone_type, char *voice_change) | |||
| { | |||
| /* Find the end of the current clause. | |||
| Write the clause into buf | |||
| Write the clause into buf | |||
| returns: clause type (bits 0-7: pause x10mS, bits 8-11 intonation type) | |||
| returns: clause type (bits 0-7: pause x10mS, bits 8-11 intonation type) | |||
| Also checks for blank line (paragraph) as end-of-clause indicator. | |||
| Also checks for blank line (paragraph) as end-of-clause indicator. | |||
| Does not end clause for: | |||
| punctuation immediately followed by alphanumeric eg. 1.23 !Speak :path | |||
| repeated punctuation, eg. ... !!! | |||
| */ | |||
| Does not end clause for: | |||
| punctuation immediately followed by alphanumeric eg. 1.23 !Speak :path | |||
| repeated punctuation, eg. ... !!! | |||
| */ | |||
| int c1=' '; // current character | |||
| int c2; // next character | |||
| int cprev=' '; // previous character | |||
| @@ -2291,7 +2311,7 @@ int ReadClause(Translator *tr, FILE *f_in, char *buf, short *charix, int *charix | |||
| *tone_type = 0; | |||
| *voice_change = 0; | |||
| f_input = f_in; // for GetC etc | |||
| f_input = f_in; // for GetC etc | |||
| if(ungot_word != NULL) | |||
| { | |||
| @@ -2666,7 +2686,7 @@ f_input = f_in; // for GetC etc | |||
| buf[ix+1] = 0; | |||
| if(parag > 3) | |||
| parag = 3; | |||
| if(option_ssml) parag=1; | |||
| if(option_ssml) parag=1; | |||
| return((CLAUSE_PARAGRAPH-30) + 30*parag); // several blank lines, longer pause | |||
| } | |||
| @@ -2804,7 +2824,7 @@ if(option_ssml) parag=1; | |||
| if(c1 == '.') | |||
| { | |||
| if((tr->langopts.numbers & NUM_ORDINAL_DOT) && | |||
| (iswdigit(cprev) || (IsRomanU(cprev) && (IsRomanU(cprev2) || iswspace(cprev2))))) // lang=hu | |||
| (iswdigit(cprev) || (IsRomanU(cprev) && (IsRomanU(cprev2) || iswspace(cprev2))))) // lang=hu | |||
| { | |||
| // dot after a number indicates an ordinal number | |||
| if(!iswdigit(cprev)) | |||
| @@ -37,95 +37,97 @@ extern int saved_parameters[]; | |||
| // convert from words-per-minute to internal speed factor | |||
| // Use this to calibrate speed for wpm 80-350 | |||
| static unsigned char speed_lookup[] = { | |||
| 255, 255, 255, 255, 255, // 80 | |||
| 253, 249, 245, 242, 238, // 85 | |||
| 235, 232, 228, 225, 222, // 90 | |||
| 218, 216, 213, 210, 207, // 95 | |||
| 204, 201, 198, 196, 193, // 100 | |||
| 191, 188, 186, 183, 181, // 105 | |||
| 179, 176, 174, 172, 169, // 110 | |||
| 168, 165, 163, 161, 159, // 115 | |||
| 158, 155, 153, 152, 150, // 120 | |||
| 148, 146, 145, 143, 141, // 125 | |||
| 139, 137, 136, 135, 133, // 130 | |||
| 131, 130, 129, 127, 126, // 135 | |||
| 124, 123, 122, 120, 119, // 140 | |||
| 118, 117, 115, 114, 113, // 145 | |||
| 112, 111, 110, 109, 107, // 150 | |||
| 106, 105, 104, 103, 102, // 155 | |||
| 101, 100, 99, 98, 97, // 160 | |||
| 96, 95, 94, 93, 92, // 165 | |||
| 91, 90, 89, 89, 88, // 170 | |||
| 87, 86, 85, 84, 83, // 175 | |||
| 82, 82, 81, 80, 80, // 180 | |||
| 79, 78, 77, 76, 76, // 185 | |||
| 75, 75, 74, 73, 72, // 190 | |||
| 71, 71, 70, 69, 69, // 195 | |||
| 68, 67, 67, 66, 66, // 200 | |||
| 65, 64, 64, 63, 62, // 205 | |||
| 62, 61, 61, 60, 59, // 210 | |||
| 59, 58, 58, 57, 57, // 215 | |||
| 56, 56, 55, 54, 54, // 220 | |||
| 53, 53, 52, 52, 52, // 225 | |||
| 51, 50, 50, 49, 49, // 230 | |||
| 48, 48, 47, 47, 46, // 235 | |||
| 46, 46, 45, 45, 44, // 240 | |||
| 44, 44, 43, 43, 42, // 245 | |||
| 41, 40, 40, 40, 39, // 250 | |||
| 39, 39, 38, 38, 38, // 255 | |||
| 37, 37, 37, 36, 36, // 260 | |||
| 35, 35, 35, 35, 34, // 265 | |||
| 34, 34, 33, 33, 33, // 270 | |||
| 32, 32, 31, 31, 31, // 275 | |||
| 30, 30, 30, 29, 29, // 280 | |||
| 29, 29, 28, 28, 27, // 285 | |||
| 27, 27, 27, 26, 26, // 290 | |||
| 26, 26, 25, 25, 25, // 295 | |||
| 24, 24, 24, 24, 23, // 300 | |||
| 23, 23, 23, 22, 22, // 305 | |||
| 22, 21, 21, 21, 21, // 310 | |||
| 20, 20, 20, 20, 19, // 315 | |||
| 19, 19, 18, 18, 17, // 320 | |||
| 17, 17, 16, 16, 16, // 325 | |||
| 16, 16, 16, 15, 15, // 330 | |||
| 15, 15, 14, 14, 14, // 335 | |||
| 13, 13, 13, 12, 12, // 340 | |||
| 12, 12, 11, 11, 11, // 345 | |||
| 11, 10, 10, 10, 9, // 350 | |||
| 9, 9, 8, 8, 8, // 355 | |||
| 255, 255, 255, 255, 255, // 80 | |||
| 253, 249, 245, 242, 238, // 85 | |||
| 235, 232, 228, 225, 222, // 90 | |||
| 218, 216, 213, 210, 207, // 95 | |||
| 204, 201, 198, 196, 193, // 100 | |||
| 191, 188, 186, 183, 181, // 105 | |||
| 179, 176, 174, 172, 169, // 110 | |||
| 168, 165, 163, 161, 159, // 115 | |||
| 158, 155, 153, 152, 150, // 120 | |||
| 148, 146, 145, 143, 141, // 125 | |||
| 139, 137, 136, 135, 133, // 130 | |||
| 131, 130, 129, 127, 126, // 135 | |||
| 124, 123, 122, 120, 119, // 140 | |||
| 118, 117, 115, 114, 113, // 145 | |||
| 112, 111, 110, 109, 107, // 150 | |||
| 106, 105, 104, 103, 102, // 155 | |||
| 101, 100, 99, 98, 97,// 160 | |||
| 96, 95, 94, 93, 92, // 165 | |||
| 91, 90, 89, 89, 88, // 170 | |||
| 87, 86, 85, 84, 83, // 175 | |||
| 82, 82, 81, 80, 80, // 180 | |||
| 79, 78, 77, 76, 76, // 185 | |||
| 75, 75, 74, 73, 72, // 190 | |||
| 71, 71, 70, 69, 69, // 195 | |||
| 68, 67, 67, 66, 66, // 200 | |||
| 65, 64, 64, 63, 62, // 205 | |||
| 62, 61, 61, 60, 59, // 210 | |||
| 59, 58, 58, 57, 57, // 215 | |||
| 56, 56, 55, 54, 54, // 220 | |||
| 53, 53, 52, 52, 52, // 225 | |||
| 51, 50, 50, 49, 49, // 230 | |||
| 48, 48, 47, 47, 46, // 235 | |||
| 46, 46, 45, 45, 44, // 240 | |||
| 44, 44, 43, 43, 42, // 245 | |||
| 41, 40, 40, 40, 39, // 250 | |||
| 39, 39, 38, 38, 38, // 255 | |||
| 37, 37, 37, 36, 36, // 260 | |||
| 35, 35, 35, 35, 34, // 265 | |||
| 34, 34, 33, 33, 33, // 270 | |||
| 32, 32, 31, 31, 31, // 275 | |||
| 30, 30, 30, 29, 29, // 280 | |||
| 29, 29, 28, 28, 27, // 285 | |||
| 27, 27, 27, 26, 26, // 290 | |||
| 26, 26, 25, 25, 25, // 295 | |||
| 24, 24, 24, 24, 23, // 300 | |||
| 23, 23, 23, 22, 22, // 305 | |||
| 22, 21, 21, 21, 21, // 310 | |||
| 20, 20, 20, 20, 19, // 315 | |||
| 19, 19, 18, 18, 17, // 320 | |||
| 17, 17, 16, 16, 16, // 325 | |||
| 16, 16, 16, 15, 15, // 330 | |||
| 15, 15, 14, 14, 14, // 335 | |||
| 13, 13, 13, 12, 12, // 340 | |||
| 12, 12, 11, 11, 11, // 345 | |||
| 11, 10, 10, 10, 9, // 350 | |||
| 9, 9, 8, 8, 8, // 355 | |||
| }; | |||
| // speed_factor1 adjustments for speeds 350 to 374: pauses | |||
| static unsigned char pause_factor_350[] = { | |||
| 22,22,22,22,22,22,22,21,21,21, // 350 | |||
| 21,20,20,19,19,18,17,16,15,15, // 360 | |||
| 15,15,15,15,15}; // 370 | |||
| 22,22,22,22,22,22,22,21,21,21, // 350 | |||
| 21,20,20,19,19,18,17,16,15,15, // 360 | |||
| 15,15,15,15,15 | |||
| }; // 370 | |||
| // wav_factor adjustments for speeds 350 to 450 | |||
| // Use this to calibrate speed for wpm 350-450 | |||
| static unsigned char wav_factor_350[] = { | |||
| 120, 121, 120, 119, 119, // 350 | |||
| 118, 118, 117, 116, 116, // 355 | |||
| 115, 114, 113, 112, 112, // 360 | |||
| 111, 111, 110, 109, 108, // 365 | |||
| 107, 106, 106, 104, 103, // 370 | |||
| 103, 102, 102, 102, 101, // 375 | |||
| 101, 99, 98, 98, 97, // 380 | |||
| 96, 96, 95, 94, 93, // 385 | |||
| 91, 90, 91, 90, 89, // 390 | |||
| 88, 86, 85, 86, 85, // 395 | |||
| 85, 84, 82, 81, 80, // 400 | |||
| 79, 77, 78, 78, 76, // 405 | |||
| 77, 75, 75, 74, 73, // 410 | |||
| 71, 72, 70, 69, 69, // 415 | |||
| 69, 67, 65, 64, 63, // 420 | |||
| 63, 63, 61, 61, 59, // 425 | |||
| 59, 59, 58, 56, 57, // 430 | |||
| 58, 56, 54, 53, 52, // 435 | |||
| 52, 53, 52, 52, 50, // 440 | |||
| 48, 47, 47, 45, 46, // 445 | |||
| 45}; // 450 | |||
| 120, 121, 120, 119, 119, // 350 | |||
| 118, 118, 117, 116, 116, // 355 | |||
| 115, 114, 113, 112, 112, // 360 | |||
| 111, 111, 110, 109, 108, // 365 | |||
| 107, 106, 106, 104, 103, // 370 | |||
| 103, 102, 102, 102, 101, // 375 | |||
| 101, 99, 98, 98, 97,// 380 | |||
| 96, 96, 95, 94, 93, // 385 | |||
| 91, 90, 91, 90, 89, // 390 | |||
| 88, 86, 85, 86, 85, // 395 | |||
| 85, 84, 82, 81, 80, // 400 | |||
| 79, 77, 78, 78, 76, // 405 | |||
| 77, 75, 75, 74, 73, // 410 | |||
| 71, 72, 70, 69, 69, // 415 | |||
| 69, 67, 65, 64, 63, // 420 | |||
| 63, 63, 61, 61, 59, // 425 | |||
| 59, 59, 58, 56, 57, // 430 | |||
| 58, 56, 54, 53, 52, // 435 | |||
| 52, 53, 52, 52, 50, // 440 | |||
| 48, 47, 47, 45, 46, // 445 | |||
| 45 | |||
| }; // 450 | |||
| static int speed1 = 130; | |||
| static int speed2 = 121; | |||
| @@ -263,7 +265,7 @@ void SetSpeed(int control) | |||
| } | |||
| // adjust for different sample rates | |||
| speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; | |||
| speed.min_sample_len = (speed.min_sample_len * samplerate_native) / 22050; | |||
| speed.pause_factor = (256 * s1)/115; // full speed adjustment, used for pause length | |||
| speed.clause_pause_factor = 0; | |||
| @@ -517,23 +519,23 @@ void CalcLengths(Translator *tr) | |||
| PHONEME_LIST *p; | |||
| PHONEME_LIST *p2; | |||
| int stress; | |||
| int type; | |||
| static int more_syllables=0; | |||
| int pre_sonorant=0; | |||
| int pre_voiced=0; | |||
| int last_pitch = 0; | |||
| int pitch_start; | |||
| int length_mod; | |||
| int next2type; | |||
| int len; | |||
| int env2; | |||
| int end_of_clause; | |||
| int embedded_ix = 0; | |||
| int min_drop; | |||
| int pitch1; | |||
| int stress; | |||
| int type; | |||
| static int more_syllables=0; | |||
| int pre_sonorant=0; | |||
| int pre_voiced=0; | |||
| int last_pitch = 0; | |||
| int pitch_start; | |||
| int length_mod; | |||
| int next2type; | |||
| int len; | |||
| int env2; | |||
| int end_of_clause; | |||
| int embedded_ix = 0; | |||
| int min_drop; | |||
| int pitch1; | |||
| int emphasized; | |||
| int tone_mod; | |||
| int tone_mod; | |||
| unsigned char *pitch_env=NULL; | |||
| PHONEME_DATA phdata_tone; | |||
| @@ -742,10 +744,10 @@ void CalcLengths(Translator *tr) | |||
| if(stress > 7) stress = 7; | |||
| if(stress <= 1) | |||
| { | |||
| stress = stress ^ 1; // swap diminished and unstressed (until we swap stress_amps,stress_lengths in tr_languages) | |||
| } | |||
| if(stress <= 1) | |||
| { | |||
| stress = stress ^ 1; // swap diminished and unstressed (until we swap stress_amps,stress_lengths in tr_languages) | |||
| } | |||
| if(pre_sonorant) | |||
| p->amp = tr->stress_amps[stress]-1; | |||
| else | |||
| @@ -875,11 +877,11 @@ if(stress <= 1) | |||
| length_mod = length_mod / 128; | |||
| if(p->type != phVOWEL) | |||
| { | |||
| length_mod = 256; // syllabic consonant | |||
| min_drop = 16; | |||
| } | |||
| if(p->type != phVOWEL) | |||
| { | |||
| length_mod = 256; // syllabic consonant | |||
| min_drop = 16; | |||
| } | |||
| p->length = length_mod; | |||
| if(p->env >= (N_ENVELOPE_DATA-1)) | |||
| @@ -4,263 +4,263 @@ extern "C" | |||
| #endif | |||
| short int sin_tab[2048] = { | |||
| 0, -25, -50, -75, -100, -125, -150, -175, | |||
| -201, -226, -251, -276, -301, -326, -351, -376, | |||
| -401, -427, -452, -477, -502, -527, -552, -577, | |||
| -602, -627, -652, -677, -702, -727, -752, -777, | |||
| -802, -827, -852, -877, -902, -927, -952, -977, | |||
| -1002, -1027, -1052, -1077, -1102, -1127, -1152, -1177, | |||
| -1201, -1226, -1251, -1276, -1301, -1326, -1350, -1375, | |||
| -1400, -1425, -1449, -1474, -1499, -1523, -1548, -1573, | |||
| -1597, -1622, -1647, -1671, -1696, -1721, -1745, -1770, | |||
| -1794, -1819, -1843, -1868, -1892, -1917, -1941, -1965, | |||
| -1990, -2014, -2038, -2063, -2087, -2111, -2136, -2160, | |||
| -2184, -2208, -2233, -2257, -2281, -2305, -2329, -2353, | |||
| -2377, -2401, -2425, -2449, -2473, -2497, -2521, -2545, | |||
| -2569, -2593, -2617, -2640, -2664, -2688, -2712, -2735, | |||
| -2759, -2783, -2806, -2830, -2853, -2877, -2900, -2924, | |||
| -2947, -2971, -2994, -3018, -3041, -3064, -3088, -3111, | |||
| -3134, -3157, -3180, -3204, -3227, -3250, -3273, -3296, | |||
| -3319, -3342, -3365, -3388, -3410, -3433, -3456, -3479, | |||
| -3502, -3524, -3547, -3570, -3592, -3615, -3637, -3660, | |||
| -3682, -3705, -3727, -3749, -3772, -3794, -3816, -3839, | |||
| -3861, -3883, -3905, -3927, -3949, -3971, -3993, -4015, | |||
| -4037, -4059, -4080, -4102, -4124, -4146, -4167, -4189, | |||
| -4211, -4232, -4254, -4275, -4296, -4318, -4339, -4360, | |||
| -4382, -4403, -4424, -4445, -4466, -4487, -4508, -4529, | |||
| -4550, -4571, -4592, -4613, -4633, -4654, -4675, -4695, | |||
| -4716, -4736, -4757, -4777, -4798, -4818, -4838, -4859, | |||
| -4879, -4899, -4919, -4939, -4959, -4979, -4999, -5019, | |||
| -5039, -5059, -5078, -5098, -5118, -5137, -5157, -5176, | |||
| -5196, -5215, -5235, -5254, -5273, -5292, -5311, -5331, | |||
| -5350, -5369, -5388, -5406, -5425, -5444, -5463, -5482, | |||
| -5500, -5519, -5537, -5556, -5574, -5593, -5611, -5629, | |||
| -5648, -5666, -5684, -5702, -5720, -5738, -5756, -5774, | |||
| -5791, -5809, -5827, -5844, -5862, -5880, -5897, -5914, | |||
| -5932, -5949, -5966, -5984, -6001, -6018, -6035, -6052, | |||
| -6069, -6085, -6102, -6119, -6136, -6152, -6169, -6185, | |||
| -6202, -6218, -6235, -6251, -6267, -6283, -6299, -6315, | |||
| -6331, -6347, -6363, -6379, -6395, -6410, -6426, -6441, | |||
| -6457, -6472, -6488, -6503, -6518, -6533, -6549, -6564, | |||
| -6579, -6594, -6608, -6623, -6638, -6653, -6667, -6682, | |||
| -6696, -6711, -6725, -6739, -6754, -6768, -6782, -6796, | |||
| -6810, -6824, -6838, -6852, -6865, -6879, -6893, -6906, | |||
| -6920, -6933, -6946, -6960, -6973, -6986, -6999, -7012, | |||
| -7025, -7038, -7051, -7064, -7076, -7089, -7101, -7114, | |||
| -7126, -7139, -7151, -7163, -7175, -7187, -7199, -7211, | |||
| -7223, -7235, -7247, -7259, -7270, -7282, -7293, -7305, | |||
| -7316, -7327, -7338, -7349, -7361, -7372, -7382, -7393, | |||
| -7404, -7415, -7425, -7436, -7446, -7457, -7467, -7478, | |||
| -7488, -7498, -7508, -7518, -7528, -7538, -7548, -7557, | |||
| -7567, -7577, -7586, -7596, -7605, -7614, -7623, -7633, | |||
| -7642, -7651, -7660, -7668, -7677, -7686, -7695, -7703, | |||
| -7712, -7720, -7728, -7737, -7745, -7753, -7761, -7769, | |||
| -7777, -7785, -7793, -7800, -7808, -7816, -7823, -7830, | |||
| -7838, -7845, -7852, -7859, -7866, -7873, -7880, -7887, | |||
| -7894, -7900, -7907, -7914, -7920, -7926, -7933, -7939, | |||
| -7945, -7951, -7957, -7963, -7969, -7975, -7980, -7986, | |||
| -7991, -7997, -8002, -8008, -8013, -8018, -8023, -8028, | |||
| -8033, -8038, -8043, -8047, -8052, -8057, -8061, -8066, | |||
| -8070, -8074, -8078, -8082, -8086, -8090, -8094, -8098, | |||
| -8102, -8105, -8109, -8113, -8116, -8119, -8123, -8126, | |||
| -8129, -8132, -8135, -8138, -8141, -8143, -8146, -8149, | |||
| -8151, -8153, -8156, -8158, -8160, -8162, -8164, -8166, | |||
| -8168, -8170, -8172, -8174, -8175, -8177, -8178, -8179, | |||
| -8181, -8182, -8183, -8184, -8185, -8186, -8187, -8187, | |||
| -8188, -8189, -8189, -8190, -8190, -8190, -8190, -8190, | |||
| -8191, -8190, -8190, -8190, -8190, -8190, -8189, -8189, | |||
| -8188, -8187, -8187, -8186, -8185, -8184, -8183, -8182, | |||
| -8181, -8179, -8178, -8177, -8175, -8174, -8172, -8170, | |||
| -8168, -8166, -8164, -8162, -8160, -8158, -8156, -8153, | |||
| -8151, -8149, -8146, -8143, -8141, -8138, -8135, -8132, | |||
| -8129, -8126, -8123, -8119, -8116, -8113, -8109, -8105, | |||
| -8102, -8098, -8094, -8090, -8086, -8082, -8078, -8074, | |||
| -8070, -8066, -8061, -8057, -8052, -8047, -8043, -8038, | |||
| -8033, -8028, -8023, -8018, -8013, -8008, -8002, -7997, | |||
| -7991, -7986, -7980, -7975, -7969, -7963, -7957, -7951, | |||
| -7945, -7939, -7933, -7926, -7920, -7914, -7907, -7900, | |||
| -7894, -7887, -7880, -7873, -7866, -7859, -7852, -7845, | |||
| -7838, -7830, -7823, -7816, -7808, -7800, -7793, -7785, | |||
| -7777, -7769, -7761, -7753, -7745, -7737, -7728, -7720, | |||
| -7712, -7703, -7695, -7686, -7677, -7668, -7660, -7651, | |||
| -7642, -7633, -7623, -7614, -7605, -7596, -7586, -7577, | |||
| -7567, -7557, -7548, -7538, -7528, -7518, -7508, -7498, | |||
| -7488, -7478, -7467, -7457, -7446, -7436, -7425, -7415, | |||
| -7404, -7393, -7382, -7372, -7361, -7349, -7338, -7327, | |||
| -7316, -7305, -7293, -7282, -7270, -7259, -7247, -7235, | |||
| -7223, -7211, -7199, -7187, -7175, -7163, -7151, -7139, | |||
| -7126, -7114, -7101, -7089, -7076, -7064, -7051, -7038, | |||
| -7025, -7012, -6999, -6986, -6973, -6960, -6946, -6933, | |||
| -6920, -6906, -6893, -6879, -6865, -6852, -6838, -6824, | |||
| -6810, -6796, -6782, -6768, -6754, -6739, -6725, -6711, | |||
| -6696, -6682, -6667, -6653, -6638, -6623, -6608, -6594, | |||
| -6579, -6564, -6549, -6533, -6518, -6503, -6488, -6472, | |||
| -6457, -6441, -6426, -6410, -6395, -6379, -6363, -6347, | |||
| -6331, -6315, -6299, -6283, -6267, -6251, -6235, -6218, | |||
| -6202, -6185, -6169, -6152, -6136, -6119, -6102, -6085, | |||
| -6069, -6052, -6035, -6018, -6001, -5984, -5966, -5949, | |||
| -5932, -5914, -5897, -5880, -5862, -5844, -5827, -5809, | |||
| -5791, -5774, -5756, -5738, -5720, -5702, -5684, -5666, | |||
| -5648, -5629, -5611, -5593, -5574, -5556, -5537, -5519, | |||
| -5500, -5482, -5463, -5444, -5425, -5406, -5388, -5369, | |||
| -5350, -5331, -5311, -5292, -5273, -5254, -5235, -5215, | |||
| -5196, -5176, -5157, -5137, -5118, -5098, -5078, -5059, | |||
| -5039, -5019, -4999, -4979, -4959, -4939, -4919, -4899, | |||
| -4879, -4859, -4838, -4818, -4798, -4777, -4757, -4736, | |||
| -4716, -4695, -4675, -4654, -4633, -4613, -4592, -4571, | |||
| -4550, -4529, -4508, -4487, -4466, -4445, -4424, -4403, | |||
| -4382, -4360, -4339, -4318, -4296, -4275, -4254, -4232, | |||
| -4211, -4189, -4167, -4146, -4124, -4102, -4080, -4059, | |||
| -4037, -4015, -3993, -3971, -3949, -3927, -3905, -3883, | |||
| -3861, -3839, -3816, -3794, -3772, -3749, -3727, -3705, | |||
| -3682, -3660, -3637, -3615, -3592, -3570, -3547, -3524, | |||
| -3502, -3479, -3456, -3433, -3410, -3388, -3365, -3342, | |||
| -3319, -3296, -3273, -3250, -3227, -3204, -3180, -3157, | |||
| -3134, -3111, -3088, -3064, -3041, -3018, -2994, -2971, | |||
| -2947, -2924, -2900, -2877, -2853, -2830, -2806, -2783, | |||
| -2759, -2735, -2712, -2688, -2664, -2640, -2617, -2593, | |||
| -2569, -2545, -2521, -2497, -2473, -2449, -2425, -2401, | |||
| -2377, -2353, -2329, -2305, -2281, -2257, -2233, -2208, | |||
| -2184, -2160, -2136, -2111, -2087, -2063, -2038, -2014, | |||
| -1990, -1965, -1941, -1917, -1892, -1868, -1843, -1819, | |||
| -1794, -1770, -1745, -1721, -1696, -1671, -1647, -1622, | |||
| -1597, -1573, -1548, -1523, -1499, -1474, -1449, -1425, | |||
| -1400, -1375, -1350, -1326, -1301, -1276, -1251, -1226, | |||
| -1201, -1177, -1152, -1127, -1102, -1077, -1052, -1027, | |||
| -1002, -977, -952, -927, -902, -877, -852, -827, | |||
| -802, -777, -752, -727, -702, -677, -652, -627, | |||
| -602, -577, -552, -527, -502, -477, -452, -427, | |||
| -401, -376, -351, -326, -301, -276, -251, -226, | |||
| -201, -175, -150, -125, -100, -75, -50, -25, | |||
| 0, 25, 50, 75, 100, 125, 150, 175, | |||
| 201, 226, 251, 276, 301, 326, 351, 376, | |||
| 401, 427, 452, 477, 502, 527, 552, 577, | |||
| 602, 627, 652, 677, 702, 727, 752, 777, | |||
| 802, 827, 852, 877, 902, 927, 952, 977, | |||
| 1002, 1027, 1052, 1077, 1102, 1127, 1152, 1177, | |||
| 1201, 1226, 1251, 1276, 1301, 1326, 1350, 1375, | |||
| 1400, 1425, 1449, 1474, 1499, 1523, 1548, 1573, | |||
| 1597, 1622, 1647, 1671, 1696, 1721, 1745, 1770, | |||
| 1794, 1819, 1843, 1868, 1892, 1917, 1941, 1965, | |||
| 1990, 2014, 2038, 2063, 2087, 2111, 2136, 2160, | |||
| 2184, 2208, 2233, 2257, 2281, 2305, 2329, 2353, | |||
| 2377, 2401, 2425, 2449, 2473, 2497, 2521, 2545, | |||
| 2569, 2593, 2617, 2640, 2664, 2688, 2712, 2735, | |||
| 2759, 2783, 2806, 2830, 2853, 2877, 2900, 2924, | |||
| 2947, 2971, 2994, 3018, 3041, 3064, 3088, 3111, | |||
| 3134, 3157, 3180, 3204, 3227, 3250, 3273, 3296, | |||
| 3319, 3342, 3365, 3388, 3410, 3433, 3456, 3479, | |||
| 3502, 3524, 3547, 3570, 3592, 3615, 3637, 3660, | |||
| 3682, 3705, 3727, 3749, 3772, 3794, 3816, 3839, | |||
| 3861, 3883, 3905, 3927, 3949, 3971, 3993, 4015, | |||
| 4037, 4059, 4080, 4102, 4124, 4146, 4167, 4189, | |||
| 4211, 4232, 4254, 4275, 4296, 4318, 4339, 4360, | |||
| 4382, 4403, 4424, 4445, 4466, 4487, 4508, 4529, | |||
| 4550, 4571, 4592, 4613, 4633, 4654, 4675, 4695, | |||
| 4716, 4736, 4757, 4777, 4798, 4818, 4838, 4859, | |||
| 4879, 4899, 4919, 4939, 4959, 4979, 4999, 5019, | |||
| 5039, 5059, 5078, 5098, 5118, 5137, 5157, 5176, | |||
| 5196, 5215, 5235, 5254, 5273, 5292, 5311, 5331, | |||
| 5350, 5369, 5388, 5406, 5425, 5444, 5463, 5482, | |||
| 5500, 5519, 5537, 5556, 5574, 5593, 5611, 5629, | |||
| 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, | |||
| 5791, 5809, 5827, 5844, 5862, 5880, 5897, 5914, | |||
| 5932, 5949, 5966, 5984, 6001, 6018, 6035, 6052, | |||
| 6069, 6085, 6102, 6119, 6136, 6152, 6169, 6185, | |||
| 6202, 6218, 6235, 6251, 6267, 6283, 6299, 6315, | |||
| 6331, 6347, 6363, 6379, 6395, 6410, 6426, 6441, | |||
| 6457, 6472, 6488, 6503, 6518, 6533, 6549, 6564, | |||
| 6579, 6594, 6608, 6623, 6638, 6653, 6667, 6682, | |||
| 6696, 6711, 6725, 6739, 6754, 6768, 6782, 6796, | |||
| 6810, 6824, 6838, 6852, 6865, 6879, 6893, 6906, | |||
| 6920, 6933, 6946, 6960, 6973, 6986, 6999, 7012, | |||
| 7025, 7038, 7051, 7064, 7076, 7089, 7101, 7114, | |||
| 7126, 7139, 7151, 7163, 7175, 7187, 7199, 7211, | |||
| 7223, 7235, 7247, 7259, 7270, 7282, 7293, 7305, | |||
| 7316, 7327, 7338, 7349, 7361, 7372, 7382, 7393, | |||
| 7404, 7415, 7425, 7436, 7446, 7457, 7467, 7478, | |||
| 7488, 7498, 7508, 7518, 7528, 7538, 7548, 7557, | |||
| 7567, 7577, 7586, 7596, 7605, 7614, 7623, 7633, | |||
| 7642, 7651, 7660, 7668, 7677, 7686, 7695, 7703, | |||
| 7712, 7720, 7728, 7737, 7745, 7753, 7761, 7769, | |||
| 7777, 7785, 7793, 7800, 7808, 7816, 7823, 7830, | |||
| 7838, 7845, 7852, 7859, 7866, 7873, 7880, 7887, | |||
| 7894, 7900, 7907, 7914, 7920, 7926, 7933, 7939, | |||
| 7945, 7951, 7957, 7963, 7969, 7975, 7980, 7986, | |||
| 7991, 7997, 8002, 8008, 8013, 8018, 8023, 8028, | |||
| 8033, 8038, 8043, 8047, 8052, 8057, 8061, 8066, | |||
| 8070, 8074, 8078, 8082, 8086, 8090, 8094, 8098, | |||
| 8102, 8105, 8109, 8113, 8116, 8119, 8123, 8126, | |||
| 8129, 8132, 8135, 8138, 8141, 8143, 8146, 8149, | |||
| 8151, 8153, 8156, 8158, 8160, 8162, 8164, 8166, | |||
| 8168, 8170, 8172, 8174, 8175, 8177, 8178, 8179, | |||
| 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8187, | |||
| 8188, 8189, 8189, 8190, 8190, 8190, 8190, 8190, | |||
| 8191, 8190, 8190, 8190, 8190, 8190, 8189, 8189, | |||
| 8188, 8187, 8187, 8186, 8185, 8184, 8183, 8182, | |||
| 8181, 8179, 8178, 8177, 8175, 8174, 8172, 8170, | |||
| 8168, 8166, 8164, 8162, 8160, 8158, 8156, 8153, | |||
| 8151, 8149, 8146, 8143, 8141, 8138, 8135, 8132, | |||
| 8129, 8126, 8123, 8119, 8116, 8113, 8109, 8105, | |||
| 8102, 8098, 8094, 8090, 8086, 8082, 8078, 8074, | |||
| 8070, 8066, 8061, 8057, 8052, 8047, 8043, 8038, | |||
| 8033, 8028, 8023, 8018, 8013, 8008, 8002, 7997, | |||
| 7991, 7986, 7980, 7975, 7969, 7963, 7957, 7951, | |||
| 7945, 7939, 7933, 7926, 7920, 7914, 7907, 7900, | |||
| 7894, 7887, 7880, 7873, 7866, 7859, 7852, 7845, | |||
| 7838, 7830, 7823, 7816, 7808, 7800, 7793, 7785, | |||
| 7777, 7769, 7761, 7753, 7745, 7737, 7728, 7720, | |||
| 7712, 7703, 7695, 7686, 7677, 7668, 7660, 7651, | |||
| 7642, 7633, 7623, 7614, 7605, 7596, 7586, 7577, | |||
| 7567, 7557, 7548, 7538, 7528, 7518, 7508, 7498, | |||
| 7488, 7478, 7467, 7457, 7446, 7436, 7425, 7415, | |||
| 7404, 7393, 7382, 7372, 7361, 7349, 7338, 7327, | |||
| 7316, 7305, 7293, 7282, 7270, 7259, 7247, 7235, | |||
| 7223, 7211, 7199, 7187, 7175, 7163, 7151, 7139, | |||
| 7126, 7114, 7101, 7089, 7076, 7064, 7051, 7038, | |||
| 7025, 7012, 6999, 6986, 6973, 6960, 6946, 6933, | |||
| 6920, 6906, 6893, 6879, 6865, 6852, 6838, 6824, | |||
| 6810, 6796, 6782, 6768, 6754, 6739, 6725, 6711, | |||
| 6696, 6682, 6667, 6653, 6638, 6623, 6608, 6594, | |||
| 6579, 6564, 6549, 6533, 6518, 6503, 6488, 6472, | |||
| 6457, 6441, 6426, 6410, 6395, 6379, 6363, 6347, | |||
| 6331, 6315, 6299, 6283, 6267, 6251, 6235, 6218, | |||
| 6202, 6185, 6169, 6152, 6136, 6119, 6102, 6085, | |||
| 6069, 6052, 6035, 6018, 6001, 5984, 5966, 5949, | |||
| 5932, 5914, 5897, 5880, 5862, 5844, 5827, 5809, | |||
| 5791, 5774, 5756, 5738, 5720, 5702, 5684, 5666, | |||
| 5648, 5629, 5611, 5593, 5574, 5556, 5537, 5519, | |||
| 5500, 5482, 5463, 5444, 5425, 5406, 5388, 5369, | |||
| 5350, 5331, 5311, 5292, 5273, 5254, 5235, 5215, | |||
| 5196, 5176, 5157, 5137, 5118, 5098, 5078, 5059, | |||
| 5039, 5019, 4999, 4979, 4959, 4939, 4919, 4899, | |||
| 4879, 4859, 4838, 4818, 4798, 4777, 4757, 4736, | |||
| 4716, 4695, 4675, 4654, 4633, 4613, 4592, 4571, | |||
| 4550, 4529, 4508, 4487, 4466, 4445, 4424, 4403, | |||
| 4382, 4360, 4339, 4318, 4296, 4275, 4254, 4232, | |||
| 4211, 4189, 4167, 4146, 4124, 4102, 4080, 4059, | |||
| 4037, 4015, 3993, 3971, 3949, 3927, 3905, 3883, | |||
| 3861, 3839, 3816, 3794, 3772, 3749, 3727, 3705, | |||
| 3682, 3660, 3637, 3615, 3592, 3570, 3547, 3524, | |||
| 3502, 3479, 3456, 3433, 3410, 3388, 3365, 3342, | |||
| 3319, 3296, 3273, 3250, 3227, 3204, 3180, 3157, | |||
| 3134, 3111, 3088, 3064, 3041, 3018, 2994, 2971, | |||
| 2947, 2924, 2900, 2877, 2853, 2830, 2806, 2783, | |||
| 2759, 2735, 2712, 2688, 2664, 2640, 2617, 2593, | |||
| 2569, 2545, 2521, 2497, 2473, 2449, 2425, 2401, | |||
| 2377, 2353, 2329, 2305, 2281, 2257, 2233, 2208, | |||
| 2184, 2160, 2136, 2111, 2087, 2063, 2038, 2014, | |||
| 1990, 1965, 1941, 1917, 1892, 1868, 1843, 1819, | |||
| 1794, 1770, 1745, 1721, 1696, 1671, 1647, 1622, | |||
| 1597, 1573, 1548, 1523, 1499, 1474, 1449, 1425, | |||
| 1400, 1375, 1350, 1326, 1301, 1276, 1251, 1226, | |||
| 1201, 1177, 1152, 1127, 1102, 1077, 1052, 1027, | |||
| 1002, 977, 952, 927, 902, 877, 852, 827, | |||
| 802, 777, 752, 727, 702, 677, 652, 627, | |||
| 602, 577, 552, 527, 502, 477, 452, 427, | |||
| 401, 376, 351, 326, 301, 276, 251, 226, | |||
| 201, 175, 150, 125, 100, 75, 50, 25, | |||
| }; | |||
| 0, -25, -50, -75, -100, -125, -150, -175, | |||
| -201, -226, -251, -276, -301, -326, -351, -376, | |||
| -401, -427, -452, -477, -502, -527, -552, -577, | |||
| -602, -627, -652, -677, -702, -727, -752, -777, | |||
| -802, -827, -852, -877, -902, -927, -952, -977, | |||
| -1002, -1027, -1052, -1077, -1102, -1127, -1152, -1177, | |||
| -1201, -1226, -1251, -1276, -1301, -1326, -1350, -1375, | |||
| -1400, -1425, -1449, -1474, -1499, -1523, -1548, -1573, | |||
| -1597, -1622, -1647, -1671, -1696, -1721, -1745, -1770, | |||
| -1794, -1819, -1843, -1868, -1892, -1917, -1941, -1965, | |||
| -1990, -2014, -2038, -2063, -2087, -2111, -2136, -2160, | |||
| -2184, -2208, -2233, -2257, -2281, -2305, -2329, -2353, | |||
| -2377, -2401, -2425, -2449, -2473, -2497, -2521, -2545, | |||
| -2569, -2593, -2617, -2640, -2664, -2688, -2712, -2735, | |||
| -2759, -2783, -2806, -2830, -2853, -2877, -2900, -2924, | |||
| -2947, -2971, -2994, -3018, -3041, -3064, -3088, -3111, | |||
| -3134, -3157, -3180, -3204, -3227, -3250, -3273, -3296, | |||
| -3319, -3342, -3365, -3388, -3410, -3433, -3456, -3479, | |||
| -3502, -3524, -3547, -3570, -3592, -3615, -3637, -3660, | |||
| -3682, -3705, -3727, -3749, -3772, -3794, -3816, -3839, | |||
| -3861, -3883, -3905, -3927, -3949, -3971, -3993, -4015, | |||
| -4037, -4059, -4080, -4102, -4124, -4146, -4167, -4189, | |||
| -4211, -4232, -4254, -4275, -4296, -4318, -4339, -4360, | |||
| -4382, -4403, -4424, -4445, -4466, -4487, -4508, -4529, | |||
| -4550, -4571, -4592, -4613, -4633, -4654, -4675, -4695, | |||
| -4716, -4736, -4757, -4777, -4798, -4818, -4838, -4859, | |||
| -4879, -4899, -4919, -4939, -4959, -4979, -4999, -5019, | |||
| -5039, -5059, -5078, -5098, -5118, -5137, -5157, -5176, | |||
| -5196, -5215, -5235, -5254, -5273, -5292, -5311, -5331, | |||
| -5350, -5369, -5388, -5406, -5425, -5444, -5463, -5482, | |||
| -5500, -5519, -5537, -5556, -5574, -5593, -5611, -5629, | |||
| -5648, -5666, -5684, -5702, -5720, -5738, -5756, -5774, | |||
| -5791, -5809, -5827, -5844, -5862, -5880, -5897, -5914, | |||
| -5932, -5949, -5966, -5984, -6001, -6018, -6035, -6052, | |||
| -6069, -6085, -6102, -6119, -6136, -6152, -6169, -6185, | |||
| -6202, -6218, -6235, -6251, -6267, -6283, -6299, -6315, | |||
| -6331, -6347, -6363, -6379, -6395, -6410, -6426, -6441, | |||
| -6457, -6472, -6488, -6503, -6518, -6533, -6549, -6564, | |||
| -6579, -6594, -6608, -6623, -6638, -6653, -6667, -6682, | |||
| -6696, -6711, -6725, -6739, -6754, -6768, -6782, -6796, | |||
| -6810, -6824, -6838, -6852, -6865, -6879, -6893, -6906, | |||
| -6920, -6933, -6946, -6960, -6973, -6986, -6999, -7012, | |||
| -7025, -7038, -7051, -7064, -7076, -7089, -7101, -7114, | |||
| -7126, -7139, -7151, -7163, -7175, -7187, -7199, -7211, | |||
| -7223, -7235, -7247, -7259, -7270, -7282, -7293, -7305, | |||
| -7316, -7327, -7338, -7349, -7361, -7372, -7382, -7393, | |||
| -7404, -7415, -7425, -7436, -7446, -7457, -7467, -7478, | |||
| -7488, -7498, -7508, -7518, -7528, -7538, -7548, -7557, | |||
| -7567, -7577, -7586, -7596, -7605, -7614, -7623, -7633, | |||
| -7642, -7651, -7660, -7668, -7677, -7686, -7695, -7703, | |||
| -7712, -7720, -7728, -7737, -7745, -7753, -7761, -7769, | |||
| -7777, -7785, -7793, -7800, -7808, -7816, -7823, -7830, | |||
| -7838, -7845, -7852, -7859, -7866, -7873, -7880, -7887, | |||
| -7894, -7900, -7907, -7914, -7920, -7926, -7933, -7939, | |||
| -7945, -7951, -7957, -7963, -7969, -7975, -7980, -7986, | |||
| -7991, -7997, -8002, -8008, -8013, -8018, -8023, -8028, | |||
| -8033, -8038, -8043, -8047, -8052, -8057, -8061, -8066, | |||
| -8070, -8074, -8078, -8082, -8086, -8090, -8094, -8098, | |||
| -8102, -8105, -8109, -8113, -8116, -8119, -8123, -8126, | |||
| -8129, -8132, -8135, -8138, -8141, -8143, -8146, -8149, | |||
| -8151, -8153, -8156, -8158, -8160, -8162, -8164, -8166, | |||
| -8168, -8170, -8172, -8174, -8175, -8177, -8178, -8179, | |||
| -8181, -8182, -8183, -8184, -8185, -8186, -8187, -8187, | |||
| -8188, -8189, -8189, -8190, -8190, -8190, -8190, -8190, | |||
| -8191, -8190, -8190, -8190, -8190, -8190, -8189, -8189, | |||
| -8188, -8187, -8187, -8186, -8185, -8184, -8183, -8182, | |||
| -8181, -8179, -8178, -8177, -8175, -8174, -8172, -8170, | |||
| -8168, -8166, -8164, -8162, -8160, -8158, -8156, -8153, | |||
| -8151, -8149, -8146, -8143, -8141, -8138, -8135, -8132, | |||
| -8129, -8126, -8123, -8119, -8116, -8113, -8109, -8105, | |||
| -8102, -8098, -8094, -8090, -8086, -8082, -8078, -8074, | |||
| -8070, -8066, -8061, -8057, -8052, -8047, -8043, -8038, | |||
| -8033, -8028, -8023, -8018, -8013, -8008, -8002, -7997, | |||
| -7991, -7986, -7980, -7975, -7969, -7963, -7957, -7951, | |||
| -7945, -7939, -7933, -7926, -7920, -7914, -7907, -7900, | |||
| -7894, -7887, -7880, -7873, -7866, -7859, -7852, -7845, | |||
| -7838, -7830, -7823, -7816, -7808, -7800, -7793, -7785, | |||
| -7777, -7769, -7761, -7753, -7745, -7737, -7728, -7720, | |||
| -7712, -7703, -7695, -7686, -7677, -7668, -7660, -7651, | |||
| -7642, -7633, -7623, -7614, -7605, -7596, -7586, -7577, | |||
| -7567, -7557, -7548, -7538, -7528, -7518, -7508, -7498, | |||
| -7488, -7478, -7467, -7457, -7446, -7436, -7425, -7415, | |||
| -7404, -7393, -7382, -7372, -7361, -7349, -7338, -7327, | |||
| -7316, -7305, -7293, -7282, -7270, -7259, -7247, -7235, | |||
| -7223, -7211, -7199, -7187, -7175, -7163, -7151, -7139, | |||
| -7126, -7114, -7101, -7089, -7076, -7064, -7051, -7038, | |||
| -7025, -7012, -6999, -6986, -6973, -6960, -6946, -6933, | |||
| -6920, -6906, -6893, -6879, -6865, -6852, -6838, -6824, | |||
| -6810, -6796, -6782, -6768, -6754, -6739, -6725, -6711, | |||
| -6696, -6682, -6667, -6653, -6638, -6623, -6608, -6594, | |||
| -6579, -6564, -6549, -6533, -6518, -6503, -6488, -6472, | |||
| -6457, -6441, -6426, -6410, -6395, -6379, -6363, -6347, | |||
| -6331, -6315, -6299, -6283, -6267, -6251, -6235, -6218, | |||
| -6202, -6185, -6169, -6152, -6136, -6119, -6102, -6085, | |||
| -6069, -6052, -6035, -6018, -6001, -5984, -5966, -5949, | |||
| -5932, -5914, -5897, -5880, -5862, -5844, -5827, -5809, | |||
| -5791, -5774, -5756, -5738, -5720, -5702, -5684, -5666, | |||
| -5648, -5629, -5611, -5593, -5574, -5556, -5537, -5519, | |||
| -5500, -5482, -5463, -5444, -5425, -5406, -5388, -5369, | |||
| -5350, -5331, -5311, -5292, -5273, -5254, -5235, -5215, | |||
| -5196, -5176, -5157, -5137, -5118, -5098, -5078, -5059, | |||
| -5039, -5019, -4999, -4979, -4959, -4939, -4919, -4899, | |||
| -4879, -4859, -4838, -4818, -4798, -4777, -4757, -4736, | |||
| -4716, -4695, -4675, -4654, -4633, -4613, -4592, -4571, | |||
| -4550, -4529, -4508, -4487, -4466, -4445, -4424, -4403, | |||
| -4382, -4360, -4339, -4318, -4296, -4275, -4254, -4232, | |||
| -4211, -4189, -4167, -4146, -4124, -4102, -4080, -4059, | |||
| -4037, -4015, -3993, -3971, -3949, -3927, -3905, -3883, | |||
| -3861, -3839, -3816, -3794, -3772, -3749, -3727, -3705, | |||
| -3682, -3660, -3637, -3615, -3592, -3570, -3547, -3524, | |||
| -3502, -3479, -3456, -3433, -3410, -3388, -3365, -3342, | |||
| -3319, -3296, -3273, -3250, -3227, -3204, -3180, -3157, | |||
| -3134, -3111, -3088, -3064, -3041, -3018, -2994, -2971, | |||
| -2947, -2924, -2900, -2877, -2853, -2830, -2806, -2783, | |||
| -2759, -2735, -2712, -2688, -2664, -2640, -2617, -2593, | |||
| -2569, -2545, -2521, -2497, -2473, -2449, -2425, -2401, | |||
| -2377, -2353, -2329, -2305, -2281, -2257, -2233, -2208, | |||
| -2184, -2160, -2136, -2111, -2087, -2063, -2038, -2014, | |||
| -1990, -1965, -1941, -1917, -1892, -1868, -1843, -1819, | |||
| -1794, -1770, -1745, -1721, -1696, -1671, -1647, -1622, | |||
| -1597, -1573, -1548, -1523, -1499, -1474, -1449, -1425, | |||
| -1400, -1375, -1350, -1326, -1301, -1276, -1251, -1226, | |||
| -1201, -1177, -1152, -1127, -1102, -1077, -1052, -1027, | |||
| -1002, -977, -952, -927, -902, -877, -852, -827, | |||
| -802, -777, -752, -727, -702, -677, -652, -627, | |||
| -602, -577, -552, -527, -502, -477, -452, -427, | |||
| -401, -376, -351, -326, -301, -276, -251, -226, | |||
| -201, -175, -150, -125, -100, -75, -50, -25, | |||
| 0, 25, 50, 75, 100, 125, 150, 175, | |||
| 201, 226, 251, 276, 301, 326, 351, 376, | |||
| 401, 427, 452, 477, 502, 527, 552, 577, | |||
| 602, 627, 652, 677, 702, 727, 752, 777, | |||
| 802, 827, 852, 877, 902, 927, 952, 977, | |||
| 1002, 1027, 1052, 1077, 1102, 1127, 1152, 1177, | |||
| 1201, 1226, 1251, 1276, 1301, 1326, 1350, 1375, | |||
| 1400, 1425, 1449, 1474, 1499, 1523, 1548, 1573, | |||
| 1597, 1622, 1647, 1671, 1696, 1721, 1745, 1770, | |||
| 1794, 1819, 1843, 1868, 1892, 1917, 1941, 1965, | |||
| 1990, 2014, 2038, 2063, 2087, 2111, 2136, 2160, | |||
| 2184, 2208, 2233, 2257, 2281, 2305, 2329, 2353, | |||
| 2377, 2401, 2425, 2449, 2473, 2497, 2521, 2545, | |||
| 2569, 2593, 2617, 2640, 2664, 2688, 2712, 2735, | |||
| 2759, 2783, 2806, 2830, 2853, 2877, 2900, 2924, | |||
| 2947, 2971, 2994, 3018, 3041, 3064, 3088, 3111, | |||
| 3134, 3157, 3180, 3204, 3227, 3250, 3273, 3296, | |||
| 3319, 3342, 3365, 3388, 3410, 3433, 3456, 3479, | |||
| 3502, 3524, 3547, 3570, 3592, 3615, 3637, 3660, | |||
| 3682, 3705, 3727, 3749, 3772, 3794, 3816, 3839, | |||
| 3861, 3883, 3905, 3927, 3949, 3971, 3993, 4015, | |||
| 4037, 4059, 4080, 4102, 4124, 4146, 4167, 4189, | |||
| 4211, 4232, 4254, 4275, 4296, 4318, 4339, 4360, | |||
| 4382, 4403, 4424, 4445, 4466, 4487, 4508, 4529, | |||
| 4550, 4571, 4592, 4613, 4633, 4654, 4675, 4695, | |||
| 4716, 4736, 4757, 4777, 4798, 4818, 4838, 4859, | |||
| 4879, 4899, 4919, 4939, 4959, 4979, 4999, 5019, | |||
| 5039, 5059, 5078, 5098, 5118, 5137, 5157, 5176, | |||
| 5196, 5215, 5235, 5254, 5273, 5292, 5311, 5331, | |||
| 5350, 5369, 5388, 5406, 5425, 5444, 5463, 5482, | |||
| 5500, 5519, 5537, 5556, 5574, 5593, 5611, 5629, | |||
| 5648, 5666, 5684, 5702, 5720, 5738, 5756, 5774, | |||
| 5791, 5809, 5827, 5844, 5862, 5880, 5897, 5914, | |||
| 5932, 5949, 5966, 5984, 6001, 6018, 6035, 6052, | |||
| 6069, 6085, 6102, 6119, 6136, 6152, 6169, 6185, | |||
| 6202, 6218, 6235, 6251, 6267, 6283, 6299, 6315, | |||
| 6331, 6347, 6363, 6379, 6395, 6410, 6426, 6441, | |||
| 6457, 6472, 6488, 6503, 6518, 6533, 6549, 6564, | |||
| 6579, 6594, 6608, 6623, 6638, 6653, 6667, 6682, | |||
| 6696, 6711, 6725, 6739, 6754, 6768, 6782, 6796, | |||
| 6810, 6824, 6838, 6852, 6865, 6879, 6893, 6906, | |||
| 6920, 6933, 6946, 6960, 6973, 6986, 6999, 7012, | |||
| 7025, 7038, 7051, 7064, 7076, 7089, 7101, 7114, | |||
| 7126, 7139, 7151, 7163, 7175, 7187, 7199, 7211, | |||
| 7223, 7235, 7247, 7259, 7270, 7282, 7293, 7305, | |||
| 7316, 7327, 7338, 7349, 7361, 7372, 7382, 7393, | |||
| 7404, 7415, 7425, 7436, 7446, 7457, 7467, 7478, | |||
| 7488, 7498, 7508, 7518, 7528, 7538, 7548, 7557, | |||
| 7567, 7577, 7586, 7596, 7605, 7614, 7623, 7633, | |||
| 7642, 7651, 7660, 7668, 7677, 7686, 7695, 7703, | |||
| 7712, 7720, 7728, 7737, 7745, 7753, 7761, 7769, | |||
| 7777, 7785, 7793, 7800, 7808, 7816, 7823, 7830, | |||
| 7838, 7845, 7852, 7859, 7866, 7873, 7880, 7887, | |||
| 7894, 7900, 7907, 7914, 7920, 7926, 7933, 7939, | |||
| 7945, 7951, 7957, 7963, 7969, 7975, 7980, 7986, | |||
| 7991, 7997, 8002, 8008, 8013, 8018, 8023, 8028, | |||
| 8033, 8038, 8043, 8047, 8052, 8057, 8061, 8066, | |||
| 8070, 8074, 8078, 8082, 8086, 8090, 8094, 8098, | |||
| 8102, 8105, 8109, 8113, 8116, 8119, 8123, 8126, | |||
| 8129, 8132, 8135, 8138, 8141, 8143, 8146, 8149, | |||
| 8151, 8153, 8156, 8158, 8160, 8162, 8164, 8166, | |||
| 8168, 8170, 8172, 8174, 8175, 8177, 8178, 8179, | |||
| 8181, 8182, 8183, 8184, 8185, 8186, 8187, 8187, | |||
| 8188, 8189, 8189, 8190, 8190, 8190, 8190, 8190, | |||
| 8191, 8190, 8190, 8190, 8190, 8190, 8189, 8189, | |||
| 8188, 8187, 8187, 8186, 8185, 8184, 8183, 8182, | |||
| 8181, 8179, 8178, 8177, 8175, 8174, 8172, 8170, | |||
| 8168, 8166, 8164, 8162, 8160, 8158, 8156, 8153, | |||
| 8151, 8149, 8146, 8143, 8141, 8138, 8135, 8132, | |||
| 8129, 8126, 8123, 8119, 8116, 8113, 8109, 8105, | |||
| 8102, 8098, 8094, 8090, 8086, 8082, 8078, 8074, | |||
| 8070, 8066, 8061, 8057, 8052, 8047, 8043, 8038, | |||
| 8033, 8028, 8023, 8018, 8013, 8008, 8002, 7997, | |||
| 7991, 7986, 7980, 7975, 7969, 7963, 7957, 7951, | |||
| 7945, 7939, 7933, 7926, 7920, 7914, 7907, 7900, | |||
| 7894, 7887, 7880, 7873, 7866, 7859, 7852, 7845, | |||
| 7838, 7830, 7823, 7816, 7808, 7800, 7793, 7785, | |||
| 7777, 7769, 7761, 7753, 7745, 7737, 7728, 7720, | |||
| 7712, 7703, 7695, 7686, 7677, 7668, 7660, 7651, | |||
| 7642, 7633, 7623, 7614, 7605, 7596, 7586, 7577, | |||
| 7567, 7557, 7548, 7538, 7528, 7518, 7508, 7498, | |||
| 7488, 7478, 7467, 7457, 7446, 7436, 7425, 7415, | |||
| 7404, 7393, 7382, 7372, 7361, 7349, 7338, 7327, | |||
| 7316, 7305, 7293, 7282, 7270, 7259, 7247, 7235, | |||
| 7223, 7211, 7199, 7187, 7175, 7163, 7151, 7139, | |||
| 7126, 7114, 7101, 7089, 7076, 7064, 7051, 7038, | |||
| 7025, 7012, 6999, 6986, 6973, 6960, 6946, 6933, | |||
| 6920, 6906, 6893, 6879, 6865, 6852, 6838, 6824, | |||
| 6810, 6796, 6782, 6768, 6754, 6739, 6725, 6711, | |||
| 6696, 6682, 6667, 6653, 6638, 6623, 6608, 6594, | |||
| 6579, 6564, 6549, 6533, 6518, 6503, 6488, 6472, | |||
| 6457, 6441, 6426, 6410, 6395, 6379, 6363, 6347, | |||
| 6331, 6315, 6299, 6283, 6267, 6251, 6235, 6218, | |||
| 6202, 6185, 6169, 6152, 6136, 6119, 6102, 6085, | |||
| 6069, 6052, 6035, 6018, 6001, 5984, 5966, 5949, | |||
| 5932, 5914, 5897, 5880, 5862, 5844, 5827, 5809, | |||
| 5791, 5774, 5756, 5738, 5720, 5702, 5684, 5666, | |||
| 5648, 5629, 5611, 5593, 5574, 5556, 5537, 5519, | |||
| 5500, 5482, 5463, 5444, 5425, 5406, 5388, 5369, | |||
| 5350, 5331, 5311, 5292, 5273, 5254, 5235, 5215, | |||
| 5196, 5176, 5157, 5137, 5118, 5098, 5078, 5059, | |||
| 5039, 5019, 4999, 4979, 4959, 4939, 4919, 4899, | |||
| 4879, 4859, 4838, 4818, 4798, 4777, 4757, 4736, | |||
| 4716, 4695, 4675, 4654, 4633, 4613, 4592, 4571, | |||
| 4550, 4529, 4508, 4487, 4466, 4445, 4424, 4403, | |||
| 4382, 4360, 4339, 4318, 4296, 4275, 4254, 4232, | |||
| 4211, 4189, 4167, 4146, 4124, 4102, 4080, 4059, | |||
| 4037, 4015, 3993, 3971, 3949, 3927, 3905, 3883, | |||
| 3861, 3839, 3816, 3794, 3772, 3749, 3727, 3705, | |||
| 3682, 3660, 3637, 3615, 3592, 3570, 3547, 3524, | |||
| 3502, 3479, 3456, 3433, 3410, 3388, 3365, 3342, | |||
| 3319, 3296, 3273, 3250, 3227, 3204, 3180, 3157, | |||
| 3134, 3111, 3088, 3064, 3041, 3018, 2994, 2971, | |||
| 2947, 2924, 2900, 2877, 2853, 2830, 2806, 2783, | |||
| 2759, 2735, 2712, 2688, 2664, 2640, 2617, 2593, | |||
| 2569, 2545, 2521, 2497, 2473, 2449, 2425, 2401, | |||
| 2377, 2353, 2329, 2305, 2281, 2257, 2233, 2208, | |||
| 2184, 2160, 2136, 2111, 2087, 2063, 2038, 2014, | |||
| 1990, 1965, 1941, 1917, 1892, 1868, 1843, 1819, | |||
| 1794, 1770, 1745, 1721, 1696, 1671, 1647, 1622, | |||
| 1597, 1573, 1548, 1523, 1499, 1474, 1449, 1425, | |||
| 1400, 1375, 1350, 1326, 1301, 1276, 1251, 1226, | |||
| 1201, 1177, 1152, 1127, 1102, 1077, 1052, 1027, | |||
| 1002, 977, 952, 927, 902, 877, 852, 827, | |||
| 802, 777, 752, 727, 702, 677, 652, 627, | |||
| 602, 577, 552, 527, 502, 477, 452, 427, | |||
| 401, 376, 351, 326, 301, 276, 251, 226, | |||
| 201, 175, 150, 125, 100, 75, 50, 25, | |||
| }; | |||
| #ifdef __cplusplus | |||
| } | |||
| @@ -96,9 +96,9 @@ static int dispatch_audio(short* outbuf, int length, espeak_EVENT* event) | |||
| #ifdef DEBUG_ENABLED | |||
| SHOW("*** dispatch_audio > uid=%d, [write=%p (%d bytes)], sample=%d, a_wave_can_be_played = %d\n", | |||
| (event) ? event->unique_identifier : 0, wave_test_get_write_buffer(), 2*length, | |||
| (event) ? event->sample : 0, | |||
| a_wave_can_be_played); | |||
| (event) ? event->unique_identifier : 0, wave_test_get_write_buffer(), 2*length, | |||
| (event) ? event->sample : 0, | |||
| a_wave_can_be_played); | |||
| #endif | |||
| switch(my_mode) | |||
| @@ -204,7 +204,7 @@ static int create_events(short* outbuf, int length, espeak_EVENT* event, uint32_ | |||
| { | |||
| event = NULL; | |||
| } | |||
| else | |||
| else | |||
| { | |||
| event = event_list + i; | |||
| #ifdef DEBUG_ENABLED | |||
| @@ -245,7 +245,7 @@ int sync_espeak_terminated_msg( uint32_t unique_identifier, void* user_data) | |||
| espeak_ERROR a_error = event_declare(event_list); | |||
| if (a_error != EE_BUFFER_FULL) | |||
| { | |||
| break; | |||
| break; | |||
| } | |||
| SHOW_TIME("sync_espeak_terminated_msg > EE_BUFFER_FULL\n"); | |||
| usleep(10000); | |||
| @@ -269,7 +269,7 @@ static void select_output(espeak_AUDIO_OUTPUT output_type) | |||
| my_mode = output_type; | |||
| my_audio = NULL; | |||
| synchronous_mode = 1; | |||
| option_waveout = 1; // inhibit portaudio callback from wavegen.cpp | |||
| option_waveout = 1; // inhibit portaudio callback from wavegen.cpp | |||
| out_samplerate = 0; | |||
| switch(my_mode) | |||
| @@ -431,7 +431,7 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text, | |||
| ENTER("Synthesize"); | |||
| if (text) | |||
| { | |||
| SHOW("Synthesize > uid=%d, flags=%d, >>>text=%s<<<\n", unique_identifier, flags, text); | |||
| SHOW("Synthesize > uid=%d, flags=%d, >>>text=%s<<<\n", unique_identifier, flags, text); | |||
| } | |||
| #endif | |||
| @@ -461,7 +461,7 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text, | |||
| if(my_mode == AUDIO_OUTPUT_SYNCH_PLAYBACK) | |||
| { | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| #ifdef PLATFORM_WINDOWS | |||
| Sleep(300); // 0.3s | |||
| @@ -482,7 +482,7 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text, | |||
| return(EE_OK); | |||
| } | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| #ifdef DEBUG_ENABLED | |||
| SHOW("Synthesize > %s\n","for (next)"); | |||
| @@ -554,16 +554,17 @@ static espeak_ERROR Synthesize(unsigned int unique_identifier, const void *text, | |||
| #ifdef DEBUG_ENABLED | |||
| static const char* label[] = { | |||
| "END_OF_EVENT_LIST", | |||
| "WORD", | |||
| "SENTENCE", | |||
| "MARK", | |||
| "PLAY", | |||
| "END", | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" }; | |||
| "END_OF_EVENT_LIST", | |||
| "WORD", | |||
| "SENTENCE", | |||
| "MARK", | |||
| "PLAY", | |||
| "END", | |||
| "MSG_TERMINATED", | |||
| "PHONEME", | |||
| "SAMPLERATE", | |||
| "??" | |||
| }; | |||
| #endif | |||
| @@ -591,8 +592,8 @@ void MarkerEvent(int type, unsigned int char_position, int value, int value2, un | |||
| #ifdef DEBUG_ENABLED | |||
| SHOW("MarkerEvent > count_samples=%d, out_ptr=%x, out_start=0x%x\n",count_samples, out_ptr, out_start); | |||
| SHOW("*** MarkerEvent > type=%s, uid=%d, text_pos=%d, length=%d, audio_position=%d, sample=%d\n", | |||
| label[ep->type], ep->unique_identifier, ep->text_position, ep->length, | |||
| ep->audio_position, ep->sample); | |||
| label[ep->type], ep->unique_identifier, ep->text_position, ep->length, | |||
| ep->audio_position, ep->sample); | |||
| #endif | |||
| if((type == espeakEVENT_MARK) || (type == espeakEVENT_PLAY)) | |||
| @@ -615,8 +616,8 @@ void MarkerEvent(int type, unsigned int char_position, int value, int value2, un | |||
| espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, size_t size, | |||
| unsigned int position, espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, void* user_data) | |||
| unsigned int position, espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, void* user_data) | |||
| { | |||
| #ifdef DEBUG_ENABLED | |||
| @@ -634,20 +635,20 @@ espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, | |||
| saved_parameters[i] = param_stack[0].parameter[i]; | |||
| switch(position_type) | |||
| { | |||
| case POS_CHARACTER: | |||
| skip_characters = position; | |||
| break; | |||
| { | |||
| case POS_CHARACTER: | |||
| skip_characters = position; | |||
| break; | |||
| case POS_WORD: | |||
| skip_words = position; | |||
| break; | |||
| case POS_WORD: | |||
| skip_words = position; | |||
| break; | |||
| case POS_SENTENCE: | |||
| skip_sentences = position; | |||
| break; | |||
| case POS_SENTENCE: | |||
| skip_sentences = position; | |||
| break; | |||
| } | |||
| } | |||
| if(skip_characters || skip_words || skip_sentences) | |||
| skipping_text = 1; | |||
| @@ -666,8 +667,8 @@ espeak_ERROR sync_espeak_Synth(unsigned int unique_identifier, const void *text, | |||
| espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void *text, size_t size, | |||
| const char *index_mark, unsigned int end_position, | |||
| unsigned int flags, void* user_data) | |||
| const char *index_mark, unsigned int end_position, | |||
| unsigned int flags, void* user_data) | |||
| { | |||
| espeak_ERROR aStatus; | |||
| @@ -677,10 +678,10 @@ espeak_ERROR sync_espeak_Synth_Mark(unsigned int unique_identifier, const void * | |||
| my_user_data = user_data; | |||
| if(index_mark != NULL) | |||
| { | |||
| { | |||
| strncpy0(skip_marker, index_mark, sizeof(skip_marker)); | |||
| skipping_text = 1; | |||
| } | |||
| } | |||
| end_character_position = end_position; | |||
| @@ -769,7 +770,7 @@ ESPEAK_API void espeak_SetPhonemeCallback(int (* PhonemeCallback)(const char*)) | |||
| ESPEAK_API int espeak_Initialize(espeak_AUDIO_OUTPUT output_type, int buf_length, const char *path, int options) | |||
| { | |||
| ENTER("espeak_Initialize"); | |||
| ENTER("espeak_Initialize"); | |||
| int param; | |||
| // It seems that the wctype functions don't work until the locale has been set | |||
| @@ -831,16 +832,16 @@ ENTER("espeak_Initialize"); | |||
| fifo_init(); | |||
| #endif | |||
| return(samplerate); | |||
| return(samplerate); | |||
| } | |||
| ESPEAK_API espeak_ERROR espeak_Synth(const void *text, size_t size, | |||
| unsigned int position, | |||
| espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, | |||
| unsigned int* unique_identifier, void* user_data) | |||
| unsigned int position, | |||
| espeak_POSITION_TYPE position_type, | |||
| unsigned int end_position, unsigned int flags, | |||
| unsigned int* unique_identifier, void* user_data) | |||
| { | |||
| #ifdef DEBUG_ENABLED | |||
| ENTER("espeak_Synth"); | |||
| @@ -901,15 +902,15 @@ ESPEAK_API espeak_ERROR espeak_Synth(const void *text, size_t size, | |||
| ESPEAK_API espeak_ERROR espeak_Synth_Mark(const void *text, size_t size, | |||
| const char *index_mark, | |||
| unsigned int end_position, | |||
| unsigned int flags, | |||
| unsigned int* unique_identifier, | |||
| void* user_data) | |||
| const char *index_mark, | |||
| unsigned int end_position, | |||
| unsigned int flags, | |||
| unsigned int* unique_identifier, | |||
| void* user_data) | |||
| { | |||
| #ifdef DEBUG_ENABLED | |||
| ENTER("espeak_Synth_Mark"); | |||
| SHOW("espeak_Synth_Mark > index_mark=%s, end_position=%d, flags=%d, text=%s\n", index_mark, end_position, flags, text); | |||
| ENTER("espeak_Synth_Mark"); | |||
| SHOW("espeak_Synth_Mark > index_mark=%s, end_position=%d, flags=%d, text=%s\n", index_mark, end_position, flags, text); | |||
| #endif | |||
| espeak_ERROR a_error=EE_OK; | |||
| @@ -935,7 +936,7 @@ ESPEAK_API espeak_ERROR espeak_Synth_Mark(const void *text, size_t size, | |||
| #ifdef USE_ASYNC | |||
| // Create the mark command | |||
| t_espeak_command* c1 = create_espeak_mark(text, size, index_mark, end_position, | |||
| flags, user_data); | |||
| flags, user_data); | |||
| // Retrieve the unique identifier | |||
| *unique_identifier = c1->u.my_mark.unique_identifier; | |||
| @@ -993,14 +994,14 @@ ESPEAK_API espeak_ERROR espeak_Key(const char *key) | |||
| } | |||
| #endif | |||
| return a_error; | |||
| return a_error; | |||
| } | |||
| ESPEAK_API espeak_ERROR espeak_Char(wchar_t character) | |||
| { | |||
| ENTER("espeak_Char"); | |||
| // is there a system resource of character names per language? | |||
| ENTER("espeak_Char"); | |||
| // is there a system resource of character names per language? | |||
| if(f_logespeak) | |||
| { | |||
| @@ -1032,7 +1033,7 @@ ESPEAK_API espeak_ERROR espeak_Char(wchar_t character) | |||
| ESPEAK_API espeak_ERROR espeak_SetVoiceByName(const char *name) | |||
| { | |||
| ENTER("espeak_SetVoiceByName"); | |||
| ENTER("espeak_SetVoiceByName"); | |||
| return(SetVoiceByName(name)); | |||
| } | |||
| @@ -1041,7 +1042,7 @@ ESPEAK_API espeak_ERROR espeak_SetVoiceByName(const char *name) | |||
| ESPEAK_API espeak_ERROR espeak_SetVoiceByProperties(espeak_VOICE *voice_selector) | |||
| { | |||
| ENTER("espeak_SetVoiceByProperties"); | |||
| ENTER("espeak_SetVoiceByProperties"); | |||
| return(SetVoiceByProperties(voice_selector)); | |||
| } | |||
| @@ -1064,7 +1065,7 @@ ESPEAK_API int espeak_GetParameter(espeak_PARAMETER parameter, int current) | |||
| ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int value, int relative) | |||
| { | |||
| ENTER("espeak_SetParameter"); | |||
| ENTER("espeak_SetParameter"); | |||
| if(f_logespeak) | |||
| { | |||
| @@ -1096,8 +1097,8 @@ ESPEAK_API espeak_ERROR espeak_SetParameter(espeak_PARAMETER parameter, int valu | |||
| ESPEAK_API espeak_ERROR espeak_SetPunctuationList(const wchar_t *punctlist) | |||
| { | |||
| ENTER("espeak_SetPunctuationList"); | |||
| // Set the list of punctuation which are spoken for "some". | |||
| ENTER("espeak_SetPunctuationList"); | |||
| // Set the list of punctuation which are spoken for "some". | |||
| #ifdef USE_ASYNC | |||
| espeak_ERROR a_error; | |||
| @@ -1136,7 +1137,7 @@ ESPEAK_API void espeak_SetPhonemeTrace(int phonememode, FILE *stream) | |||
| bits 8-23: separator character, between phoneme names | |||
| stream output stream for the phoneme symbols (and trace). If stream=NULL then it uses stdout. | |||
| */ | |||
| */ | |||
| option_phonemes = phonememode; | |||
| f_trans = stream; | |||
| if(stream == NULL) | |||
| @@ -1149,9 +1150,9 @@ ESPEAK_API const char *espeak_TextToPhonemes(const void **textptr, int textmode, | |||
| { | |||
| /* phoneme_mode | |||
| bit 1: 0=eSpeak's ascii phoneme names, 1= International Phonetic Alphabet (as UTF-8 characters). | |||
| bit 7: use (bits 8-23) as a tie within multi-letter phonemes names | |||
| bits 8-23: separator character, between phoneme names | |||
| */ | |||
| bit 7: use (bits 8-23) as a tie within multi-letter phonemes names | |||
| bits 8-23: separator character, between phoneme names | |||
| */ | |||
| option_multibyte = textmode & 7; | |||
| *textptr = TranslateClause(translator, NULL, *textptr, NULL, NULL); | |||
| @@ -44,11 +44,11 @@ int pk_select; | |||
| #define PEAKSHAPEW 256 | |||
| static int default_freq[N_PEAKS] = | |||
| {200,500,1200,3000,3500,4000,6900,7800,9000}; | |||
| {200,500,1200,3000,3500,4000,6900,7800,9000}; | |||
| static int default_width[N_PEAKS] = | |||
| {750,500,550,550,600,700,700,700,700}; | |||
| {750,500,550,550,600,700,700,700,700}; | |||
| static int default_klt_bw[N_PEAKS] = | |||
| {89,90,140,260,260,260,500,500,500}; | |||
| {89,90,140,260,260,260,500,500,500}; | |||
| static double read_double(FILE *stream) | |||
| { | |||
| @@ -67,7 +67,7 @@ float polint(float xa[],float ya[],int n,float x) | |||
| dif=fabs(x-xa[1]); | |||
| for(i=1;i<=n;i++){ | |||
| for(i=1; i<=n; i++) { | |||
| if((dift=fabs(x-xa[i])) < dif) { | |||
| ns=i; | |||
| dif=dift; | |||
| @@ -76,8 +76,8 @@ float polint(float xa[],float ya[],int n,float x) | |||
| d[i]=ya[i]; | |||
| } | |||
| y=ya[ns--]; | |||
| for(m=1;m<n;m++) { | |||
| for(i=1;i<=n-m;i++) { | |||
| for(m=1; m<n; m++) { | |||
| for(i=1; i<=n-m; i++) { | |||
| ho=xa[i]-x; | |||
| hp=xa[i+m]-x; | |||
| w=c[i+1]-d[i]; | |||
| @@ -108,7 +108,7 @@ static void PeaksZero(peak_t *sp, peak_t *zero) | |||
| static SpectFrame *SpectFrameCreate() | |||
| { | |||
| int ix; | |||
| int ix; | |||
| SpectFrame *frame; | |||
| frame = malloc(sizeof(SpectFrame)); | |||
| @@ -123,7 +123,7 @@ static SpectFrame *SpectFrameCreate() | |||
| frame->length_adjust = 0; | |||
| for(ix=0; ix<N_PEAKS; ix++) | |||
| { | |||
| { | |||
| frame->formants[ix].freq = 0; | |||
| frame->peaks[ix].pkfreq = default_freq[ix]; | |||
| frame->peaks[ix].pkheight = 0; | |||
| @@ -132,7 +132,7 @@ static SpectFrame *SpectFrameCreate() | |||
| frame->peaks[ix].klt_bw = default_klt_bw[ix]; | |||
| frame->peaks[ix].klt_ap = 0; | |||
| frame->peaks[ix].klt_bp = default_klt_bw[ix]; | |||
| } | |||
| } | |||
| memset(frame->klatt_param, 0, sizeof(frame->klatt_param)); | |||
| frame->klatt_param[KLATT_AV] = 59; | |||
| @@ -212,7 +212,7 @@ int LoadFrame(SpectFrame *frame, FILE *stream, int file_format_type) | |||
| spect_data[ix] = x; | |||
| if(x > frame->max_y) frame->max_y = x; | |||
| } | |||
| frame->spect = spect_data; | |||
| frame->spect = spect_data; | |||
| return(0); | |||
| } | |||
| @@ -255,12 +255,12 @@ SpectSeq *SpectSeqCreate() | |||
| spect->numframes = 0; | |||
| spect->frames = NULL; | |||
| spect->name = NULL; | |||
| pk_select = 1; | |||
| spect->grid = 1; | |||
| spect->duration = 0; | |||
| spect->pitch1 = 0; | |||
| spect->pitch2 = 0; | |||
| spect->duration = 0; | |||
| spect->pitch1 = 0; | |||
| spect->pitch2 = 0; | |||
| spect->bass_reduction = 0; | |||
| spect->max_x = 3000; | |||
| @@ -289,11 +289,11 @@ void SpectSeqDestroy(SpectSeq *spect) | |||
| static float GetFrameLength(SpectSeq *spect, int frame) | |||
| { | |||
| int ix; | |||
| float adjust=0; | |||
| int ix; | |||
| float adjust=0; | |||
| if(frame >= spect->numframes-1) return(0); | |||
| for(ix=frame+1; ix<spect->numframes-1; ix++) | |||
| { | |||
| if(spect->frames[ix]->keyframe) break; // reached next keyframe | |||
| @@ -324,17 +324,17 @@ int LoadSpectSeq(SpectSeq *spect, const char *filename) | |||
| if((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEQ)) | |||
| { | |||
| spect->file_format = 0; // eSpeak formants | |||
| spect->file_format = 0; // eSpeak formants | |||
| } | |||
| else | |||
| if((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSEK)) | |||
| { | |||
| spect->file_format = 1; // formants for Klatt synthesizer | |||
| spect->file_format = 1; // formants for Klatt synthesizer | |||
| } | |||
| else | |||
| if((id1 == FILEID1_SPECTSEQ) && (id2 == FILEID2_SPECTSQ2)) | |||
| { | |||
| spect->file_format = 2; // formants for Klatt synthesizer | |||
| spect->file_format = 2; // formants for Klatt synthesizer | |||
| } | |||
| else | |||
| { | |||
| @@ -392,7 +392,7 @@ int LoadSpectSeq(SpectSeq *spect, const char *filename) | |||
| spect->max_y = frame->max_y; | |||
| if(frame->nx * frame->dx > spect->max_x) spect->max_x = (int)(frame->nx * frame->dx); | |||
| } | |||
| spect->max_x = 9000; // disable auto-xscaling | |||
| spect->max_x = 9000; // disable auto-xscaling | |||
| frame_width = (int)((FRAME_WIDTH*spect->max_x)/MAX_DISPLAY_FREQ); | |||
| if(frame_width > FRAME_WIDTH) frame_width = FRAME_WIDTH; | |||
| @@ -407,10 +407,10 @@ spect->max_x = 9000; // disable auto-xscaling | |||
| spect->pitch2 = spect->pitchenv.pitch2; | |||
| spect->duration = (int)(spect->frames[spect->numframes-1]->time * 1000); | |||
| if(spect->max_y < 400) | |||
| spect->max_y = 200; | |||
| else | |||
| spect->max_y = 29000; // disable auto height scaling | |||
| if(spect->max_y < 400) | |||
| spect->max_y = 200; | |||
| else | |||
| spect->max_y = 29000; // disable auto height scaling | |||
| for(ix=0; ix<spect->numframes; ix++) | |||
| { | |||
| @@ -95,37 +95,37 @@ typedef struct | |||
| float length_adjust; | |||
| double rms; | |||
| float time; | |||
| float pitch; | |||
| float length; | |||
| float dx; | |||
| unsigned short nx; | |||
| short markers; | |||
| int max_y; | |||
| USHORT *spect; // sqrt of harmonic amplitudes, 1-nx at 'pitch' | |||
| short klatt_param[N_KLATTP2]; | |||
| formant_t formants[N_PEAKS]; // this is just the estimate given by Praat | |||
| peak_t peaks[N_PEAKS]; | |||
| float time; | |||
| float pitch; | |||
| float length; | |||
| float dx; | |||
| unsigned short nx; | |||
| short markers; | |||
| int max_y; | |||
| USHORT *spect; // sqrt of harmonic amplitudes, 1-nx at 'pitch' | |||
| short klatt_param[N_KLATTP2]; | |||
| formant_t formants[N_PEAKS]; // this is just the estimate given by Praat | |||
| peak_t peaks[N_PEAKS]; | |||
| } SpectFrame; | |||
| double GetFrameRms(SpectFrame *frame, int amp); | |||
| typedef struct | |||
| { | |||
| int numframes; | |||
| int numframes; | |||
| short amplitude; | |||
| int spare; | |||
| int spare; | |||
| char *name; | |||
| SpectFrame **frames; | |||
| PitchEnvelope pitchenv; | |||
| int pitch1; | |||
| int pitch2; | |||
| int duration; | |||
| int grid; | |||
| int bass_reduction; | |||
| int pitch1; | |||
| int pitch2; | |||
| int duration; | |||
| int grid; | |||
| int bass_reduction; | |||
| int max_x; | |||
| short max_y; | |||
| int file_format; | |||
| @@ -53,15 +53,15 @@ extern "C" | |||
| #endif | |||
| typedef unsigned short USHORT; | |||
| typedef unsigned char UCHAR; | |||
| typedef unsigned char UCHAR; | |||
| typedef double DOUBLEX; | |||
| typedef unsigned long long64; // use this for conversion between pointers and integers | |||
| typedef struct { | |||
| const char *mnem; | |||
| int value; | |||
| const char *mnem; | |||
| int value; | |||
| } MNEM_TAB; | |||
| int LookupMnem(MNEM_TAB *table, const char *string); | |||
| @@ -49,25 +49,25 @@ typedef void (WINAPI *PROCVV)(void); | |||
| typedef void (WINAPI *PROCVI)(int); | |||
| typedef void (WINAPI *PROCVF)(float); | |||
| typedef int (WINAPI *PROCIV)(); | |||
| typedef int (WINAPI *PROCIC) (char *); | |||
| typedef int (WINAPI *PROCIC)(char *); | |||
| typedef int (WINAPI *PROCISI)(short *,int); | |||
| typedef char* (WINAPI *PROCVCI)(char *,int); | |||
| PROCIC init_MBR; | |||
| PROCIC write_MBR; | |||
| PROCIV flush_MBR; | |||
| PROCISI read_MBR; | |||
| PROCVV close_MBR; | |||
| PROCVV reset_MBR; | |||
| PROCIV lastError_MBR; | |||
| PROCVCI lastErrorStr_MBR; | |||
| PROCVI setNoError_MBR; | |||
| PROCIV getFreq_MBR; | |||
| PROCVF setVolumeRatio_MBR; | |||
| PROCIC init_MBR; | |||
| PROCIC write_MBR; | |||
| PROCIV flush_MBR; | |||
| PROCISI read_MBR; | |||
| PROCVV close_MBR; | |||
| PROCVV reset_MBR; | |||
| PROCIV lastError_MBR; | |||
| PROCVCI lastErrorStr_MBR; | |||
| PROCVI setNoError_MBR; | |||
| PROCIV getFreq_MBR; | |||
| PROCVF setVolumeRatio_MBR; | |||
| HINSTANCE hinstDllMBR = NULL; | |||
| HINSTANCE hinstDllMBR = NULL; | |||
| BOOL load_MBR() | |||
| @@ -77,16 +77,16 @@ BOOL load_MBR() | |||
| if ((hinstDllMBR=LoadLibraryA("mbrola.dll")) == 0) | |||
| return FALSE; | |||
| init_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"init_MBR"); | |||
| write_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"write_MBR"); | |||
| flush_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"flush_MBR"); | |||
| read_MBR =(PROCISI) GetProcAddress(hinstDllMBR,"read_MBR"); | |||
| close_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"close_MBR"); | |||
| reset_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"reset_MBR"); | |||
| lastError_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"lastError_MBR"); | |||
| lastErrorStr_MBR =(PROCVCI) GetProcAddress(hinstDllMBR,"lastErrorStr_MBR"); | |||
| setNoError_MBR =(PROCVI) GetProcAddress(hinstDllMBR,"setNoError_MBR"); | |||
| setVolumeRatio_MBR =(PROCVF) GetProcAddress(hinstDllMBR,"setVolumeRatio_MBR"); | |||
| init_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"init_MBR"); | |||
| write_MBR =(PROCIC) GetProcAddress(hinstDllMBR,"write_MBR"); | |||
| flush_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"flush_MBR"); | |||
| read_MBR =(PROCISI) GetProcAddress(hinstDllMBR,"read_MBR"); | |||
| close_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"close_MBR"); | |||
| reset_MBR =(PROCVV) GetProcAddress(hinstDllMBR,"reset_MBR"); | |||
| lastError_MBR =(PROCIV) GetProcAddress(hinstDllMBR,"lastError_MBR"); | |||
| lastErrorStr_MBR =(PROCVCI) GetProcAddress(hinstDllMBR,"lastErrorStr_MBR"); | |||
| setNoError_MBR =(PROCVI) GetProcAddress(hinstDllMBR,"setNoError_MBR"); | |||
| setVolumeRatio_MBR =(PROCVF) GetProcAddress(hinstDllMBR,"setVolumeRatio_MBR"); | |||
| return TRUE; | |||
| } | |||
| @@ -134,7 +134,7 @@ espeak_ERROR LoadMbrolaTable(const char *mbrola_voice, const char *phtrans, int | |||
| // usr/share/mbrola/xx, /usr/share/mbrola/xx/xx, /usr/share/mbrola/voices/xx | |||
| if(GetFileLength(path) <= 0) | |||
| { | |||
| sprintf(path,"/usr/share/mbrola/%s",mbrola_voice); | |||
| sprintf(path,"/usr/share/mbrola/%s",mbrola_voice); | |||
| if(GetFileLength(path) <= 0) | |||
| { | |||
| @@ -243,8 +243,8 @@ static int GetMbrName(PHONEME_LIST *plist, PHONEME_TAB *ph, PHONEME_TAB *ph_prev | |||
| other_ph = ph_next; | |||
| if((pr->next_phoneme == other_ph->mnemonic) || | |||
| ((pr->next_phoneme == 2) && (other_ph->type == phVOWEL)) || | |||
| ((pr->next_phoneme == '_') && (other_ph->type == phPAUSE))) | |||
| ((pr->next_phoneme == 2) && (other_ph->type == phVOWEL)) || | |||
| ((pr->next_phoneme == '_') && (other_ph->type == phPAUSE))) | |||
| { | |||
| found = 1; | |||
| } | |||
| @@ -74,7 +74,7 @@ static char *ReadPhFile(void *ptr, const char *fname, int *size) | |||
| { | |||
| FILE *f_in; | |||
| char *p; | |||
| unsigned int length; | |||
| unsigned int length; | |||
| char buf[sizeof(path_home)+40]; | |||
| sprintf(buf,"%s%c%s",path_home,PATHSEP,fname); | |||
| @@ -127,7 +127,7 @@ int LoadPhData(int *srate) | |||
| return(-1); | |||
| if((tunes = (TUNE *)ReadPhFile((void *)(tunes),"intonations",&length)) == NULL) | |||
| return(-1); | |||
| wavefile_data = (unsigned char *)phondata_ptr; | |||
| wavefile_data = (unsigned char *)phondata_ptr; | |||
| n_tunes = length / sizeof(TUNE); | |||
| // read the version number and sample rate from the first 8 bytes of phondata | |||
| @@ -166,8 +166,8 @@ int LoadPhData(int *srate) | |||
| if(phoneme_tab_number >= n_phoneme_tables) | |||
| phoneme_tab_number = 0; | |||
| if(srate != NULL) | |||
| *srate = rate; | |||
| if(srate != NULL) | |||
| *srate = rate; | |||
| return(result); | |||
| } | |||
| @@ -202,9 +202,9 @@ int PhonemeCode(unsigned int mnem) | |||
| int LookupPhonemeString(const char *string) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| unsigned char c; | |||
| unsigned int mnem; | |||
| unsigned int mnem; | |||
| // Pack up to 4 characters into a word | |||
| mnem = 0; | |||
| @@ -223,14 +223,14 @@ int LookupPhonemeString(const char *string) | |||
| frameref_t *LookupSpect(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, int *n_frames, PHONEME_LIST *plist) | |||
| { | |||
| int ix; | |||
| int nf; | |||
| int nf1; | |||
| int seq_break; | |||
| int ix; | |||
| int nf; | |||
| int nf1; | |||
| int seq_break; | |||
| frameref_t *frames; | |||
| int length1; | |||
| int length_std; | |||
| int length_factor; | |||
| int length1; | |||
| int length_std; | |||
| int length_factor; | |||
| SPECT_SEQ *seq, *seq2; | |||
| SPECT_SEQK *seqk, *seqk2; | |||
| frame_t *frame; | |||
| @@ -604,7 +604,7 @@ static int CountVowelPosition(PHONEME_LIST *plist) | |||
| { | |||
| int count = 0; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if(plist->ph->type == phVOWEL) | |||
| count++; | |||
| @@ -647,9 +647,9 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| if(which==6) | |||
| { | |||
| // the 'which' code is in the next instruction | |||
| p_prog++; | |||
| which = (*p_prog); | |||
| // the 'which' code is in the next instruction | |||
| p_prog++; | |||
| which = (*p_prog); | |||
| } | |||
| if(which==4) | |||
| @@ -665,37 +665,37 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| return(false); | |||
| } | |||
| if(which==6) | |||
| { | |||
| // next2PhW, not word boundary | |||
| if(plist[1].sourceix || plist[2].sourceix) | |||
| return(false); | |||
| } | |||
| switch(which) | |||
| { | |||
| case 0: // prevPh | |||
| case 5: // prevPhW | |||
| plist--; | |||
| check_endtype = 1; | |||
| break; | |||
| case 1: // thisPh | |||
| break; | |||
| case 2: // nextPh | |||
| case 4: // nextPhW | |||
| plist++; | |||
| break; | |||
| case 3: // next2Ph | |||
| case 6: // next2PhW | |||
| plist += 2; | |||
| break; | |||
| case 7: | |||
| { | |||
| // next2PhW, not word boundary | |||
| if(plist[1].sourceix || plist[2].sourceix) | |||
| return(false); | |||
| } | |||
| switch(which) | |||
| { | |||
| case 0: // prevPh | |||
| case 5: // prevPhW | |||
| plist--; | |||
| check_endtype = 1; | |||
| break; | |||
| case 1: // thisPh | |||
| break; | |||
| case 2: // nextPh | |||
| case 4: // nextPhW | |||
| plist++; | |||
| break; | |||
| case 3: // next2Ph | |||
| case 6: // next2PhW | |||
| plist += 2; | |||
| break; | |||
| case 7: | |||
| // nextVowel, not word boundary | |||
| for(which=1;;which++) | |||
| for(which=1;; which++) | |||
| { | |||
| if(plist[which].sourceix) | |||
| return(false); | |||
| @@ -707,12 +707,12 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| } | |||
| break; | |||
| case 8: // prevVowel in this word | |||
| if((worddata==NULL) || (worddata->prev_vowel.ph == NULL)) | |||
| return(false); // no previous vowel | |||
| plist = &(worddata->prev_vowel); | |||
| case 8: // prevVowel in this word | |||
| if((worddata==NULL) || (worddata->prev_vowel.ph == NULL)) | |||
| return(false); // no previous vowel | |||
| plist = &(worddata->prev_vowel); | |||
| check_endtype = 1; | |||
| break; | |||
| break; | |||
| case 9: // next3PhW | |||
| for(ix=1; ix<=3; ix++) | |||
| @@ -729,7 +729,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| plist-=2; | |||
| check_endtype = 1; | |||
| break; | |||
| } | |||
| } | |||
| if((which == 0) || (which == 5)) | |||
| { | |||
| @@ -816,7 +816,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| return(ph->type != phVOWEL); | |||
| case 11: // isFinalVowel | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| plist++; | |||
| // plist->ph = phoneme_tab[plist->phcode]; // Why was this line here?? It corrupts plist if we have language switching if phoneme_tab is wrong language | |||
| @@ -842,7 +842,7 @@ static bool InterpretCondition(Translator *tr, int control, PHONEME_LIST *plist, | |||
| return(false); // this is the first phoneme in the word, so no. | |||
| count = 0; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| plist--; | |||
| if(plist->ph->type == phVOWEL) | |||
| @@ -992,8 +992,8 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| if((worddata != NULL) && (plist->sourceix)) | |||
| { | |||
| // start of a word, reset word data | |||
| worddata->prev_vowel.ph = NULL; | |||
| // start of a word, reset word data | |||
| worddata->prev_vowel.ph = NULL; | |||
| } | |||
| memset(phdata, 0, sizeof(PHONEME_DATA)); | |||
| @@ -1137,7 +1137,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| } | |||
| } | |||
| prog--; | |||
| break; | |||
| break; | |||
| case 6: | |||
| // JUMP | |||
| @@ -1159,7 +1159,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| SwitchOnVowelType(plist, phdata, &prog, 3); | |||
| break; | |||
| } | |||
| break; | |||
| break; | |||
| case 9: | |||
| data = ((instn & 0xf) << 16) + prog[1]; | |||
| @@ -1233,7 +1233,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| phdata->sound_param[instn2] = param_sc; // sign extend | |||
| } | |||
| } | |||
| break; | |||
| break; | |||
| default: | |||
| InvalidInstn(ph,instn); | |||
| @@ -1253,21 +1253,21 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| } | |||
| } | |||
| if((worddata != NULL) && (plist->type == phVOWEL)) | |||
| { | |||
| memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); | |||
| } | |||
| plist->std_length = phdata->pd_param[i_SET_LENGTH]; | |||
| if(phdata->sound_addr[0] != 0) | |||
| { | |||
| plist->phontab_addr = phdata->sound_addr[0]; // FMT address | |||
| plist->sound_param = phdata->sound_param[0]; | |||
| } | |||
| else | |||
| { | |||
| plist->phontab_addr = phdata->sound_addr[1]; // WAV address | |||
| plist->sound_param = phdata->sound_param[1]; | |||
| if((worddata != NULL) && (plist->type == phVOWEL)) | |||
| { | |||
| memcpy(&worddata->prev_vowel, &plist[0], sizeof(PHONEME_LIST)); | |||
| } | |||
| plist->std_length = phdata->pd_param[i_SET_LENGTH]; | |||
| if(phdata->sound_addr[0] != 0) | |||
| { | |||
| plist->phontab_addr = phdata->sound_addr[0]; // FMT address | |||
| plist->sound_param = phdata->sound_param[0]; | |||
| } | |||
| else | |||
| { | |||
| plist->phontab_addr = phdata->sound_addr[1]; // WAV address | |||
| plist->sound_param = phdata->sound_param[1]; | |||
| } | |||
| } | |||
| @@ -46,18 +46,18 @@ char mbrola_name[20]; | |||
| SPEED_FACTORS speed; | |||
| static int last_pitch_cmd; | |||
| static int last_amp_cmd; | |||
| static int last_pitch_cmd; | |||
| static int last_amp_cmd; | |||
| static frame_t *last_frame; | |||
| static int last_wcmdq; | |||
| static int pitch_length; | |||
| static int amp_length; | |||
| static int modn_flags; | |||
| static int fmt_amplitude=0; | |||
| static int last_wcmdq; | |||
| static int pitch_length; | |||
| static int amp_length; | |||
| static int modn_flags; | |||
| static int fmt_amplitude=0; | |||
| static int syllable_start; | |||
| static int syllable_end; | |||
| static int syllable_centre; | |||
| static int syllable_start; | |||
| static int syllable_end; | |||
| static int syllable_centre; | |||
| static voice_t *new_voice=NULL; | |||
| @@ -78,7 +78,7 @@ static PHONEME_LIST next_pause; | |||
| const char *WordToString(unsigned int word) | |||
| { | |||
| // Convert a phoneme mnemonic word into a string | |||
| int ix; | |||
| int ix; | |||
| static char buf[5]; | |||
| for(ix=0; ix<4; ix++) | |||
| @@ -457,19 +457,20 @@ static void set_frame_rms(frame_t *fr, int new_rms) | |||
| int ix; | |||
| static const short sqrt_tab[200] = { | |||
| 0, 64, 90,110,128,143,156,169,181,192,202,212,221,230,239,247, | |||
| 256,263,271,278,286,293,300,306,313,320,326,332,338,344,350,356, | |||
| 362,367,373,378,384,389,394,399,404,409,414,419,424,429,434,438, | |||
| 443,448,452,457,461,465,470,474,478,483,487,491,495,499,503,507, | |||
| 512,515,519,523,527,531,535,539,543,546,550,554,557,561,565,568, | |||
| 572,576,579,583,586,590,593,596,600,603,607,610,613,617,620,623, | |||
| 627,630,633,636,640,643,646,649,652,655,658,662,665,668,671,674, | |||
| 677,680,683,686,689,692,695,698,701,704,706,709,712,715,718,721, | |||
| 724,726,729,732,735,738,740,743,746,749,751,754,757,759,762,765, | |||
| 768,770,773,775,778,781,783,786,789,791,794,796,799,801,804,807, | |||
| 809,812,814,817,819,822,824,827,829,832,834,836,839,841,844,846, | |||
| 849,851,853,856,858,861,863,865,868,870,872,875,877,879,882,884, | |||
| 886,889,891,893,896,898,900,902}; | |||
| 0, 64, 90,110,128,143,156,169,181,192,202,212,221,230,239,247, | |||
| 256,263,271,278,286,293,300,306,313,320,326,332,338,344,350,356, | |||
| 362,367,373,378,384,389,394,399,404,409,414,419,424,429,434,438, | |||
| 443,448,452,457,461,465,470,474,478,483,487,491,495,499,503,507, | |||
| 512,515,519,523,527,531,535,539,543,546,550,554,557,561,565,568, | |||
| 572,576,579,583,586,590,593,596,600,603,607,610,613,617,620,623, | |||
| 627,630,633,636,640,643,646,649,652,655,658,662,665,668,671,674, | |||
| 677,680,683,686,689,692,695,698,701,704,706,709,712,715,718,721, | |||
| 724,726,729,732,735,738,740,743,746,749,751,754,757,759,762,765, | |||
| 768,770,773,775,778,781,783,786,789,791,794,796,799,801,804,807, | |||
| 809,812,814,817,819,822,824,827,829,832,834,836,839,841,844,846, | |||
| 849,851,853,856,858,861,863,865,868,870,872,875,877,879,882,884, | |||
| 886,889,891,893,896,898,900,902 | |||
| }; | |||
| if(voice->klattv[0]) | |||
| { | |||
| @@ -498,8 +499,8 @@ static void set_frame_rms(frame_t *fr, int new_rms) | |||
| static void formants_reduce_hf(frame_t *fr, int level) | |||
| { | |||
| // change height of peaks 2 to 8, percentage | |||
| int ix; | |||
| int x; | |||
| int ix; | |||
| int x; | |||
| if(voice->klattv[0]) | |||
| return; | |||
| @@ -626,10 +627,10 @@ int FormantTransition2(frameref_t *seq, int *n_frames, unsigned int data1, unsig | |||
| #define N_VCOLOUR 2 | |||
| // percentage change for each formant in 256ths | |||
| static short vcolouring[N_VCOLOUR][5] = { | |||
| {243,272,256,256,256}, // palatal consonant follows | |||
| {256,256,240,240,240}, // retroflex | |||
| }; | |||
| static short vcolouring[N_VCOLOUR][5] = { | |||
| {243,272,256,256,256}, // palatal consonant follows | |||
| {256,256,240,240,240}, // retroflex | |||
| }; | |||
| frame_t *fr = NULL; | |||
| @@ -664,10 +665,10 @@ static short vcolouring[N_VCOLOUR][5] = { | |||
| next_rms = seq[1].frame->rms; | |||
| if(voice->klattv[0]) | |||
| { | |||
| fr->klattp[KLATT_AV] = seq[1].frame->klattp[KLATT_AV] - 4; | |||
| } | |||
| if(voice->klattv[0]) | |||
| { | |||
| fr->klattp[KLATT_AV] = seq[1].frame->klattp[KLATT_AV] - 4; | |||
| } | |||
| if(f2 != 0) | |||
| { | |||
| if(rms & 0x20) | |||
| @@ -791,7 +792,7 @@ static void SmoothSpect(void) | |||
| // backwards | |||
| ix = syllable_centre -1; | |||
| frame = frame2 = frame_centre; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if(ix < 0) ix = N_WCMDQ-1; | |||
| q = wcmdq[ix]; | |||
| @@ -879,7 +880,7 @@ static void SmoothSpect(void) | |||
| ix = syllable_centre; | |||
| frame = NULL; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| q = wcmdq[ix]; | |||
| @@ -979,21 +980,21 @@ int DoSpect2(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, PHONEME_L | |||
| // length_mod: 256 = 100% | |||
| // modulation: -1 = don't write to wcmdq | |||
| int n_frames; | |||
| int n_frames; | |||
| frameref_t *frames; | |||
| int frameix; | |||
| int frameix; | |||
| frame_t *frame1; | |||
| frame_t *frame2; | |||
| frame_t *fr; | |||
| int ix; | |||
| int ix; | |||
| long64 *q; | |||
| int len; | |||
| int frame_length; | |||
| int length_factor; | |||
| int length_mod; | |||
| int length_sum; | |||
| int length_min; | |||
| int total_len = 0; | |||
| int len; | |||
| int frame_length; | |||
| int length_factor; | |||
| int length_mod; | |||
| int length_sum; | |||
| int length_min; | |||
| int total_len = 0; | |||
| static int wave_flag = 0; | |||
| int wcmd_spect = WCMD_SPECT; | |||
| int frame_lengths[N_SEQ_FRAMES]; | |||
| @@ -1011,17 +1012,17 @@ int DoSpect2(PHONEME_TAB *this_ph, int which, FMT_PARAMS *fmt_params, PHONEME_L | |||
| length_min *= 2; // ensure long vowels are longer | |||
| } | |||
| if(which==1) | |||
| { | |||
| // limit the shortening of sonorants before shortened (eg. unstressed vowels) | |||
| if((this_ph->type==phLIQUID) || (plist[-1].type==phLIQUID) || (plist[-1].type==phNASAL)) | |||
| if(which==1) | |||
| { | |||
| if(length_mod < (len = translator->langopts.param[LOPT_SONORANT_MIN])) | |||
| // limit the shortening of sonorants before shortened (eg. unstressed vowels) | |||
| if((this_ph->type==phLIQUID) || (plist[-1].type==phLIQUID) || (plist[-1].type==phNASAL)) | |||
| { | |||
| length_mod = len; | |||
| if(length_mod < (len = translator->langopts.param[LOPT_SONORANT_MIN])) | |||
| { | |||
| length_mod = len; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| modn_flags = 0; | |||
| frames = LookupSpect(this_ph, which, fmt_params, &n_frames, plist); | |||
| @@ -1069,7 +1070,7 @@ if(which==1) | |||
| if(last_frame != NULL) | |||
| { | |||
| if(((last_frame->length < 2) || (last_frame->frflags & FRFLAG_VOWEL_CENTRE)) | |||
| && !(last_frame->frflags & FRFLAG_BREAK)) | |||
| && !(last_frame->frflags & FRFLAG_BREAK)) | |||
| { | |||
| // last frame of previous sequence was zero-length, replace with first of this sequence | |||
| wcmdq[last_wcmdq][3] = (long64)frame1; | |||
| @@ -1312,19 +1313,19 @@ void DoEmbedded(int *embix, int sourceix) | |||
| int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| { | |||
| static int ix; | |||
| static int embedded_ix; | |||
| static int word_count; | |||
| static int ix; | |||
| static int embedded_ix; | |||
| static int word_count; | |||
| PHONEME_LIST *prev; | |||
| PHONEME_LIST *next; | |||
| PHONEME_LIST *next2; | |||
| PHONEME_LIST *p; | |||
| int released; | |||
| int stress; | |||
| int modulation; | |||
| int pre_voiced; | |||
| int free_min; | |||
| int value; | |||
| int released; | |||
| int stress; | |||
| int modulation; | |||
| int pre_voiced; | |||
| int free_min; | |||
| int value; | |||
| unsigned char *pitch_env=NULL; | |||
| unsigned char *amp_env; | |||
| PHONEME_TAB *ph; | |||
| @@ -1395,7 +1396,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| if(p->newword) | |||
| { | |||
| if(((p->type == phVOWEL) && (translator->langopts.param[LOPT_WORD_MERGE] & 1)) || | |||
| (p->ph->phflags & phNOPAUSE)) | |||
| (p->ph->phflags & phNOPAUSE)) | |||
| { | |||
| } | |||
| else | |||
| @@ -1439,7 +1440,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| { | |||
| case phPAUSE: | |||
| DoPause(p->length,0); | |||
| p->std_length = p->ph->std_length; | |||
| p->std_length = p->ph->std_length; | |||
| break; | |||
| case phSTOP: | |||
| @@ -1447,7 +1448,7 @@ int Generate(PHONEME_LIST *phoneme_list, int *n_ph, int resume) | |||
| ph = p->ph; | |||
| if(next->type==phVOWEL) | |||
| { | |||
| released = 1; | |||
| released = 1; | |||
| } | |||
| else | |||
| if(!next->newword) | |||
| @@ -146,24 +146,24 @@ typedef struct { | |||
| } wavegen_peaks_t; | |||
| typedef struct { | |||
| unsigned char *pitch_env; | |||
| int pitch; // pitch Hz*256 | |||
| int pitch_ix; // index into pitch envelope (*256) | |||
| int pitch_inc; // increment to pitch_ix | |||
| int pitch_base; // Hz*256 low, before modified by envelope | |||
| int pitch_range; // Hz*256 range of envelope | |||
| unsigned char *mix_wavefile; // wave file to be added to synthesis | |||
| int n_mix_wavefile; // length in bytes | |||
| int mix_wave_scale; // 0=2 byte samples | |||
| int mix_wave_amp; | |||
| int mix_wavefile_ix; | |||
| int mix_wavefile_max; // length of available WAV data (in bytes) | |||
| int mix_wavefile_offset; | |||
| int amplitude; | |||
| int amplitude_v; | |||
| int amplitude_fmt; // percentage amplitude adjustment for formant synthesis | |||
| unsigned char *pitch_env; | |||
| int pitch; // pitch Hz*256 | |||
| int pitch_ix; // index into pitch envelope (*256) | |||
| int pitch_inc; // increment to pitch_ix | |||
| int pitch_base; // Hz*256 low, before modified by envelope | |||
| int pitch_range; // Hz*256 range of envelope | |||
| unsigned char *mix_wavefile; // wave file to be added to synthesis | |||
| int n_mix_wavefile; // length in bytes | |||
| int mix_wave_scale; // 0=2 byte samples | |||
| int mix_wave_amp; | |||
| int mix_wavefile_ix; | |||
| int mix_wavefile_max; // length of available WAV data (in bytes) | |||
| int mix_wavefile_offset; | |||
| int amplitude; | |||
| int amplitude_v; | |||
| int amplitude_fmt; // percentage amplitude adjustment for formant synthesis | |||
| } WGEN_DATA; | |||
| @@ -177,17 +177,17 @@ typedef struct { | |||
| typedef struct { | |||
| short length_total; // not used | |||
| unsigned char n_frames; | |||
| unsigned char sqflags; | |||
| frame_t2 frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence | |||
| short length_total; // not used | |||
| unsigned char n_frames; | |||
| unsigned char sqflags; | |||
| frame_t2 frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence | |||
| } SPECT_SEQ; // sequence of espeak formant frames | |||
| typedef struct { | |||
| short length_total; // not used | |||
| unsigned char n_frames; | |||
| unsigned char sqflags; | |||
| frame_t frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence | |||
| short length_total; // not used | |||
| unsigned char n_frames; | |||
| unsigned char sqflags; | |||
| frame_t frame[N_SEQ_FRAMES]; // max. frames in a spectrum sequence | |||
| } SPECT_SEQK; // sequence of klatt formants frames | |||
| @@ -277,7 +277,7 @@ typedef struct { | |||
| } FMT_PARAMS; | |||
| typedef struct { | |||
| PHONEME_LIST prev_vowel; | |||
| PHONEME_LIST prev_vowel; | |||
| } WORD_PH_DATA; | |||
| // instructions | |||
| @@ -373,12 +373,12 @@ typedef struct { | |||
| } SOUND_ICON; | |||
| typedef struct { | |||
| int name; | |||
| unsigned int next_phoneme; | |||
| int mbr_name; | |||
| int mbr_name2; | |||
| int percent; // percentage length of first component | |||
| int control; | |||
| int name; | |||
| unsigned int next_phoneme; | |||
| int mbr_name; | |||
| int mbr_name2; | |||
| int percent; // percentage length of first component | |||
| int control; | |||
| } MBROLA_TAB; | |||
| typedef struct { | |||
| @@ -457,16 +457,16 @@ extern unsigned char env_frise[128]; | |||
| extern unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1]; | |||
| // queue of commands for wavegen | |||
| #define WCMD_KLATT 1 | |||
| #define WCMD_KLATT2 2 | |||
| #define WCMD_SPECT 3 | |||
| #define WCMD_SPECT2 4 | |||
| #define WCMD_PAUSE 5 | |||
| #define WCMD_KLATT 1 | |||
| #define WCMD_KLATT2 2 | |||
| #define WCMD_SPECT 3 | |||
| #define WCMD_SPECT2 4 | |||
| #define WCMD_PAUSE 5 | |||
| #define WCMD_WAVE 6 | |||
| #define WCMD_WAVE2 7 | |||
| #define WCMD_AMPLITUDE 8 | |||
| #define WCMD_PITCH 9 | |||
| #define WCMD_MARKER 10 | |||
| #define WCMD_PITCH 9 | |||
| #define WCMD_MARKER 10 | |||
| #define WCMD_VOICE 11 | |||
| #define WCMD_EMBEDDED 12 | |||
| #define WCMD_MBROLA_DATA 13 | |||
| @@ -86,7 +86,7 @@ char word_phonemes[N_WORD_PHONEMES*2]; // longer, because snprint() is not av | |||
| char word_phonemes[N_WORD_PHONEMES]; // a word translated into phoneme codes | |||
| #endif | |||
| int n_ph_list2; | |||
| PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes | |||
| PHONEME_LIST2 ph_list2[N_PHONEME_LIST]; // first stage of text->phonemes | |||
| @@ -374,7 +374,7 @@ int IsAlpha(unsigned int c) | |||
| // Replacement for iswalph() which also checks for some in-word symbols | |||
| static const unsigned short extra_indic_alphas[] = { | |||
| 0xa70,0xa71, // Gurmukhi: tippi, addak | |||
| 0xa70,0xa71, // Gurmukhi: tippi, addak | |||
| 0 | |||
| }; | |||
| @@ -669,7 +669,7 @@ static int CheckDottedAbbrev(char *word1, WORD_TAB *wtab) | |||
| wbuf = word_buf; | |||
| ix = 0; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| ok = 0; | |||
| nbytes = utf8_in(&wc, word); | |||
| @@ -728,13 +728,13 @@ int ChangeEquivalentPhonemes(Translator *tr, int lang2, char *phonemes) | |||
| int ix; | |||
| int len; | |||
| char phon; | |||
| char phon; | |||
| char *p; | |||
| unsigned char *pb; | |||
| char *eqlist; | |||
| char *p_out; | |||
| char *p_in; | |||
| int remove_stress = 0; | |||
| int remove_stress = 0; | |||
| char phonbuf[N_WORD_PHONEMES]; | |||
| // has a phoneme equivalence table been specified for thus language pair? | |||
| @@ -743,7 +743,7 @@ int ChangeEquivalentPhonemes(Translator *tr, int lang2, char *phonemes) | |||
| pb = (unsigned char *)&phondata_ptr[ix]; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if(pb[0] == 0) | |||
| return(0); // table not found | |||
| @@ -1057,7 +1057,7 @@ int TranslateWord(Translator *tr, char *word_start, int next_pause, WORD_TAB *wt | |||
| emphasize_allcaps = FLAG_EMPHASIZED; | |||
| } | |||
| else if(!found && !(dictionary_flags[0] & FLAG_SKIPWORDS) && (word_length<4) && (tr->clause_lower_count > 3) | |||
| && (tr->clause_upper_count <= tr->clause_lower_count)) | |||
| && (tr->clause_upper_count <= tr->clause_lower_count)) | |||
| { | |||
| // An upper case word in a lower case clause. This could be an abbreviation. | |||
| spell_word = 1; | |||
| @@ -1845,7 +1845,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| { | |||
| // switch languages | |||
| word+=3; | |||
| for(ix=0;;) | |||
| for(ix=0;; ) | |||
| { | |||
| c1 = *word++; | |||
| if((c1==' ') || (c1==0)) | |||
| @@ -2224,7 +2224,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
| if(first_phoneme && tr->langopts.param[LOPT_IT_DOUBLING]) | |||
| { | |||
| if(((tr->prev_dict_flags[0] & FLAG_DOUBLING) && (tr->langopts.param[LOPT_IT_DOUBLING] & 1)) || | |||
| (tr->end_stressed_vowel && (tr->langopts.param[LOPT_IT_DOUBLING] & 2))) | |||
| (tr->end_stressed_vowel && (tr->langopts.param[LOPT_IT_DOUBLING] & 2))) | |||
| { | |||
| // italian, double the initial consonant if the previous word ends with a | |||
| // stressed vowel, or is marked with a flag | |||
| @@ -2512,7 +2512,7 @@ int UpperCaseInWord(Translator *tr, char *word, int c) | |||
| if(tr->translator_name == L('g','a')) | |||
| { | |||
| // Irish | |||
| for(ix=0; ; ix++) | |||
| for(ix=0;; ix++) | |||
| { | |||
| if((p = UCase_ga[ix]) == NULL) | |||
| break; | |||
| @@ -2614,7 +2614,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| clause_pause = (terminator & 0xfff) * 10; // mS | |||
| if(terminator & CLAUSE_PAUSE_LONG) | |||
| clause_pause = clause_pause * 32 ; // pause value is *320mS not *10mS | |||
| clause_pause = clause_pause * 32; // pause value is *320mS not *10mS | |||
| tone = (terminator >> 12) & 0x7; | |||
| if(tone2 != 0) | |||
| @@ -2924,7 +2924,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| if(tr->letter_bits_offset > 0) | |||
| { | |||
| if(((c < 0x250) && (prev_out >= tr->letter_bits_offset)) || | |||
| ((c >= tr->letter_bits_offset) && (letter_count > 1) && (prev_out < 0x250))) | |||
| ((c >= tr->letter_bits_offset) && (letter_count > 1) && (prev_out < 0x250))) | |||
| { | |||
| // Don't mix native and Latin characters in the same word | |||
| // Break into separate words | |||
| @@ -3109,34 +3109,34 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| } | |||
| } | |||
| else | |||
| if(lookupwchar(breaks,c) != 0) | |||
| if(lookupwchar(breaks,c) != 0) | |||
| { | |||
| c = ' '; // various characters to treat as space | |||
| } | |||
| else if(iswdigit(c)) | |||
| { | |||
| if(tr->langopts.tone_numbers && IsAlpha(prev_out) && !IsDigit(next_in)) | |||
| { | |||
| } | |||
| else if((prev_out != ' ') && !iswdigit(prev_out)) | |||
| { | |||
| if((prev_out != tr->langopts.decimal_sep) || ((decimal_sep_count > 0) && (tr->langopts.decimal_sep == ','))) | |||
| { | |||
| c = ' '; // various characters to treat as space | |||
| c = ' '; | |||
| space_inserted = 1; | |||
| } | |||
| else if(iswdigit(c)) | |||
| else | |||
| { | |||
| if(tr->langopts.tone_numbers && IsAlpha(prev_out) && !IsDigit(next_in)) | |||
| { | |||
| } | |||
| else if((prev_out != ' ') && !iswdigit(prev_out)) | |||
| { | |||
| if((prev_out != tr->langopts.decimal_sep) || ((decimal_sep_count > 0) && (tr->langopts.decimal_sep == ','))) | |||
| { | |||
| c = ' '; | |||
| space_inserted = 1; | |||
| } | |||
| else | |||
| { | |||
| decimal_sep_count = 1; | |||
| } | |||
| } | |||
| else if((prev_out == ' ') && IsAlpha(prev_out2) && !IsAlpha(prev_in)) | |||
| { | |||
| // insert extra space between a word and a number, to distinguish 'a 2' from 'a2' | |||
| sbuf[ix++] = ' '; | |||
| words[word_count].start++; | |||
| } | |||
| decimal_sep_count = 1; | |||
| } | |||
| } | |||
| else if((prev_out == ' ') && IsAlpha(prev_out2) && !IsAlpha(prev_in)) | |||
| { | |||
| // insert extra space between a word and a number, to distinguish 'a 2' from 'a2' | |||
| sbuf[ix++] = ' '; | |||
| words[word_count].start++; | |||
| } | |||
| } | |||
| } | |||
| if(IsSpace(c)) | |||
| @@ -3299,7 +3299,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| *pn++ = *pw++; | |||
| } | |||
| else if((*pw == tr->langopts.thousands_sep) && (pw[1] == ' ') | |||
| && iswdigit(pw[2]) && (pw[3] != ' ') && (pw[4] != ' ')) // don't allow only 1 or 2 digits in the final part | |||
| && iswdigit(pw[2]) && (pw[3] != ' ') && (pw[4] != ' ')) // don't allow only 1 or 2 digits in the final part | |||
| { | |||
| pw += 2; | |||
| ix++; // skip "word" | |||
| @@ -3375,7 +3375,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| pn[16] = 0; | |||
| nw = 0; | |||
| for(pw = &number_buf[1]; pw < pn;) | |||
| for(pw = &number_buf[1]; pw < pn; ) | |||
| { | |||
| // keep wflags for each part, for FLAG_HYPHEN_AFTER | |||
| dict_flags = TranslateWord2(tr, pw, &num_wtab[nw++], words[ix].pre_pause,0 ); | |||
| @@ -3398,7 +3398,7 @@ void *TranslateClause(Translator *tr, FILE *f_text, const void *vp_input, int *t | |||
| if(dict_flags & FLAG_SPELLWORD) | |||
| { | |||
| // redo the word, speaking single letters | |||
| for(pw = word; *pw != ' ';) | |||
| for(pw = word; *pw != ' '; ) | |||
| { | |||
| memset(number_buf,' ',9); | |||
| nx = utf8_in(&c_temp, pw); | |||
| @@ -158,25 +158,25 @@ extern "C" | |||
| // codes in dictionary rules | |||
| #define RULE_PRE 1 | |||
| #define RULE_POST 2 | |||
| #define RULE_PHONEMES 3 | |||
| #define RULE_PH_COMMON 4 // At start of rule. Its phoneme string is used by subsequent rules | |||
| #define RULE_CONDITION 5 // followed by condition number (byte) | |||
| #define RULE_PRE 1 | |||
| #define RULE_POST 2 | |||
| #define RULE_PHONEMES 3 | |||
| #define RULE_PH_COMMON 4 // At start of rule. Its phoneme string is used by subsequent rules | |||
| #define RULE_CONDITION 5 // followed by condition number (byte) | |||
| #define RULE_GROUP_START 6 | |||
| #define RULE_GROUP_END 7 | |||
| #define RULE_GROUP_END 7 | |||
| #define RULE_PRE_ATSTART 8 // as RULE_PRE but also match with 'start of word' | |||
| #define RULE_LINENUM 9 // next 2 bytes give a line number, for debugging purposes | |||
| #define RULE_SPACE 32 // ascii space | |||
| #define RULE_SYLLABLE 21 // @ | |||
| #define RULE_STRESSED 10 // & | |||
| #define RULE_DOUBLE 11 // % | |||
| #define RULE_INC_SCORE 12 // + | |||
| #define RULE_DEL_FWD 13 // # | |||
| #define RULE_ENDING 14 // S | |||
| #define RULE_DIGIT 15 // D digit | |||
| #define RULE_NONALPHA 16 // Z non-alpha | |||
| #define RULE_LINENUM 9 // next 2 bytes give a line number, for debugging purposes | |||
| #define RULE_SPACE 32 // ascii space | |||
| #define RULE_SYLLABLE 21 // @ | |||
| #define RULE_STRESSED 10 // & | |||
| #define RULE_DOUBLE 11 // % | |||
| #define RULE_INC_SCORE 12 // + | |||
| #define RULE_DEL_FWD 13 // # | |||
| #define RULE_ENDING 14 // S | |||
| #define RULE_DIGIT 15 // D digit | |||
| #define RULE_NONALPHA 16 // Z non-alpha | |||
| #define RULE_LETTERGP 17 // A B C H F G Y letter group number | |||
| #define RULE_LETTERGP2 18 // L + letter group number | |||
| #define RULE_CAPITAL 19 // ! word starts with a capital letter | |||
| @@ -195,13 +195,13 @@ extern "C" | |||
| #define DOLLAR_LIST 0x03 | |||
| #define LETTERGP_A 0 | |||
| #define LETTERGP_B 1 | |||
| #define LETTERGP_C 2 | |||
| #define LETTERGP_H 3 | |||
| #define LETTERGP_F 4 | |||
| #define LETTERGP_G 5 | |||
| #define LETTERGP_Y 6 | |||
| #define LETTERGP_A 0 | |||
| #define LETTERGP_B 1 | |||
| #define LETTERGP_C 2 | |||
| #define LETTERGP_H 3 | |||
| #define LETTERGP_F 4 | |||
| #define LETTERGP_G 5 | |||
| #define LETTERGP_Y 6 | |||
| #define LETTERGP_VOWEL2 7 | |||
| @@ -256,15 +256,15 @@ extern "C" | |||
| typedef const char * constcharptr; | |||
| typedef struct { | |||
| int points; | |||
| int points; | |||
| const char *phonemes; | |||
| int end_type; | |||
| int end_type; | |||
| char *del_fwd; | |||
| } MatchRecord; | |||
| // used to mark words with the source[] buffer | |||
| typedef struct{ | |||
| typedef struct { | |||
| unsigned int flags; | |||
| unsigned short start; | |||
| unsigned char pre_pause; | |||
| @@ -284,11 +284,11 @@ extern const int param_defaults[N_SPEECH_PARAM]; | |||
| typedef struct { | |||
| const char *name; | |||
| int offset; | |||
| unsigned short range_min, range_max; | |||
| int language; | |||
| int flags; | |||
| const char *name; | |||
| int offset; | |||
| unsigned short range_min, range_max; | |||
| int language; | |||
| int flags; | |||
| } ALPHABET; | |||
| extern ALPHABET alphabets[]; | |||
| @@ -303,85 +303,85 @@ extern ALPHABET *current_alphabet; | |||
| #define N_LOPTS 21 | |||
| #define LOPT_DIERESES 1 | |||
| // 1=remove [:] from unstressed syllables, 2= remove from unstressed or non-penultimate syllables | |||
| // bit 4=0, if stress < 4, bit 4=1, if not the highest stress in the word | |||
| // 1=remove [:] from unstressed syllables, 2= remove from unstressed or non-penultimate syllables | |||
| // bit 4=0, if stress < 4, bit 4=1, if not the highest stress in the word | |||
| #define LOPT_IT_LENGTHEN 2 | |||
| // 1=german | |||
| // 1=german | |||
| #define LOPT_PREFIXES 3 | |||
| // non-zero, change voiced/unoiced to match last consonant in a cluster | |||
| // bit 0=use regressive voicing | |||
| // bit 1=LANG=cz,bg don't propagate over [v] | |||
| // bit 2=don't propagate acress word boundaries | |||
| // bit 3=LANG=pl, propagate over liquids and nasals | |||
| // bit 4=LANG=cz,sk don't progagate to [v] | |||
| // bit 8=devoice word-final consonants | |||
| // non-zero, change voiced/unoiced to match last consonant in a cluster | |||
| // bit 0=use regressive voicing | |||
| // bit 1=LANG=cz,bg don't propagate over [v] | |||
| // bit 2=don't propagate acress word boundaries | |||
| // bit 3=LANG=pl, propagate over liquids and nasals | |||
| // bit 4=LANG=cz,sk don't progagate to [v] | |||
| // bit 8=devoice word-final consonants | |||
| #define LOPT_REGRESSIVE_VOICING 4 | |||
| // 0=default, 1=no check, other allow this character as an extra initial letter (default is 's') | |||
| // 0=default, 1=no check, other allow this character as an extra initial letter (default is 's') | |||
| #define LOPT_UNPRONOUNCABLE 5 | |||
| // select length_mods tables, (length_mod_tab) + (length_mod_tab0 * 100) | |||
| // select length_mods tables, (length_mod_tab) + (length_mod_tab0 * 100) | |||
| #define LOPT_LENGTH_MODS 6 | |||
| // increase this to prevent sonorants being shortened before shortened (eg. unstressed) vowels | |||
| // increase this to prevent sonorants being shortened before shortened (eg. unstressed) vowels | |||
| #define LOPT_SONORANT_MIN 7 | |||
| // bit 0: don't break vowels at word boundary | |||
| // bit 0: don't break vowels at word boundary | |||
| #define LOPT_WORD_MERGE 8 | |||
| // max. amplitude for vowel at the end of a clause | |||
| // max. amplitude for vowel at the end of a clause | |||
| #define LOPT_MAXAMP_EOC 9 | |||
| // bit 0=reduce even if phonemes are specified in the **_list file | |||
| // bit 1=don't reduce the strongest vowel in a word which is marked 'unstressed' | |||
| // bit 0=reduce even if phonemes are specified in the **_list file | |||
| // bit 1=don't reduce the strongest vowel in a word which is marked 'unstressed' | |||
| #define LOPT_REDUCE 10 | |||
| // LANG=cs,sk combine some prepositions with the following word, if the combination has N or fewer syllables | |||
| // bits 0-3 N syllables | |||
| // bit 4=only if the second word has $alt attribute | |||
| // bit 5=not if the second word is end-of-sentence | |||
| // LANG=cs,sk combine some prepositions with the following word, if the combination has N or fewer syllables | |||
| // bits 0-3 N syllables | |||
| // bit 4=only if the second word has $alt attribute | |||
| // bit 5=not if the second word is end-of-sentence | |||
| #define LOPT_COMBINE_WORDS 11 | |||
| // change [t] when followed by unstressed vowel | |||
| // change [t] when followed by unstressed vowel | |||
| #define LOPT_REDUCE_T 12 | |||
| // 1 = allow capitals inside a word | |||
| // 2 = stressed syllable is indicated by capitals | |||
| // 1 = allow capitals inside a word | |||
| // 2 = stressed syllable is indicated by capitals | |||
| #define LOPT_CAPS_IN_WORD 13 | |||
| // bit 0=Italian "syntactic doubling" of consoants in the word after a word marked with $double attribute | |||
| // bit 1=also after a word which ends with a stressed vowel | |||
| // bit 0=Italian "syntactic doubling" of consoants in the word after a word marked with $double attribute | |||
| // bit 1=also after a word which ends with a stressed vowel | |||
| #define LOPT_IT_DOUBLING 14 | |||
| // Call ApplySpecialAttributes() if $alt or $alt2 is set for a word | |||
| // bit 1: stressed syllable: $alt change [e],[o] to [E],[O], $alt2 change [E],[O] to [e],[o] | |||
| // Call ApplySpecialAttributes() if $alt or $alt2 is set for a word | |||
| // bit 1: stressed syllable: $alt change [e],[o] to [E],[O], $alt2 change [E],[O] to [e],[o] | |||
| #define LOPT_ALT 15 | |||
| // pause for bracket (default=4), pause when annoucing bracket names (default=2) | |||
| // pause for bracket (default=4), pause when annoucing bracket names (default=2) | |||
| #define LOPT_BRACKET_PAUSE 16 | |||
| // bit 1, don't break clause before annoucning . ? ! | |||
| // bit 1, don't break clause before annoucning . ? ! | |||
| #define LOPT_ANNOUNCE_PUNCT 17 | |||
| // recognize long vowels (0 = don't recognize) | |||
| // recognize long vowels (0 = don't recognize) | |||
| #define LOPT_LONG_VOWEL_THRESHOLD 18 | |||
| // bit 0: Don't allow suffices if there is no previous syllable | |||
| // bit 0: Don't allow suffices if there is no previous syllable | |||
| #define LOPT_SUFFIX 19 | |||
| // bit 0 Apostrophe at start of word is part of the word | |||
| // bit 1 Apostrophe at end of word is part of the word | |||
| // bit 0 Apostrophe at start of word is part of the word | |||
| // bit 1 Apostrophe at end of word is part of the word | |||
| #define LOPT_APOSTROPHE 20 | |||
| // stress_rule | |||
| #define STRESSPOSN_1L 0 // 1st syllable | |||
| #define STRESSPOSN_2L 1 // 2nd syllable | |||
| #define STRESSPOSN_2R 2 // penultimate | |||
| #define STRESSPOSN_1R 3 // final syllable | |||
| #define STRESSPOSN_3R 4 // antipenultimate | |||
| #define STRESSPOSN_1L 0 // 1st syllable | |||
| #define STRESSPOSN_2L 1 // 2nd syllable | |||
| #define STRESSPOSN_2R 2 // penultimate | |||
| #define STRESSPOSN_1R 3 // final syllable | |||
| #define STRESSPOSN_3R 4 // antipenultimate | |||
| typedef struct { | |||
| @@ -494,7 +494,7 @@ typedef struct { | |||
| // bit5='and' between tens and units | |||
| // bit6=add "and" after hundred or thousand | |||
| // bit7=don't have "and" both after hundreds and also between tens and units | |||
| // bit8=only one primary stress in tens+units | |||
| // bit8=only one primary stress in tens+units | |||
| // bit9=only one vowel betwen tens and units | |||
| // bit10=omit "one" before "hundred" | |||
| // bit11=say 19** as nineteen hundred | |||
| @@ -514,7 +514,7 @@ typedef struct { | |||
| // bit25= Roman numbers only if upper case | |||
| // bit26= say "roman" after the number, not before | |||
| // bit27= Roman numbers are ordinal numbers | |||
| // bit28= only one primary stress in tens+units (on the tens) | |||
| // bit28= only one primary stress in tens+units (on the tens) | |||
| int numbers; | |||
| #define NUM2_THOUSANDS_VAR1 0x40 | |||
| @@ -613,8 +613,8 @@ typedef struct | |||
| char dictionary_name[40]; | |||
| char phonemes_repeat[20]; | |||
| int phonemes_repeat_count; | |||
| int phoneme_tab_ix; | |||
| int phonemes_repeat_count; | |||
| int phoneme_tab_ix; | |||
| unsigned char stress_amps[8]; | |||
| unsigned char stress_amps_r[8]; | |||
| @@ -798,7 +798,7 @@ void InterpretPhoneme(Translator *tr, int control, PHONEME_LIST *plist, PHONEME_ | |||
| void InterpretPhoneme2(int phcode, PHONEME_DATA *phdata); | |||
| char *WritePhMnemonic(char *phon_out, PHONEME_TAB *ph, PHONEME_LIST *plist, int use_ipa, int *flags); | |||
| extern FILE *f_trans; // for logging | |||
| extern FILE *f_trans; // for logging | |||
| extern FILE *f_logespeak; | |||
| extern int logging_type; // from config file | |||
| @@ -136,7 +136,7 @@ static MNEM_TAB keyword_tab[] = { | |||
| {"stressAdd", V_STRESSADD}, | |||
| {"intonation", V_INTONATION}, | |||
| {"tunes", V_TUNES}, | |||
| {"dictrules", V_DICTRULES}, | |||
| {"dictrules", V_DICTRULES}, | |||
| {"stressrule", V_STRESSRULE}, | |||
| {"stressopt", V_STRESSOPT}, | |||
| {"charset", V_CHARSET}, | |||
| @@ -277,9 +277,9 @@ void ReadTonePoints(char *string, int *tone_pts) | |||
| tone_pts[ix] = -1; | |||
| sscanf(string,"%d %d %d %d %d %d %d %d %d %d", | |||
| &tone_pts[0],&tone_pts[1],&tone_pts[2],&tone_pts[3], | |||
| &tone_pts[4],&tone_pts[5],&tone_pts[6],&tone_pts[7], | |||
| &tone_pts[8],&tone_pts[9]); | |||
| &tone_pts[0],&tone_pts[1],&tone_pts[2],&tone_pts[3], | |||
| &tone_pts[4],&tone_pts[5],&tone_pts[6],&tone_pts[7], | |||
| &tone_pts[8],&tone_pts[9]); | |||
| } | |||
| @@ -400,7 +400,7 @@ void VoiceReset(int tone_only) | |||
| { | |||
| // Set voice to the default values | |||
| int pk; | |||
| int pk; | |||
| static unsigned char default_heights[N_PEAKS] = {130,128,120,116,100,100,128,128,128}; // changed for v.1.47 | |||
| static unsigned char default_widths[N_PEAKS] = {140,128,128,160,171,171,128,128,128}; | |||
| @@ -500,7 +500,7 @@ static void VoiceFormant(char *p) | |||
| static void PhonemeReplacement(int type, char *p) | |||
| { | |||
| int n; | |||
| int phon; | |||
| int phon; | |||
| int flags = 0; | |||
| char phon_string1[12]; | |||
| char phon_string2[12]; | |||
| @@ -525,7 +525,7 @@ static int Read8Numbers(char *data_in,int *data) | |||
| // Read 8 integer numbers | |||
| memset(data, 0, 8+sizeof(int)); | |||
| return(sscanf(data_in,"%d %d %d %d %d %d %d %d", | |||
| &data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7])); | |||
| &data[0],&data[1],&data[2],&data[3],&data[4],&data[5],&data[6],&data[7])); | |||
| } | |||
| @@ -553,19 +553,19 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| FILE *f_voice = NULL; | |||
| char *p; | |||
| int key; | |||
| int ix; | |||
| int n; | |||
| int value; | |||
| int value2; | |||
| int langix = 0; | |||
| int tone_only = control & 2; | |||
| int language_set = 0; | |||
| int phonemes_set = 0; | |||
| int stress_amps_set = 0; | |||
| int stress_lengths_set = 0; | |||
| int stress_add_set = 0; | |||
| int conditional_rules = 0; | |||
| int key; | |||
| int ix; | |||
| int n; | |||
| int value; | |||
| int value2; | |||
| int langix = 0; | |||
| int tone_only = control & 2; | |||
| int language_set = 0; | |||
| int phonemes_set = 0; | |||
| int stress_amps_set = 0; | |||
| int stress_lengths_set = 0; | |||
| int stress_add_set = 0; | |||
| int conditional_rules = 0; | |||
| LANGUAGE_OPTIONS *langopts = NULL; | |||
| Translator *new_translator = NULL; | |||
| @@ -598,9 +598,9 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| // which directory to look for a named voice. List of voice names, must end in a space. | |||
| static const char *voices_asia = | |||
| "az bn fa fa-pin gu hi hy hy-west id ka kn ku ml ms ne pa ta te tr vi vi-hue vi-sgn zh zh-yue "; | |||
| "az bn fa fa-pin gu hi hy hy-west id ka kn ku ml ms ne pa ta te tr vi vi-hue vi-sgn zh zh-yue "; | |||
| static const char *voices_europe = | |||
| "an bg bs ca cs cy da de el en en-us es et eu fi fr fr-be ga hr hu is it lt lv mk nl no pl pt-pt ro ru sk sq sr sv "; | |||
| "an bg bs ca cs cy da de el en en-us es et eu fi fr fr-be ga hr hu is it lt lv mk nl no pl pt-pt ro ru sk sq sr sv "; | |||
| strncpy0(voicename, vname, sizeof(voicename)); | |||
| @@ -888,9 +888,9 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| case V_STRESSRULE: | |||
| sscanf(p,"%d %d %d %d",&langopts->stress_rule, | |||
| &langopts->stress_flags, | |||
| &langopts->unstressed_wd1, | |||
| &langopts->unstressed_wd2); | |||
| &langopts->stress_flags, | |||
| &langopts->unstressed_wd1, | |||
| &langopts->unstressed_wd2); | |||
| break; | |||
| case V_CHARSET: | |||
| @@ -901,7 +901,7 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| case V_OPTION: | |||
| value2 = 0; | |||
| if(((sscanf(p,"%s %d %d",option_name,&value,&value2) >= 2) && ((ix = LookupMnem(options_tab, option_name)) >= 0)) || | |||
| ((sscanf(p,"%d %d %d",&ix,&value,&value2) >= 2) && (ix < N_LOPTS))) | |||
| ((sscanf(p,"%d %d %d",&ix,&value,&value2) >= 2) && (ix < N_LOPTS))) | |||
| { | |||
| langopts->param[ix] = value; | |||
| langopts->param2[ix] = value2; | |||
| @@ -1005,26 +1005,26 @@ voice_t *LoadVoice(const char *vname, int control) | |||
| break; | |||
| case V_ALPHABET2: | |||
| { | |||
| ALPHABET *alphabet; | |||
| name1[0] = name2[0] = 0; | |||
| sscanf(p, "%s %s", name1, name2); | |||
| { | |||
| ALPHABET *alphabet; | |||
| name1[0] = name2[0] = 0; | |||
| sscanf(p, "%s %s", name1, name2); | |||
| if(strcmp(name1, "latin") == 0) | |||
| { | |||
| strncpy0(langopts->ascii_language,name2,sizeof(langopts->ascii_language)); | |||
| } | |||
| else if((alphabet = AlphabetFromName(name1)) != 0) | |||
| { | |||
| langopts->alt_alphabet = alphabet->offset; | |||
| langopts->alt_alphabet_lang = StringToWord2(name2); | |||
| } | |||
| else | |||
| { | |||
| fprintf(stderr,"alphabet name '%s' not found\n", name1); | |||
| } | |||
| if(strcmp(name1, "latin") == 0) | |||
| { | |||
| strncpy0(langopts->ascii_language,name2,sizeof(langopts->ascii_language)); | |||
| } | |||
| break; | |||
| else if((alphabet = AlphabetFromName(name1)) != 0) | |||
| { | |||
| langopts->alt_alphabet = alphabet->offset; | |||
| langopts->alt_alphabet_lang = StringToWord2(name2); | |||
| } | |||
| else | |||
| { | |||
| fprintf(stderr,"alphabet name '%s' not found\n", name1); | |||
| } | |||
| } | |||
| break; | |||
| case V_DICTDIALECT: | |||
| // specify a dialect to use for foreign words, eg, en-us for _^_EN | |||
| @@ -1275,7 +1275,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, const char *spec_language, int s | |||
| matching_parts = 0; | |||
| n_parts = 1; | |||
| for(ix=0; ; ix++) | |||
| for(ix=0;; ix++) | |||
| { | |||
| if((ix >= spec_lang_len) || ((c1 = spec_language[ix]) == '-')) | |||
| c1 = 0; | |||
| @@ -1334,7 +1334,7 @@ static int ScoreVoice(espeak_VOICE *voice_spec, const char *spec_language, int s | |||
| } | |||
| if(((voice_spec->gender == 1) || (voice_spec->gender == 2)) && | |||
| ((voice->gender == 1) || (voice->gender == 2))) | |||
| ((voice->gender == 1) || (voice->gender == 2))) | |||
| { | |||
| if(voice_spec->gender == voice->gender) | |||
| score += 50; | |||
| @@ -1617,7 +1617,7 @@ char const *SelectVoice(espeak_VOICE *voice_select, int *found) | |||
| voices2[ix2++] = vp; | |||
| } | |||
| for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS);) | |||
| for(j=0; (j < vp->xx1) && (n_variants < N_VOICE_VARIANTS); ) | |||
| { | |||
| if((variant_number = *p) == 0) | |||
| { | |||
| @@ -1818,7 +1818,7 @@ espeak_ERROR SetVoiceByName(const char *name) | |||
| variant_name = ExtractVoiceVariantName(buf, 0, 1); | |||
| for(ix=0; ; ix++) | |||
| for(ix=0;; ix++) | |||
| { | |||
| // convert voice name to lower case (ascii) | |||
| if((buf[ix] = tolower(buf[ix])) == 0) | |||
| @@ -1935,7 +1935,7 @@ ESPEAK_API const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec) | |||
| // sort the voices list | |||
| qsort(voices_list,n_voices_list,sizeof(espeak_VOICE *), | |||
| (int (__cdecl *)(const void *,const void *))VoiceNameSorter); | |||
| (int (__cdecl *)(const void *,const void *))VoiceNameSorter); | |||
| if(voice_spec) | |||
| @@ -1950,7 +1950,7 @@ ESPEAK_API const espeak_VOICE **espeak_ListVoices(espeak_VOICE *voice_spec) | |||
| for(ix=0; (v = voices_list[ix]) != NULL; ix++) | |||
| { | |||
| if((v->languages[0] != 0) && (strcmp(&v->languages[1],"variant") != 0) | |||
| && (memcmp(v->identifier,"mb/",3) != 0) && (memcmp(v->identifier,"test/",5) != 0)) | |||
| && (memcmp(v->identifier,"mb/",3) != 0) && (memcmp(v->identifier,"test/",5) != 0)) | |||
| { | |||
| voices[j++] = v; | |||
| } | |||
| @@ -65,7 +65,7 @@ static uint32_t last_play_position=0; | |||
| static uint32_t wave_samplerate; | |||
| // wave_init | |||
| // wave_init | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| @@ -77,47 +77,47 @@ static uint32_t wave_samplerate; | |||
| // audio device. | |||
| // | |||
| int wave_init(int srate) { | |||
| ENTER("wave_init"); | |||
| ENTER("wave_init"); | |||
| audio_info_t ainfo; | |||
| char *audio_device = NULL; | |||
| audio_info_t ainfo; | |||
| char *audio_device = NULL; | |||
| wave_samplerate = srate; | |||
| audio_device = getenv("AUDIODEV"); | |||
| if (audio_device != NULL) { | |||
| if ((sun_audio_fd = open(audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| if (sun_audio_fd < 0) { | |||
| if ((sun_audio_fd = open(sun_audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| sun_audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| SHOW("wave_init() sun_audio_fd: %d\n", sun_audio_fd); | |||
| if (sun_audio_fd < 0) { | |||
| return(0); | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_init() play buffer size: %d\n", ainfo.play.buffer_size); | |||
| ainfo.play.encoding = AUDIO_ENCODING_LINEAR; | |||
| ainfo.play.channels = 1; | |||
| ainfo.play.sample_rate = wave_samplerate; | |||
| ainfo.play.precision = SAMPLE_SIZE; | |||
| if (ioctl(sun_audio_fd, AUDIO_SETINFO, &ainfo) == -1) { | |||
| SHOW("wave_init() failed to set audio params: %s\n", strerror(errno)); | |||
| close(sun_audio_fd); | |||
| return(0); | |||
| } | |||
| return(1); | |||
| audio_device = getenv("AUDIODEV"); | |||
| if (audio_device != NULL) { | |||
| if ((sun_audio_fd = open(audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| if (sun_audio_fd < 0) { | |||
| if ((sun_audio_fd = open(sun_audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| sun_audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| SHOW("wave_init() sun_audio_fd: %d\n", sun_audio_fd); | |||
| if (sun_audio_fd < 0) { | |||
| return(0); | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_init() play buffer size: %d\n", ainfo.play.buffer_size); | |||
| ainfo.play.encoding = AUDIO_ENCODING_LINEAR; | |||
| ainfo.play.channels = 1; | |||
| ainfo.play.sample_rate = wave_samplerate; | |||
| ainfo.play.precision = SAMPLE_SIZE; | |||
| if (ioctl(sun_audio_fd, AUDIO_SETINFO, &ainfo) == -1) { | |||
| SHOW("wave_init() failed to set audio params: %s\n", strerror(errno)); | |||
| close(sun_audio_fd); | |||
| return(0); | |||
| } | |||
| return(1); | |||
| } | |||
| // wave_open | |||
| @@ -144,8 +144,8 @@ int wave_init(int srate) { | |||
| // | |||
| void* wave_open(const char* the_api) | |||
| { | |||
| ENTER("wave_open"); | |||
| return((void*) sun_audio_fd); | |||
| ENTER("wave_open"); | |||
| return((void*) sun_audio_fd); | |||
| } | |||
| // wave_write | |||
| @@ -170,55 +170,55 @@ void* wave_open(const char* the_api) | |||
| // | |||
| // total_samples_sent: modified based upon 16-bit samples sent | |||
| // | |||
| // RETURNS: | |||
| // RETURNS: | |||
| // | |||
| // the number of bytes (not 16-bit samples) sent | |||
| // | |||
| size_t wave_write(void* theHandler, | |||
| char* theMono16BitsWaveBuffer, | |||
| size_t theSize) | |||
| size_t wave_write(void* theHandler, | |||
| char* theMono16BitsWaveBuffer, | |||
| size_t theSize) | |||
| { | |||
| size_t num; | |||
| ENTER("wave_write"); | |||
| if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) { | |||
| SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | |||
| return 0; | |||
| } | |||
| size_t num; | |||
| ENTER("wave_write"); | |||
| if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) { | |||
| SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | |||
| return 0; | |||
| } | |||
| #if defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN | |||
| { | |||
| // BIG-ENDIAN, swap the order of bytes in each sound sample | |||
| int c; | |||
| char *out_ptr; | |||
| char *out_end; | |||
| out_ptr = (char *)theMono16BitsWaveBuffer; | |||
| out_end = out_ptr + theSize; | |||
| while(out_ptr < out_end) | |||
| { | |||
| c = out_ptr[0]; | |||
| out_ptr[0] = out_ptr[1]; | |||
| out_ptr[1] = c; | |||
| out_ptr += 2; | |||
| } | |||
| } | |||
| { | |||
| // BIG-ENDIAN, swap the order of bytes in each sound sample | |||
| int c; | |||
| char *out_ptr; | |||
| char *out_end; | |||
| out_ptr = (char *)theMono16BitsWaveBuffer; | |||
| out_end = out_ptr + theSize; | |||
| while(out_ptr < out_end) | |||
| { | |||
| c = out_ptr[0]; | |||
| out_ptr[0] = out_ptr[1]; | |||
| out_ptr[1] = c; | |||
| out_ptr += 2; | |||
| } | |||
| } | |||
| #endif | |||
| num = write((int) theHandler, theMono16BitsWaveBuffer, theSize); | |||
| num = write((int) theHandler, theMono16BitsWaveBuffer, theSize); | |||
| // Keep track of the total number of samples sent -- we use this in | |||
| // wave_get_read_position and also use it to help calculate the | |||
| // total_samples_skipped in wave_close. | |||
| // | |||
| total_samples_sent += num / 2; | |||
| // Keep track of the total number of samples sent -- we use this in | |||
| // wave_get_read_position and also use it to help calculate the | |||
| // total_samples_skipped in wave_close. | |||
| // | |||
| total_samples_sent += num / 2; | |||
| if (num < theSize) { | |||
| SHOW("ERROR: wave_write only wrote %d of %d bytes\n", num, theSize); | |||
| } else { | |||
| SHOW("wave_write wrote %d bytes\n", theSize); | |||
| } | |||
| if (num < theSize) { | |||
| SHOW("ERROR: wave_write only wrote %d of %d bytes\n", num, theSize); | |||
| } else { | |||
| SHOW("wave_write wrote %d bytes\n", theSize); | |||
| } | |||
| SHOW_TIME("wave_write > LEAVE"); | |||
| return num; | |||
| SHOW_TIME("wave_write > LEAVE"); | |||
| return num; | |||
| } | |||
| // wave_close | |||
| @@ -241,37 +241,37 @@ size_t wave_write(void* theHandler, | |||
| // total_samples_skipped: modified to hold the total number of 16-bit | |||
| // samples sent to wave_write, but which were | |||
| // never played | |||
| // sun_audio_fd: used because some calls to wave_close seem to | |||
| // sun_audio_fd: used because some calls to wave_close seem to | |||
| // pass a NULL for theHandler for some odd reason | |||
| // | |||
| // RETURNS: | |||
| // RETURNS: | |||
| // | |||
| // The result of the ioctl call (non-0 means failure) | |||
| // | |||
| int wave_close(void* theHandler) | |||
| { | |||
| int ret; | |||
| audio_info_t ainfo; | |||
| int audio_fd = (int) theHandler; | |||
| if (!audio_fd) { | |||
| audio_fd = sun_audio_fd; | |||
| } | |||
| ENTER("wave_close"); | |||
| // [[[WDW: maybe do a pause/resume ioctl???]]] | |||
| ret = ioctl(audio_fd, I_FLUSH, FLUSHRW); | |||
| ioctl(audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // Calculate the number of samples that won't get | |||
| // played. We also keep track of the last_play_position | |||
| // because wave_close can be called multiple times | |||
| // before another call to wave_write. | |||
| // | |||
| if (last_play_position != ainfo.play.samples) { | |||
| last_play_position = ainfo.play.samples; | |||
| total_samples_skipped = total_samples_sent - last_play_position; | |||
| } | |||
| SHOW_TIME("wave_close > LEAVE"); | |||
| return ret; | |||
| int ret; | |||
| audio_info_t ainfo; | |||
| int audio_fd = (int) theHandler; | |||
| if (!audio_fd) { | |||
| audio_fd = sun_audio_fd; | |||
| } | |||
| ENTER("wave_close"); | |||
| // [[[WDW: maybe do a pause/resume ioctl???]]] | |||
| ret = ioctl(audio_fd, I_FLUSH, FLUSHRW); | |||
| ioctl(audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // Calculate the number of samples that won't get | |||
| // played. We also keep track of the last_play_position | |||
| // because wave_close can be called multiple times | |||
| // before another call to wave_write. | |||
| // | |||
| if (last_play_position != ainfo.play.samples) { | |||
| last_play_position = ainfo.play.samples; | |||
| total_samples_skipped = total_samples_sent - last_play_position; | |||
| } | |||
| SHOW_TIME("wave_close > LEAVE"); | |||
| return ret; | |||
| } | |||
| // wave_is_busy | |||
| @@ -286,7 +286,7 @@ int wave_close(void* theHandler) | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: used because some calls to wave_is_busy seem to | |||
| // sun_audio_fd: used because some calls to wave_is_busy seem to | |||
| // pass a NULL for theHandler for some odd reason | |||
| // | |||
| // RETURNS: | |||
| @@ -295,13 +295,13 @@ int wave_close(void* theHandler) | |||
| // | |||
| int wave_is_busy(void* theHandler) | |||
| { | |||
| uint32_t time; | |||
| if (total_samples_sent >= 1) { | |||
| wave_get_remaining_time(total_samples_sent - 1, &time); | |||
| } else { | |||
| time = 0; | |||
| } | |||
| return time != 0; | |||
| uint32_t time; | |||
| if (total_samples_sent >= 1) { | |||
| wave_get_remaining_time(total_samples_sent - 1, &time); | |||
| } else { | |||
| time = 0; | |||
| } | |||
| return time != 0; | |||
| } | |||
| // wave_terminate | |||
| @@ -316,10 +316,10 @@ int wave_is_busy(void* theHandler) | |||
| // | |||
| void wave_terminate() | |||
| { | |||
| ENTER("wave_terminate"); | |||
| close(sun_audio_fd); | |||
| sun_audio_fd = -1; | |||
| SHOW_TIME("wave_terminate > LEAVE"); | |||
| ENTER("wave_terminate"); | |||
| close(sun_audio_fd); | |||
| sun_audio_fd = -1; | |||
| SHOW_TIME("wave_terminate > LEAVE"); | |||
| } | |||
| // wave_flush | |||
| @@ -339,8 +339,8 @@ void wave_terminate() | |||
| // | |||
| void wave_flush(void* theHandler) | |||
| { | |||
| ENTER("wave_flush"); | |||
| SHOW_TIME("wave_flush > LEAVE"); | |||
| ENTER("wave_flush"); | |||
| SHOW_TIME("wave_flush > LEAVE"); | |||
| } | |||
| // wave_set_callback_is_output_enabled | |||
| @@ -357,7 +357,7 @@ void wave_flush(void* theHandler) | |||
| // | |||
| void wave_set_callback_is_output_enabled(t_wave_callback* cb) | |||
| { | |||
| my_callback_is_output_enabled = cb; | |||
| my_callback_is_output_enabled = cb; | |||
| } | |||
| // wave_test_get_write_buffer | |||
| @@ -373,7 +373,7 @@ void wave_set_callback_is_output_enabled(t_wave_callback* cb) | |||
| // | |||
| void *wave_test_get_write_buffer() | |||
| { | |||
| return NULL; | |||
| return NULL; | |||
| } | |||
| // wave_get_read_position | |||
| @@ -397,12 +397,12 @@ void *wave_test_get_write_buffer() | |||
| // | |||
| uint32_t wave_get_read_position(void* theHandler) | |||
| { | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_read_position"); | |||
| ioctl((int) theHandler, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_get_read_position: %d\n", ainfo.play.samples); | |||
| SHOW_TIME("wave_get_read_position > LEAVE"); | |||
| return ainfo.play.samples; | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_read_position"); | |||
| ioctl((int) theHandler, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_get_read_position: %d\n", ainfo.play.samples); | |||
| SHOW_TIME("wave_get_read_position > LEAVE"); | |||
| return ainfo.play.samples; | |||
| } | |||
| // wave_get_write_position | |||
| @@ -433,10 +433,10 @@ uint32_t wave_get_read_position(void* theHandler) | |||
| // | |||
| uint32_t wave_get_write_position(void* theHandler) | |||
| { | |||
| ENTER("wave_get_write_position"); | |||
| SHOW("wave_get_write_position: %d\n", total_samples_sent); | |||
| SHOW_TIME("wave_get_write_position > LEAVE"); | |||
| return total_samples_sent; | |||
| ENTER("wave_get_write_position"); | |||
| SHOW("wave_get_write_position: %d\n", total_samples_sent); | |||
| SHOW_TIME("wave_get_write_position > LEAVE"); | |||
| return total_samples_sent; | |||
| } | |||
| // wave_get_remaining_time | |||
| @@ -468,48 +468,67 @@ uint32_t wave_get_write_position(void* theHandler) | |||
| // | |||
| int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| { | |||
| uint32_t a_time=0; | |||
| uint32_t actual_index; | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_remaining_time"); | |||
| if (!time) { | |||
| return(-1); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // See if this sample has already been played or is currently | |||
| // playing. | |||
| // | |||
| actual_index = sample - total_samples_skipped; | |||
| if ((sample < total_samples_skipped) || | |||
| (actual_index <= ainfo.play.samples)) { | |||
| *time = 0; | |||
| } else { | |||
| a_time = ((actual_index - ainfo.play.samples) * 1000) / wave_samplerate; | |||
| *time = (uint32_t) a_time; | |||
| } | |||
| SHOW("wave_get_remaining_time for %d: %d\n", sample, *time); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| return 0; | |||
| uint32_t a_time=0; | |||
| uint32_t actual_index; | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_remaining_time"); | |||
| if (!time) { | |||
| return(-1); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // See if this sample has already been played or is currently | |||
| // playing. | |||
| // | |||
| actual_index = sample - total_samples_skipped; | |||
| if ((sample < total_samples_skipped) || | |||
| (actual_index <= ainfo.play.samples)) { | |||
| *time = 0; | |||
| } else { | |||
| a_time = ((actual_index - ainfo.play.samples) * 1000) / wave_samplerate; | |||
| *time = (uint32_t) a_time; | |||
| } | |||
| SHOW("wave_get_remaining_time for %d: %d\n", sample, *time); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| return 0; | |||
| } | |||
| #else | |||
| init wave_init() {return 1;} | |||
| void* wave_open(const char* the_api) {return (void *)1;} | |||
| size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;} | |||
| int wave_close(void* theHandler) {return 0;} | |||
| int wave_is_busy(void* theHandler) {return 0;} | |||
| void wave_terminate() {} | |||
| uint32_t wave_get_read_position(void* theHandler) {return 0;} | |||
| uint32_t wave_get_write_position(void* theHandler) {return 0;} | |||
| void wave_flush(void* theHandler) {} | |||
| init wave_init() { | |||
| return 1; | |||
| } | |||
| void* wave_open(const char* the_api) { | |||
| return (void *)1; | |||
| } | |||
| size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) { | |||
| return theSize; | |||
| } | |||
| int wave_close(void* theHandler) { | |||
| return 0; | |||
| } | |||
| int wave_is_busy(void* theHandler) { | |||
| return 0; | |||
| } | |||
| void wave_terminate() { | |||
| } | |||
| uint32_t wave_get_read_position(void* theHandler) { | |||
| return 0; | |||
| } | |||
| uint32_t wave_get_write_position(void* theHandler) { | |||
| return 0; | |||
| } | |||
| void wave_flush(void* theHandler) { | |||
| } | |||
| typedef int (t_wave_callback)(void); | |||
| void wave_set_callback_is_output_enabled(t_wave_callback* cb) {} | |||
| extern void* wave_test_get_write_buffer() {return NULL;} | |||
| void wave_set_callback_is_output_enabled(t_wave_callback* cb) { | |||
| } | |||
| extern void* wave_test_get_write_buffer() { | |||
| return NULL; | |||
| } | |||
| int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| { | |||
| @@ -522,33 +541,33 @@ int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| void clock_gettime2(struct timespec *ts) | |||
| { | |||
| struct timeval tv; | |||
| struct timeval tv; | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| assert (gettimeofday(&tv, NULL) != -1); | |||
| ts->tv_sec = tv.tv_sec; | |||
| ts->tv_nsec = tv.tv_usec*1000; | |||
| assert (gettimeofday(&tv, NULL) != -1); | |||
| ts->tv_sec = tv.tv_sec; | |||
| ts->tv_nsec = tv.tv_usec*1000; | |||
| } | |||
| void add_time_in_ms(struct timespec *ts, int time_in_ms) | |||
| { | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| uint64_t t_ns = (uint64_t)ts->tv_nsec + 1000000 * (uint64_t)time_in_ms; | |||
| while(t_ns >= ONE_BILLION) | |||
| { | |||
| SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | |||
| ts->tv_sec += 1; | |||
| t_ns -= ONE_BILLION; | |||
| } | |||
| ts->tv_nsec = (long int)t_ns; | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| uint64_t t_ns = (uint64_t)ts->tv_nsec + 1000000 * (uint64_t)time_in_ms; | |||
| while(t_ns >= ONE_BILLION) | |||
| { | |||
| SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | |||
| ts->tv_sec += 1; | |||
| t_ns -= ONE_BILLION; | |||
| } | |||
| ts->tv_nsec = (long int)t_ns; | |||
| } | |||
| #endif // USE_ASYNC | |||
| @@ -174,57 +174,57 @@ static unsigned char modulation_tab[N_ROUGHNESS][8] = { | |||
| #define N_FLUTTER 0x170 | |||
| static int Flutter_inc; | |||
| static const unsigned char Flutter_tab[N_FLUTTER] = { | |||
| 0x80, 0x9b, 0xb5, 0xcb, 0xdc, 0xe8, 0xed, 0xec, | |||
| 0xe6, 0xdc, 0xce, 0xbf, 0xb0, 0xa3, 0x98, 0x90, | |||
| 0x8c, 0x8b, 0x8c, 0x8f, 0x92, 0x94, 0x95, 0x92, | |||
| 0x8c, 0x83, 0x78, 0x69, 0x59, 0x49, 0x3c, 0x31, | |||
| 0x2a, 0x29, 0x2d, 0x36, 0x44, 0x56, 0x69, 0x7d, | |||
| 0x8f, 0x9f, 0xaa, 0xb1, 0xb2, 0xad, 0xa4, 0x96, | |||
| 0x87, 0x78, 0x69, 0x5c, 0x53, 0x4f, 0x4f, 0x55, | |||
| 0x5e, 0x6b, 0x7a, 0x88, 0x96, 0xa2, 0xab, 0xb0, | |||
| 0xb1, 0xae, 0xa8, 0xa0, 0x98, 0x91, 0x8b, 0x88, | |||
| 0x89, 0x8d, 0x94, 0x9d, 0xa8, 0xb2, 0xbb, 0xc0, | |||
| 0xc1, 0xbd, 0xb4, 0xa5, 0x92, 0x7c, 0x63, 0x4a, | |||
| 0x32, 0x1e, 0x0e, 0x05, 0x02, 0x05, 0x0f, 0x1e, | |||
| 0x30, 0x44, 0x59, 0x6d, 0x7f, 0x8c, 0x96, 0x9c, | |||
| 0x9f, 0x9f, 0x9d, 0x9b, 0x99, 0x99, 0x9c, 0xa1, | |||
| 0xa9, 0xb3, 0xbf, 0xca, 0xd5, 0xdc, 0xe0, 0xde, | |||
| 0xd8, 0xcc, 0xbb, 0xa6, 0x8f, 0x77, 0x60, 0x4b, | |||
| 0x3a, 0x2e, 0x28, 0x29, 0x2f, 0x3a, 0x48, 0x59, | |||
| 0x6a, 0x7a, 0x86, 0x90, 0x94, 0x95, 0x91, 0x89, | |||
| 0x80, 0x75, 0x6b, 0x62, 0x5c, 0x5a, 0x5c, 0x61, | |||
| 0x69, 0x74, 0x80, 0x8a, 0x94, 0x9a, 0x9e, 0x9d, | |||
| 0x98, 0x90, 0x86, 0x7c, 0x71, 0x68, 0x62, 0x60, | |||
| 0x63, 0x6b, 0x78, 0x88, 0x9b, 0xaf, 0xc2, 0xd2, | |||
| 0xdf, 0xe6, 0xe7, 0xe2, 0xd7, 0xc6, 0xb2, 0x9c, | |||
| 0x84, 0x6f, 0x5b, 0x4b, 0x40, 0x39, 0x37, 0x38, | |||
| 0x3d, 0x43, 0x4a, 0x50, 0x54, 0x56, 0x55, 0x52, | |||
| 0x4d, 0x48, 0x42, 0x3f, 0x3e, 0x41, 0x49, 0x56, | |||
| 0x67, 0x7c, 0x93, 0xab, 0xc3, 0xd9, 0xea, 0xf6, | |||
| 0xfc, 0xfb, 0xf4, 0xe7, 0xd5, 0xc0, 0xaa, 0x94, | |||
| 0x80, 0x71, 0x64, 0x5d, 0x5a, 0x5c, 0x61, 0x68, | |||
| 0x70, 0x77, 0x7d, 0x7f, 0x7f, 0x7b, 0x74, 0x6b, | |||
| 0x61, 0x57, 0x4e, 0x48, 0x46, 0x48, 0x4e, 0x59, | |||
| 0x66, 0x75, 0x84, 0x93, 0x9f, 0xa7, 0xab, 0xaa, | |||
| 0xa4, 0x99, 0x8b, 0x7b, 0x6a, 0x5b, 0x4e, 0x46, | |||
| 0x43, 0x45, 0x4d, 0x5a, 0x6b, 0x7f, 0x92, 0xa6, | |||
| 0xb8, 0xc5, 0xcf, 0xd3, 0xd2, 0xcd, 0xc4, 0xb9, | |||
| 0xad, 0xa1, 0x96, 0x8e, 0x89, 0x87, 0x87, 0x8a, | |||
| 0x8d, 0x91, 0x92, 0x91, 0x8c, 0x84, 0x78, 0x68, | |||
| 0x55, 0x41, 0x2e, 0x1c, 0x0e, 0x05, 0x01, 0x05, | |||
| 0x0f, 0x1f, 0x34, 0x4d, 0x68, 0x81, 0x9a, 0xb0, | |||
| 0xc1, 0xcd, 0xd3, 0xd3, 0xd0, 0xc8, 0xbf, 0xb5, | |||
| 0xab, 0xa4, 0x9f, 0x9c, 0x9d, 0xa0, 0xa5, 0xaa, | |||
| 0xae, 0xb1, 0xb0, 0xab, 0xa3, 0x96, 0x87, 0x76, | |||
| 0x63, 0x51, 0x42, 0x36, 0x2f, 0x2d, 0x31, 0x3a, | |||
| 0x48, 0x59, 0x6b, 0x7e, 0x8e, 0x9c, 0xa6, 0xaa, | |||
| 0xa9, 0xa3, 0x98, 0x8a, 0x7b, 0x6c, 0x5d, 0x52, | |||
| 0x4a, 0x48, 0x4a, 0x50, 0x5a, 0x67, 0x75, 0x82 | |||
| 0x80, 0x9b, 0xb5, 0xcb, 0xdc, 0xe8, 0xed, 0xec, | |||
| 0xe6, 0xdc, 0xce, 0xbf, 0xb0, 0xa3, 0x98, 0x90, | |||
| 0x8c, 0x8b, 0x8c, 0x8f, 0x92, 0x94, 0x95, 0x92, | |||
| 0x8c, 0x83, 0x78, 0x69, 0x59, 0x49, 0x3c, 0x31, | |||
| 0x2a, 0x29, 0x2d, 0x36, 0x44, 0x56, 0x69, 0x7d, | |||
| 0x8f, 0x9f, 0xaa, 0xb1, 0xb2, 0xad, 0xa4, 0x96, | |||
| 0x87, 0x78, 0x69, 0x5c, 0x53, 0x4f, 0x4f, 0x55, | |||
| 0x5e, 0x6b, 0x7a, 0x88, 0x96, 0xa2, 0xab, 0xb0, | |||
| 0xb1, 0xae, 0xa8, 0xa0, 0x98, 0x91, 0x8b, 0x88, | |||
| 0x89, 0x8d, 0x94, 0x9d, 0xa8, 0xb2, 0xbb, 0xc0, | |||
| 0xc1, 0xbd, 0xb4, 0xa5, 0x92, 0x7c, 0x63, 0x4a, | |||
| 0x32, 0x1e, 0x0e, 0x05, 0x02, 0x05, 0x0f, 0x1e, | |||
| 0x30, 0x44, 0x59, 0x6d, 0x7f, 0x8c, 0x96, 0x9c, | |||
| 0x9f, 0x9f, 0x9d, 0x9b, 0x99, 0x99, 0x9c, 0xa1, | |||
| 0xa9, 0xb3, 0xbf, 0xca, 0xd5, 0xdc, 0xe0, 0xde, | |||
| 0xd8, 0xcc, 0xbb, 0xa6, 0x8f, 0x77, 0x60, 0x4b, | |||
| 0x3a, 0x2e, 0x28, 0x29, 0x2f, 0x3a, 0x48, 0x59, | |||
| 0x6a, 0x7a, 0x86, 0x90, 0x94, 0x95, 0x91, 0x89, | |||
| 0x80, 0x75, 0x6b, 0x62, 0x5c, 0x5a, 0x5c, 0x61, | |||
| 0x69, 0x74, 0x80, 0x8a, 0x94, 0x9a, 0x9e, 0x9d, | |||
| 0x98, 0x90, 0x86, 0x7c, 0x71, 0x68, 0x62, 0x60, | |||
| 0x63, 0x6b, 0x78, 0x88, 0x9b, 0xaf, 0xc2, 0xd2, | |||
| 0xdf, 0xe6, 0xe7, 0xe2, 0xd7, 0xc6, 0xb2, 0x9c, | |||
| 0x84, 0x6f, 0x5b, 0x4b, 0x40, 0x39, 0x37, 0x38, | |||
| 0x3d, 0x43, 0x4a, 0x50, 0x54, 0x56, 0x55, 0x52, | |||
| 0x4d, 0x48, 0x42, 0x3f, 0x3e, 0x41, 0x49, 0x56, | |||
| 0x67, 0x7c, 0x93, 0xab, 0xc3, 0xd9, 0xea, 0xf6, | |||
| 0xfc, 0xfb, 0xf4, 0xe7, 0xd5, 0xc0, 0xaa, 0x94, | |||
| 0x80, 0x71, 0x64, 0x5d, 0x5a, 0x5c, 0x61, 0x68, | |||
| 0x70, 0x77, 0x7d, 0x7f, 0x7f, 0x7b, 0x74, 0x6b, | |||
| 0x61, 0x57, 0x4e, 0x48, 0x46, 0x48, 0x4e, 0x59, | |||
| 0x66, 0x75, 0x84, 0x93, 0x9f, 0xa7, 0xab, 0xaa, | |||
| 0xa4, 0x99, 0x8b, 0x7b, 0x6a, 0x5b, 0x4e, 0x46, | |||
| 0x43, 0x45, 0x4d, 0x5a, 0x6b, 0x7f, 0x92, 0xa6, | |||
| 0xb8, 0xc5, 0xcf, 0xd3, 0xd2, 0xcd, 0xc4, 0xb9, | |||
| 0xad, 0xa1, 0x96, 0x8e, 0x89, 0x87, 0x87, 0x8a, | |||
| 0x8d, 0x91, 0x92, 0x91, 0x8c, 0x84, 0x78, 0x68, | |||
| 0x55, 0x41, 0x2e, 0x1c, 0x0e, 0x05, 0x01, 0x05, | |||
| 0x0f, 0x1f, 0x34, 0x4d, 0x68, 0x81, 0x9a, 0xb0, | |||
| 0xc1, 0xcd, 0xd3, 0xd3, 0xd0, 0xc8, 0xbf, 0xb5, | |||
| 0xab, 0xa4, 0x9f, 0x9c, 0x9d, 0xa0, 0xa5, 0xaa, | |||
| 0xae, 0xb1, 0xb0, 0xab, 0xa3, 0x96, 0x87, 0x76, | |||
| 0x63, 0x51, 0x42, 0x36, 0x2f, 0x2d, 0x31, 0x3a, | |||
| 0x48, 0x59, 0x6b, 0x7e, 0x8e, 0x9c, 0xa6, 0xaa, | |||
| 0xa9, 0xa3, 0x98, 0x8a, 0x7b, 0x6c, 0x5d, 0x52, | |||
| 0x4a, 0x48, 0x4a, 0x50, 0x5a, 0x67, 0x75, 0x82 | |||
| }; | |||
| // waveform shape table for HF peaks, formants 6,7,8 | |||
| @@ -235,31 +235,33 @@ static int wavemult_max=0; | |||
| // the presets are for 22050 Hz sample rate. | |||
| // A different rate will need to recalculate the presets in WavegenInit() | |||
| static unsigned char wavemult[N_WAVEMULT] = { | |||
| 0, 0, 0, 2, 3, 5, 8, 11, 14, 18, 22, 27, 32, 37, 43, 49, | |||
| 55, 62, 69, 76, 83, 90, 98,105,113,121,128,136,144,152,159,166, | |||
| 174,181,188,194,201,207,213,218,224,228,233,237,240,244,246,249, | |||
| 251,252,253,253,253,253,252,251,249,246,244,240,237,233,228,224, | |||
| 218,213,207,201,194,188,181,174,166,159,152,144,136,128,121,113, | |||
| 105, 98, 90, 83, 76, 69, 62, 55, 49, 43, 37, 32, 27, 22, 18, 14, | |||
| 11, 8, 5, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | |||
| 0, 0, 0, 2, 3, 5, 8, 11, 14, 18, 22, 27, 32, 37, 43, 49, | |||
| 55, 62, 69, 76, 83, 90, 98,105,113,121,128,136,144,152,159,166, | |||
| 174,181,188,194,201,207,213,218,224,228,233,237,240,244,246,249, | |||
| 251,252,253,253,253,253,252,251,249,246,244,240,237,233,228,224, | |||
| 218,213,207,201,194,188,181,174,166,159,152,144,136,128,121,113, | |||
| 105, 98, 90, 83, 76, 69, 62, 55, 49, 43, 37, 32, 27, 22, 18, 14, | |||
| 11, 8, 5, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | |||
| }; | |||
| // set from y = pow(2,x) * 128, x=-1 to 1 | |||
| unsigned char pitch_adjust_tab[MAX_PITCH_VALUE+1] = { | |||
| 64, 65, 66, 67, 68, 69, 70, 71, | |||
| 72, 73, 74, 75, 76, 77, 78, 79, | |||
| 80, 81, 82, 83, 84, 86, 87, 88, | |||
| 89, 91, 92, 93, 94, 96, 97, 98, | |||
| 100,101,103,104,105,107,108,110, | |||
| 111,113,115,116,118,119,121,123, | |||
| 124,126,128,130,132,133,135,137, | |||
| 139,141,143,145,147,149,151,153, | |||
| 155,158,160,162,164,167,169,171, | |||
| 174,176,179,181,184,186,189,191, | |||
| 194,197,199,202,205,208,211,214, | |||
| 217,220,223,226,229,232,236,239, | |||
| 242,246,249,252, 254,255 }; | |||
| 64, 65, 66, 67, 68, 69, 70, 71, | |||
| 72, 73, 74, 75, 76, 77, 78, 79, | |||
| 80, 81, 82, 83, 84, 86, 87, 88, | |||
| 89, 91, 92, 93, 94, 96, 97, 98, | |||
| 100,101,103,104,105,107,108,110, | |||
| 111,113,115,116,118,119,121,123, | |||
| 124,126,128,130,132,133,135,137, | |||
| 139,141,143,145,147,149,151,153, | |||
| 155,158,160,162,164,167,169,171, | |||
| 174,176,179,181,184,186,189,191, | |||
| 194,197,199,202,205,208,211,214, | |||
| 217,220,223,226,229,232,236,239, | |||
| 242,246,249,252, 254,255 | |||
| }; | |||
| #ifdef LOG_FRAMES | |||
| @@ -324,7 +326,7 @@ int WcmdqFree() | |||
| int WcmdqUsed() | |||
| { | |||
| return(N_WCMDQ - WcmdqFree()); | |||
| return(N_WCMDQ - WcmdqFree()); | |||
| } | |||
| @@ -346,48 +348,52 @@ static void WcmdqIncHead() | |||
| #define PEAKSHAPEW 256 | |||
| static const float pk_shape_x[2][8] = { | |||
| {0,-0.6f, 0.0f, 0.6f, 1.4f, 2.5f, 4.5f, 5.5f}, | |||
| {0,-0.6f, 0.0f, 0.6f, 1.4f, 2.0f, 4.5f, 5.5f }}; | |||
| {0,-0.6f, 0.0f, 0.6f, 1.4f, 2.0f, 4.5f, 5.5f } | |||
| }; | |||
| static const float pk_shape_y[2][8] = { | |||
| {0, 67, 81, 67, 31, 14, 0, -6} , | |||
| {0, 77, 81, 77, 31, 7, 0, -6 }}; | |||
| {0, 67, 81, 67, 31, 14, 0, -6}, | |||
| {0, 77, 81, 77, 31, 7, 0, -6 } | |||
| }; | |||
| unsigned char pk_shape1[PEAKSHAPEW+1] = { | |||
| 255,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246, | |||
| 245,244,242,241,239,238,236,234,233,231,229,227,225,223,220,218, | |||
| 216,213,211,209,207,205,203,201,199,197,195,193,191,189,187,185, | |||
| 183,180,178,176,173,171,169,166,164,161,159,156,154,151,148,146, | |||
| 143,140,138,135,132,129,126,123,120,118,115,112,108,105,102, 99, | |||
| 96, 95, 93, 91, 90, 88, 86, 85, 83, 82, 80, 79, 77, 76, 74, 73, | |||
| 72, 70, 69, 68, 67, 66, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, | |||
| 55, 54, 53, 52, 52, 51, 50, 50, 49, 48, 48, 47, 47, 46, 46, 46, | |||
| 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 44, 43, | |||
| 42, 42, 41, 40, 40, 39, 38, 38, 37, 36, 36, 35, 35, 34, 33, 33, | |||
| 32, 32, 31, 30, 30, 29, 29, 28, 28, 27, 26, 26, 25, 25, 24, 24, | |||
| 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 18, 17, 17, 16, | |||
| 16, 15, 15, 15, 14, 14, 13, 13, 13, 12, 12, 11, 11, 11, 10, 10, | |||
| 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, | |||
| 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, | |||
| 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0 }; | |||
| 255,254,254,254,254,254,253,253,252,251,251,250,249,248,247,246, | |||
| 245,244,242,241,239,238,236,234,233,231,229,227,225,223,220,218, | |||
| 216,213,211,209,207,205,203,201,199,197,195,193,191,189,187,185, | |||
| 183,180,178,176,173,171,169,166,164,161,159,156,154,151,148,146, | |||
| 143,140,138,135,132,129,126,123,120,118,115,112,108,105,102, 99, | |||
| 96, 95, 93, 91, 90, 88, 86, 85, 83, 82, 80, 79, 77, 76, 74, 73, | |||
| 72, 70, 69, 68, 67, 66, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, | |||
| 55, 54, 53, 52, 52, 51, 50, 50, 49, 48, 48, 47, 47, 46, 46, 46, | |||
| 45, 45, 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 44, 43, | |||
| 42, 42, 41, 40, 40, 39, 38, 38, 37, 36, 36, 35, 35, 34, 33, 33, | |||
| 32, 32, 31, 30, 30, 29, 29, 28, 28, 27, 26, 26, 25, 25, 24, 24, | |||
| 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 18, 17, 17, 16, | |||
| 16, 15, 15, 15, 14, 14, 13, 13, 13, 12, 12, 11, 11, 11, 10, 10, | |||
| 10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 6, 5, 5, | |||
| 5, 5, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, | |||
| 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0 | |||
| }; | |||
| static unsigned char pk_shape2[PEAKSHAPEW+1] = { | |||
| 255,254,254,254,254,254,254,254,254,254,253,253,253,253,252,252, | |||
| 252,251,251,251,250,250,249,249,248,248,247,247,246,245,245,244, | |||
| 243,243,242,241,239,237,235,233,231,229,227,225,223,221,218,216, | |||
| 213,211,208,205,203,200,197,194,191,187,184,181,178,174,171,167, | |||
| 163,160,156,152,148,144,140,136,132,127,123,119,114,110,105,100, | |||
| 96, 94, 91, 88, 86, 83, 81, 78, 76, 74, 71, 69, 66, 64, 62, 60, | |||
| 57, 55, 53, 51, 49, 47, 44, 42, 40, 38, 36, 34, 32, 30, 29, 27, | |||
| 25, 23, 21, 19, 18, 16, 14, 12, 11, 9, 7, 6, 4, 3, 1, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0 }; | |||
| 255,254,254,254,254,254,254,254,254,254,253,253,253,253,252,252, | |||
| 252,251,251,251,250,250,249,249,248,248,247,247,246,245,245,244, | |||
| 243,243,242,241,239,237,235,233,231,229,227,225,223,221,218,216, | |||
| 213,211,208,205,203,200,197,194,191,187,184,181,178,174,171,167, | |||
| 163,160,156,152,148,144,140,136,132,127,123,119,114,110,105,100, | |||
| 96, 94, 91, 88, 86, 83, 81, 78, 76, 74, 71, 69, 66, 64, 62, 60, | |||
| 57, 55, 53, 51, 49, 47, 44, 42, 40, 38, 36, 34, 32, 30, 29, 27, | |||
| 25, 23, 21, 19, 18, 16, 14, 12, 11, 9, 7, 6, 4, 3, 1, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |||
| 0 | |||
| }; | |||
| static unsigned char *pk_shape; | |||
| @@ -405,11 +411,11 @@ int outbuffer_size = 0; | |||
| #if USE_PORTAUDIO == 18 | |||
| static int WaveCallback(void *inputBuffer, void *outputBuffer, | |||
| unsigned long framesPerBuffer, PaTimestamp outTime, void *userData ) | |||
| unsigned long framesPerBuffer, PaTimestamp outTime, void *userData ) | |||
| #else | |||
| static int WaveCallback(const void *inputBuffer, void *outputBuffer, | |||
| long unsigned int framesPerBuffer, const PaStreamCallbackTimeInfo *outTime, | |||
| PaStreamCallbackFlags flags, void *userData ) | |||
| long unsigned int framesPerBuffer, const PaStreamCallbackTimeInfo *outTime, | |||
| PaStreamCallbackFlags flags, void *userData ) | |||
| #endif | |||
| { | |||
| int ix; | |||
| @@ -539,13 +545,13 @@ static int WaveCallback(const void *inputBuffer, void *outputBuffer, | |||
| is broken */ | |||
| static PaError Pa_OpenDefaultStream2( PaStream** stream, | |||
| int inputChannelCount, | |||
| int outputChannelCount, | |||
| PaSampleFormat sampleFormat, | |||
| double sampleRate, | |||
| unsigned long framesPerBuffer, | |||
| PaStreamCallback *streamCallback, | |||
| void *userData ) | |||
| int inputChannelCount, | |||
| int outputChannelCount, | |||
| PaSampleFormat sampleFormat, | |||
| double sampleRate, | |||
| unsigned long framesPerBuffer, | |||
| PaStreamCallback *streamCallback, | |||
| void *userData ) | |||
| { | |||
| PaError result; | |||
| PaStreamParameters hostApiOutputParameters; | |||
| @@ -564,13 +570,13 @@ static PaError Pa_OpenDefaultStream2( PaStream** stream, | |||
| defaultLowOutputLatency because it is more important for the default | |||
| stream to work reliably than it is for it to work with the lowest | |||
| latency. | |||
| */ | |||
| */ | |||
| hostApiOutputParameters.suggestedLatency = | |||
| Pa_GetDeviceInfo( hostApiOutputParameters.device )->defaultHighOutputLatency; | |||
| Pa_GetDeviceInfo( hostApiOutputParameters.device )->defaultHighOutputLatency; | |||
| hostApiOutputParameters.hostApiSpecificStreamInfo = NULL; | |||
| result = Pa_OpenStream( | |||
| stream, NULL, &hostApiOutputParameters, sampleRate, framesPerBuffer, paNoFlag, streamCallback, userData ); | |||
| stream, NULL, &hostApiOutputParameters, sampleRate, framesPerBuffer, paNoFlag, streamCallback, userData ); | |||
| return(result); | |||
| } | |||
| @@ -707,7 +713,7 @@ int WavegenInitSound() | |||
| void WavegenInit(int rate, int wavemult_fact) | |||
| { | |||
| int ix; | |||
| int ix; | |||
| double x; | |||
| if(wavemult_fact == 0) | |||
| @@ -754,8 +760,8 @@ void WavegenInit(int rate, int wavemult_fact) | |||
| #endif | |||
| #ifdef LOG_FRAMES | |||
| remove("log-espeakedit"); | |||
| remove("log-klatt"); | |||
| remove("log-espeakedit"); | |||
| remove("log-klatt"); | |||
| #endif | |||
| } | |||
| @@ -823,7 +829,7 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) | |||
| // control 0=initial call, 1=every 64 cycles | |||
| // pitch and freqs are Hz<<16 | |||
| // pitch and freqs are Hz<<16 | |||
| int f; | |||
| wavegen_peaks_t *p; | |||
| @@ -855,7 +861,7 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) | |||
| if(hmax > hmax_samplerate) | |||
| hmax = hmax_samplerate; | |||
| for(h=0;h<=hmax;h++) | |||
| for(h=0; h<=hmax; h++) | |||
| htab[h]=0; | |||
| h=0; | |||
| @@ -879,23 +885,23 @@ int PeaksToHarmspect(wavegen_peaks_t *peaks, int pitch, int *htab, int control) | |||
| } | |||
| } | |||
| { | |||
| int y; | |||
| int h2; | |||
| // increase bass | |||
| y = peaks[1].height * 10; // addition as a multiple of 1/256s | |||
| h2 = (1000<<16)/pitch; // decrease until 1000Hz | |||
| if(h2 > 0) | |||
| { | |||
| x = y/h2; | |||
| h = 1; | |||
| while(y > 0) | |||
| int y; | |||
| int h2; | |||
| // increase bass | |||
| y = peaks[1].height * 10; // addition as a multiple of 1/256s | |||
| h2 = (1000<<16)/pitch; // decrease until 1000Hz | |||
| if(h2 > 0) | |||
| { | |||
| htab[h++] += y; | |||
| y -= x; | |||
| x = y/h2; | |||
| h = 1; | |||
| while(y > 0) | |||
| { | |||
| htab[h++] += y; | |||
| y -= x; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| // find the nearest harmonic for HF peaks where we don't use shape | |||
| for(; pk<N_PEAKS; pk++) | |||
| @@ -993,7 +999,7 @@ static void AdvanceParameters() | |||
| peaks[ix].right = peaks[ix].left; | |||
| } | |||
| } | |||
| for(;ix < 8; ix++) | |||
| for(; ix < 8; ix++) | |||
| { | |||
| // formants 6,7,8 don't have a width parameter | |||
| if(ix < 7) | |||
| @@ -1026,7 +1032,7 @@ static double resonator(RESONATOR *r, double input) | |||
| r->x2 = r->x1; | |||
| r->x1 = x; | |||
| return x; | |||
| return x; | |||
| } | |||
| @@ -1146,7 +1152,7 @@ int Wavegen() | |||
| // continue until the output buffer is full, or | |||
| // the required number of samples have been produced | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if((end_wave==0) && (samplecount==nsamples)) | |||
| return(0); | |||
| @@ -1163,7 +1169,7 @@ int Wavegen() | |||
| // adjust amplitude to compensate for fewer harmonics at higher pitch | |||
| amplitude2 = (wdata.amplitude * (wdata.pitch >> 8) * wdata.amplitude_fmt)/(10000 << 3); | |||
| // switch sign of harmonics above about 900Hz, to reduce max peak amplitude | |||
| // switch sign of harmonics above about 900Hz, to reduce max peak amplitude | |||
| h_switch_sign = 890 / (wdata.pitch >> 12); | |||
| } | |||
| else | |||
| @@ -1646,16 +1652,16 @@ void SetPitch(int length, unsigned char *env, int pitch1, int pitch2) | |||
| // length in samples | |||
| #ifdef LOG_FRAMES | |||
| if(option_log_frames) | |||
| { | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| if(option_log_frames) | |||
| { | |||
| fprintf(f_log," pitch %3d %3d %3dmS\n",pitch1,pitch2,(length*1000)/samplerate); | |||
| fclose(f_log); | |||
| f_log=NULL; | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| { | |||
| fprintf(f_log," pitch %3d %3d %3dmS\n",pitch1,pitch2,(length*1000)/samplerate); | |||
| fclose(f_log); | |||
| f_log=NULL; | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| if((wdata.pitch_env = env)==NULL) | |||
| wdata.pitch_env = env_fall; // default | |||
| @@ -1690,19 +1696,19 @@ void SetSynth(int length, int modn, frame_t *fr1, frame_t *fr2, voice_t *v) | |||
| static int glottal_reduce_tab2[4] = {0x90, 0xa0, 0xb0, 0xc0}; // vowel after [?], amp * 1/256 | |||
| #ifdef LOG_FRAMES | |||
| if(option_log_frames) | |||
| { | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| if(option_log_frames) | |||
| { | |||
| fprintf(f_log,"%3dmS %3d %3d %4d %4d (%3d %3d %3d %3d) to %3d %3d %4d %4d (%3d %3d %3d %3d)\n",length*1000/samplerate, | |||
| fr1->ffreq[0],fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3], fr1->fheight[0],fr1->fheight[1],fr1->fheight[2],fr1->fheight[3], | |||
| fr2->ffreq[0],fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3], fr2->fheight[0],fr2->fheight[1],fr2->fheight[2],fr2->fheight[3] ); | |||
| f_log=fopen("log-espeakedit","a"); | |||
| if(f_log != NULL) | |||
| { | |||
| fprintf(f_log,"%3dmS %3d %3d %4d %4d (%3d %3d %3d %3d) to %3d %3d %4d %4d (%3d %3d %3d %3d)\n",length*1000/samplerate, | |||
| fr1->ffreq[0],fr1->ffreq[1],fr1->ffreq[2],fr1->ffreq[3], fr1->fheight[0],fr1->fheight[1],fr1->fheight[2],fr1->fheight[3], | |||
| fr2->ffreq[0],fr2->ffreq[1],fr2->ffreq[2],fr2->ffreq[3], fr2->fheight[0],fr2->fheight[1],fr2->fheight[2],fr2->fheight[3] ); | |||
| fclose(f_log); | |||
| f_log=NULL; | |||
| fclose(f_log); | |||
| f_log=NULL; | |||
| } | |||
| } | |||
| } | |||
| #endif | |||
| harm_sqrt_n = 0; | |||
| @@ -1723,7 +1729,7 @@ if(option_log_frames) | |||
| glottal_reduce = glottal_reduce_tab2[(modn >> 8) & 3]; | |||
| } | |||
| for(qix=wcmdq_head+1;;qix++) | |||
| for(qix=wcmdq_head+1;; qix++) | |||
| { | |||
| if(qix >= N_WCMDQ) qix = 0; | |||
| if(qix == wcmdq_tail) break; | |||
| @@ -1977,7 +1983,7 @@ static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text | |||
| } | |||
| if(sonicGetSpeed(sonicSpeedupStream) != sonicSpeed) | |||
| { | |||
| sonicSetSpeed(sonicSpeedupStream, sonicSpeed); | |||
| sonicSetSpeed(sonicSpeedupStream, sonicSpeed); | |||
| } | |||
| sonicWriteShortToStream(sonicSpeedupStream, outbuf, length_in); | |||
| @@ -67,60 +67,60 @@ unsigned int wavefile_count = 0; | |||
| int end_of_sentence = 0; | |||
| static const char *help_text = | |||
| "\nspeak-ng [options] [\"<words>\"]\n\n" | |||
| "-f <text file> Text file to speak\n" | |||
| "--stdin Read text input from stdin instead of a file\n\n" | |||
| "If neither -f nor --stdin, then <words> are spoken, or if none then text\n" | |||
| "is spoken from stdin, each line separately.\n\n" | |||
| "-a <integer>\n" | |||
| "\t Amplitude, 0 to 200, default is 100\n" | |||
| "-g <integer>\n" | |||
| "\t Word gap. Pause between words, units of 10mS at the default speed\n" | |||
| "-k <integer>\n" | |||
| "\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" | |||
| "\t higher values indicate a pitch increase (try -k20).\n" | |||
| "-l <integer>\n" | |||
| "\t Line length. If not zero (which is the default), consider\n" | |||
| "\t lines less than this length as end-of-clause\n" | |||
| "-p <integer>\n" | |||
| "\t Pitch adjustment, 0 to 99, default is 50\n" | |||
| "-s <integer>\n" | |||
| "\t Speed in approximate words per minute. The default is 175\n" | |||
| "-v <voice name>\n" | |||
| "\t Use voice file of this name from espeak-data/voices\n" | |||
| "-w <wave file name>\n" | |||
| "\t Write speech to this WAV file, rather than speaking it directly\n" | |||
| "-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n" | |||
| "-m\t Interpret SSML markup, and ignore other < > tags\n" | |||
| "-q\t Quiet, don't produce any speech (may be useful with -x)\n" | |||
| "-x\t Write phoneme mnemonics to stdout\n" | |||
| "-X\t Write phonemes mnemonics and translation trace to stdout\n" | |||
| "-z\t No final sentence pause at the end of the text\n" | |||
| "--compile=<voice name>\n" | |||
| "\t Compile pronunciation rules and dictionary from the current\n" | |||
| "\t directory. <voice name> specifies the language\n" | |||
| "--ipa Write phonemes to stdout using International Phonetic Alphabet\n" | |||
| "--path=\"<path>\"\n" | |||
| "\t Specifies the directory containing the espeak-data directory\n" | |||
| "--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n" | |||
| "--phonout=\"<filename>\"\n" | |||
| "\t Write phoneme output from -x -X --ipa and --pho to this file\n" | |||
| "--punct=\"<characters>\"\n" | |||
| "\t Speak the names of punctuation characters during speaking. If\n" | |||
| "\t =<characters> is omitted, all punctuation is spoken.\n" | |||
| "--sep=<character>\n" | |||
| "\t Separate phonemes (from -x --ipa) with <character>.\n" | |||
| "\t Default is space, z means ZWJN character.\n" | |||
| "--split=<minutes>\n" | |||
| "\t Starts a new WAV file every <minutes>. Used with -w\n" | |||
| "--stdout Write speech output to stdout\n" | |||
| "--tie=<character>\n" | |||
| "\t Use a tie character within multi-letter phoneme names.\n" | |||
| "\t Default is U+361, z means ZWJ character.\n" | |||
| "--version Shows version number and date, and location of espeak-data\n" | |||
| "--voices=<language>\n" | |||
| "\t List the available voices for the specified language.\n" | |||
| "\t If <language> is omitted, then list all voices.\n"; | |||
| "\nspeak-ng [options] [\"<words>\"]\n\n" | |||
| "-f <text file> Text file to speak\n" | |||
| "--stdin Read text input from stdin instead of a file\n\n" | |||
| "If neither -f nor --stdin, then <words> are spoken, or if none then text\n" | |||
| "is spoken from stdin, each line separately.\n\n" | |||
| "-a <integer>\n" | |||
| "\t Amplitude, 0 to 200, default is 100\n" | |||
| "-g <integer>\n" | |||
| "\t Word gap. Pause between words, units of 10mS at the default speed\n" | |||
| "-k <integer>\n" | |||
| "\t Indicate capital letters with: 1=sound, 2=the word \"capitals\",\n" | |||
| "\t higher values indicate a pitch increase (try -k20).\n" | |||
| "-l <integer>\n" | |||
| "\t Line length. If not zero (which is the default), consider\n" | |||
| "\t lines less than this length as end-of-clause\n" | |||
| "-p <integer>\n" | |||
| "\t Pitch adjustment, 0 to 99, default is 50\n" | |||
| "-s <integer>\n" | |||
| "\t Speed in approximate words per minute. The default is 175\n" | |||
| "-v <voice name>\n" | |||
| "\t Use voice file of this name from espeak-data/voices\n" | |||
| "-w <wave file name>\n" | |||
| "\t Write speech to this WAV file, rather than speaking it directly\n" | |||
| "-b\t Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit \n" | |||
| "-m\t Interpret SSML markup, and ignore other < > tags\n" | |||
| "-q\t Quiet, don't produce any speech (may be useful with -x)\n" | |||
| "-x\t Write phoneme mnemonics to stdout\n" | |||
| "-X\t Write phonemes mnemonics and translation trace to stdout\n" | |||
| "-z\t No final sentence pause at the end of the text\n" | |||
| "--compile=<voice name>\n" | |||
| "\t Compile pronunciation rules and dictionary from the current\n" | |||
| "\t directory. <voice name> specifies the language\n" | |||
| "--ipa Write phonemes to stdout using International Phonetic Alphabet\n" | |||
| "--path=\"<path>\"\n" | |||
| "\t Specifies the directory containing the espeak-data directory\n" | |||
| "--pho Write mbrola phoneme data (.pho) to stdout or to the file in --phonout\n" | |||
| "--phonout=\"<filename>\"\n" | |||
| "\t Write phoneme output from -x -X --ipa and --pho to this file\n" | |||
| "--punct=\"<characters>\"\n" | |||
| "\t Speak the names of punctuation characters during speaking. If\n" | |||
| "\t =<characters> is omitted, all punctuation is spoken.\n" | |||
| "--sep=<character>\n" | |||
| "\t Separate phonemes (from -x --ipa) with <character>.\n" | |||
| "\t Default is space, z means ZWJN character.\n" | |||
| "--split=<minutes>\n" | |||
| "\t Starts a new WAV file every <minutes>. Used with -w\n" | |||
| "--stdout Write speech output to stdout\n" | |||
| "--tie=<character>\n" | |||
| "\t Use a tie character within multi-letter phoneme names.\n" | |||
| "\t Default is U+361, z means ZWJ character.\n" | |||
| "--version Shows version number and date, and location of espeak-data\n" | |||
| "--voices=<language>\n" | |||
| "\t List the available voices for the specified language.\n" | |||
| "\t If <language> is omitted, then list all voices.\n"; | |||
| void DisplayVoices(FILE *f_out, char *language); | |||
| @@ -187,7 +187,7 @@ void DisplayVoices(FILE *f_out, char *language) | |||
| break; | |||
| } | |||
| fprintf(f_out,"%2d %-12s%s%c %-20s %-13s ", | |||
| p[0],lang_name,age_buf,genders[v->gender],buf,v->identifier); | |||
| p[0],lang_name,age_buf,genders[v->gender],buf,v->identifier); | |||
| } | |||
| else | |||
| { | |||
| @@ -208,7 +208,8 @@ static int OpenWaveFile(const char *path, int rate) | |||
| static unsigned char wave_hdr[44] = { | |||
| 'R','I','F','F',0x24,0xf0,0xff,0x7f,'W','A','V','E','f','m','t',' ', | |||
| 0x10,0,0,0,1,0,1,0, 9,0x3d,0,0,0x12,0x7a,0,0, | |||
| 2,0,0x10,0,'d','a','t','a', 0x00,0xf0,0xff,0x7f}; | |||
| 2,0,0x10,0,'d','a','t','a', 0x00,0xf0,0xff,0x7f | |||
| }; | |||
| if(path == NULL) | |||
| return(2); | |||
| @@ -246,13 +247,13 @@ static int OpenWaveFile(const char *path, int rate) | |||
| static void CloseWaveFile() | |||
| { | |||
| unsigned int pos; | |||
| unsigned int pos; | |||
| if((f_wave == NULL) || (f_wave == stdout)) | |||
| return; | |||
| if((f_wave == NULL) || (f_wave == stdout)) | |||
| return; | |||
| fflush(f_wave); | |||
| pos = ftell(f_wave); | |||
| fflush(f_wave); | |||
| pos = ftell(f_wave); | |||
| fseek(f_wave,4,SEEK_SET); | |||
| Write4Bytes(f_wave,pos - 8); | |||
| @@ -261,8 +262,8 @@ static void CloseWaveFile() | |||
| Write4Bytes(f_wave,pos - 44); | |||
| fclose(f_wave); | |||
| f_wave = NULL; | |||
| fclose(f_wave); | |||
| f_wave = NULL; | |||
| } | |||
| @@ -352,14 +353,14 @@ static void init_path(char *argv0, char *path_specified) | |||
| sprintf(path_home,"%s\\espeak-data",buf); | |||
| #else | |||
| #ifdef PLATFORM_DOS | |||
| strcpy(path_home,PATH_ESPEAK_DATA); | |||
| strcpy(path_home,PATH_ESPEAK_DATA); | |||
| #else | |||
| char *env; | |||
| if((env = getenv("ESPEAK_DATA_PATH")) != NULL) | |||
| { | |||
| snprintf(path_home,sizeof(path_home),"%s/espeak-data",env); | |||
| if(GetFileLength(path_home) == -2) | |||
| return; // an espeak-data directory exists | |||
| return; // an espeak-data directory exists | |||
| } | |||
| snprintf(path_home,sizeof(path_home),"%s/espeak-data",getenv("HOME")); | |||
| @@ -382,7 +383,7 @@ static int initialise(void) | |||
| // to something other than the default "C". Then, not only Latin1 but also the | |||
| // other characters give the correct results with iswalpha() etc. | |||
| #ifdef PLATFORM_RISCOS | |||
| setlocale(LC_CTYPE,"ISO8859-1"); | |||
| setlocale(LC_CTYPE,"ISO8859-1"); | |||
| #else | |||
| if(setlocale(LC_CTYPE,"en_US.UTF-8") == NULL) | |||
| { | |||
| @@ -416,16 +417,16 @@ static int initialise(void) | |||
| #ifdef NEED_GETOPT | |||
| struct option { | |||
| char *name; | |||
| int has_arg; | |||
| int *flag; | |||
| int val; | |||
| }; | |||
| int optind; | |||
| static int optional_argument; | |||
| static const char *arg_opts = "abfgklpsvw"; // which options have arguments | |||
| static char *opt_string=""; | |||
| struct option { | |||
| char *name; | |||
| int has_arg; | |||
| int *flag; | |||
| int val; | |||
| }; | |||
| int optind; | |||
| static int optional_argument; | |||
| static const char *arg_opts = "abfgklpsvw"; // which options have arguments | |||
| static char *opt_string=""; | |||
| #define no_argument 0 | |||
| #define required_argument 1 | |||
| #define optional_argument 2 | |||
| @@ -434,7 +435,7 @@ static int initialise(void) | |||
| int main (int argc, char **argv) | |||
| { | |||
| static struct option long_options[] = | |||
| { | |||
| { | |||
| {"help", no_argument, 0, 'h'}, | |||
| {"stdin", no_argument, 0, 0x100}, | |||
| {"compile-debug", optional_argument, 0, 0x101}, | |||
| @@ -451,7 +452,7 @@ int main (int argc, char **argv) | |||
| {"sep", optional_argument, 0, 0x10c}, | |||
| {"tie", optional_argument, 0, 0x10d}, | |||
| {0, 0, 0, 0} | |||
| }; | |||
| }; | |||
| static const char *err_load = "Failed to read "; | |||
| @@ -517,7 +518,7 @@ int main (int argc, char **argv) | |||
| break; // -- means don't interpret further - as commands | |||
| opt_string=""; | |||
| for(ix=0; ;ix++) | |||
| for(ix=0;; ix++) | |||
| { | |||
| if(long_options[ix].name == 0) | |||
| break; | |||
| @@ -549,7 +550,7 @@ int main (int argc, char **argv) | |||
| while(true) | |||
| { | |||
| c = getopt_long (argc, argv, "a:b:f:g:hk:l:p:qs:v:w:xXmz", // NOTE: also change arg_opts to indicate which commands have a numeric value | |||
| long_options, &option_index); | |||
| long_options, &option_index); | |||
| /* Detect the end of the options. */ | |||
| if (c == -1) | |||
| @@ -631,23 +632,23 @@ int main (int argc, char **argv) | |||
| option_endpause = 0; | |||
| break; | |||
| case 0x100: // --stdin | |||
| case 0x100: // --stdin | |||
| flag_stdin = 1; | |||
| break; | |||
| case 0x105: // --stdout | |||
| case 0x105: // --stdout | |||
| option_waveout = 1; | |||
| strcpy(wavefile,"stdout"); | |||
| break; | |||
| case 0x101: // --compile-debug | |||
| case 0x102: // --compile | |||
| case 0x102: // --compile | |||
| if(optarg2 != NULL) | |||
| strncpy0(voicename,optarg2,sizeof(voicename)); | |||
| flag_compile = c; | |||
| break; | |||
| case 0x103: // --punct | |||
| case 0x103: // --punct | |||
| option_punctuation = 1; | |||
| if(optarg2 != NULL) | |||
| { | |||
| @@ -693,19 +694,19 @@ int main (int argc, char **argv) | |||
| // deprecated and obsolete | |||
| switch(atoi(optarg2)) | |||
| { | |||
| case 1: | |||
| phonemes_separator = '_'; | |||
| break; | |||
| case 2: | |||
| phonemes_separator = 0x0361; | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 3: | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 1: | |||
| phonemes_separator = '_'; | |||
| break; | |||
| case 2: | |||
| phonemes_separator = 0x0361; | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| case 3: | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| phoneme_options |= espeakPHONEMES_TIE; | |||
| break; | |||
| } | |||
| } | |||
| break; | |||
| @@ -713,15 +714,15 @@ int main (int argc, char **argv) | |||
| init_path(argv[0],data_path); | |||
| printf("speak text-to-speech: %s Data at: %s\n",version_string,path_home); | |||
| exit(0); | |||
| case 0x10c: // --sep | |||
| phoneme_options |= espeakPHONEMES_SHOW; | |||
| if(optarg2 == 0) | |||
| phonemes_separator = ' '; | |||
| else | |||
| utf8_in(&phonemes_separator, optarg2); | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200c; // ZWNJ | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200c; // ZWNJ | |||
| break; | |||
| case 0x10d: // --tie | |||
| @@ -730,8 +731,8 @@ int main (int argc, char **argv) | |||
| phonemes_separator = 0x0361; // default: combining-double-inverted-breve | |||
| else | |||
| utf8_in(&phonemes_separator, optarg2); | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| if(phonemes_separator == 'z') | |||
| phonemes_separator = 0x200d; // ZWJ | |||
| break; | |||
| default: | |||
| @@ -855,7 +856,7 @@ int main (int argc, char **argv) | |||
| SpeakNextClause(f_text,p_text,0); | |||
| ix = 1; | |||
| for(;;) | |||
| for(;; ) | |||
| { | |||
| if(WavegenFile() != 0) | |||
| { | |||