| src/ucd-tools/src/include/ucd/ucd.h | src/ucd-tools/src/include/ucd/ucd.h | ||||
| if OPT_KLATT | if OPT_KLATT | ||||
| src_libespeak_ng_la_CFLAGS += -DINCLUDE_KLATT | |||||
| AM_CFLAGS += -DUSE_KLATT=1 | |||||
| src_libespeak_ng_la_SOURCES += src/libespeak-ng/klatt.c | src_libespeak_ng_la_SOURCES += src/libespeak-ng/klatt.c | ||||
| endif | endif | ||||
| if OPT_SPEECHPLAYER | if OPT_SPEECHPLAYER | ||||
| src_libespeak_ng_la_CFLAGS += -DINCLUDE_SPEECHPLAYER | |||||
| AM_CFLAGS += -DUSE_SPEECHPLAYER=1 | |||||
| src_libespeak_ng_la_SOURCES += src/libespeak-ng/sPlayer.c | src_libespeak_ng_la_SOURCES += src/libespeak-ng/sPlayer.c | ||||
| src_libespeak_ng_la_SOURCES += src/speechPlayer/src/frame.cpp | src_libespeak_ng_la_SOURCES += src/speechPlayer/src/frame.cpp | ||||
| src_libespeak_ng_la_SOURCES += src/speechPlayer/src/speechPlayer.cpp | src_libespeak_ng_la_SOURCES += src/speechPlayer/src/speechPlayer.cpp | ||||
| endif | endif | ||||
| if OPT_MBROLA | if OPT_MBROLA | ||||
| src_libespeak_ng_la_CFLAGS += -DINCLUDE_MBROLA | |||||
| AM_CFLAGS += -DUSE_MBROLA=1 | |||||
| src_libespeak_ng_la_SOURCES += src/libespeak-ng/mbrowrap.c | src_libespeak_ng_la_SOURCES += src/libespeak-ng/mbrowrap.c | ||||
| endif | endif | ||||
| if OPT_ASYNC | if OPT_ASYNC | ||||
| src_libespeak_ng_la_CFLAGS += -DUSE_ASYNC | |||||
| AM_CFLAGS += -DUSE_ASYNC=1 | |||||
| src_libespeak_ng_la_SOURCES += \ | src_libespeak_ng_la_SOURCES += \ | ||||
| src/libespeak-ng/espeak_command.c \ | src/libespeak-ng/espeak_command.c \ | ||||
| src/libespeak-ng/event.c \ | src/libespeak-ng/event.c \ | ||||
| ${PCAUDIOLIB_CFLAGS} ${AM_CFLAGS} | ${PCAUDIOLIB_CFLAGS} ${AM_CFLAGS} | ||||
| src_libespeak_ng_test_la_SOURCES = $(src_libespeak_ng_la_SOURCES) | src_libespeak_ng_test_la_SOURCES = $(src_libespeak_ng_la_SOURCES) | ||||
| if OPT_KLATT | |||||
| src_libespeak_ng_test_la_CFLAGS += -DINCLUDE_KLATT | |||||
| endif | |||||
| if OPT_SPEECHPLAYER | |||||
| src_libespeak_ng_test_la_CFLAGS += -DINCLUDE_SPEECHPLAYER | |||||
| endif | |||||
| check_PROGRAMS += tests/encoding.test | check_PROGRAMS += tests/encoding.test | ||||
| tests_encoding_test_LDADD = src/libespeak-ng.la | tests_encoding_test_LDADD = src/libespeak-ng.la |
| f_wavfile = NULL; | f_wavfile = NULL; | ||||
| if (path[0] != 0) { | if (path[0] != 0) { | ||||
| if (strcmp(path, "stdout") == 0) { | if (strcmp(path, "stdout") == 0) { | ||||
| #ifdef PLATFORM_WINDOWS | |||||
| #if PLATFORM_WINDOWS | |||||
| // prevent Windows adding 0x0d before 0x0a bytes | // prevent Windows adding 0x0d before 0x0a bytes | ||||
| _setmode(_fileno(stdout), _O_BINARY); | _setmode(_fileno(stdout), _O_BINARY); | ||||
| #endif | #endif |
| #include "espeak_command.h" | #include "espeak_command.h" | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| static unsigned int my_current_text_id = 0; | static unsigned int my_current_text_id = 0; | ||||
| #include "fifo.h" | #include "fifo.h" | ||||
| #include "event.h" | #include "event.h" | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| // my_mutex: protects my_thread_is_talking, | // my_mutex: protects my_thread_is_talking, | ||||
| // my_stop_is_required, and the command fifo | // my_stop_is_required, and the command fifo |
| #include "common.h" // for espeak_rand | #include "common.h" // for espeak_rand | ||||
| #include "synthesize.h" // for frame_t, WGEN_DATA, STEPSIZE, N_KLATTP, echo... | #include "synthesize.h" // for frame_t, WGEN_DATA, STEPSIZE, N_KLATTP, echo... | ||||
| #include "voice.h" // for voice_t, N_PEAKS | #include "voice.h" // for voice_t, N_PEAKS | ||||
| #ifdef INCLUDE_SPEECHPLAYER | |||||
| #if USE_SPEECHPLAYER | |||||
| #include "sPlayer.h" | #include "sPlayer.h" | ||||
| #endif | #endif | ||||
| { | { | ||||
| int r_ix; | int r_ix; | ||||
| #ifdef INCLUDE_SPEECHPLAYER | |||||
| #if USE_SPEECHPLAYER | |||||
| KlattResetSP(); | KlattResetSP(); | ||||
| #endif | #endif | ||||
| void KlattFini(void) | void KlattFini(void) | ||||
| { | { | ||||
| #ifdef INCLUDE_SPEECHPLAYER | |||||
| #if USE_SPEECHPLAYER | |||||
| KlattFiniSP(); | KlattFiniSP(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| int Wavegen_Klatt(int length, int resume, frame_t *fr1, frame_t *fr2, WGEN_DATA *wdata, voice_t *wvoice) | int Wavegen_Klatt(int length, int resume, frame_t *fr1, frame_t *fr2, WGEN_DATA *wdata, voice_t *wvoice) | ||||
| { | { | ||||
| #ifdef INCLUDE_SPEECHPLAYER | |||||
| #if USE_SPEECHPLAYER | |||||
| if(wvoice->klattv[0] == 6) | if(wvoice->klattv[0] == 6) | ||||
| return Wavegen_KlattSP(wdata, wvoice, length, resume, fr1, fr2); | return Wavegen_KlattSP(wdata, wvoice, length, resume, fr1, fr2); | ||||
| #endif | #endif | ||||
| int ix; | int ix; | ||||
| #ifdef INCLUDE_SPEECHPLAYER | |||||
| #if USE_SPEECHPLAYER | |||||
| KlattInitSP(); | KlattInitSP(); | ||||
| #endif | #endif | ||||
| speed.min_pause = 5; | speed.min_pause = 5; | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| int wpm_value = wpm; | int wpm_value = wpm; | ||||
| if (voice->speed_percent > 0) | if (voice->speed_percent > 0) |
| fclose(f); | fclose(f); | ||||
| f = NULL; | f = NULL; | ||||
| #ifdef HAVE_MKSTEMP | |||||
| #if HAVE_MKSTEMP | |||||
| strcpy(fname_temp, "/tmp/espeakXXXXXX"); | strcpy(fname_temp, "/tmp/espeakXXXXXX"); | ||||
| int fd_temp; | int fd_temp; | ||||
| if ((fd_temp = mkstemp(fname_temp)) >= 0) | if ((fd_temp = mkstemp(fname_temp)) >= 0) |
| #include <unistd.h> | #include <unistd.h> | ||||
| #include <wchar.h> | #include <wchar.h> | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| #include <pcaudiolib/audio.h> | #include <pcaudiolib/audio.h> | ||||
| #endif | #endif | ||||
| static int event_list_ix = 0; | static int event_list_ix = 0; | ||||
| static int n_event_list; | static int n_event_list; | ||||
| static long count_samples; | static long count_samples; | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| static struct audio_object *my_audio = NULL; | static struct audio_object *my_audio = NULL; | ||||
| #endif | #endif | ||||
| void cancel_audio(void) | void cancel_audio(void) | ||||
| { | { | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | ||||
| audio_object_flush(my_audio); | audio_object_flush(my_audio); | ||||
| } | } | ||||
| static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) | static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) | ||||
| { | { | ||||
| int a_wave_can_be_played = 1; | int a_wave_can_be_played = 1; | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) | if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) | ||||
| a_wave_can_be_played = fifo_is_command_enabled(); | a_wave_can_be_played = fifo_is_command_enabled(); | ||||
| #endif | #endif | ||||
| voice_samplerate = event->id.number; | voice_samplerate = event->id.number; | ||||
| if (out_samplerate != voice_samplerate) { | if (out_samplerate != voice_samplerate) { | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if (out_samplerate != 0) { | if (out_samplerate != 0) { | ||||
| // sound was previously open with a different sample rate | // sound was previously open with a different sample rate | ||||
| audio_object_close(my_audio); | audio_object_close(my_audio); | ||||
| #endif | #endif | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); | int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); | ||||
| if (error != 0) { | if (error != 0) { | ||||
| fprintf(stderr, "error: %s\n", audio_object_strerror(my_audio, error)); | fprintf(stderr, "error: %s\n", audio_object_strerror(my_audio, error)); | ||||
| } | } | ||||
| #endif | #endif | ||||
| out_samplerate = voice_samplerate; | out_samplerate = voice_samplerate; | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) | if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) | ||||
| event_init(); | event_init(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| } | } | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if (out_samplerate == 0) { | if (out_samplerate == 0) { | ||||
| int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); | int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); | ||||
| if (error != 0) { | if (error != 0) { | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if (outbuf && length && a_wave_can_be_played) { | if (outbuf && length && a_wave_can_be_played) { | ||||
| int error = audio_object_write(my_audio, (char *)outbuf, 2*length); | int error = audio_object_write(my_audio, (char *)outbuf, 2*length); | ||||
| if (error != 0) | if (error != 0) | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| while (event && a_wave_can_be_played) { | while (event && a_wave_can_be_played) { | ||||
| // TBD: some event are filtered here but some insight might be given | // TBD: some event are filtered here but some insight might be given | ||||
| // TBD: in synthesise.cpp for avoiding to create WORDs with size=0. | // TBD: in synthesise.cpp for avoiding to create WORDs with size=0. | ||||
| return finished; | return finished; | ||||
| } | } | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| int sync_espeak_terminated_msg(uint32_t unique_identifier, void *user_data) | int sync_espeak_terminated_msg(uint32_t unique_identifier, void *user_data) | ||||
| { | { | ||||
| ESPEAK_NG_API espeak_ng_STATUS espeak_ng_InitializeOutput(espeak_ng_OUTPUT_MODE output_mode, int buffer_length, const char *device) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_InitializeOutput(espeak_ng_OUTPUT_MODE output_mode, int buffer_length, const char *device) | ||||
| { | { | ||||
| (void)device; // unused if HAVE_PCAUDIOLIB_AUDIO_H is not defined | |||||
| (void)device; // unused if USE_LIBPCAUDIO is not defined | |||||
| my_mode = output_mode; | my_mode = output_mode; | ||||
| out_samplerate = 0; | out_samplerate = 0; | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if (((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) && (my_audio == NULL)) | if (((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) && (my_audio == NULL)) | ||||
| my_audio = create_audio_device_object(device, "eSpeak", "Text-to-Speech"); | my_audio = create_audio_device_object(device, "eSpeak", "Text-to-Speech"); | ||||
| #endif | #endif | ||||
| if (check_data_path(path, 1)) | if (check_data_path(path, 1)) | ||||
| return; | return; | ||||
| #ifdef PLATFORM_WINDOWS | |||||
| #if PLATFORM_WINDOWS | |||||
| HKEY RegKey; | HKEY RegKey; | ||||
| unsigned long size; | unsigned long size; | ||||
| unsigned long var_type; | unsigned long var_type; | ||||
| SetParameter(espeakPUNCTUATION, option_punctuation, 0); | SetParameter(espeakPUNCTUATION, option_punctuation, 0); | ||||
| SetParameter(espeakWORDGAP, 0, 0); | SetParameter(espeakWORDGAP, 0, 0); | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| fifo_init(); | fifo_init(); | ||||
| #endif | #endif | ||||
| end_character_position = end_position; | end_character_position = end_position; | ||||
| espeak_ng_STATUS aStatus = Synthesize(unique_identifier, text, flags); | espeak_ng_STATUS aStatus = Synthesize(unique_identifier, text, flags); | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | ||||
| int error = (aStatus == ENS_SPEECH_STOPPED) | int error = (aStatus == ENS_SPEECH_STOPPED) | ||||
| ? audio_object_flush(my_audio) | ? audio_object_flush(my_audio) | ||||
| ESPEAK_API void espeak_SetSynthCallback(t_espeak_callback *SynthCallback) | ESPEAK_API void espeak_SetSynthCallback(t_espeak_callback *SynthCallback) | ||||
| { | { | ||||
| synth_callback = SynthCallback; | synth_callback = SynthCallback; | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| event_set_callback(synth_callback); | event_set_callback(synth_callback); | ||||
| #endif | #endif | ||||
| } | } | ||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | ||||
| return sync_espeak_Synth(0, text, position, position_type, end_position, flags, user_data); | return sync_espeak_Synth(0, text, position, position_type, end_position, flags, user_data); | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| // Create the text command | // Create the text command | ||||
| t_espeak_command *c1 = create_espeak_text(text, size, position, position_type, end_position, flags, user_data); | t_espeak_command *c1 = create_espeak_text(text, size, position, position_type, end_position, flags, user_data); | ||||
| if (c1) { | if (c1) { | ||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | ||||
| return sync_espeak_Synth_Mark(0, text, index_mark, end_position, flags, user_data); | return sync_espeak_Synth_Mark(0, text, index_mark, end_position, flags, user_data); | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| // Create the mark command | // Create the mark command | ||||
| t_espeak_command *c1 = create_espeak_mark(text, size, index_mark, end_position, | t_espeak_command *c1 = create_espeak_mark(text, size, index_mark, end_position, | ||||
| flags, user_data); | flags, user_data); | ||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | ||||
| return sync_espeak_Key(key_name); | return sync_espeak_Key(key_name); | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| t_espeak_command *c = create_espeak_key(key_name, NULL); | t_espeak_command *c = create_espeak_key(key_name, NULL); | ||||
| espeak_ng_STATUS status = fifo_add_command(c); | espeak_ng_STATUS status = fifo_add_command(c); | ||||
| if (status != ENS_OK) | if (status != ENS_OK) | ||||
| { | { | ||||
| // is there a system resource of character names per language? | // is there a system resource of character names per language? | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | ||||
| return sync_espeak_Char(character); | return sync_espeak_Char(character); | ||||
| ESPEAK_NG_API espeak_ng_STATUS espeak_ng_SetParameter(espeak_PARAMETER parameter, int value, int relative) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_SetParameter(espeak_PARAMETER parameter, int value, int relative) | ||||
| { | { | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) | ||||
| return SetParameter(parameter, value, relative); | return SetParameter(parameter, value, relative); | ||||
| { | { | ||||
| // Set the list of punctuation which are spoken for "some". | // Set the list of punctuation which are spoken for "some". | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) { | if (my_mode & ENOUTPUT_MODE_SYNCHRONOUS) { | ||||
| sync_espeak_SetPunctuationList(punctlist); | sync_espeak_SetPunctuationList(punctlist); | ||||
| return ENS_OK; | return ENS_OK; | ||||
| ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Cancel(void) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Cancel(void) | ||||
| { | { | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| fifo_stop(); | fifo_stop(); | ||||
| event_clear_all(); | event_clear_all(); | ||||
| #endif | #endif | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) | if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) | ||||
| audio_object_flush(my_audio); | audio_object_flush(my_audio); | ||||
| #endif | #endif | ||||
| ESPEAK_API int espeak_IsPlaying(void) | ESPEAK_API int espeak_IsPlaying(void) | ||||
| { | { | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| return fifo_is_busy(); | return fifo_is_busy(); | ||||
| #else | #else | ||||
| return 0; | return 0; | ||||
| ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Synchronize(void) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Synchronize(void) | ||||
| { | { | ||||
| espeak_ng_STATUS berr = err; | espeak_ng_STATUS berr = err; | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| while (espeak_IsPlaying()) | while (espeak_IsPlaying()) | ||||
| usleep(20000); | usleep(20000); | ||||
| #endif | #endif | ||||
| ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void) | ESPEAK_NG_API espeak_ng_STATUS espeak_ng_Terminate(void) | ||||
| { | { | ||||
| #ifdef USE_ASYNC | |||||
| #if USE_ASYNC | |||||
| fifo_stop(); | fifo_stop(); | ||||
| fifo_terminate(); | fifo_terminate(); | ||||
| event_terminate(); | event_terminate(); | ||||
| #endif | #endif | ||||
| if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | ||||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||||
| #if USE_LIBPCAUDIO | |||||
| audio_object_close(my_audio); | audio_object_close(my_audio); | ||||
| audio_object_destroy(my_audio); | audio_object_destroy(my_audio); | ||||
| my_audio = NULL; | my_audio = NULL; |
| #if defined(_WIN32) || defined(_WIN64) // Windows | #if defined(_WIN32) || defined(_WIN64) // Windows | ||||
| #define PLATFORM_WINDOWS | |||||
| #define PLATFORM_WINDOWS 1 | |||||
| #define PATHSEP '\\' | #define PATHSEP '\\' | ||||
| #define N_PATH_HOME_DEF 230 | #define N_PATH_HOME_DEF 230 | ||||
| #define NO_VARIADIC_MACROS | #define NO_VARIADIC_MACROS | ||||
| #else | #else | ||||
| #define PLATFORM_POSIX | |||||
| #define PLATFORM_POSIX 1 | |||||
| #define PATHSEP '/' | #define PATHSEP '/' | ||||
| #define N_PATH_HOME_DEF 160 | #define N_PATH_HOME_DEF 160 | ||||
| #define USE_NANOSLEEP | #define USE_NANOSLEEP |
| int wpm = speech_parameters[espeakRATE]; | int wpm = speech_parameters[espeakRATE]; | ||||
| espeak_SetParameter(espeakRATE, wpm, 0); | espeak_SetParameter(espeakRATE, wpm, 0); | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| if (wpm >= espeakRATE_MAXIMUM) { | if (wpm >= espeakRATE_MAXIMUM) { | ||||
| // Compensate speedup with libsonic, see function SetSpeed() | // Compensate speedup with libsonic, see function SetSpeed() | ||||
| double sonic = ((double)wpm)/espeakRATE_NORMAL; | double sonic = ((double)wpm)/espeakRATE_NORMAL; |
| int mbrola_delay; | int mbrola_delay; | ||||
| char mbrola_name[20]; | char mbrola_name[20]; | ||||
| #ifdef INCLUDE_MBROLA | |||||
| #if USE_MBROLA | |||||
| #if defined(_WIN32) || defined(_WIN64) | #if defined(_WIN32) || defined(_WIN64) | ||||
| #include <windows.h> | #include <windows.h> | ||||
| return ENS_MBROLA_NOT_FOUND; | return ENS_MBROLA_NOT_FOUND; | ||||
| sprintf(path, "%s/mbrola/%s", path_home, mbrola_voice); | sprintf(path, "%s/mbrola/%s", path_home, mbrola_voice); | ||||
| #ifdef PLATFORM_POSIX | |||||
| #if PLATFORM_POSIX | |||||
| // if not found, then also look in | // if not found, then also look in | ||||
| // usr/share/mbrola/xx, /usr/share/mbrola/xx/xx, /usr/share/mbrola/voices/xx | // usr/share/mbrola/xx, /usr/share/mbrola/xx/xx, /usr/share/mbrola/voices/xx | ||||
| if (GetFileLength(path) <= 0) { | if (GetFileLength(path) <= 0) { |
| } | } | ||||
| } | } | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| void DoSonicSpeed(int value) | void DoSonicSpeed(int value) | ||||
| { | { | ||||
| // value, multiplier * 1024 | // value, multiplier * 1024 |
| void Write4Bytes(FILE *f, int value); | void Write4Bytes(FILE *f, int value); | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| void DoSonicSpeed(int value); | void DoSonicSpeed(int value); | ||||
| #endif | #endif | ||||
| { | { | ||||
| char fname[sizeof(path_home)+100]; | char fname[sizeof(path_home)+100]; | ||||
| #ifdef PLATFORM_WINDOWS | |||||
| #if PLATFORM_WINDOWS | |||||
| WIN32_FIND_DATAA FindFileData; | WIN32_FIND_DATAA FindFileData; | ||||
| HANDLE hFind = INVALID_HANDLE_VALUE; | HANDLE hFind = INVALID_HANDLE_VALUE; | ||||
| #include "synthesize.h" // for WGEN_DATA, RESONATOR, frame_t | #include "synthesize.h" // for WGEN_DATA, RESONATOR, frame_t | ||||
| #include "mbrola.h" // for MbrolaFill, MbrolaReset, mbrola... | #include "mbrola.h" // for MbrolaFill, MbrolaReset, mbrola... | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| #include "klatt.h" | #include "klatt.h" | ||||
| #endif | #endif | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| #include "sonic.h" | #include "sonic.h" | ||||
| #endif | #endif | ||||
| const int embedded_default[N_EMBEDDED_VALUES] = { 0, 50, espeakRATE_NORMAL, 100, 50, 0, 0, 0, espeakRATE_NORMAL, 0, 0, 0, 0, 0, 0 }; | const int embedded_default[N_EMBEDDED_VALUES] = { 0, 50, espeakRATE_NORMAL, 100, 50, 0, 0, 0, espeakRATE_NORMAL, 0, 0, 0, 0, 0, 0 }; | ||||
| static int embedded_max[N_EMBEDDED_VALUES] = { 0, 0x7fff, 750, 300, 99, 99, 99, 0, 750, 0, 0, 0, 0, 4, 0 }; | static int embedded_max[N_EMBEDDED_VALUES] = { 0, 0x7fff, 750, 300, 99, 99, 99, 0, 750, 0, 0, 0, 0, 4, 0 }; | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| static sonicStream sonicSpeedupStream = NULL; | static sonicStream sonicSpeedupStream = NULL; | ||||
| static double sonicSpeed = 1.0; | static double sonicSpeed = 1.0; | ||||
| #endif | #endif | ||||
| wcmdq_head = 0; | wcmdq_head = 0; | ||||
| wcmdq_tail = 0; | wcmdq_tail = 0; | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| if (sonicSpeedupStream != NULL) { | if (sonicSpeedupStream != NULL) { | ||||
| sonicDestroyStream(sonicSpeedupStream); | sonicDestroyStream(sonicSpeedupStream); | ||||
| sonicSpeedupStream = NULL; | sonicSpeedupStream = NULL; | ||||
| pk_shape = pk_shape2; | pk_shape = pk_shape2; | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| KlattInit(); | KlattInit(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| void WavegenFini(void) | void WavegenFini(void) | ||||
| { | { | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| KlattFini(); | KlattFini(); | ||||
| #endif | #endif | ||||
| } | } | ||||
| echo_complete -= length; | echo_complete -= length; | ||||
| wdata.n_mix_wavefile = 0; | wdata.n_mix_wavefile = 0; | ||||
| wdata.amplitude_fmt = 100; | wdata.amplitude_fmt = 100; | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| KlattReset(1); | KlattReset(1); | ||||
| #endif | #endif | ||||
| result = PlaySilence(length, resume); | result = PlaySilence(length, resume); | ||||
| case WCMD_WAVE: | case WCMD_WAVE: | ||||
| echo_complete = echo_length; | echo_complete = echo_length; | ||||
| wdata.n_mix_wavefile = 0; | wdata.n_mix_wavefile = 0; | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| KlattReset(1); | KlattReset(1); | ||||
| #endif | #endif | ||||
| result = PlayWave(length, resume, (unsigned char *)q[2], q[3] & 0xff, q[3] >> 8); | result = PlayWave(length, resume, (unsigned char *)q[2], q[3] & 0xff, q[3] >> 8); | ||||
| echo_complete = echo_length; | echo_complete = echo_length; | ||||
| result = Wavegen(length & 0xffff, q[1] >> 16, resume, (frame_t *)q[2], (frame_t *)q[3], wvoice); | result = Wavegen(length & 0xffff, q[1] >> 16, resume, (frame_t *)q[2], (frame_t *)q[3], wvoice); | ||||
| break; | break; | ||||
| #ifdef INCLUDE_KLATT | |||||
| #if USE_KLATT | |||||
| case WCMD_KLATT2: // as WCMD_SPECT but stop any concurrent wave file | case WCMD_KLATT2: // as WCMD_SPECT but stop any concurrent wave file | ||||
| wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case | wdata.n_mix_wavefile = 0; // ... and drop through to WCMD_SPECT case | ||||
| case WCMD_KLATT: | case WCMD_KLATT: | ||||
| case WCMD_EMBEDDED: | case WCMD_EMBEDDED: | ||||
| SetEmbedded(q[1], q[2]); | SetEmbedded(q[1], q[2]); | ||||
| break; | break; | ||||
| #if USE_MBROLA | |||||
| case WCMD_MBROLA_DATA: | case WCMD_MBROLA_DATA: | ||||
| if (wvoice != NULL) | if (wvoice != NULL) | ||||
| result = MbrolaFill(length, resume, (general_amplitude * wvoice->voicing)/64); | result = MbrolaFill(length, resume, (general_amplitude * wvoice->voicing)/64); | ||||
| break; | break; | ||||
| #endif | |||||
| case WCMD_FMT_AMPLITUDE: | case WCMD_FMT_AMPLITUDE: | ||||
| if ((wdata.amplitude_fmt = q[1]) == 0) | if ((wdata.amplitude_fmt = q[1]) == 0) | ||||
| wdata.amplitude_fmt = 100; // percentage, but value=0 means 100% | wdata.amplitude_fmt = 100; // percentage, but value=0 means 100% | ||||
| break; | break; | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| case WCMD_SONIC_SPEED: | case WCMD_SONIC_SPEED: | ||||
| sonicSpeed = (double)q[1] / 1024; | sonicSpeed = (double)q[1] / 1024; | ||||
| if (sonicSpeedupStream && (sonicSpeed <= 1.0)) { | if (sonicSpeedupStream && (sonicSpeed <= 1.0)) { | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| // Speed up the audio samples with libsonic. | // Speed up the audio samples with libsonic. | ||||
| static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text) | static int SpeedUp(short *outbuf, int length_in, int length_out, int end_of_text) | ||||
| { | { | ||||
| int WavegenFill(void) | int WavegenFill(void) | ||||
| { | { | ||||
| int finished; | int finished; | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| unsigned char *p_start; | unsigned char *p_start; | ||||
| p_start = out_ptr; | p_start = out_ptr; | ||||
| finished = WavegenFill2(); | finished = WavegenFill2(); | ||||
| #if HAVE_SONIC_H | |||||
| #if USE_LIBSONIC | |||||
| if (sonicSpeed > 1.0) { | if (sonicSpeed > 1.0) { | ||||
| int length; | int length; | ||||
| int max_length; | int max_length; |