static void queue_process_entry(struct synth_t *s) { espeak_ERROR error; static struct espeak_entry_t *current = NULL; if (current != queue_peek(synth_queue)) { if (current) free_espeak_entry(current); current = (struct espeak_entry_t *) queue_remove(synth_queue); } pthread_mutex_unlock(&queue_guard); if (current->cmd != CMD_PAUSE && paused_espeak) { reinitialize_espeak(s); } switch (current->cmd) { case CMD_SET_FREQUENCY: error = set_frequency(s, current->value, current->adjust); break; case CMD_SET_PITCH: error = set_pitch(s, current->value, current->adjust); break; case CMD_SET_PUNCTUATION: error = set_punctuation(s, current->value, current->adjust); break; case CMD_SET_RATE: error = set_rate(s, current->value, current->adjust); break; case CMD_SET_VOICE: error = EE_OK; break; case CMD_SET_VOLUME: error = set_volume(s, current->value, current->adjust); break; case CMD_SPEAK_TEXT: s->buf = current->buf; s->len = current->len; error = speak_text(s); break; case CMD_PAUSE: if (!paused_espeak) { espeak_Cancel(); espeak_Terminate(); paused_espeak = 1; } break; default: break; } if (error == EE_OK) { free_espeak_entry(current); current = NULL; } }
static void synth_queue_clear() { struct espeak_entry_t *current; while (queue_peek(synth_queue)) { current = (struct espeak_entry_t *) queue_remove(synth_queue); free_espeak_entry(current); } }