| return a_start_is_required; | return a_start_is_required; | ||||
| } | } | ||||
| static void close_stream() | |||||
| static espeak_ng_STATUS close_stream() | |||||
| { | { | ||||
| // Warning: a wave_close can be already required by | // Warning: a wave_close can be already required by | ||||
| // an external command (espeak_Cancel + fifo_stop), if so: | // an external command (espeak_Cancel + fifo_stop), if so: | ||||
| // my_stop_is_required = 1; | // 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; | int a_stop_is_required = my_stop_is_required; | ||||
| if (!a_stop_is_required) | if (!a_stop_is_required) | ||||
| my_command_is_running = 1; | my_command_is_running = 1; | ||||
| a_status = pthread_mutex_unlock(&my_mutex); | |||||
| status = pthread_mutex_unlock(&my_mutex); | |||||
| if (!a_stop_is_required) { | if (!a_stop_is_required) { | ||||
| wave_close(NULL); | wave_close(NULL); | ||||
| int a_status = pthread_mutex_lock(&my_mutex); | 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_stop_is_required = my_stop_is_required; | ||||
| a_status = pthread_mutex_unlock(&my_mutex); | a_status = pthread_mutex_unlock(&my_mutex); | ||||
| if (status == ENS_OK) | |||||
| status = a_status; | |||||
| if (a_stop_is_required) { | if (a_stop_is_required) { | ||||
| // acknowledge the stop request | // 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) | static void *say_thread(void *p) |