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.
This commit is contained in:
Samuel Thibault
2018-05-03 21:27:02 +02:00
parent 888bb71bbf
commit d844a47804
+14 -1
View File
@@ -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);