| @@ -220,35 +220,45 @@ static int sleep_until_start_request_or_inactivity() | |||
| return a_start_is_required; | |||
| } | |||
| static void close_stream() | |||
| static espeak_ng_STATUS close_stream() | |||
| { | |||
| // Warning: a wave_close can be already required by | |||
| // an external command (espeak_Cancel + fifo_stop), if so: | |||
| // my_stop_is_required = 1; | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert(!a_status); | |||
| espeak_ng_STATUS status = pthread_mutex_lock(&my_mutex); | |||
| if (status != ENS_OK) | |||
| return status; | |||
| int a_stop_is_required = my_stop_is_required; | |||
| if (!a_stop_is_required) | |||
| my_command_is_running = 1; | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| status = pthread_mutex_unlock(&my_mutex); | |||
| if (!a_stop_is_required) { | |||
| wave_close(NULL); | |||
| int a_status = pthread_mutex_lock(&my_mutex); | |||
| assert(!a_status); | |||
| my_command_is_running = 0; | |||
| if (status == ENS_OK) | |||
| status = a_status; | |||
| my_command_is_running = 0; | |||
| a_stop_is_required = my_stop_is_required; | |||
| a_status = pthread_mutex_unlock(&my_mutex); | |||
| if (status == ENS_OK) | |||
| status = a_status; | |||
| if (a_stop_is_required) { | |||
| // acknowledge the stop request | |||
| int a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| assert(a_status != -1); | |||
| a_status = sem_post(&my_sem_stop_is_acknowledged); | |||
| if (status == ENS_OK) | |||
| status = a_status; | |||
| } | |||
| } | |||
| return status; | |||
| } | |||
| static void *say_thread(void *p) | |||