refactored patch with tts_purge ability and dbus command, allowing external user... 91/103191/2
authorRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Wed, 7 Dec 2016 13:11:04 +0000 (14:11 +0100)
committerRadoslaw Cybulski <r.cybulski@partner.samsung.com>
Fri, 23 Dec 2016 08:36:15 +0000 (09:36 +0100)
Change-Id: I0dcbb1718d675de0a98ab604cea6d903cd629100

include/screen_reader_tts.h
src/dbus_direct_reading_adapter.c
src/screen_reader_tts.c

index 8137405f83e9a499bf45608945151f05c272a2ec..80ef23dbea1ba2efccc7034c785bd9a2e9c8389a 100644 (file)
@@ -47,6 +47,13 @@ void state_changed_cb(tts_h tts, tts_state_e previous, tts_state_e current, void
  */
 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,
index 1bbbe1fc410867a762f86ec50f1a251582183ef2..507112578572ad399560021d9367148eae445046 100644 (file)
@@ -85,8 +85,30 @@ _consume_read_command(const Eldbus_Service_Interface *iface EINA_UNUSED, const E
        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},
        { }
 };
 
index e2e948beb0a6c2ce6234b75bf04d1e74f0290048..cdee3f7c610c0b16bf089c26034f0f591d370030 100644 (file)
@@ -44,6 +44,8 @@ struct Screen_Reader_Tts_Data_s {
        int _dbus_txt_readed;
        bool say_text;
        bool update_language_list;
+
+       Eina_Bool speak_running;
 };
 
 typedef enum _Play_Read_Command_Status {
@@ -271,6 +273,20 @@ static void overwrite_last_read_command_with(Screen_Reader_Tts_Data_t *tts_data,
        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)
 {
@@ -471,6 +487,7 @@ static Play_Read_Command_Status send_chunk_to_tts(Screen_Reader_Tts_Data_t *tts_
                        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);
        }
@@ -756,10 +773,10 @@ static void tts_utt_completed_cb(tts_h tts, int utt_id, void *user_data)
        }
 
        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();
@@ -774,6 +791,31 @@ static void tts_utt_completed_cb(tts_h tts, int utt_id, void *user_data)
        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 ---------------------");