Add a new TTS Interrupt mode
[platform/core/uifw/tts.git] / server / ttsd_server.c
index 724dc85..24365e5 100644 (file)
@@ -11,6 +11,7 @@
 *  limitations under the License.
 */
 
+#include <app_manager.h>
 #include <aul.h>
 #include <Ecore.h>
 
@@ -178,7 +179,7 @@ int ttsd_send_error(ttse_error_e error, const char* msg)
        int uttid = g_utt.uttid;
        int tmp_pid = ttsd_data_get_pid(uid);
 
-       SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Error msg from engine, pid(%d), uid(%d), uttid(%d), error(%d), msg(%s)", tmp_pid, uid, uttid, error, msg);
+       SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Error msg from engine, pid(%d), uid(%d), uttid(%d), error(%d), msg(%s)", tmp_pid, uid, uttid, error, (NULL == msg ? "NULL" : msg));
 
        __server_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
 
@@ -297,7 +298,7 @@ int ttsd_send_result(ttse_result_event_e event, const void* data, unsigned int d
        return TTSD_ERROR_NONE;
 }
 
-bool __get_client_cb(int pid, int uid, app_state_e state, void* user_data)
+bool __get_client_cb(int pid, int uid, app_tts_state_e state, void* user_data)
 {
        /* clear client data */
        ttsd_data_clear_data(uid);
@@ -406,7 +407,7 @@ void __config_changed_cb(tts_config_type_e type, const char* str_param, int int_
        return;
 }
 
-bool __terminate_client(int pid, int uid, app_state_e state, void* user_data)
+bool __terminate_client(int pid, int uid, app_tts_state_e state, void* user_data)
 {
        SLOG(LOG_INFO, tts_tag(), "@@@ Start to terminate client [%d]", uid);
        ttsd_server_finalize(uid);
@@ -523,9 +524,31 @@ int ttsd_server_initialize(int pid, int uid, bool* credential_needed)
        }
 
        if (0 != ttsd_engine_agent_is_credential_needed(uid, credential_needed)) {
-               SLOG(LOG_ERROR, tts_tag(), "Server ERROR] Fail to get credential necessity");
+               SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get credential necessity");
                return TTSD_ERROR_OPERATION_FAILED;
        }
+
+       if (true == *credential_needed) {
+               char* appid = NULL;
+               if (0 != app_manager_get_app_id(pid, &appid)) {
+                       SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get app id, pid(%d)", pid);
+               }
+               bool is_agreed = false;
+               if (0 != ttsd_engine_check_app_agreed(appid, &is_agreed)) {
+                       SLOG(LOG_ERROR, tts_tag(), "Server ERROR] Fail to check app agreed");
+                       if (!appid)
+                               free(appid);
+                       return TTSD_ERROR_OPERATION_FAILED;
+               }
+               if (!appid)
+                       free(appid);
+
+               if (false == is_agreed) {
+                       SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] App is not agreed");
+                       return TTSD_ERROR_PERMISSION_DENIED;
+               }
+       }
+
        if (0 != ttsd_data_new_client(pid, uid)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add client info");
                return TTSD_ERROR_OPERATION_FAILED;
@@ -545,7 +568,6 @@ static Eina_Bool __quit_ecore_loop(void *data)
        ttsd_network_finalize();
        ttsd_finalize();
        ecore_main_loop_quit();
-       ecore_shutdown();
 
        return EINA_FALSE;
 }
@@ -585,7 +607,7 @@ static void __read_proc()
        return;
 }
 
-bool __get_client_for_clean_up(int pid, int uid, app_state_e state, void* user_data)
+bool __get_client_for_clean_up(int pid, int uid, app_tts_state_e state, void* user_data)
 {
        bool exist = false;
        int i = 0;
@@ -662,7 +684,7 @@ int ttsd_server_finalize(int uid)
 {
        SLOG(LOG_INFO, tts_tag(), "[Server] Server finalize");
 
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_finalize : uid is not valid");
        }
@@ -691,7 +713,7 @@ int ttsd_server_finalize(int uid)
 
 int ttsd_server_add_queue(int uid, const char* text, const char* lang, int voice_type, int speed, int utt_id, const char* credential)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_add_queue : uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -810,7 +832,7 @@ Eina_Bool __send_interrupt_client(void *data)
 
 int ttsd_server_play(int uid, const char* credential)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%d) is NOT valid  ", uid);
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -829,6 +851,19 @@ int ttsd_server_play(int uid, const char* credential)
                }
        }
 
