From dee3799f82bcc4de6833f3045b0a7663a68606a7 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Tue, 24 Jan 2017 07:24:29 +0000 Subject: [PATCH] issue #172: flush audio on cancel requests. 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. --- src/libespeak-ng/fifo.c | 4 ++++ src/libespeak-ng/speech.c | 9 +++++++++ src/libespeak-ng/speech.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/src/libespeak-ng/fifo.c b/src/libespeak-ng/fifo.c index 33177434..43f0d453 100644 --- a/src/libespeak-ng/fifo.c +++ b/src/libespeak-ng/fifo.c @@ -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; diff --git a/src/libespeak-ng/speech.c b/src/libespeak-ng/speech.c index 4dda6764..bde25f1c 100644 --- a/src/libespeak-ng/speech.c +++ b/src/libespeak-ng/speech.c @@ -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; diff --git a/src/libespeak-ng/speech.h b/src/libespeak-ng/speech.h index b5a50d30..cc14e20c 100644 --- a/src/libespeak-ng/speech.h +++ b/src/libespeak-ng/speech.h @@ -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);