This is a partial fix for an audio regression. The other part of the fix requires a change in pcaudiolib to reopen the audio device on flush requests for affected audio drivers/devices.master
| @@ -254,6 +254,10 @@ static espeak_ng_STATUS close_stream() | |||
| status = a_status; | |||
| if (a_stop_is_required) { | |||
| // cancel the audio early, to be more responsive when using eSpeak NG | |||
| // for audio. | |||
| cancel_audio(); | |||
| // acknowledge the stop request | |||
| if((a_status = pthread_mutex_lock(&my_mutex)) != ENS_OK) | |||
| return a_status; | |||
| @@ -81,6 +81,15 @@ int (*phoneme_callback)(const char *) = NULL; | |||
| char path_home[N_PATH_HOME]; // this is the espeak-ng-data directory | |||
| extern int saved_parameters[N_SPEECH_PARAM]; // Parameters saved on synthesis start | |||
| void cancel_audio(void) | |||
| { | |||
| #ifdef HAVE_PCAUDIOLIB_AUDIO_H | |||
| if ((my_mode & ENOUTPUT_MODE_SPEAK_AUDIO) == ENOUTPUT_MODE_SPEAK_AUDIO) { | |||
| audio_object_flush(my_audio); | |||
| } | |||
| #endif | |||
| } | |||
| static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) | |||
| { | |||
| int a_wave_can_be_played = 1; | |||
| @@ -65,6 +65,8 @@ typedef struct { | |||
| } MNEM_TAB; | |||
| int LookupMnem(MNEM_TAB *table, const char *string); | |||
| void cancel_audio(void); | |||
| extern char path_home[N_PATH_HOME]; // this is the espeak-ng-data directory | |||
| extern ESPEAK_NG_API void strncpy0(char *to, const char *from, int size); | |||