Tizen TV Configuration
authorShinwoo Kim <cinoo.kim@samsung.com>
Thu, 16 Jul 2015 05:04:46 +0000 (14:04 +0900)
committerTomasz Olszak <t.olszak@samsung.com>
Thu, 16 Jul 2015 16:01:29 +0000 (18:01 +0200)
Change-Id: I704742ea0676df8ba8de0fb2dec3d22bbb707f4f

include/screen_reader.h
packaging/org.tizen.screen-reader.spec
src/main.c
src/screen_reader.c
src/screen_reader_spi.c
src/screen_reader_tts.c
tests/atspi/atspi.c
tests/atspi/atspi.h

index 6681fba..7608a6f 100644 (file)
@@ -7,6 +7,7 @@
 
 #define LANGUAGE_NAME_SIZE 6
 
+#define FOCUS_CHANGED_SIG "object:state-changed:focused"
 #define HIGHLIGHT_CHANGED_SIG "object:state-change:highlighted"
 #define VALUE_CHANGED_SIG "object:property-change:accessible-value"
 #define CARET_MOVED_SIG "object:text-caret-moved"
index 2425572..44a5a66 100755 (executable)
@@ -37,6 +37,10 @@ An utility library for developers of the menu screen.
 %setup -q
 
 %build
+%if "%{?tizen_profile_name}" == "tv"
+    export CFLAGS+=" -DSCREEN_READER_TV"
+%endif
+
 rm -rf CMakeFiles CMakeCache.txt && cmake . -DCMAKE_INSTALL_PREFIX="%{AppInstallPath}" -DCMAKE_TARGET="%{Exec}" -DCMAKE_PACKAGE="%{name}"
 make %{?jobs:-j%jobs} \
 2>&1 | sed \
index 3a95a6c..d8ee5cd 100644 (file)
@@ -172,9 +172,12 @@ static int app_create(void *data)
    elm_init(0, NULL);
 
    logger_init();
-   screen_reader_gestures_init();
    screen_reader_create_service(data);
+
+#ifndef SCREEN_READER_TV
+   screen_reader_gestures_init();
    navigator_init();
+#endif
 
    return 0;
 }
@@ -183,8 +186,11 @@ static int app_terminate(void *data)
 {
    screen_reader_terminate_service(data);
 
+#ifndef SCREEN_READER_TV
    navigator_shutdown();
    screen_reader_gestures_shutdown();
+#endif
+
    eldbus_shutdown();
    logger_shutdown();
    return 0;
index 0f63eeb..9a7784e 100644 (file)
@@ -15,8 +15,11 @@ Service_Data service_data =
 {
    //Set by vconf
    .run_service = 1,
+#ifdef SCREEN_READER_TV
+   .tracking_signal_name = FOCUS_CHANGED_SIG,
+#else
    .tracking_signal_name = HIGHLIGHT_CHANGED_SIG,
-
+#endif
 
    //Set by tts
    .tts = NULL,
@@ -40,9 +43,11 @@ int screen_reader_create_service(void *data)
    vconf_init(service_data);
    tts_init(service_data);
 
+#ifdef SCREEN_READER_TV
+   spi_init(service_data);
+#endif
 
    /* XML TEST */
-
 #ifdef RUN_IPC_TEST_SUIT
    run_xml_tests();
    test_suite_init();
index f9126e5..2b3bba7 100644 (file)
@@ -31,7 +31,7 @@ static void display_info(const AtspiEvent *event)
 {
    AtspiAccessible  *source = event->source;
    gchar *name = atspi_accessible_get_name(source, NULL);
-   gchar *role = atspi_accessible_get_role_name(source, NULL);
+   gchar *role = atspi_accessible_get_localized_role_name(source, NULL);
    gchar *toolkit = atspi_accessible_get_toolkit_name(source, NULL);
 
    DEBUG("--------------------------------------------------------");
@@ -111,7 +111,7 @@ static char *spi_on_state_changed_get_text(AtspiEvent *event, void *user_data)
 
    description = atspi_accessible_get_description(sd->currently_focused, NULL);
    name = atspi_accessible_get_name(sd->currently_focused, NULL);
-   role_name = atspi_accessible_get_role_name(sd->currently_focused, NULL);
+   role_name = atspi_accessible_get_localized_role_name(sd->currently_focused, NULL);
    other = generate_description_for_subtree(sd->currently_focused);
 
    DEBUG("->->->->->-> WIDGET GAINED HIGHLIGHT: %s <-<-<-<-<-<-<-", name);
@@ -281,7 +281,6 @@ char *spi_event_get_text_to_read(AtspiEvent *event, void *user_data)
 void spi_event_listener_cb(AtspiEvent *event, void *user_data)
 {
    DEBUG("START")
-
    display_info(event);
 
    if(!user_data)
@@ -296,8 +295,24 @@ void spi_event_listener_cb(AtspiEvent *event, void *user_data)
          ERROR("Can not prepare text to read");
          return;
       }
-   DEBUG("SPEAK:%s", text_to_read)
+   DEBUG("SPEAK: %s", text_to_read)
    tts_speak(text_to_read, EINA_FALSE);
+
+   tts_state_e state;
+   Service_Data *sd = (Service_Data*)user_data;
+   tts_get_state(sd->tts, &state);
+
+   if (state == TTS_STATE_READY || state == TTS_STATE_PAUSED)
+     {
+        int ret = tts_play(sd->tts);
+        if (TTS_ERROR_NONE != ret)
+           ERROR("Fail to play TTS : ret(%d)", ret);
+     }
+   else
+     {
+           DEBUG("Current tts state: %d", state);
+     }
+
    free(text_to_read);
    DEBUG("END")
 }
@@ -335,17 +350,21 @@ void spi_init(Service_Data *sd)
       {
          DEBUG("FAILED TO REGISTER spi focus/highlight listener");
       }
-
-   gboolean ret2 = atspi_event_listener_register(sd->spi_listener, CARET_MOVED_SIG, NULL);
+   GError *error = NULL;
+   gboolean ret2 = atspi_event_listener_register(sd->spi_listener, CARET_MOVED_SIG, &error);
    if(ret2 == false)
       {
-         DEBUG("FAILED TO REGISTER spi caret moved listener");
+         DEBUG("FAILED TO REGISTER spi caret moved listener: %s", error ? error->message : "no error message");
+         if (error)
+             g_clear_error(&error);
       }
 
-   gboolean ret3 = atspi_event_listener_register(sd->spi_listener, VALUE_CHANGED_SIG, NULL);
+   gboolean ret3 = atspi_event_listener_register(sd->spi_listener, VALUE_CHANGED_SIG, &error);
    if(ret3 == false)
       {
-         DEBUG("FAILED TO REGISTER spi value changed listener");
+         DEBUG("FAILED TO REGISTER spi value changed listener: %s", error ? error->message : "no error message");
+         if (error)
+             g_clear_error(&error);
       }
 
    if(ret1 == true && ret2 == true && ret3 == true)
index c9c3271..2a951e4 100644 (file)
@@ -132,13 +132,14 @@ static void __tts_test_utt_completed_cb(tts_h tts, int utt_id, void* user_data)
             flush_flag = EINA_FALSE;
       }
 
+#ifndef SCREEN_READER_TV
    if(last_utt_id == utt_id)
       {
          DEBUG("LAST UTTERANCE");
          pause_state = EINA_FALSE;
          on_utterance_end();
-
       }
+#endif
 
    return;
 }
