From d844a478048bbb913620d69a677f436f410977ec Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Thu, 3 May 2018 21:18:35 +0200 Subject: [PATCH] Make it possible to restart speech even when audio open failed once When notably the audio card is busy, we should report the issue to the application, but still permit the application to retry submitting text to synth, and eventually succeed to open it. This change simply fixes the update of the out_samplerate variable to track whether audio is open, and if not when text is submitted by the application, try again to open it. --- src/libespeak-ng/speech.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/libespeak-ng/speech.c b/src/libespeak-ng/speech.c index 32511845..1d127046 100644 --- a/src/libespeak-ng/speech.c +++ b/src/libespeak-ng/speech.c @@ -123,12 +123,12 @@ static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) 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 - out_samplerate = voice_samplerate; #ifdef HAVE_PCAUDIOLIB_AUDIO_H int error = audio_object_open(my_audio, AUDIO_OBJECT_FORMAT_S16LE, voice_samplerate, 1); if (error != 0) { @@ -137,6 +137,7 @@ static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) return -1; } #endif + out_samplerate = voice_samplerate; #ifdef USE_ASYNC if ((my_mode & ENOUTPUT_MODE_SYNCHRONOUS) == 0) event_init(); @@ -144,6 +145,18 @@ static int dispatch_audio(short *outbuf, int length, espeak_EVENT *event) } } +#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);