*/
Read_Command *tts_speak(char *text_to_speak, Eina_Bool want_discard_previous_reading, Screen_Reader_Tts_Data_t *tts_data);
+/**
+ * @brief Purges commands from local queue and stops current reading.
+ * If only_discardables is set to true, then only discardables are purged.
+ * Also current reading then will be only stopped, if its discardable.
+ **/
+void tts_purge(Screen_Reader_Tts_Data_t *tts_data, Eina_Bool only_discardables);
+
//TODO: add support for i18
/**
* @brief Requests asynchronous (queued) reading of given text allowing to control,
return reply;
}
+static Eldbus_Message *
+_consume_purge_command(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+ DEBUG("[START] CONSUMING PURGE COMMAND");
+ assert(msg);
+ Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+ if (reply) {
+ Eina_Bool only_discardable = EINA_TRUE;
+ if (!eldbus_message_arguments_get(msg, "b", &only_discardable)) {
+ ERROR("eldbus_message_arguments_get() failed to parse arguments of type Boolean from message msg=%p", msg);
+ } else {
+ DEBUG("RECEIVED DBUS MESSAGE WITH ARGS: only_discardable(%d)", only_discardable);
+ Service_Data *sd = get_pointer_to_service_data_struct();
+ tts_purge(sd->tts_data, only_discardable);
+ }
+ } else
+ ERROR("eldbus_message_method_return_new(%p) has failed to create a reply message", msg);
+ DEBUG("[END] CONSUMING READ COMMAND");
+ return reply;
+}
+
static const Eldbus_Method _methods[] = {
{"ReadCommand", ELDBUS_ARGS({"s", "text"}, {"b", "discardable"}), ELDBUS_ARGS({"s", "text"}, {"b", "discardable"}, {"i", "rc_id"}, {"i", "err_id"}), _consume_read_command},
+ {"PurgeCommand", ELDBUS_ARGS({"b", "only_discardable"}), NULL, _consume_purge_command},
{ }
};
int _dbus_txt_readed;
bool say_text;
bool update_language_list;
+
+ Eina_Bool speak_running;
};
typedef enum _Play_Read_Command_Status {
tts_data->last_read_command = new_value;
}
+static void purge_commands_from_queue(Eina_List **list_ptr, Eina_Bool only_discardables)
+{
+ Eina_List *list = *list_ptr;
+ Read_Command *cq;
+
+ Eina_List *l, *l_next;
+ EINA_LIST_FOREACH_SAFE(list, l, l_next, cq) {
+ if (cq->discardable || !only_discardables) {
+ list = eina_list_remove(list, cq);
+ }
+ }
+ *list_ptr = list;
+}
+
Eina_Bool
can_discard(const Read_Command *prev, const Read_Command *next)
{
return FAILURE_NOT_RECOVERABLE;
}
} else {
+ tts_data->speak_running = EINA_TRUE;
if (utt_id) *utt_id = utterance_id;
DEBUG("chunk size (%d) added utterance id:%d\n", strlen(utf8_line), utterance_id);
}
}
DEBUG("Utterance completed : utt id(%d) \n", utt_id);
-
if (tts_data->last_read_command && tts_data->last_read_command->context.last_id == utt_id) {
DEBUG("LAST UTTERANCE");
-
+
+ tts_data->speak_running = EINA_FALSE;
#ifndef SCREEN_READER_TV
tts_data->pause_state = EINA_FALSE;
tts_data->on_utterance_end();
return;
}
+static void stop_speaking(Screen_Reader_Tts_Data_t *tts)
+{
+ if (tts->speak_running) {
+ tts->speak_running = EINA_FALSE;
+ int ret = tts_stop(tts->tts);
+ if (TTS_ERROR_NONE != ret)
+ DEBUG("Fail to stop TTS: result(%d)", ret);
+ }
+}
+
+void tts_purge(Screen_Reader_Tts_Data_t *tts, Eina_Bool only_discardables)
+{
+ DEBUG("BEGIN");
+ if (!tts) {
+ ERROR("tts is null");
+ return;
+ }
+ purge_commands_from_queue(&tts->read_command_queue, only_discardables);
+ if (tts->last_read_command && tts->last_read_command->is_playing && (tts->last_read_command->discardable || !only_discardables)) {
+ stop_speaking(tts);
+ overwrite_last_read_command_with(tts, NULL);
+ }
+ DEBUG("END");
+}
+
Screen_Reader_Tts_Data_t *tts_init(void)
{
DEBUG("--------------------- TTS_init START ---------------------");