Check whether pointer is NULL or not, before use
[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         if (NULL != args) {
590                 args->before = before;
591                 args->current = current;
592         }
593
594         SLOG(LOG_INFO, tts_tag(), "[Server] Notify state chanaged from (%d) to (%d).", before, current);
595         g_notify_state_timer = ecore_timer_add(0.0, __state_changed_timer_cb, args);
596 }
597
598 /*
599 * Server APIs
600 */
601 int ttsd_initialize(ttse_request_callback_s *callback)
602 {
603         SLOG(LOG_INFO, tts_tag(), "[Server] Initialize");
604         g_is_terminated = false;
605
606         if (ttsd_config_initialize(__config_changed_cb)) {
607                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize config.");
608         }
609
610         if (TTSD_ERROR_NONE != ttsd_state_initialize(__state_changed_cb)) {
611                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize state.");
612         }
613
614         /* player init */
615         if (ttsd_player_init()) {
616                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to initialize player init.");
617                 return TTSD_ERROR_OPERATION_FAILED;
618         }
619
620         double ratio;
621         if (0 == ttsd_config_get_bg_volume_ratio(&ratio))
622         {
623                 SLOG(LOG_ERROR, tts_tag(), "[Server] get bg volume ratio is %lf", ratio);
624                 int ret = ttsd_player_set_background_volume_ratio(ratio);
625                 if (0 != ret)
626                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set bg volume ratio : result(%d)", ret);
627         } else {
628                 SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to get bg volume ratio");
629         }
630
631         /* Engine Agent initialize */
632         if (TTSD_ERROR_NONE != ttsd_engine_agent_init(callback)) {
633                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to engine agent initialize.");
634                 return TTSD_ERROR_OPERATION_FAILED;
635         }
636
637         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
638         ttsd_config_set_screen_reader_callback(__screen_reader_changed_cb);
639
640         g_check_client_timer = ecore_timer_add(CLIENT_CLEAN_UP_TIME, __cleanup_client, NULL);
641         if (NULL == g_check_client_timer) {
642                 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to create timer");
643         }
644
645         g_activated_mode = 0;
646
647         return TTSD_ERROR_NONE;
648 }
649
650 int ttsd_finalize()
651 {
652         SLOG(LOG_INFO, tts_tag(), "[Server] Finalize");
653
654         GList *iter = NULL;
655         if (0 < g_list_length(g_proc_list)) {
656                 iter = g_list_first(g_proc_list);
657                 while (NULL != iter) {
658                         g_proc_list = g_list_remove_link(g_proc_list, iter);
659                         g_list_free(iter);
660                         iter = g_list_first(g_proc_list);
661                 }
662         }
663
664         if (g_wait_timer) {
665                 ecore_timer_del(g_wait_timer);
666                 g_wait_timer = NULL;
667                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore waiting timer handle");
668         }
669
670         if (g_check_client_timer) {
671                 ecore_timer_del(g_check_client_timer);
672                 g_check_client_timer = NULL;
673                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore checking client timer handle");
674         }
675
676         if (g_quit_loop_timer) {
677                 ecore_timer_del(g_quit_loop_timer);
678                 g_quit_loop_timer = NULL;
679                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
680         }
681
682         ttsd_config_finalize();
683         ttsd_state_finalize();
684
685         int ret = TTSD_ERROR_NONE;
686         ret = ttsd_player_release();
687         if (TTSD_ERROR_NONE != ret) {
688                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_player_release(). ret(%d)", ret);
689                 return TTSD_ERROR_OPERATION_FAILED;
690         }
691
692         ret = ttsd_engine_agent_release();
693         if (TTSD_ERROR_NONE != ret) {
694                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to ttsd_engine_agent_release(). ret(%d)", ret);
695                 return TTSD_ERROR_OPERATION_FAILED;
696         }
697
698         return TTSD_ERROR_NONE;
699 }
700
701 int ttsd_terminate()
702 {
703         SLOG(LOG_INFO, tts_tag(), "[Server] Terminate");
704         int ret = ttsd_data_foreach_clients(__terminate_client, NULL);
705         if (TTSD_ERROR_NONE != ret) {
706                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to terminate all clients. ret(%d)", ret);
707                 return TTSD_ERROR_OPERATION_FAILED;
708         }
709
710         if (g_quit_loop_timer) {
711                 ecore_timer_del(g_quit_loop_timer);
712                 g_quit_loop_timer = NULL;
713                 SLOG(LOG_INFO, tts_tag(), "[INFO] Delete ecore quit loop timer handle");
714         }
715
716         return __terminate_server();
717 }
718
719 /*
720 * TTS Server Functions for Client
721 */
722
723 int ttsd_server_is_already_initialized(int pid, unsigned int uid, bool* is_initialized)
724 {
725         if (-1 != ttsd_data_is_client(uid))
726                 *is_initialized = true;
727         else
728                 *is_initialized = false;
729
730         SLOG(LOG_INFO, tts_tag(), "[Server INFO] Pid(%d), uid(%u) is %s", pid, uid, *is_initialized ? "already initialized" : "not initialized yet");
731         return TTSD_ERROR_NONE;
732 }
733
734 static void __set_and_notify_activated_mode()
735 {
736         int activated_mode = ttsd_data_get_activated_mode();
737         if (g_activated_mode == activated_mode) {
738                 return;
739         }
740
741         SLOG(LOG_INFO, tts_tag(), "[Server] Activated mode is changed from(%d) to (%d)", g_activated_mode, activated_mode);
742
743         g_activated_mode = activated_mode;
744         int ret = ttsd_engine_notify_activated_mode_changed(g_activated_mode);
745         if (TTSD_ERROR_NONE != ret) {
746                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to notify activated mode changed event.(%d)", ret);
747         }
748 }
749
750 static int __check_app_agreed(int pid, unsigned int uid, bool credential_needed)
751 {
752         if (false == credential_needed) {
753                 return TTSD_ERROR_NONE;
754         }
755
756         char* appid = NULL;
757         if (APP_MANAGER_ERROR_NONE != app_manager_get_app_id(pid, &appid)) {
758                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get app id, pid(%d)", pid);
759         }
760
761         bool is_agreed = false;
762         int ret = ttsd_engine_check_app_agreed(appid, &is_agreed);
763         free(appid);
764         appid = NULL;
765
766         if (TTSD_ERROR_NONE != ret) {
767                 SLOG(LOG_ERROR, tts_tag(), "Server ERROR] Fail to check app agreed");
768                 return TTSD_ERROR_OPERATION_FAILED;
769         }
770
771         if (false == is_agreed) {
772                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] App is not agreed");
773                 return TTSD_ERROR_PERMISSION_DENIED;
774         }
775
776         return TTSD_ERROR_NONE;
777 }
778
779 int ttsd_server_initialize(int pid, unsigned int uid, ttsd_mode_e mode, tts_ipc_method_e method, bool* credential_needed)
780 {
781         SLOG(LOG_INFO, tts_tag(), "[Server] Server initialize");
782
783         if (-1 != ttsd_data_is_client(uid)) {
784                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Uid has already been registered");
785                 return TTSD_ERROR_NONE;
786         }
787
788         if (TTSD_ERROR_NONE != ttsd_data_new_client(pid, uid, mode, method)) {
789                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add client info");
790                 return TTSD_ERROR_OPERATION_FAILED;
791         }
792
793         __set_and_notify_activated_mode();
794
795         if (TTSD_ERROR_NONE != ttsd_engine_agent_load_current_engine()) {
796                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to load current engine");
797                 ttsd_data_delete_client(uid);
798                 return TTSD_ERROR_OPERATION_FAILED;
799         }
800
801         bool is_needed = false;
802         if (TTSD_ERROR_NONE != ttsd_engine_agent_is_credential_needed(uid, &is_needed)) {
803                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get credential necessity");
804                 ttsd_data_delete_client(uid);
805                 return TTSD_ERROR_OPERATION_FAILED;
806         }
807
808         int ret = __check_app_agreed(pid, uid, is_needed);
809         if (TTSD_ERROR_NONE != ret) {
810                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Checking credential is finished(%d)", ret);
811                 ttsd_data_delete_client(uid);
812                 return ret;
813         }
814
815         *credential_needed = is_needed;
816
817         return TTSD_ERROR_NONE;
818 }
819
820 void __used_voice_cb(const char* lang, int type)
821 {
822         SLOG(LOG_DEBUG, tts_tag(), "[Server] Request to unload voice (%s,%d)", lang, type);
823         if (0 != ttsd_engine_unload_voice(lang, type)) {
824                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to unload voice");
825         }
826 }
827
828 int ttsd_server_finalize(unsigned int uid)
829 {
830         SLOG(LOG_INFO, tts_tag(), "[Server] Server finalize");
831         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);
832
833         if (0 > ttsd_data_is_client(uid)) {
834                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_finalize : uid is not valid");
835         }
836
837         int ret = ttsd_server_stop(uid);
838         if (TTSD_ERROR_NONE != ret) {
839                 SLOG(LOG_ERROR, tts_tag(), "[ERROR] TTS server top(%u) fail (%d/%s) <<<<<", uid, ret, get_error_message(ret));
840         }
841
842         /* Need to unload voice when used voice is unregistered */
843         if (0 != ttsd_data_reset_used_voice(uid, __used_voice_cb)) {
844                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set used voice");
845                 return TTSD_ERROR_OPERATION_FAILED;
846         }
847
848         ttsd_data_delete_client(uid);
849         __set_and_notify_activated_mode();
850
851         /* unload engine, if ref count of client is 0 */
852         if (0 == ttsd_data_get_client_count()) {
853                 if (NULL == g_quit_loop_timer) {
854                         SLOG(LOG_DEBUG, tts_tag(), "[Server] Quit main loop");
855                         g_quit_loop_timer = ecore_timer_add(0, __quit_ecore_loop, NULL);
856                 } else {
857                         SLOG(LOG_WARN, tts_tag(), "[Server] Already called __quit_ecore_loop");
858                 }
859         }
860
861         return TTSD_ERROR_NONE;
862 }
863
864 static bool __is_connected_to_network()
865 {
866         /* Check network */
867         int network_status = 0;
868         int ret = vconf_get_int(VCONFKEY_NETWORK_STATUS, &network_status);
869         if (0 != ret) {
870                 SLOG(LOG_WARN, tts_tag(), "[Network] Fail to get network status, ret(%d)", ret);
871                 return false;
872         }
873
874         if (network_status == VCONFKEY_NETWORK_OFF) {
875                 SLOG(LOG_WARN, tts_tag(), "[Network] Current network connection is OFF.");
876                 return false;
877         }
878
879         SLOG(LOG_DEBUG, tts_tag(), "[Network] Network status is %d", network_status);
880
881         return true;
882 }
883
884 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)
885 {
886         app_tts_state_e state = ttsd_data_get_client_state(uid);
887         if (APP_STATE_NONE == state) {
888                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_add_text : uid is not valid");
889                 return TTSD_ERROR_INVALID_PARAMETER;
890         }
891
892         /* check valid voice */
893         char* temp_lang = NULL;
894         int temp_type;
895         if (true != ttsd_engine_select_valid_voice((const char*)lang, voice_type, &temp_lang, &temp_type)) {
896                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to select valid voice");
897                 if (NULL != temp_lang) {
898                         free(temp_lang);
899                         temp_lang = NULL;
900                 }
901                 return TTSD_ERROR_INVALID_VOICE;
902         }
903
904         if (NULL == temp_lang) {
905                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to select valid voice : result lang is NULL");
906                 return TTSD_ERROR_INVALID_VOICE;
907         }
908
909         speak_data_s* speak_data = ttsd_data_create_speak_data(text, lang, voice_type, speed, utt_id);
910         if (NULL == speak_data) {
911                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to allocate memory");
912                 if (NULL != temp_lang) {
913                         free(temp_lang);
914                         temp_lang = NULL;
915                 }
916
917                 return TTSD_ERROR_OPERATION_FAILED;
918         }
919
920         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);
921
922         /* if state is APP_STATE_READY , APP_STATE_PAUSED , only need to add speak data to queue*/
923         int ret = -1;
924         ret = ttsd_data_add_speak_data(uid, speak_data);
925         if (0 != ret) {
926                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to add speak data");
927                 if (NULL != temp_lang) {
928                         free(temp_lang);
929                         temp_lang = NULL;
930                 }
931
932                 ttsd_data_destroy_speak_data(speak_data);
933                 speak_data = NULL;
934
935                 return ret;
936         }
937
938         if (0 != ttsd_data_set_used_voice(uid, temp_lang, temp_type)) {
939                 /* Request load voice */
940                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Request to load voice");
941                 if (0 != ttsd_engine_load_voice(temp_lang, temp_type)) {
942                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to load voice");
943                 }
944         }
945
946         if (NULL != temp_lang) {
947                 free(temp_lang);
948                 temp_lang = NULL;
949         }
950
951         if (APP_STATE_PLAYING == state) {
952                 /* check if engine use network */
953                 if (ttsd_engine_agent_need_network()) {
954                         if (false == __is_connected_to_network()) {
955                                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Disconnect network. Current engine needs network.");
956                                 return TTSD_ERROR_OPERATION_FAILED;
957                         }
958                 }
959
960                 ttsd_data_set_credential(uid, credential);
961
962                 /* Check whether tts-engine is running or not */
963                 ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
964                 SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
965                 if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control) {
966                         SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Engine has already been running.");
967                 } else {
968                         __synthesis(uid);
969                 }
970         }
971
972         return TTSD_ERROR_NONE;
973 }
974
975 static int __interrupt_player_by_policy(unsigned int request_app_uid)
976 {
977         unsigned int playing_app_uid = ttsd_data_get_current_playing();
978         if (0 > ttsd_data_is_client(playing_app_uid)) {
979                 SLOG(LOG_INFO, tts_tag(), "[Server] There is no app which is in 'Play' state");
980                 return TTSD_ERROR_NONE;
981         }
982
983         if (request_app_uid == playing_app_uid) {
984                 SLOG(LOG_WARN, tts_tag(), "[Server] This is played uid. Skip policy behavior");
985                 return TTSD_ERROR_NONE;
986         }
987
988         ttsd_mode_e request_app_mode = ttsd_data_get_mode(request_app_uid);
989         ttsd_mode_e playing_app_mode = ttsd_data_get_mode(playing_app_uid);
990         switch (playing_app_mode) {
991         case TTSD_MODE_DEFAULT:
992         case TTSD_MODE_NOTIFICATION:
993         case TTSD_MODE_SCREEN_READER:
994                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Played client(%u) will be interrupted into 'Stop' state", playing_app_uid);
995                 __stop_and_send_ready_state(playing_app_uid);
996                 break;
997
998         case TTSD_MODE_INTERRUPT:
999                 if (TTSD_MODE_INTERRUPT != request_app_mode) {
1000                         SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Default, Screen reader, and Noti are prohibitted.");
1001                         return TTSD_ERROR_AUDIO_POLICY_BLOCKED;
1002                 }
1003
1004                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Played client(%u) will be interrupted into 'Stop' state", playing_app_uid);
1005                 __stop_and_send_ready_state(playing_app_uid);
1006                 break;
1007         }
1008
1009         return TTSD_ERROR_NONE;
1010 }
1011
1012 int ttsd_server_play(unsigned int uid, const char* credential)
1013 {
1014         app_tts_state_e state = ttsd_data_get_client_state(uid);
1015         if (APP_STATE_NONE == state) {
1016                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1017                 return TTSD_ERROR_INVALID_PARAMETER;
1018         }
1019
1020         if (APP_STATE_PLAYING == state) {
1021                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state of (%u) is 'PLAYING'", uid);
1022                 return TTSD_ERROR_NONE;
1023         }
1024
1025         /* check if engine use network */
1026         if (ttsd_engine_agent_need_network()) {
1027                 if (false == __is_connected_to_network()) {
1028                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Disconnect network. Current engine needs network service!!!.");
1029                         return TTSD_ERROR_OUT_OF_NETWORK;
1030                 }
1031         }
1032
1033         int ret = __interrupt_player_by_policy(uid);
1034         if (TTSD_ERROR_NONE != ret) {
1035                 SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Cannot play default, screen reader, and noti modes.");
1036                 return ret;
1037         }
1038
1039         /* Change current play */
1040         if (0 != ttsd_player_wait_to_play(uid)) {
1041                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Fail to set to wait for playing : uid(%u)", uid);
1042         }
1043
1044         if (0 != ttsd_data_set_client_state(uid, APP_STATE_PLAYING)) {
1045                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set state : uid(%u)", uid);
1046                 return TTSD_ERROR_OPERATION_FAILED;
1047         }
1048
1049         SLOG(LOG_DEBUG, tts_tag(), "[Server] Play player. uid(%u)", uid);
1050         ret = ttsd_player_play(uid);
1051         if (TTSD_ERROR_NONE != ret) {
1052                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play sound : uid(%u)", uid);
1053                 ttsd_data_set_client_state(uid, state);
1054                 return TTSD_ERROR_OPERATION_FAILED;
1055         }
1056
1057         ttsd_data_set_credential(uid, credential);
1058
1059         /* Check whether tts-engine is running or not */
1060         clock_gettime(CLOCK_MONOTONIC_RAW, &g_request_playing);
1061         ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
1062         SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
1063         if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control) {
1064                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Engine has already been running.");
1065         } else {
1066                 __synthesis(uid);
1067         }
1068         ttsd_data_set_play_type(uid, TTS_APP_PLAY_TYPE_SYNTH);
1069
1070         return TTSD_ERROR_NONE;
1071 }
1072
1073 static void __stop_engine_synthesis(unsigned int uid)
1074 {
1075         ttsd_synthesis_control_e synth_control = ttsd_data_get_synth_control();
1076         SLOG(LOG_INFO, tts_tag(), "[Server INFO] synth_control(%d)", synth_control);
1077
1078         if (TTSD_SYNTHESIS_CONTROL_DOING == synth_control && uid == ttsd_data_get_current_playing()) {
1079                 SLOG(LOG_DEBUG, tts_tag(), "[Server] TTS-engine is running");
1080
1081                 int ret = ttsd_engine_cancel_synthesis();
1082                 if (TTSD_ERROR_NONE != ret)
1083                         SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to cancel synthesis : ret(%d)", ret);
1084         }
1085
1086         ttsd_data_set_synth_control(TTSD_SYNTHESIS_CONTROL_EXPIRED);
1087 }
1088
1089 int ttsd_server_stop(unsigned int uid)
1090 {
1091         app_tts_state_e state = ttsd_data_get_client_state(uid);
1092         if (APP_STATE_NONE == state) {
1093                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
1094                 return TTSD_ERROR_INVALID_PARAMETER;
1095         }
1096
1097         SLOG(LOG_INFO, tts_tag(), "[Server] server stop, uid(%d), state(%d)", uid, state);
1098
1099         if (APP_STATE_PLAYING == state || APP_STATE_PAUSED == state) {
1100                 if (TTS_APP_PLAY_TYPE_SYNTH == ttsd_data_get_play_type(uid)) {
1101                         __stop_engine_synthesis(uid);
1102                 }
1103
1104                 /* stop player */
1105                 ttsd_data_set_client_state(uid, APP_STATE_READY);
1106                 if (TTSD_ERROR_NONE != ttsd_player_stop(uid)) {
1107                         SLOG(LOG_WARN, tts_tag(), "[Server] Fail to ttsd_player_stop()");
1108                 }
1109         }
1110
1111         /* Reset all data */
1112         ttsd_data_clear_data(uid);
1113
1114         return TTSD_ERROR_NONE;
1115 }
1116
1117 int ttsd_server_pause(unsigned int uid)
1118 {
1119         app_tts_state_e state = ttsd_data_get_client_state(uid);
1120         if (APP_STATE_NONE == state) {
1121                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_pause : uid is not valid");
1122                 return TTSD_ERROR_INVALID_PARAMETER;
1123         }
1124
1125         if (APP_STATE_PLAYING != state) {
1126                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state is not 'play'");
1127                 return TTSD_ERROR_INVALID_STATE;
1128         }
1129
1130         int ret = ttsd_data_set_client_state(uid, APP_STATE_PAUSED);
1131         if (TTSD_ERROR_NONE != ret) {
1132                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail set pause state() : ret(%d)", ret);
1133                 return TTSD_ERROR_OPERATION_FAILED;
1134         }
1135
1136         ret = ttsd_player_pause(uid);
1137         if (TTSD_ERROR_NONE != ret) {
1138                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail player_pause() : ret(%d)", ret);
1139                 return TTSD_ERROR_OPERATION_FAILED;
1140         }
1141
1142         return TTSD_ERROR_NONE;
1143 }
1144
1145 int ttsd_server_get_support_voices(unsigned int uid, GList** voice_list)
1146 {
1147         if (0 > ttsd_data_is_client(uid)) {
1148                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid is not valid");
1149                 return TTSD_ERROR_INVALID_PARAMETER;
1150         }
1151
1152         /* get voice list*/
1153         int ret = ttsd_engine_get_voice_list(voice_list);
1154         if (0 != ret) {
1155                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail ttsd_server_get_support_voices() : ret(%d)", ret);
1156                 return ret;
1157         }
1158
1159         SLOG(LOG_DEBUG, tts_tag(), "[Server SUCCESS] Get supported voices");
1160
1161         return TTSD_ERROR_NONE;
1162 }
1163
1164 int ttsd_server_get_current_voice(unsigned int uid, char** language, int* voice_type)
1165 {
1166         if (0 > ttsd_data_is_client(uid)) {
1167                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_get_current_voice : uid is not valid");
1168                 return TTSD_ERROR_INVALID_PARAMETER;
1169         }
1170
1171         /* get current voice */
1172         int ret = ttsd_engine_get_default_voice(language, voice_type);
1173         if (0 != ret) {
1174                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail ttsd_server_get_support_voices() : ret(%d)", ret);
1175                 return ret;
1176         }
1177
1178         SLOG(LOG_DEBUG, tts_tag(), "[Server] Get default language (%s), voice type(%d) ", *language, *voice_type);
1179
1180         return TTSD_ERROR_NONE;
1181 }
1182
1183 int ttsd_server_set_private_data(unsigned int uid, const char* key, const char* data)
1184 {
1185         app_tts_state_e state = ttsd_data_get_client_state(uid);
1186         if (APP_STATE_NONE == state) {
1187                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1188                 return TTSD_ERROR_INVALID_PARAMETER;
1189         }
1190
1191         if (APP_STATE_READY != state) {
1192                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Current state of (%u) is NOT 'READY'", uid);
1193                 return TTSD_ERROR_INVALID_STATE;
1194         }
1195
1196         int ret = ttsd_engine_set_private_data(key, data);
1197         if (0 != ret) {
1198                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data : ret(%d)", ret);
1199         } else {
1200                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data, key(%s), data(%s)", key, data);
1201         }
1202
1203         return ret;
1204 }
1205
1206 int ttsd_server_get_private_data(unsigned int uid, const char* key, char** data)
1207 {
1208         app_tts_state_e state = ttsd_data_get_client_state(uid);
1209         if (APP_STATE_NONE == state) {
1210                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1211                 return TTSD_ERROR_INVALID_PARAMETER;
1212         }
1213
1214         if (APP_STATE_READY != state) {
1215                 SLOG(LOG_WARN, tts_tag(), "[Server ERROR] Current state of (%u) is NOT 'READY'", uid);
1216                 return TTSD_ERROR_INVALID_STATE;
1217         }
1218
1219         char* temp_data = NULL;
1220         int ret = ttsd_engine_get_private_data(key, &temp_data);
1221         if (0 != ret) {
1222                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to get private data : ret(%d)", ret);
1223         } else {
1224                 SLOG(LOG_DEBUG, tts_tag(), "[Server] Get private data, key(%s), data(%s)", key, *data);
1225         }
1226
1227         if (NULL == temp_data) {
1228                 temp_data = strdup("NULL");
1229         }
1230         *data = temp_data;
1231
1232         return ret;
1233 }
1234
1235 int ttsd_set_private_data_set_cb(ttse_private_data_set_cb callback)
1236 {
1237         SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data set cb");
1238
1239         int ret = 0;
1240         ret = ttsd_engine_agent_set_private_data_set_cb(callback);
1241         if (0 != ret) {
1242                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data set cb : ret(%d)", ret);
1243         }
1244
1245         return ret;
1246 }
1247
1248 int ttsd_set_private_data_requested_cb(ttse_private_data_requested_cb callback)
1249 {
1250         SLOG(LOG_DEBUG, tts_tag(), "[Server] Set private data requested cb");
1251
1252         int ret = 0;
1253         ret = ttsd_engine_agent_set_private_data_requested_cb(callback);
1254         if (0 != ret) {
1255                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data requested cb : ret(%d)", ret);
1256         }
1257
1258         return ret;
1259 }
1260
1261 int ttsd_get_activated_mode(int* activated_mode)
1262 {
1263         if (NULL == activated_mode) {
1264                 return TTSD_ERROR_INVALID_PARAMETER;
1265         }
1266
1267         *activated_mode = ttsd_data_get_activated_mode();
1268         return TTSD_ERROR_NONE;
1269 }
1270
1271 int ttsd_set_activated_mode_changed_cb(ttse_activated_mode_changed_cb callback)
1272 {
1273         int ret = ttsd_engine_agent_set_activated_mode_changed_cb(callback);
1274         if (TTSD_ERROR_NONE != ret) {
1275                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set private data requested cb : ret(%d)", ret);
1276         }
1277
1278         return ret;
1279 }
1280
1281 int ttsd_server_play_pcm(unsigned int uid)
1282 {
1283         app_tts_state_e state = ttsd_data_get_client_state(uid);
1284         if (APP_STATE_NONE == state) {
1285                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] uid(%u) is NOT valid", uid);
1286                 return TTSD_ERROR_INVALID_PARAMETER;
1287         }
1288
1289         if (APP_STATE_PLAYING == state) {
1290                 SLOG(LOG_WARN, tts_tag(), "[Server WARNING] Current state of (%u) is 'PLAYING'", uid);
1291                 return TTSD_ERROR_NONE;
1292         }
1293
1294         int ret = __interrupt_player_by_policy(uid);
1295         if (TTSD_ERROR_NONE != ret) {
1296                 SLOG(LOG_WARN, tts_tag(), "[Server] Current play mode is Interrupt. Cannot play default, screen reader, and noti modes.");
1297                 return ret;
1298         }
1299
1300         /* Change current play */
1301         if (0 != ttsd_data_set_client_state(uid, APP_STATE_PLAYING)) {
1302                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to set state : uid(%u)", uid);
1303                 return TTSD_ERROR_OPERATION_FAILED;
1304         }
1305
1306         SLOG(LOG_DEBUG, tts_tag(), "[Server] Play player. uid(%u)", uid);
1307         ret = ttsd_player_play(uid);
1308         if (TTSD_ERROR_NONE != ret) {
1309                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] Fail to play sound : uid(%u)", uid);
1310                 ttsd_data_set_client_state(uid, state);
1311                 return TTSD_ERROR_OPERATION_FAILED;
1312         }
1313
1314         ttsd_data_set_play_type(uid, TTS_APP_PLAY_TYPE_PCM);
1315
1316         return TTSD_ERROR_NONE;
1317 }
1318
1319 int ttsd_server_add_pcm(unsigned int uid, int event, void* data, int data_size, int audio_type, int rate)
1320 {
1321         SLOG(LOG_DEBUG, tts_tag(), "@@@ ADD PCM");
1322
1323         int uttid = -1;
1324
1325         /* Synthesis is success */
1326         if (TTSE_RESULT_EVENT_START == event || TTSE_RESULT_EVENT_CONTINUE == event || TTSE_RESULT_EVENT_FINISH == event) {
1327                 if (TTSE_RESULT_EVENT_START == event) {
1328                         SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_START");
1329                         SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] PCM Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
1330                                 uid, uttid, data, data_size, audio_type, rate);
1331                 } else if (TTSE_RESULT_EVENT_FINISH == event) {
1332                         SLOG(LOG_INFO, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_FINISH");
1333                         SECURE_SLOG(LOG_DEBUG, tts_tag(), "[SERVER] PCM Info : uid(%u), utt(%d), data(%p), data size(%d) audiotype(%d) rate(%d)",
1334                                 uid, uttid, data, data_size, audio_type, rate);
1335                 } else {
1336                         /*if (TTSE_RESULT_EVENT_CONTINUE == event)  SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_CONTINUE");*/
1337                 }
1338
1339                 if (rate <= 0 || audio_type < 0 || audio_type > TTSE_AUDIO_TYPE_MAX) {
1340                         SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] audio data is invalid");
1341                         SLOG(LOG_DEBUG, tts_tag(), "@@@");
1342                         return TTSD_ERROR_INVALID_PARAMETER;
1343                 }
1344
1345                 sound_data_s* sound_data = ttsd_data_create_sound_data(uttid, data, data_size, event, audio_type, rate, 0);
1346                 if (NULL == sound_data) {
1347                         SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Out of memory");
1348                         return TTSD_ERROR_OUT_OF_MEMORY;
1349                 }
1350
1351                 if (0 != ttsd_data_add_sound_data(uid, sound_data)) {
1352                         SECURE_SLOG(LOG_ERROR, tts_tag(), "[SERVER ERROR] Fail to add sound data : uid(%u)", uid);
1353                         ttsd_data_destroy_sound_data(sound_data);
1354                 }
1355         } else {
1356                 SLOG(LOG_DEBUG, tts_tag(), "[SERVER] Event : TTSE_RESULT_EVENT_ERROR");
1357         }
1358
1359         SLOG(LOG_DEBUG, tts_tag(), "@@@");
1360
1361         return TTSD_ERROR_NONE;
1362 }
1363
1364 int ttsd_server_get_service_state(unsigned int uid, int* service_state)
1365 {
1366         if (0 > ttsd_data_is_client(uid)) {
1367                 SLOG(LOG_ERROR, tts_tag(), "[Server ERROR] ttsd_server_get_service_state : uid is not valid");
1368                 return TTSD_ERROR_INVALID_PARAMETER;
1369         }
1370
1371         *service_state = (int)ttsd_state_get_state();
1372         SLOG(LOG_DEBUG, tts_tag(), "[Server] Get current service state. service state(%d) ", *service_state);
1373
1374         return TTSD_ERROR_NONE;
1375 }