int sync_espeak_terminated_msg( uint32_t unique_identifier, void* user_data) {//===================================================================== ENTER("sync_espeak_terminated_msg"); int finished=0; memset(event_list, 0, 2*sizeof(espeak_EVENT)); event_list[0].type = espeakEVENT_MSG_TERMINATED; event_list[0].unique_identifier = unique_identifier; event_list[0].user_data = user_data; event_list[1].type = espeakEVENT_LIST_TERMINATED; event_list[1].unique_identifier = unique_identifier; event_list[1].user_data = user_data; if (my_mode==AUDIO_OUTPUT_PLAYBACK) { while(1) { espeak_ERROR a_error = event_declare(event_list); if (a_error != EE_BUFFER_FULL) { break; } SHOW_TIME("sync_espeak_terminated_msg > EE_BUFFER_FULL\n"); usleep(10000); } } else { if (synth_callback) { finished=synth_callback(NULL,0,event_list); } } return finished; }
int sync_espeak_terminated_msg(uint32_t unique_identifier, void *user_data) { int finished = 0; memset(event_list, 0, 2*sizeof(espeak_EVENT)); event_list[0].type = espeakEVENT_MSG_TERMINATED; event_list[0].unique_identifier = unique_identifier; event_list[0].user_data = user_data; event_list[1].type = espeakEVENT_LIST_TERMINATED; event_list[1].unique_identifier = unique_identifier; event_list[1].user_data = user_data; if (my_mode == ENOUTPUT_MODE_SPEAK_AUDIO) { while (1) { err = event_declare(event_list); if (err != ENS_EVENT_BUFFER_FULL) break; usleep(10000); } } else if (synth_callback) finished = synth_callback(NULL, 0, event_list); return finished; }
static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) { int a_wave_can_be_played = 1; #ifdef USE_ASYNC if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) a_wave_can_be_played = fifo_is_command_enabled(); #endif switch ((int)my_mode) { case ENOUTPUT_MODE_SPEAK_AUDIO: case ENOUTPUT_MODE_SPEAK_AUDIO | ENOUTPUT_MODE_SYNCHRONOUS: { int event_type = 0; if (event) event_type = event->type; if (event_type == espeakEVENT_SAMPLERATE) { voice_samplerate = event->id.number; if (out_samplerate != voice_samplerate) { #ifdef HAVE_PCAUDIOLIB_AUDIO_H if (out_samplerate != 0) { // sound was previously open with a different sample rate audio_object_close(my_audio); out_samplerate = 0; #ifdef HAVE_SLEEP sleep(1); #endif } #endif #ifdef HAVE_PCAUDIOLIB_AUDIO_H int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); if (error != 0) { fprintf(stderr, "error: %s\n", audio_object_strerror(my_audio, error)); err = ENS_AUDIO_ERROR; return -1; } #endif out_samplerate = voice_samplerate; #ifdef USE_ASYNC if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) event_init(); #endif } } #ifdef HAVE_PCAUDIOLIB_AUDIO_H if (out_samplerate == 0) { int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); if (error != 0) { fprintf(stderr, "error: %s\n", audio_object_strerror(my_audio, error)); err = ENS_AUDIO_ERROR; return -1; } out_samplerate = voice_samplerate; } #endif #ifdef HAVE_PCAUDIOLIB_AUDIO_H if (outbuf && length && a_wave_can_be_played) { int error = audio_object_write(my_audio, (char *)outbuf, 2*length); if (error != 0) fprintf(stderr, "error: %s\n", audio_object_strerror(my_audio, error)); } #endif #ifdef USE_ASYNC while (event && a_wave_can_be_played) { // 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: For example sentence "or ALT)." returns three words // "or", "ALT" and "". // TBD: the last one has its size=0. if ((event->type == espeakEVENT_WORD) && (event->length == 0)) break; if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) { err = event_declare(event); if (err != ENS_EVENT_BUFFER_FULL) break; usleep(10000); a_wave_can_be_played = fifo_is_command_enabled(); } else break; } #endif } break; case 0: if (synth_callback) synth_callback(outbuf, length, event); break; } return a_wave_can_be_played == 0; // 1 = stop synthesis, -1 = error }
static int dispatch_audio(short* outbuf, int length, espeak_EVENT* event) {//====================================================================== ENTER("dispatch_audio"); int a_wave_can_be_played = fifo_is_command_enabled(); #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); #endif switch(my_mode) { case AUDIO_OUTPUT_PLAYBACK: { int event_type=0; if(event) { event_type = event->type; } if(event_type == espeakEVENT_SAMPLERATE) { voice_samplerate = event->id.number; if(out_samplerate != voice_samplerate) { if(out_samplerate != 0) { // sound was previously open with a different sample rate wave_close(my_audio); sleep(1); } out_samplerate = voice_samplerate; if(!wave_init(voice_samplerate)) { err = EE_INTERNAL_ERROR; return(-1); } wave_set_callback_is_output_enabled( fifo_is_command_enabled); my_audio = wave_open("alsa"); event_init(); } } if (outbuf && length && a_wave_can_be_played) { wave_write (my_audio, (char*)outbuf, 2*length); } while(a_wave_can_be_played) { // 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: For example sentence "or ALT)." returns three words // "or", "ALT" and "". // TBD: the last one has its size=0. if (event && (event->type == espeakEVENT_WORD) && (event->length==0)) { break; } espeak_ERROR a_error = event_declare(event); if (a_error != EE_BUFFER_FULL) { break; } SHOW_TIME("dispatch_audio > EE_BUFFER_FULL\n"); usleep(10000); a_wave_can_be_played = fifo_is_command_enabled(); } } break; case AUDIO_OUTPUT_RETRIEVAL: if (synth_callback) { synth_callback(outbuf, length, event); } break; case AUDIO_OUTPUT_SYNCHRONOUS: case AUDIO_OUTPUT_SYNCH_PLAYBACK: break; } if (!a_wave_can_be_played) { SHOW_TIME("dispatch_audio > synth must be stopped!\n"); } SHOW_TIME("LEAVE dispatch_audio\n"); return (a_wave_can_be_played==0); // 1 = stop synthesis, -1 = error }