@@ -151,7 +152,7 @@ bool tts_init(void *data)
    int r = tts_create( &sd->tts );
    DEBUG( "Create tts %d (%s)", r, get_tts_error( r ) );
 
-   r = tts_set_mode( sd->tts, TTS_MODE_DEFAULT );
+   r = tts_set_mode( sd->tts, TTS_MODE_SCREEN_READER );
    DEBUG( "Set tts mode SR %d (%s)", r, get_tts_error( r ) );
 
    r = tts_prepare( sd->tts );
@@ -228,9 +229,30 @@ void tts_speak(char *text_to_speak, Eina_Bool flush_switch)
    DEBUG( "text to say:%s\n", text_to_speak);
    if ( !text_to_speak ) return;
    if ( !text_to_speak[0] ) return;
-
-   if(tts_add_text( sd->tts, text_to_speak, NULL, TTS_VOICE_TYPE_AUTO, TTS_SPEED_AUTO, &speak_id))
+   int ret = 0;
+   if(ret = tts_add_text( sd->tts, text_to_speak, NULL, TTS_VOICE_TYPE_AUTO, TTS_SPEED_AUTO, &speak_id))
+   {
+       switch(ret) {
+       case TTS_ERROR_INVALID_PARAMETER:
+           DEBUG("FAILED tts_add_text: error: TTS_ERROR_INVALID_PARAMETER");
+           break;
+       case TTS_ERROR_INVALID_STATE:
+         DEBUG("FAILED tts_add_text: error: TTS_ERROR_INVALID_STATE, tts_state: %d", state);
+         break;
+       case TTS_ERROR_INVALID_VOICE:
+         DEBUG("FAILED tts_add_text: error: TTS_ERROR_INVALID_VOICE");
+         break;
+       case TTS_ERROR_OPERATION_FAILED:
+         DEBUG("FAILED tts_add_text: error: TTS_ERROR_OPERATION_FAILED");
+         break;
+       case TTS_ERROR_NOT_SUPPORTED:
+         DEBUG("FAILED tts_add_text: error: TTS_ERROR_NOT_SUPPORTED");
+         break;
+       default:
+         DEBUG("FAILED tts_add_text: error: not recognized");
+       }
       return;
+   }
 
    DEBUG("added id to:%d\n", speak_id);
    last_utt_id = speak_id;
index d9a1a35..c4c9b71 100644 (file)
@@ -74,6 +74,29 @@ gchar * atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error)
       }
 }
 
+gchar * atspi_accessible_get_localized_role_name (AtspiAccessible *obj, GError **error)
+{
+   if(!obj) return strdup("\0");
+   AtspiRole role = obj->role;
+   switch(role)
+      {
+      case ATSPI_ROLE_APPLICATION:
+         return strdup("Application");
+      case ATSPI_ROLE_PUSH_BUTTON:
+         return strdup("Push button");
+      case ATSPI_ROLE_ICON:
+         return strdup("Icon");
+      case ATSPI_ROLE_CHECK_BOX:
+         return strdup("Check box");
+      case ATSPI_ROLE_ENTRY:
+         return strdup("Entry");
+      case ATSPI_ROLE_FILLER:
+         return strdup("filler");
+      default:
+         return strdup("\0");
+      }
+}
+
 gchar * atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error)
 {
    return "fake atspi";
index 2374c58..7b6adb8 100644 (file)
@@ -359,6 +359,7 @@ typedef enum
 
 gchar * atspi_accessible_get_name (AtspiAccessible *obj, GError **error);
 gchar * atspi_accessible_get_role_name (AtspiAccessible *obj, GError **error);
+gchar * atspi_accessible_get_localized_role_name (AtspiAccessible *obj, GError **error);
 gchar * atspi_accessible_get_toolkit_name (AtspiAccessible *obj, GError **error);
 gchar * atspi_accessible_get_description (AtspiAccessible *obj, GError **error);
 AtspiText * atspi_accessible_get_text_iface (AtspiAccessible *obj);