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