2 * Copyright (c) 2012, 2013 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.
17 #include <sys/types.h>
22 #include "tts_setting.h"
23 #include "tts_setting_dbus.h"
25 static bool g_is_daemon_started = false;
27 static Ecore_Timer* g_setting_connect_timer = NULL;
29 static int __check_setting_tts_daemon();
31 static tts_setting_state_e g_state = TTS_SETTING_STATE_NONE;
33 static tts_setting_initialized_cb g_initialized_cb;
34 static void* g_user_data;
38 /* API Implementation */
39 static Eina_Bool __tts_setting_initialized(void *data)
41 g_initialized_cb(g_state, g_reason, g_user_data);
46 static Eina_Bool __tts_setting_connect_daemon(void *data)
49 if (0 != tts_setting_dbus_request_hello()) {
50 if (false == g_is_daemon_started) {
51 g_is_daemon_started = true;
52 __check_setting_tts_daemon();
57 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
59 /* do request initialize */
62 ret = tts_setting_dbus_request_initialize();
64 if (TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret) {
65 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
66 } else if (TTS_SETTING_ERROR_NONE != ret) {
67 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection : %d", ret);
69 /* success to connect tts-daemon */
70 g_state = TTS_SETTING_STATE_READY;
75 ecore_timer_add(0, __tts_setting_initialized, NULL);
77 g_setting_connect_timer = NULL;
79 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
80 SLOG(LOG_DEBUG, TAG_TTSC, " ");
85 int tts_setting_initialize()
87 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
89 if (TTS_SETTING_STATE_READY == g_state) {
90 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
91 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
92 SLOG(LOG_DEBUG, TAG_TTSC, " ");
93 return TTS_SETTING_ERROR_NONE;
96 if( 0 != tts_setting_dbus_open_connection() ) {
97 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
98 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
99 SLOG(LOG_DEBUG, TAG_TTSC, " ");
100 return TTS_SETTING_ERROR_OPERATION_FAILED;
104 if (0 != tts_setting_dbus_request_hello()) {
105 __check_setting_tts_daemon();
112 ret = tts_setting_dbus_request_initialize();
114 if( TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret ) {
115 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
120 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Connection Time out");
121 ret = TTS_SETTING_ERROR_TIMED_OUT;
126 /* success to connect tts-daemon */
131 if (TTS_SETTING_ERROR_NONE == ret) {
132 g_state = TTS_SETTING_STATE_READY;
133 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Initialize");
136 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
137 SLOG(LOG_DEBUG, TAG_TTSC, " ");
142 int tts_setting_initialize_async(tts_setting_initialized_cb callback, void* user_data)
144 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
146 if (TTS_SETTING_STATE_READY == g_state) {
147 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
148 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
149 SLOG(LOG_DEBUG, TAG_TTSC, " ");
150 return TTS_SETTING_ERROR_NONE;
153 if( 0 != tts_setting_dbus_open_connection() ) {
154 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
155 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
156 SLOG(LOG_DEBUG, TAG_TTSC, " ");
157 return TTS_SETTING_ERROR_OPERATION_FAILED;
160 g_initialized_cb = callback;
161 g_user_data = user_data;
163 g_setting_connect_timer = ecore_timer_add(0, __tts_setting_connect_daemon, NULL);
165 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
166 SLOG(LOG_DEBUG, TAG_TTSC, " ");
168 return TTS_SETTING_ERROR_NONE;
172 int tts_setting_finalize()
174 SLOG(LOG_DEBUG, TAG_TTSC, "===== Finalize TTS Setting");
178 if (TTS_SETTING_STATE_READY == g_state) {
179 ret = tts_setting_dbus_request_finalilze();
181 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
185 if (NULL != g_setting_connect_timer) {
186 SLOG(LOG_DEBUG, TAG_TTSC, "Setting Connect Timer is remained");
187 ecore_timer_del(g_setting_connect_timer);
190 g_is_daemon_started = false;
192 if (0 != tts_setting_dbus_close_connection()) {
193 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection\n ");
195 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Finalize");
198 g_state = TTS_SETTING_STATE_NONE;
200 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
201 SLOG(LOG_DEBUG, TAG_TTSC, " ");
203 return TTS_SETTING_ERROR_NONE;
206 int tts_setting_foreach_supported_engines(tts_setting_supported_engine_cb callback, void* user_data)
208 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported engines");
210 if (TTS_SETTING_STATE_NONE == g_state) {
211 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
212 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
213 SLOG(LOG_DEBUG, TAG_TTSC, " ");
214 return TTS_SETTING_ERROR_INVALID_STATE;
217 if (NULL == callback) {
218 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Callback is NULL");
219 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
220 SLOG(LOG_DEBUG, TAG_TTSC, " ");
221 return TTS_SETTING_ERROR_INVALID_PARAMETER;
224 int ret = tts_setting_dbus_request_get_engine_list(callback, user_data);
226 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
228 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported engines");
231 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
232 SLOG(LOG_DEBUG, TAG_TTSC, " ");
237 int tts_setting_get_engine(char** engine_id)
239 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get current engine");
241 if (TTS_SETTING_STATE_NONE == g_state) {
242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
243 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
244 SLOG(LOG_DEBUG, TAG_TTSC, " ");
245 return TTS_SETTING_ERROR_INVALID_STATE;
248 if (NULL == engine_id) {
249 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
250 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
251 SLOG(LOG_DEBUG, TAG_TTSC, " ");
252 return TTS_SETTING_ERROR_INVALID_PARAMETER;
255 int ret = tts_setting_dbus_request_get_engine(engine_id);
257 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
259 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get current engine");
262 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
263 SLOG(LOG_DEBUG, TAG_TTSC, " ");
268 int tts_setting_set_engine(const char* engine_id)
270 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set current engine");
272 if (TTS_SETTING_STATE_NONE == g_state) {
273 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
274 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
275 SLOG(LOG_DEBUG, TAG_TTSC, " ");
276 return TTS_SETTING_ERROR_INVALID_STATE;
279 if (NULL == engine_id) {
280 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
281 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
282 SLOG(LOG_DEBUG, TAG_TTSC, " ");
283 return TTS_SETTING_ERROR_INVALID_PARAMETER;
286 int ret = tts_setting_dbus_request_set_engine(engine_id);
288 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
290 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set current engine");
293 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
294 SLOG(LOG_DEBUG, TAG_TTSC, " ");
299 int tts_setting_foreach_surpported_voices(tts_setting_supported_voice_cb callback, void* user_data)
301 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
303 if (TTS_SETTING_STATE_NONE == g_state) {
304 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
305 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
306 SLOG(LOG_DEBUG, TAG_TTSC, " ");
307 return TTS_SETTING_ERROR_INVALID_STATE;
310 if (NULL == callback) {
311 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
312 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
313 SLOG(LOG_DEBUG, TAG_TTSC, " ");
314 return TTS_SETTING_ERROR_INVALID_PARAMETER;
317 int ret = tts_setting_dbus_request_get_voice_list(callback, user_data);
320 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
322 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
325 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
326 SLOG(LOG_DEBUG, TAG_TTSC, " ");
331 int tts_setting_get_default_voice(char** language, tts_setting_voice_type_e* voice_type)
333 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
335 if (TTS_SETTING_STATE_NONE == g_state) {
336 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
337 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
338 SLOG(LOG_DEBUG, TAG_TTSC, " ");
339 return TTS_SETTING_ERROR_INVALID_STATE;
342 if (NULL == language || NULL == voice_type) {
343 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
344 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
345 SLOG(LOG_DEBUG, TAG_TTSC, " ");
346 return TTS_SETTING_ERROR_INVALID_PARAMETER;
349 int ret = tts_setting_dbus_request_get_default_voice(language, voice_type);
351 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
353 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
356 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
357 SLOG(LOG_DEBUG, TAG_TTSC, " ");
362 int tts_setting_set_default_voice(const char* language, tts_setting_voice_type_e voice_type)
364 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default voice");
366 if (TTS_SETTING_STATE_NONE == g_state) {
367 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
368 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
369 SLOG(LOG_DEBUG, TAG_TTSC, " ");
370 return TTS_SETTING_ERROR_INVALID_STATE;
373 if (NULL == language) {
374 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
375 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
376 SLOG(LOG_DEBUG, TAG_TTSC, " ");
377 return TTS_SETTING_ERROR_INVALID_PARAMETER;
380 if (voice_type < TTS_SETTING_VOICE_TYPE_MALE || TTS_SETTING_VOICE_TYPE_USER3 < voice_type ) {
381 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid voice type");
382 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
383 SLOG(LOG_DEBUG, TAG_TTSC, " ");
384 return TTS_SETTING_ERROR_INVALID_PARAMETER;
387 int ret = tts_setting_dbus_request_set_default_voice(language, voice_type);
389 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
391 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice");
394 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
395 SLOG(LOG_DEBUG, TAG_TTSC, " ");
401 int tts_setting_get_default_speed(tts_setting_speed_e* speed)
403 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default speed");
405 if (TTS_SETTING_STATE_NONE == g_state) {
406 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
407 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
408 SLOG(LOG_DEBUG, TAG_TTSC, " ");
409 return TTS_SETTING_ERROR_INVALID_STATE;
413 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
414 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
415 SLOG(LOG_DEBUG, TAG_TTSC, " ");
416 return TTS_SETTING_ERROR_INVALID_PARAMETER;
422 int ret = tts_setting_dbus_request_get_default_speed(&temp);
424 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
427 *speed = (tts_setting_speed_e)temp;
428 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default speed : %d ", (int)*speed);
431 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
432 SLOG(LOG_DEBUG, TAG_TTSC, " ");
438 int tts_setting_set_default_speed(tts_setting_speed_e speed)
440 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default speed");
442 if (TTS_SETTING_STATE_NONE == g_state) {
443 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
444 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
445 SLOG(LOG_DEBUG, TAG_TTSC, " ");
446 return TTS_SETTING_ERROR_INVALID_STATE;
449 if (speed < TTS_SETTING_SPEED_VERY_SLOW || TTS_SETTING_SPEED_VERY_FAST < speed) {
450 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid speed");
451 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
452 SLOG(LOG_DEBUG, TAG_TTSC, " ");
453 return TTS_SETTING_ERROR_INVALID_PARAMETER;
456 int ret = tts_setting_dbus_request_set_default_speed((int)speed);
458 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
460 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default speed");
463 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
464 SLOG(LOG_DEBUG, TAG_TTSC, " ");
469 int tts_setting_foreach_engine_settings(tts_setting_engine_setting_cb callback, void* user_data)
471 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach engine setting");
473 if (TTS_SETTING_STATE_NONE == g_state) {
474 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
475 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
476 SLOG(LOG_DEBUG, TAG_TTSC, " ");
477 return TTS_SETTING_ERROR_INVALID_STATE;
480 if (NULL == callback) {
481 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
482 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
483 SLOG(LOG_DEBUG, TAG_TTSC, " ");
484 return TTS_SETTING_ERROR_INVALID_PARAMETER;
487 int ret = tts_setting_dbus_request_get_engine_setting(callback, user_data);
489 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
491 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
494 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
495 SLOG(LOG_DEBUG, TAG_TTSC, " ");
500 int tts_setting_set_engine_setting(const char* key, const char* value)
502 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set engine setting");
504 if (TTS_SETTING_STATE_NONE == g_state) {
505 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
506 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
507 SLOG(LOG_DEBUG, TAG_TTSC, " ");
508 return TTS_SETTING_ERROR_INVALID_STATE;
511 if(NULL == key || NULL == value) {
512 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
513 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
514 SLOG(LOG_DEBUG, TAG_TTSC, " ");
515 return TTS_SETTING_ERROR_INVALID_PARAMETER;
518 int ret = tts_setting_dbus_request_set_engine_setting(key, value);
520 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
522 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
525 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
526 SLOG(LOG_DEBUG, TAG_TTSC, " ");
531 int __setting_get_cmd_line(char *file, char *buf)
535 fp = fopen(file, "r");
537 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
542 if (NULL == fgets(buf, 256, fp)) {
543 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail fgets command line");
552 /* Functions for tts-daemon fork */
553 static bool __tts_setting_is_alive()
556 struct dirent *entry;
557 struct stat filestat;
563 dir = opendir("/proc");
565 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
569 while ((entry = readdir(dir)) != NULL) {
570 if (0 != lstat(entry->d_name, &filestat))
573 if (!S_ISDIR(filestat.st_mode))
576 pid = atoi(entry->d_name);
577 if (pid <= 0) continue;
579 sprintf(tempPath, "/proc/%d/cmdline", pid);
580 if (0 != __setting_get_cmd_line(tempPath, cmdLine)) {
584 if (0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
585 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
586 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
587 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !! \n");
592 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !! \n");
599 static int __check_setting_tts_daemon()
601 if( TRUE == __tts_setting_is_alive() )
604 /* fork-exec tts-daemom */
611 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create tts-daemon ");
616 for( i = 0 ; i < _NSIG ; i++ )
619 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);