Implement service state changed event transfering
[platform/core/uifw/tts.git] / server / ttsd_server.c
1 /*
2 *  Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 *  Licensed under the Apache License, Version 2.0 (the "License");
4 *  you may not use this file except in compliance with the License.
5 *  You may obtain a copy of the License at
6 *  http://www.apache.org/licenses/LICENSE-2.0
7 *  Unless required by applicable law or agreed to in writing, software
8 *  distributed under the License is distributed on an "AS IS" BASIS,
9 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 *  See the License for the specific language governing permissions and
11 *  limitations under the License.
12 */
13
14 #include <app_manager.h>
15 #include <aul.h>
16 #include <Ecore.h>
17 #include <sys/time.h>
18
19 #include "ttsd_config.h"
20 #include "ttsd_data.h"
21 #include "ttsd_ipc.h"
22 #include "ttsd_engine_agent.h"
23 #include "ttsd_main.h"
24 #include "ttsd_player.h"
25 #include "ttsd_state.h"
26 #include "ttsd_server.h"
27
28
29 #define CLIENT_CLEAN_UP_TIME 500
30
31 /* for checking time */
32 #define TIME_DIFF(start, end) \
33         ((uint64_t)((end).tv_sec - (start).tv_sec) * 1000000 + (((end).tv_nsec - (start).tv_nsec) / 1000)) / 1000
34
35 static struct timespec g_request_playing, g_start_playing;
36 static double g_avg_latency;
37 static double g_min_latency;
38 static double g_max_latency;
39 static int g_file_num;
40
41 typedef struct {
42         unsigned int uid;
43         int uttid;
44 } utterance_t;
45
46 typedef struct {
47         ttsd_state_e before;
48         ttsd_state_e current;
49 } state_changed_args_t;
50
51 /* If current engine exist */
52 //static bool   g_is_engine;
53
54 static Ecore_Timer* g_check_client_timer = NULL;
55 static Ecore_Timer* g_wait_timer = NULL;
56 static Ecore_Timer* g_quit_loop_timer = NULL;
57 static Ecore_Timer* g_notify_state_timer = NULL;
58
59 static utterance_t g_utt;
60
61 static GList *g_proc_list = NULL;
62
63 static bool g_is_terminated = false;
64
65 static int g_activated_mode = 0;
66
67 /* Function definitions */
68 static int __stop_and_send_ready_state(unsigned int uid)
69 {
70         int ret = ttsd_server_stop(uid);
71         if (TTSD_ERROR_NONE != ret) {
72                 SLOG(LOG_WARN, tts_tag(), "[Server ERROR] Fail to ttsd_server_stop() : uid(%u). ret(%d)", uid, ret);
73                 return ret;
74         }
75
76         int pid = ttsd_data_get_pid(uid);
77         if (pid <= 0) {
78                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get pid. uid(%u)", uid);
79                 return TTSD_ERROR_OPERATION_FAILED;
80         } else {
81                 ttsdc_ipc_send_set_state_message(pid, uid, APP_STATE_READY);
82         }
83
84         return ret;
85 }
86
87 static void __synthesis(unsigned int uid);
88
89 static Eina_Bool __wait_synthesis(void *data)
90 {
91         /* get current play */
92         unsigned int uid = ttsd_data_get_current_playing();
93
94         if (uid > 0) {
95                 ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
96                 if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control) {
97                         return EINA_TRUE;
98                 } else {
99                         SLOG(LOG_INFO, tts_tag(), "[Server] synth_control(%d)", synth_control);
100                         g_wait_timer = NULL;
101                         if (TTSD_SYNTHESIS_CONTROL_DONE == synth_control) {
102                                 /* Start next synthesis */
103                                 __synthesis(uid);
104                         }
105                 }
106         } else {
107                 g_wait_timer = NULL;
108         }
109
110         return EINA_FALSE;
111 }
112
113 static void __synthesis(unsigned int uid)
114 {
115         SLOG(LOG_DEBUG, tts_tag(), "@@@ SYNTHESIS  START");
116
117         speak_data_s* speak_data = NULL;
118         int ret = ttsd_data_get_speak_data(uid, &speak_data);
119         if (TTSD_ERROR_NONE != ret || NULL == speak_data) {
120                 SLOG(LOG_DEBUG, tts_tag(), "@@@ Fail to get speak data. ret(%d)", ret);
121                 SLOG(LOG_DEBUG, tts_tag(), "@@@ SYNTHESIS  END");
122                 return;
123         }
124
125         int pid = ttsd_data_get_pid(uid);
126         if (pid <= 0) {
127                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get pid. uid(%u)", uid);
128                 ttsd_data_destroy_speak_data(speak_data);
129                 speak_data = NULL;
130                 return;
131         }
132
133         char appid[1024] = {0, };
134         if (0 != aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1)) {
135                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get app id");
136         }
137
138         if (NULL == speak_data->lang || NULL == speak_data->text) {
139                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Current data is NOT valid");
140                 __stop_and_send_ready_state(uid);
141                 ttsd_data_destroy_speak_data(speak_data);
142                 speak_data = NULL;
143                 return;
144         }
145
146         g_utt.uid = uid;
147         g_utt.uttid = speak_data->utt_id;
148
149         char* credential = ttsd_data_get_credential(uid);
150
151         SLOG(LOG_INFO, tts_tag(), "-----------------------------------------------------------");
152         SLOG(LOG_INFO, tts_tag(), "ID : uid (%u), uttid(%d) ", g_utt.uid, g_utt.uttid);
153         SLOG(LOG_INFO, tts_tag(), "Voice : langauge(%s), type(%d), speed(%d)", speak_data->lang, speak_data->vctype, speak_data->speed);
154         SLOG(LOG_INFO, tts_tag(), "Text : %s", speak_data->text);
155         SLOG(LOG_INFO, tts_tag(), "Credential : %s", credential);
156         SLOG(LOG_INFO, tts_tag(), "-----------------------------------------------------------");
157
158         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DOING);
159         ret = ttsd_engine_start_synthesis(speak_data->lang, speak_data->vctype, speak_data->text, speak_data->speed, appid, credential, NULL);
160         if (TTSD_ERROR_NONE != ret) {
161                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] * FAIL to start SYNTHESIS !!!! * ");
162
163                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
164                 __stop_and_send_ready_state(uid);
165         } else {
166                 g_wait_timer = ecore_timer_add(0.05, __wait_synthesis, (void*)credential);
167         }
168
169         if (ttsd_data_get_synth_control() == TTSD_SYNTHESIS_CONTROL_DOING && ttsd_state_get_state() == TTSD_STATE_READY) {
170                 ttsd_state_set_state(TTSD_STATE_SYNTHESIZING);
171         }
172
173         free(credential);
174         credential = NULL;
175         ttsd_data_destroy_speak_data(speak_data);
176         speak_data = NULL;
177         SLOG(LOG_DEBUG, tts_tag(), "@@@ SYNTHESIS  END");
178
179         return;
180 }
181
182 /*
183 * TTS Server Callback Functions
184 */
185 int ttsd_send_error(ttse_error_e error, const char* msg)
186 {
187         unsigned int uid = g_utt.uid;
188         int uttid = g_utt.uttid;
189         int tmp_pid = ttsd_data_get_pid(uid);
190
191         SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Error msg from engine, pid(%d), uid(%u), uttid(%d), error(%d), msg(%s)", tmp_pid, uid, uttid, error, (NULL == msg ? "NULL" : msg));
192
193         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
194
195         if (0 != ttsd_data_clear_data(uid))
196                 SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsd_data_clear_data()");
197
198         if (tmp_pid > 0) {
199                 if (0 != ttsdc_ipc_send_error_message(tmp_pid, uid, uttid, error, (char*)msg))
200                         SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsdc_ipc_send_error_message()");
201         }
202
203         if (0 != ttsd_data_set_client_state(uid, APP_STATE_READY))
204                 SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsd_data_set_client_state()");
205
206         if (tmp_pid > 0) {
207                 if (0 != ttsdc_ipc_send_set_state_message(tmp_pid, uid, APP_STATE_READY))
208                         SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsdc_ipc_send_set_state_message()");
209         }
210         return 0;
211 }
212
213 int ttsd_send_result(ttse_result_event_e event, const void* data, unsigned int data_size, ttse_audio_type_e audio_type, int rate, void* user_data)
214 {
215         SLOG(LOG_DEBUG, tts_tag(), "@@@ SEND SYNTHESIS RESULT START");
216
217         unsigned int uid = g_utt.uid;
218         int uttid = g_utt.uttid;
219
220         if (false == ttsd_data_is_uttid_valid(uid, uttid)) {
221                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
222                 SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] uttid is NOT valid !!!! - uid(%u), uttid(%d)", uid, uttid);
223                 SLOG(LOG_DEBUG, tts_tag(), "@@@");
224                 return TTSD_ERROR_INVALID_PARAMETER;
225         }
226
227         if (TTSE_RESULT_EVENT_START > event || TTSE_RESULT_EVENT_FINISH < event) {
228                 SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_ERROR");
229                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
230                 return TTSD_ERROR_INVALID_PARAMETER;
231         }
232
233         if (rate <= 0 || audio_type < 0 || audio_type > TTSE_AUDIO_TYPE_MAX) {
234                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
235                 SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] audio data is invalid");
236                 SLOG(LOG_DEBUG, tts_tag(), "@@@");
237                 return TTSD_ERROR_INVALID_PARAMETER;
238         }
239
240         /* check the current state */
241         app_tts_state_e state = ttsd_data_get_client_state(uid);
242         if (APP_STATE_NONE == state) {
243                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
244                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
245                 return TTSD_ERROR_INVALID_PARAMETER;
246         }
247
248         SLOG(LOG_INFO, tts_tag(), "[Server] uid(%u), current state(%d)", uid, state);
249         if (APP_STATE_CREATED == state || APP_STATE_READY == state) {
250                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
251                 SLOG(LOG_WARN, tts_tag(), "[SERVER WARNING] Current state is %d. The synthesized result is ignored.", state);
252                 return TTSD_ERROR_NONE;
253         }
254
255         /* Synthesis is success */
256         if (TTSE_RESULT_EVENT_START == event) {
257                 SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_START");
258                 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Result Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
259                         uid, uttid, data, data_size, audio_type, rate);
260
261                 clock_gettime(CLOCK_MONOTONIC_RAW, &g_start_playing);
262                 long long int latency = (uint64_t)TIME_DIFF(g_request_playing, g_start_playing);
263                 SLOG(LOG_INFO, tts_tag(), "[SERVER] Latency (Request playing ~ Get 1st synthesized results): %lld ms", latency);
264                 double d_latency = (double)latency;
265                 g_avg_latency += d_latency;
266                 g_min_latency = (d_latency < g_min_latency) ? d_latency : g_min_latency;
267                 g_max_latency = (d_latency > g_max_latency) ? d_latency : g_max_latency;
268                 g_file_num++;
269                 SLOG(LOG_INFO, tts_tag(), "[Server] File num(%d), Avg Latency(%lf), Min(%lf), Max(%lf)", g_file_num, (g_avg_latency / (double)g_file_num), g_min_latency, g_max_latency);
270         } else if (TTSE_RESULT_EVENT_FINISH == event) {
271                 SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_FINISH");
272                 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Result Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
273                         uid, uttid, data, data_size, audio_type, rate);
274         } else {
275                 /*if (TTSE_RESULT_EVENT_CONTINUE == event)  SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_CONTINUE");*/
276         }
277
278         /* add wav data */
279         sound_data_s* sound_data = ttsd_data_create_sound_data(uttid, data, data_size, event, audio_type, rate, 0);
280         if (NULL == sound_data) {
281                 SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Out of memory");
282                 return TTSD_ERROR_OUT_OF_MEMORY;
283         }
284
285         if (0 != ttsd_data_add_sound_data(uid, sound_data)) {
286                 SECURE_SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Fail to add sound data : uid(%u)", uid);
287                 ttsd_data_destroy_sound_data(sound_data);
288
289                 return TTSD_ERROR_OPERATION_FAILED;
290         }
291
292         if (event == TTSE_RESULT_EVENT_FINISH) {
293                 ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_DONE);
294         }
295
296         return TTSD_ERROR_NONE;
297 }
298
299 static bool __get_client_cb(int pid, unsigned int uid, app_tts_state_e state, void* user_data)
300 {
301         if (0 > ttsd_data_is_client(uid)) {
302                 SLOG(LOG_ERROR, tts_tag(), "[Server] Client(%d) is not valid.", uid);
303                 ttsd_data_delete_client(uid);
304                 return true;
305         }
306
307         /* clear client data */
308         ttsd_data_clear_data(uid);
309
310         if (APP_STATE_READY != state) {
311                 ttsd_data_set_client_state(uid, APP_STATE_READY);
312                 ttsdc_ipc_send_set_state_message(pid, uid, APP_STATE_READY);
313         }
314
315         return true;
316 }
317
318 static void __stop_all_client()
319 {
320         SLOG(LOG_INFO, tts_tag(), "[Server] Send to stop all requests");
321
322         ttsd_engine_cancel_synthesis();
323         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
324
325         /* stop all player */
326         ttsd_player_all_stop();
327
328         /* send interrupt message to  all clients */
329         ttsd_data_foreach_clients(__get_client_cb, NULL);
330 }
331
332 static void __config_changed_cb(tts_config_type_e type, const char* str_param, int int_param, double double_param)
333 {
334         switch (type) {
335         case TTS_CONFIG_TYPE_ENGINE:
336         {
337                 /* TODO - Determine the policy when engine process get engine changed cb */
338                 if (NULL == str_param) {
339                         SLOG(LOG_ERROR, tts_tag(), "[Server] engine id from config is NULL");
340                         return;
341                 }
342
343                 int ret = 0;
344                 if (true == ttsd_engine_agent_is_same_engine(str_param)) {
345                         SLOG(LOG_DEBUG, tts_tag(), "[Server Setting] new engine is the same as current engine");
346                         ret = ttsd_engine_agent_unload_current_engine();
347                         if (0 != ret) {
348                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to unload current engine : result(%d)", ret);
349                         }
350
351                         ret = ttsd_engine_agent_load_current_engine();
352                         if (0 != ret) {
353                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to load current engine : result (%d)", ret);
354                         }
355                         return;
356                 }
357
358                 __stop_all_client();
359                 break;
360         }
361
362         case TTS_CONFIG_TYPE_VOICE:
363         {
364                 if (NULL == str_param) {
365                         SLOG(LOG_ERROR, tts_tag(), "[Server] language from config is NULL");
366                         return;
367                 }
368
369                 char* out_lang = NULL;
370                 int out_type;
371                 int ret = -1;
372
373                 if (true == ttsd_engine_select_valid_voice(str_param, int_param, &out_lang, &out_type)) {
374                         SLOG(LOG_ERROR, tts_tag(), "[Server] valid language : lang(%s), type(%d)", out_lang, out_type);
375                         ret = ttsd_engine_agent_set_default_voice(out_lang, out_type);
376                         if (0 != ret)
377                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set valid language : lang(%s), type(%d)", out_lang, out_type);
378                 } else {
379                         /* Current language is not available */
380                         SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Fail to set voice : lang(%s), type(%d)", str_param, int_param);
381                 }
382                 if (NULL != out_lang) {
383                         free(out_lang);
384                         out_lang = NULL;
385                 }
386                 break;
387         }
388
389         case TTS_CONFIG_TYPE_SPEED:
390         {
391                 if (TTS_SPEED_MIN <= int_param && int_param <= TTS_SPEED_MAX) {
392                         /* set default speed */
393                         int ret = 0;
394                         ret = ttsd_engine_agent_set_default_speed(int_param);
395                         if (0 != ret) {
396                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set default speed : result(%d)", ret);
397                         }
398                 }
399                 break;
400         }
401
402         case TTS_CONFIG_TYPE_PITCH:
403         {
404                 if (TTS_PITCH_MIN <= int_param && int_param <= TTS_PITCH_MAX) {
405                         /* set default speed */
406                         int ret = 0;
407                         ret = ttsd_engine_agent_set_default_pitch(int_param);
408                         if (0 != ret) {
409                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set default pitch : result(%d)", ret);
410                         }
411                 }
412                 break;
413         }
414
415         case TTS_CONFIG_TYPE_BACKGROUND_VOLUME_RATIO:
416         {
417                 if (0.0 <= double_param && double_param <= 1.0) {
418                         /* set default bg volume ratio */
419                         int ret = 0;
420                         ret = ttsd_player_set_background_volume_ratio(double_param);
421                         if (0 != ret) {
422                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set default bg volume ratio : result(%d)", ret);
423                         }
424                 }
425                 break;
426         }
427         }
428
429         return;
430 }
431
432 bool __terminate_client(int pid, unsigned int uid, app_tts_state_e state, void* user_data)
433 {
434         SLOG(LOG_INFO, tts_tag(), "@@@ Start to terminate client [%d]", uid);
435         ttsd_server_finalize(uid);
436         return true;
437 }
438
439 static int __terminate_server()
440 {
441         if (g_is_terminated) {
442                 SLOG(LOG_INFO, tts_tag(), "[INFO] ttsd_terminate() is already invoked.");
443                 return TTSD_ERROR_NONE;
444         }
445
446         int ret = TTSD_ERROR_NONE;
447         ret = ttsd_ipc_close_connection();
448         if (TTSD_ERROR_NONE != ret) {
449                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_ipc_close_connection(). ret(%d)", ret);
450                 return TTSD_ERROR_OPERATION_FAILED;
451         }
452
453         ret = ttsd_finalize();
454         if (TTSD_ERROR_NONE != ret) {
455                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_finalize(). ret(%d)", ret);
456                 return TTSD_ERROR_OPERATION_FAILED;
457         }
458
459         g_is_terminated = true;
460         return TTSD_ERROR_NONE;
461 }
462
463 static Eina_Bool __quit_ecore_loop(void *data)
464 {
465         __terminate_server();
466         ecore_main_loop_quit();
467
468         return EINA_FALSE;
469 }
470
471 void __screen_reader_changed_cb(bool value)
472 {
473         SLOG(LOG_DEBUG, tts_tag(), "[Server] Screen reader is %s", value ? "ON" : "OFF");
474         return;
475 }
476
477 static void __read_proc()
478 {
479         DIR *dp = NULL;
480         struct dirent *dirp = NULL;
481         int tmp;
482
483         GList *iter = NULL;
484         if (0 < g_list_length(g_proc_list)) {
485                 iter = g_list_first(g_proc_list);
486                 while (NULL != iter) {
487                         g_proc_list = g_list_remove_link(g_proc_list, iter);
488                         g_list_free(iter);
489                         iter = g_list_first(g_proc_list);
490                 }
491         }
492
493         dp = opendir("/proc");
494         if (NULL == dp) {
495                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to open proc");
496         } else {
497                 do {
498                         dirp = readdir(dp);
499
500                         if (NULL != dirp) {
501                                 tmp = atoi(dirp->d_name);
502                                 if (0 >= tmp)   continue;
503                                 g_proc_list = g_list_append(g_proc_list, GINT_TO_POINTER(tmp));
504                         }
505                 } while (NULL != dirp);
506                 closedir(dp);
507         }
508         return;
509 }
510
511 bool __get_client_for_clean_up(int pid, unsigned int uid, app_tts_state_e state, void* user_data)
512 {
513         bool exist = false;
514         int i = 0;
515
516         GList *iter = NULL;
517         for (i = 0; i < g_list_length(g_proc_list); i++) {
518                 iter = g_list_nth(g_proc_list, i);
519                 if (NULL != iter) {
520                         if (pid == GPOINTER_TO_INT(iter->data)) {
521                                 SLOG(LOG_DEBUG, tts_tag(), "uid (%u) is running", uid);
522                                 exist = true;
523                                 break;
524                         }
525                 }
526         }
527
528         if (false == exist) {
529                 SLOG(LOG_ERROR, tts_tag(), "uid (%u) should be removed", uid);
530                 ttsd_server_finalize(uid);
531         }
532
533         return true;
534 }
535
536 static Eina_Bool __cleanup_client(void *data)
537 {
538         SLOG(LOG_DEBUG, tts_tag(), "@@@ CLEAN UP CLIENT START");
539         __read_proc();
540
541         if (0 < ttsd_data_get_client_count()) {
542                 ttsd_data_foreach_clients(__get_client_for_clean_up, NULL);
543         } else {
544                 if (NULL == g_quit_loop_timer) {
545                         SLOG(LOG_INFO, tts_tag(), "[Server] Add a timer __quit_ecore_loop");
546                         g_quit_loop_timer = ecore_timer_add(0, __quit_ecore_loop, NULL);
547                 }
548                 SLOG(LOG_ERROR, tts_tag(), "[Server] Deleted timer");
549                 g_check_client_timer = NULL;
550                 return EINA_FALSE;
551         }
552
553         SLOG(LOG_DEBUG, tts_tag(), "@@@");
554
555         return EINA_TRUE;
556 }
557
558 static bool __notify_state_changed_event(int pid, unsigned int uid, app_tts_state_e state, void* user_data)
559 {
560         state_changed_args_t* args = (state_changed_args_t*)user_data;
561         if (NULL == args) {
562                 return false;
563         }
564
565         ttsdc_ipc_send_set_service_state_message(pid, uid, args->before, args->current);
566         return true;
567 }
568
569 static Eina_Bool __state_changed_timer_cb(void *data)
570 {
571         if (NULL == data) {
572                 SLOG(LOG_ERROR, tts_tag(), "[Server] Invalid data passed.");
573                 return ECORE_CALLBACK_CANCEL;
574         }
575
576         int ret = ttsd_data_foreach_clients(__notify_state_changed_event, data);
577         if (TTSD_ERROR_NONE != ret) {
578                 SLOG(LOG_ERROR, tts_tag(), "[Server] Fail to notify state change.");
579         }
580
581         free(data);
582         g_notify_state_timer = NULL;
583         return ECORE_CALLBACK_CANCEL;
584 }
585
586 static void __state_changed_cb(ttsd_state_e before, ttsd_state_e current)
587 {
588         state_changed_args_t* args = (state_changed_args_t*)calloc(1, sizeof(state_changed_args_t));
589         args->before = before;
590         args->current = current;
591
592         SLOG(LOG_INFO, tts_tag(), "[Server] Notify state chanaged from (%d) to (%d).", before, current);
593         g_notify_state_timer = ecore_timer_add(0.0, __state_changed_timer_cb, args);
594 }
595
596 /*
597 * Server APIs
598 */
599 int ttsd_initialize(ttse_request_callback_s *callback)
600 {
601         SLOG(LOG_INFO, tts_tag(), "[Server] Initialize");
602         g_is_terminated = false;
603
604         if (ttsd_config_initialize(__config_changed_cb)) {
605                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize config.");
606         }
607
608         if (TTSD_ERROR_NONE != ttsd_state_initialize(__state_changed_cb)) {
609                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize state.");
610         }
611
612         /* player init */
613         if (ttsd_player_init()) {
614                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to initialize player init.");
615                 return TTSD_ERROR_OPERATION_FAILED;
616         }
617
618         double ratio;
619         if (0 == ttsd_config_get_bg_volume_ratio(&ratio))
620         {
621                 SLOG(LOG_ERROR, tts_tag(), "[Server] get bg volume ratio is %lf", ratio);
622                 int ret = ttsd_player_set_background_volume_ratio(ratio);
623                 if (0 != ret)
624                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set bg volume ratio : result(%d)", ret);
625         } else {
626                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to get bg volume ratio");
627         }
628
629         /* Engine Agent initialize */
630         if (TTSD_ERROR_NONE != ttsd_engine_agent_init(callback)) {
631                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to engine agent initialize.");
632                 return TTSD_ERROR_OPERATION_FAILED;
633         }
634
635         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
636         ttsd_config_set_screen_reader_callback(__screen_reader_changed_cb);
637
638         g_check_client_timer = ecore_timer_add(CLIENT_CLEAN_UP_TIME, __cleanup_client, NULL);
639         if (NULL == g_check_client_timer) {
640                 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to create timer");
641         }
642
643         g_activated_mode = 0;
644
645         return TTSD_ERROR_NONE;
646 }
647
648 int ttsd_finalize()
649 {
650         SLOG(LOG_INFO, tts_tag(), "[Server] Finalize");
651
652         GList *iter = NULL;
653         if (0 < g_list_length(g_proc_list)) {
654                 iter = g_list_first(g_proc_list);
655                 while (NULL != iter) {
656                         g_proc_list = g_list_remove_link(g_proc_list, iter);
657                         g_list_free(iter);
658                         iter = g_list_first(g_proc_list);
659                 }
660         }
661
662         if (g_wait_timer) {
663                 ecore_timer_del(g_wait_timer);
664                 g_wait_timer = NULL;
665                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore waiting timer handle");
666         }
667
668         if (g_check_client_timer) {
669                 ecore_timer_del(g_check_client_timer);
670                 g_check_client_timer = NULL;
671                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore checking client timer handle");
672         }
673
674         if (g_quit_loop_timer) {
675                 ecore_timer_del(g_quit_loop_timer);
676                 g_quit_loop_timer = NULL;
677                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
678         }
679
680         ttsd_config_finalize();
681         ttsd_state_finalize();
682
683         int ret = TTSD_ERROR_NONE;
684         ret = ttsd_player_release();
685         if (TTSD_ERROR_NONE != ret) {
686                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_player_release(). ret(%d)", ret);
687                 return TTSD_ERROR_OPERATION_FAILED;
688         }
689
690         ret = ttsd_engine_agent_release();
691         if (TTSD_ERROR_NONE != ret) {
692                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_engine_agent_release(). ret(%d)", ret);
693                 return TTSD_ERROR_OPERATION_FAILED;
694         }
695
696         return TTSD_ERROR_NONE;
697 }
698
699 int ttsd_terminate()
700 {
701         SLOG(LOG_INFO, tts_tag(), "[Server] Terminate");
702         int ret = ttsd_data_foreach_clients(__terminate_client, NULL);
703         if (TTSD_ERROR_NONE != ret) {
704                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to terminate all clients. ret(%d)", ret);
705                 return TTSD_ERROR_OPERATION_FAILED;
706         }
707
708         if (g_quit_loop_timer) {
709                 ecore_timer_del(g_quit_loop_timer);
710                 g_quit_loop_timer = NULL;
711                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
712         }
713
714         return __terminate_server();
715 }
716
717 /*
718 * TTS Server Functions for Client
719 */
720
721 int ttsd_server_is_already_initialized(int pid, unsigned int uid, bool* is_initialized)
722 {
723         if (-1 != ttsd_data_is_client(uid))
724                 *is_initialized = true;
725         else
726                 *is_initialized = false;
727
728         SLOG(LOG_INFO, tts_tag(), "[Server INFO] Pid(%d), uid(%u) is %s", pid, uid, *is_initialized ? "already initialized" : "not initialized yet");
729         return TTSD_ERROR_NONE;
730 }
731
732 static void __set_and_notify_activated_mode()
733 {
734         int activated_mode = ttsd_data_get_activated_mode();
735         if (g_activated_mode == activated_mode) {
736                 return;
737         }
738
739         SLOG(LOG_INFO, tts_tag(), "[Server] Activated mode is changed from(%d) to (%d)", g_activated_mode, activated_mode);
740
741         g_activated_mode = activated_mode;
742         int ret = ttsd_engine_notify_activated_mode_changed(g_activated_mode);
743         if (TTSD_ERROR_NONE != ret) {
744                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to notify activated mode changed event.(%d)", ret);
745         }
746 }
747
748 static int __check_app_agreed(int pid, unsigned int uid, bool credential_needed)
749 {
750         if (false == credential_needed) {
751                 return TTSD_ERROR_NONE;
752         }
753
754         char* appid = NULL;
755         if (APP_MANAGER_ERROR_NONE != app_manager_get_app_id(pid, &appid)) {
756                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get app id, pid(%d)", pid);
757         }
758
759         bool is_agreed = false;
760         int ret = ttsd_engine_check_app_agreed(appid, &is_agreed);
761         free(appid);
762         appid = NULL;
763
764         if (TTSD_ERROR_NONE != ret) {
765                 SLOG(LOG_ERROR, tts_tag(), "Server ERROR] Fail to check app agreed");
766                 return TTSD_ERROR_OPERATION_FAILED;
767         }
768
769         if (false == is_agreed) {
770                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] App is not agreed");
771                 return TTSD_ERROR_PERMISSION_DENIED;
772         }
773
774         return TTSD_ERROR_NONE;
775 }
776
777 int ttsd_server_initialize(int pid, unsigned int uid, ttsd_mode_e mode, tts_ipc_method_e method, bool* credential_needed)
778 {
779         SLOG(LOG_INFO, tts_tag(), "[Server] Server initialize");
780
781         if (-1 != ttsd_data_is_client(uid)) {
782                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Uid has already been registered");
783                 return TTSD_ERROR_NONE;
784         }
785
786         if (TTSD_ERROR_NONE != ttsd_data_new_client(pid, uid, mode, method)) {
787                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add client info");
788                 return TTSD_ERROR_OPERATION_FAILED;
789         }
790
791         __set_and_notify_activated_mode();
792
793         if (TTSD_ERROR_NONE != ttsd_engine_agent_load_current_engine()) {
794                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to load current engine");
795                 ttsd_data_delete_client(uid);
796                 return TTSD_ERROR_OPERATION_FAILED;
797         }
798
799         bool is_needed = false;
800         if (TTSD_ERROR_NONE != ttsd_engine_agent_is_credential_needed(uid, &is_needed)) {
801                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get credential necessity");
802                 ttsd_data_delete_client(uid);
803                 return TTSD_ERROR_OPERATION_FAILED;
804         }
805
806         int ret = __check_app_agreed(pid, uid, is_needed);
807         if (TTSD_ERROR_NONE != ret) {
808                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Checking credential is finished(%d)", ret);
809                 ttsd_data_delete_client(uid);
810                 return ret;
811         }
812
813         *credential_needed = is_needed;
814
815         return TTSD_ERROR_NONE;
816 }
817
818 void __used_voice_cb(const char* lang, int type)
819 {
820         SLOG(LOG_DEBUG, tts_tag(), "[Server] Request to unload voice (%s,%d)", lang, type);
821         if (0 != ttsd_engine_unload_voice(lang, type)) {
822                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to unload voice");
823         }
824 }
825
826 int ttsd_server_finalize(unsigned int uid)
827 {
828         SLOG(LOG_INFO, tts_tag(), "[Server] Server finalize");
829         SLOG(LOG_INFO, tts_tag(), "[Server] File num(%d), Avg Latency(%lf), Min(%lf), Max(%lf)", g_file_num, (g_avg_latency / (double)g_file_num), g_min_latency, g_max_latency);
830
831         if (0 > ttsd_data_is_client(uid)) {
832                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_finalize : uid is not valid");
833         }
834
835         int ret = ttsd_server_stop(uid);
836         if (TTSD_ERROR_NONE != ret) {
837                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] TTS server top(%u) fail (%d/%s) <<<<<", uid, ret, get_error_message(ret));
838         }
839
840         /* Need to unload voice when used voice is unregistered */
841         if (0 != ttsd_data_reset_used_voice(uid, __used_voice_cb)) {
842                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set used voice");
843                 return TTSD_ERROR_OPERATION_FAILED;
844         }
845
846         ttsd_data_delete_client(uid);
847         __set_and_notify_activated_mode();
848
849         /* unload engine, if ref count of client is 0 */
850         if (0 == ttsd_data_get_client_count()) {
851                 if (NULL == g_quit_loop_timer) {
852                         SLOG(LOG_DEBUG, tts_tag(), "[Server] Quit main loop");
853                         g_quit_loop_timer = ecore_timer_add(0, __quit_ecore_loop, NULL);
854                 } else {
855                         SLOG(LOG_WARN, tts_tag(), "[Server] Already called __quit_ecore_loop");
856                 }
857         }
858
859         return TTSD_ERROR_NONE;
860 }
861
862 static bool __is_connected_to_network()
863 {
864         /* Check network */
865         int network_status = 0;
866         int ret = vconf_get_int(VCONFKEY_NETWORK_STATUS, &network_status);
867         if (0 != ret) {
868                 SLOG(LOG_WARN, tts_tag(), "[Network] Fail to get network status, ret(%d)", ret);
869                 return false;
870         }
871
872         if (network_status == VCONFKEY_NETWORK_OFF) {
873                 SLOG(LOG_WARN, tts_tag(), "[Network] Current network connection is OFF.");
874                 return false;
875         }
876
877         SLOG(LOG_DEBUG, tts_tag(), "[Network] Network status is %d", network_status);
878
879         return true;
880 }
881
882 int ttsd_server_add_text(unsigned int uid, const char* text, const char* lang, int voice_type, int speed, int utt_id, const char* credential)
883 {
884         app_tts_state_e state = ttsd_data_get_client_state(uid);
885         if (APP_STATE_NONE == state) {
886                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_add_text : uid is not valid");
887                 return TTSD_ERROR_INVALID_PARAMETER;
888         }
889
890         /* check valid voice */
891         char* temp_lang = NULL;
892         int temp_type;
893         if (true != ttsd_engine_select_valid_voice((const char*)lang, voice_type, &temp_lang, &temp_type)) {
894                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to select valid voice");
895                 if (NULL != temp_lang) {
896                         free(temp_lang);
897                         temp_lang = NULL;
898                 }
899                 return TTSD_ERROR_INVALID_VOICE;
900         }
901
902         if (NULL == temp_lang) {
903                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to select valid voice : result lang is NULL");
904                 return TTSD_ERROR_INVALID_VOICE;
905         }
906
907         speak_data_s* speak_data = ttsd_data_create_speak_data(text, lang, voice_type, speed, utt_id);
908         if (NULL == speak_data) {
909                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to allocate memory");
910                 if (NULL != temp_lang) {
911                         free(temp_lang);
912                         temp_lang = NULL;
913                 }
914
915                 return TTSD_ERROR_OPERATION_FAILED;
916         }
917
918         SLOG(LOG_INFO, tts_tag(), "[Server] Add queue, lang(%s), vctype(%d), speed(%d), uttid(%d), credential(%s)", lang, voice_type, speed, utt_id, credential);
919
920         /* if state is APP_STATE_READY , APP_STATE_PAUSED , only need to add speak data to queue*/
921         int ret = -1;
922         ret = ttsd_data_add_speak_data(uid, speak_data);
923         if (0 != ret) {
924                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add speak data");
925                 if (NULL != temp_lang) {
926                         free(temp_lang);
927                         temp_lang = NULL;
928                 }
929
930                 ttsd_data_destroy_speak_data(speak_data);
931                 speak_data = NULL;
932
933                 return ret;
934         }
935
936         if (0 != ttsd_data_set_used_voice(uid, temp_lang, temp_type)) {
937                 /* Request load voice */
938                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Request to load voice");
939                 if (0 != ttsd_engine_load_voice(temp_lang, temp_type)) {
940                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to load voice");
941                 }
942         }
943
944         if (NULL != temp_lang) {
945                 free(temp_lang);
946                 temp_lang = NULL;
947         }
948
949         if (APP_STATE_PLAYING == state) {
950                 /* check if engine use network */
951                 if (ttsd_engine_agent_need_network()) {
952                         if (false == __is_connected_to_network()) {
953                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Disconnect network. Current engine needs network.");
954                                 return TTSD_ERROR_OPERATION_FAILED;
955                         }
956                 }
957
958                 ttsd_data_set_credential(uid, credential);
959
960                 /* Check whether tts-engine is running or not */
961                 ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
962                 SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
963                 if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control) {
964                         SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Engine has already been running.");
965                 } else {
966                         __synthesis(uid);
967                 }
968         }
969
970         return TTSD_ERROR_NONE;
971 }
972
973 static int __interrupt_player_by_policy(unsigned int request_app_uid)
974 {
975         unsigned int playing_app_uid = ttsd_data_get_current_playing();
976         if (0 > ttsd_data_is_client(playing_app_uid)) {
977                 SLOG(LOG_INFO, tts_tag(), "[Server] There is no app which is in 'Play' state");
978                 return TTSD_ERROR_NONE;
979         }
980
981         if (request_app_uid == playing_app_uid) {
982                 SLOG(LOG_WARN, tts_tag(), "[Server] This is played uid. Skip policy behavior");
983                 return TTSD_ERROR_NONE;
984         }
985
986         ttsd_mode_e request_app_mode = ttsd_data_get_mode(request_app_uid);
987         ttsd_mode_e playing_app_mode = ttsd_data_get_mode(playing_app_uid);
988         switch (playing_app_mode) {
989         case TTSD_MODE_DEFAULT:
990         case TTSD_MODE_NOTIFICATION:
991         case TTSD_MODE_SCREEN_READER:
992                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Played client(%u) will be interrupted into 'Stop' state", playing_app_uid);
993                 __stop_and_send_ready_state(playing_app_uid);
994                 break;
995
996         case TTSD_MODE_INTERRUPT:
997                 if (TTSD_MODE_INTERRUPT != request_app_mode) {
998                         SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Default, Screen reader, and Noti are prohibitted.");
999                         return TTSD_ERROR_AUDIO_POLICY_BLOCKED;
1000                 }
1001
1002                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Played client(%u) will be interrupted into 'Stop' state", playing_app_uid);
1003                 __stop_and_send_ready_state(playing_app_uid);
1004                 break;
1005         }
1006
1007         return TTSD_ERROR_NONE;
1008 }
1009
1010 int ttsd_server_play(unsigned int uid, const char* credential)
1011 {
1012         app_tts_state_e state = ttsd_data_get_client_state(uid);
1013         if (APP_STATE_NONE == state) {
1014                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1015                 return TTSD_ERROR_INVALID_PARAMETER;
1016         }
1017
1018         if (APP_STATE_PLAYING == state) {
1019                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state of (%u) is 'PLAYING'", uid);
1020                 return TTSD_ERROR_NONE;
1021         }
1022
1023         /* check if engine use network */
1024         if (ttsd_engine_agent_need_network()) {
1025                 if (false == __is_connected_to_network()) {
1026                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Disconnect network. Current engine needs network service!!!.");
1027                         return TTSD_ERROR_OUT_OF_NETWORK;
1028                 }
1029         }
1030
1031         int ret = __interrupt_player_by_policy(uid);
1032         if (TTSD_ERROR_NONE != ret) {
1033                 SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Cannot play default, screen reader, and noti modes.");
1034                 return ret;
1035         }
1036
1037         /* Change current play */
1038         if (0 != ttsd_player_wait_to_play(uid)) {
1039                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Fail to set to wait for playing : uid(%u)", uid);
1040         }
1041
1042         if (0 != ttsd_data_set_client_state(uid, APP_STATE_PLAYING)) {
1043                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set state : uid(%u)", uid);
1044                 return TTSD_ERROR_OPERATION_FAILED;
1045         }
1046
1047         SLOG(LOG_DEBUG, tts_tag(), "[Server] Play player. uid(%u)", uid);
1048         ret = ttsd_player_play(uid);
1049         if (TTSD_ERROR_NONE != ret) {
1050                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play sound : uid(%u)", uid);
1051                 ttsd_data_set_client_state(uid, state);
1052                 return TTSD_ERROR_OPERATION_FAILED;
1053         }
1054
1055         ttsd_data_set_credential(uid, credential);
1056
1057         /* Check whether tts-engine is running or not */
1058         clock_gettime(CLOCK_MONOTONIC_RAW, &g_request_playing);
1059         ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
1060         SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
1061         if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control) {
1062                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Engine has already been running.");
1063         } else {
1064                 __synthesis(uid);
1065         }
1066         ttsd_data_set_play_type(uid, TTS_APP_PLAY_TYPE_SYNTH);
1067
1068         return TTSD_ERROR_NONE;
1069 }
1070
1071 static void __stop_engine_synthesis(unsigned int uid)
1072 {
1073         ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
1074         SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
1075
1076         if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control && uid == ttsd_data_get_current_playing()) {
1077                 SLOG(LOG_DEBUG, tts_tag(), "[Server] TTS-engine is running");
1078
1079                 int ret = ttsd_engine_cancel_synthesis();
1080                 if (TTSD_ERROR_NONE != ret)
1081                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to cancel synthesis : ret(%d)", ret);
1082         }
1083
1084         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
1085 }
1086
1087 int ttsd_server_stop(unsigned int uid)
1088 {
1089         app_tts_state_e state = ttsd_data_get_client_state(uid);
1090         if (APP_STATE_NONE == state) {
1091                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
1092                 return TTSD_ERROR_INVALID_PARAMETER;
1093         }
1094
1095         SLOG(LOG_INFO, tts_tag(), "[Server] server stop, uid(%d), state(%d)", uid, state);
1096
1097         if (APP_STATE_PLAYING == state || APP_STATE_PAUSED == state) {
1098                 if (TTS_APP_PLAY_TYPE_SYNTH == ttsd_data_get_play_type(uid)) {
1099                         __stop_engine_synthesis(uid);
1100                 }
1101
1102                 /* stop player */
1103                 ttsd_data_set_client_state(uid, APP_STATE_READY);
1104                 if (TTSD_ERROR_NONE != ttsd_player_stop(uid)) {
1105                         SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsd_player_stop()");
1106                 }
1107         }
1108
1109         /* Reset all data */
1110         ttsd_data_clear_data(uid);
1111
1112         return TTSD_ERROR_NONE;
1113 }
1114
1115 int ttsd_server_pause(unsigned int uid)
1116 {
1117         app_tts_state_e state = ttsd_data_get_client_state(uid);
1118         if (APP_STATE_NONE == state) {
1119                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_pause : uid is not valid");
1120                 return TTSD_ERROR_INVALID_PARAMETER;
1121         }
1122
1123         if (APP_STATE_PLAYING != state) {
1124                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state is not 'play'");
1125                 return TTSD_ERROR_INVALID_STATE;
1126         }
1127
1128         int ret = ttsd_data_set_client_state(uid, APP_STATE_PAUSED);
1129         if (TTSD_ERROR_NONE != ret) {
1130                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail set pause state() : ret(%d)", ret);
1131                 return TTSD_ERROR_OPERATION_FAILED;
1132         }
1133
1134         ret = ttsd_player_pause(uid);
1135         if (TTSD_ERROR_NONE != ret) {
1136                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail player_pause() : ret(%d)", ret);
1137                 return TTSD_ERROR_OPERATION_FAILED;
1138         }
1139
1140         return TTSD_ERROR_NONE;
1141 }
1142
1143 int ttsd_server_get_support_voices(unsigned int uid, GList** voice_list)
1144 {
1145         if (0 > ttsd_data_is_client(uid)) {
1146                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
1147                 return TTSD_ERROR_INVALID_PARAMETER;
1148         }
1149
1150         /* get voice list*/
1151         int ret = ttsd_engine_get_voice_list(voice_list);
1152         if (0 != ret) {
1153                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail ttsd_server_get_support_voices() : ret(%d)", ret);
1154                 return ret;
1155         }
1156
1157         SLOG(LOG_DEBUG, tts_tag(), "[Server SUCCESS] Get supported voices");
1158
1159         return TTSD_ERROR_NONE;
1160 }
1161
1162 int ttsd_server_get_current_voice(unsigned int uid, char** language, int* voice_type)
1163 {
1164         if (0 > ttsd_data_is_client(uid)) {
1165                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_get_current_voice : uid is not valid");
1166                 return TTSD_ERROR_INVALID_PARAMETER;
1167         }
1168
1169         /* get current voice */
1170         int ret = ttsd_engine_get_default_voice(language, voice_type);
1171         if (0 != ret) {
1172                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail ttsd_server_get_support_voices() : ret(%d)", ret);
1173                 return ret;
1174         }
1175
1176         SLOG(LOG_DEBUG, tts_tag(), "[Server] Get default language (%s), voice type(%d) ", *language, *voice_type);
1177
1178         return TTSD_ERROR_NONE;
1179 }
1180
1181 int ttsd_server_set_private_data(unsigned int uid, const char* key, const char* data)
1182 {
1183         app_tts_state_e state = ttsd_data_get_client_state(uid);
1184         if (APP_STATE_NONE == state) {
1185                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1186                 return TTSD_ERROR_INVALID_PARAMETER;
1187         }
1188
1189         if (APP_STATE_READY != state) {
1190                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Current state of (%u) is NOT 'READY'", uid);
1191                 return TTSD_ERROR_INVALID_STATE;
1192         }
1193
1194         int ret = ttsd_engine_set_private_data(key, data);
1195         if (0 != ret) {
1196                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data : ret(%d)", ret);
1197         } else {
1198                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data, key(%s), data(%s)", key, data);
1199         }
1200
1201         return ret;
1202 }
1203
1204 int ttsd_server_get_private_data(unsigned int uid, const char* key, char** data)
1205 {
1206         app_tts_state_e state = ttsd_data_get_client_state(uid);
1207         if (APP_STATE_NONE == state) {
1208                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1209                 return TTSD_ERROR_INVALID_PARAMETER;
1210         }
1211
1212         if (APP_STATE_READY != state) {
1213                 SLOG(LOG_WARN, tts_tag(), "[Server ERROR] Current state of (%u) is NOT 'READY'", uid);
1214                 return TTSD_ERROR_INVALID_STATE;
1215         }
1216
1217         char* temp_data = NULL;
1218         int ret = ttsd_engine_get_private_data(key, &temp_data);
1219         if (0 != ret) {
1220                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get private data : ret(%d)", ret);
1221         } else {
1222                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Get private data, key(%s), data(%s)", key, *data);
1223         }
1224
1225         if (NULL == temp_data) {
1226                 temp_data = strdup("NULL");
1227         }
1228         *data = temp_data;
1229
1230         return ret;
1231 }
1232
1233 int ttsd_set_private_data_set_cb(ttse_private_data_set_cb callback)
1234 {
1235         SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data set cb");
1236
1237         int ret = 0;
1238         ret = ttsd_engine_agent_set_private_data_set_cb(callback);
1239         if (0 != ret) {
1240                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data set cb : ret(%d)", ret);
1241         }
1242
1243         return ret;
1244 }
1245
1246 int ttsd_set_private_data_requested_cb(ttse_private_data_requested_cb callback)
1247 {
1248         SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data requested cb");
1249
1250         int ret = 0;
1251         ret = ttsd_engine_agent_set_private_data_requested_cb(callback);
1252         if (0 != ret) {
1253                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data requested cb : ret(%d)", ret);
1254         }
1255
1256         return ret;
1257 }
1258
1259 int ttsd_get_activated_mode(int* activated_mode)
1260 {
1261         if (NULL == activated_mode) {
1262                 return TTSD_ERROR_INVALID_PARAMETER;
1263         }
1264
1265         *activated_mode = ttsd_data_get_activated_mode();
1266         return TTSD_ERROR_NONE;
1267 }
1268
1269 int ttsd_set_activated_mode_changed_cb(ttse_activated_mode_changed_cb callback)
1270 {
1271         int ret = ttsd_engine_agent_set_activated_mode_changed_cb(callback);
1272         if (TTSD_ERROR_NONE != ret) {
1273                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data requested cb : ret(%d)", ret);
1274         }
1275
1276         return ret;
1277 }
1278
1279 int ttsd_server_play_pcm(unsigned int uid)
1280 {
1281         app_tts_state_e state = ttsd_data_get_client_state(uid);
1282         if (APP_STATE_NONE == state) {
1283                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1284                 return TTSD_ERROR_INVALID_PARAMETER;
1285         }
1286
1287         if (APP_STATE_PLAYING == state) {
1288                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state of (%u) is 'PLAYING'", uid);
1289                 return TTSD_ERROR_NONE;
1290         }
1291
1292         int ret = __interrupt_player_by_policy(uid);
1293         if (TTSD_ERROR_NONE != ret) {
1294                 SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Cannot play default, screen reader, and noti modes.");
1295                 return ret;
1296         }
1297
1298         /* Change current play */
1299         if (0 != ttsd_data_set_client_state(uid, APP_STATE_PLAYING)) {
1300                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set state : uid(%u)", uid);
1301                 return TTSD_ERROR_OPERATION_FAILED;
1302         }
1303
1304         SLOG(LOG_DEBUG, tts_tag(), "[Server] Play player. uid(%u)", uid);
1305         ret = ttsd_player_play(uid);
1306         if (TTSD_ERROR_NONE != ret) {
1307                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play sound : uid(%u)", uid);
1308                 ttsd_data_set_client_state(uid, state);
1309                 return TTSD_ERROR_OPERATION_FAILED;
1310         }
1311
1312         ttsd_data_set_play_type(uid, TTS_APP_PLAY_TYPE_PCM);
1313
1314         return TTSD_ERROR_NONE;
1315 }
1316
1317 int ttsd_server_add_pcm(unsigned int uid, int event, void* data, int data_size, int audio_type, int rate)
1318 {
1319         SLOG(LOG_DEBUG, tts_tag(), "@@@ ADD PCM");
1320
1321         int uttid = -1;
1322
1323         /* Synthesis is success */
1324         if (TTSE_RESULT_EVENT_START == event || TTSE_RESULT_EVENT_CONTINUE == event || TTSE_RESULT_EVENT_FINISH == event) {
1325                 if (TTSE_RESULT_EVENT_START == event) {
1326                         SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_START");
1327                         SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] PCM Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
1328                                 uid, uttid, data, data_size, audio_type, rate);
1329                 } else if (TTSE_RESULT_EVENT_FINISH == event) {
1330                         SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_FINISH");
1331                         SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] PCM Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
1332                                 uid, uttid, data, data_size, audio_type, rate);
1333                 } else {
1334                         /*if (TTSE_RESULT_EVENT_CONTINUE == event)  SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_CONTINUE");*/
1335                 }
1336
1337                 if (rate <= 0 || audio_type < 0 || audio_type > TTSE_AUDIO_TYPE_MAX) {
1338                         SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] audio data is invalid");
1339                         SLOG(LOG_DEBUG, tts_tag(), "@@@");
1340                         return TTSD_ERROR_INVALID_PARAMETER;
1341                 }
1342
1343                 sound_data_s* sound_data = ttsd_data_create_sound_data(uttid, data, data_size, event, audio_type, rate, 0);
1344                 if (NULL == sound_data) {
1345                         SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Out of memory");
1346                         return TTSD_ERROR_OUT_OF_MEMORY;
1347                 }
1348
1349                 if (0 != ttsd_data_add_sound_data(uid, sound_data)) {
1350                         SECURE_SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Fail to add sound data : uid(%u)", uid);
1351                         ttsd_data_destroy_sound_data(sound_data);
1352                 }
1353         } else {
1354                 SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_ERROR");
1355         }
1356
1357         SLOG(LOG_DEBUG, tts_tag(), "@@@");
1358
1359         return TTSD_ERROR_NONE;
1360 }
1361
1362 int ttsd_server_get_service_state(unsigned int uid, int* service_state)
1363 {
1364         if (0 > ttsd_data_is_client(uid)) {
1365                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_get_service_state : uid is not valid");
1366                 return TTSD_ERROR_INVALID_PARAMETER;
1367         }
1368
1369         *service_state = (int)ttsd_state_get_state();
1370         SLOG(LOG_DEBUG, tts_tag(), "[Server] Get current service state. service state(%d) ", *service_state);
1371
1372         return TTSD_ERROR_NONE;
1373 }