+       /* check the current playback focus */
+       if (TTSD_MODE_INTERRUPT != ttsd_get_mode()) {
+               bool is_current_interrupt = false;
+               if (0 != ttsd_player_check_current_playback_focus(&is_current_interrupt)) {
+                       SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to check the current playback focus");
+               } else {
+                       if (true == is_current_interrupt) {
+                               SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current playback focus is set on Interrupt mode. Cannot play default, screen reader, and noti modes.");
+                               return TTSD_ERROR_AUDIO_POLICY_BLOCKED;
+                       }
+               }
+       }
+
        int current_uid = ttsd_data_get_current_playing();
        SLOG(LOG_INFO, tts_tag(), "[Server] playing uid (%d)", current_uid);
 
@@ -893,7 +928,7 @@ int ttsd_server_play(int uid, const char* credential)
 
 int ttsd_server_stop(int uid)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -927,7 +962,7 @@ int ttsd_server_stop(int uid)
 
 int ttsd_server_pause(int uid, int* utt_id)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_pause : uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -955,7 +990,7 @@ int ttsd_server_pause(int uid, int* utt_id)
 
 int ttsd_server_get_support_voices(int uid, GList** voice_list)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -975,7 +1010,7 @@ int ttsd_server_get_support_voices(int uid, GList** voice_list)
 
 int ttsd_server_get_current_voice(int uid, char** language, int* voice_type)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_get_current_voice : uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -995,7 +1030,7 @@ int ttsd_server_get_current_voice(int uid, char** language, int* voice_type)
 
 int ttsd_server_set_private_data(int uid, const char* key, const char* data)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%d) is NOT valid", uid);
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -1018,7 +1053,7 @@ int ttsd_server_set_private_data(int uid, const char* key, const char* data)
 
 int ttsd_server_get_private_data(int uid, const char* key, char** data)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%d) is NOT valid", uid);
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -1067,7 +1102,7 @@ int ttsd_set_private_data_requested_cb(ttse_private_data_requested_cb callback)
 
 int ttsd_server_play_pcm(int uid)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%d) is NOT valid  ", uid);
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -1121,12 +1156,32 @@ int ttsd_server_play_pcm(int uid)
                return TTSD_ERROR_OPERATION_FAILED;
        }
 
+       if (APP_STATE_PAUSED == state) {
+               SLOG(LOG_DEBUG, tts_tag(), "[Server] uid(%d) is 'Pause' state : resume player", uid);
+
+               /* Resume player */
+               if (0 != ttsd_player_resume(uid)) {
+                       SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Fail to ttsd_player_resume()");
+               }
+       } else {
+               if (0 != ttsd_player_play_pcm(uid)) {
+                       SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play pcm sound : uid(%d)", uid);
+
+                       // Change ready state
+                       ttsd_server_stop_pcm(uid);
+
+                       int tmp_pid;
+                       tmp_pid = ttsd_data_get_pid(uid);
+                       ttsdc_send_set_state_message(tmp_pid, uid, APP_STATE_READY);
+               }
+       }
+
        return TTSD_ERROR_NONE;
 }
 
 int ttsd_server_stop_pcm(int uid)
 {
-       app_state_e state;
+       app_tts_state_e state;
        if (0 > ttsd_data_get_client_state(uid, &state)) {
                SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
                return TTSD_ERROR_INVALID_PARAMETER;
@@ -1134,16 +1189,16 @@ int ttsd_server_stop_pcm(int uid)
 
        SLOG(LOG_INFO, tts_tag(), "[Server] server stop, state(%d)", state);
 
-       if (APP_STATE_PLAYING == state || APP_STATE_PAUSED == state) {
-               if (0 != ttsd_player_clear(uid))
-                       SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsd_player_stop()");
-
+       if (APP_STATE_PLAYING == state || APP_STATE_PAUSED == state || APP_STATE_READY == state) {
                ttsd_data_set_client_state(uid, APP_STATE_READY);
        }
 
        /* Reset all data */
        ttsd_data_clear_data(uid);
 
+       ttsd_player_stop(uid);
+
+
        return TTSD_ERROR_NONE;
 }
 
@@ -1216,16 +1271,17 @@ int ttsd_server_add_pcm(int uid, int event, void* data, int data_size, int audio
                        temp_sound_data = NULL;
                }
 
-               if (0 != ttsd_player_play(uid)) {
+/*             if (0 != ttsd_player_play(uid)) {
                        SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play sound : uid(%d)", uid);
 
-                       /* Change ready state */
+                       // Change ready state
                        ttsd_server_stop(uid);
 
                        int tmp_pid;
                        tmp_pid = ttsd_data_get_pid(uid);
                        ttsdc_send_set_state_message(tmp_pid, uid, APP_STATE_READY);
                }
+*/
        } else {
                SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_ERROR");
        }