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 int __check_setting_tts_daemon();
29 static tts_setting_state_e g_state = TTS_SETTING_STATE_NONE;
31 static tts_setting_initialized_cb g_initialized_cb;
32 static void* g_user_data;
36 /* API Implementation */
37 static Eina_Bool __tts_setting_initialized(void *data)
39 g_initialized_cb(g_state, g_reason, g_user_data);
44 static Eina_Bool __tts_setting_connect_daemon(void *data)
47 if (0 != tts_setting_dbus_request_hello()) {
48 if (false == g_is_daemon_started) {
49 g_is_daemon_started = true;
50 __check_setting_tts_daemon();
55 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
57 /* do request initialize */
60 ret = tts_setting_dbus_request_initialize();
62 if (TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret) {
63 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
64 } else if (TTS_SETTING_ERROR_NONE != ret) {
65 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection : %d", ret);
67 /* success to connect tts-daemon */
68 g_state = TTS_SETTING_STATE_READY;
73 ecore_timer_add(0, __tts_setting_initialized, NULL);
75 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
76 SLOG(LOG_DEBUG, TAG_TTSC, " ");
81 int tts_setting_initialize()
83 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
85 if (TTS_SETTING_STATE_READY == g_state) {
86 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
87 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
88 SLOG(LOG_DEBUG, TAG_TTSC, " ");
89 return TTS_SETTING_ERROR_NONE;
92 if( 0 != tts_setting_dbus_open_connection() ) {
93 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
94 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
95 SLOG(LOG_DEBUG, TAG_TTSC, " ");
96 return TTS_SETTING_ERROR_OPERATION_FAILED;
100 if (0 != tts_setting_dbus_request_hello()) {
101 __check_setting_tts_daemon();
108 ret = tts_setting_dbus_request_initialize();
110 if( TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret ) {
111 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
116 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Connection Time out");
117 ret = TTS_SETTING_ERROR_TIMED_OUT;
122 /* success to connect tts-daemon */
127 if (TTS_SETTING_ERROR_NONE == ret) {
128 g_state = TTS_SETTING_STATE_READY;
129 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Initialize");
132 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
133 SLOG(LOG_DEBUG, TAG_TTSC, " ");
138 int tts_setting_initialize_async(tts_setting_initialized_cb callback, void* user_data)
140 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
142 if (TTS_SETTING_STATE_READY == g_state) {
143 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
144 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
145 SLOG(LOG_DEBUG, TAG_TTSC, " ");
146 return TTS_SETTING_ERROR_NONE;
149 if( 0 != tts_setting_dbus_open_connection() ) {
150 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
151 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
152 SLOG(LOG_DEBUG, TAG_TTSC, " ");
153 return TTS_SETTING_ERROR_OPERATION_FAILED;
156 g_initialized_cb = callback;
157 g_user_data = user_data;
159 ecore_timer_add(0, __tts_setting_connect_daemon, NULL);
161 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
162 SLOG(LOG_DEBUG, TAG_TTSC, " ");
164 return TTS_SETTING_ERROR_NONE;
168 int tts_setting_finalize()
170 SLOG(LOG_DEBUG, TAG_TTSC, "===== Finalize TTS Setting");
172 if (TTS_SETTING_STATE_NONE == g_state) {
173 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Not initialized");
174 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
175 SLOG(LOG_DEBUG, TAG_TTSC, " ");
176 return TTS_SETTING_ERROR_INVALID_STATE;
179 int ret = tts_setting_dbus_request_finalilze();
181 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
182 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
183 SLOG(LOG_DEBUG, TAG_TTSC, " ");
185 return TTS_SETTING_ERROR_OPERATION_FAILED;
187 g_is_daemon_started = false;
189 if (0 != tts_setting_dbus_close_connection()) {
190 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection\n ");
192 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Finalize");
195 g_state = TTS_SETTING_STATE_NONE;
197 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
198 SLOG(LOG_DEBUG, TAG_TTSC, " ");
200 return TTS_SETTING_ERROR_NONE;
203 int tts_setting_foreach_supported_engines(tts_setting_supported_engine_cb callback, void* user_data)
205 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported engines");
207 if (TTS_SETTING_STATE_NONE == g_state) {
208 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
209 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
210 SLOG(LOG_DEBUG, TAG_TTSC, " ");
211 return TTS_SETTING_ERROR_INVALID_STATE;
214 if (NULL == callback) {
215 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Callback is NULL");
216 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
217 SLOG(LOG_DEBUG, TAG_TTSC, " ");
218 return TTS_SETTING_ERROR_INVALID_PARAMETER;
221 int ret = tts_setting_dbus_request_get_engine_list(callback, user_data);
223 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
225 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported engines");
228 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
229 SLOG(LOG_DEBUG, TAG_TTSC, " ");
234 int tts_setting_get_engine(char** engine_id)
236 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get current engine");
238 if (TTS_SETTING_STATE_NONE == g_state) {
239 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
240 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
241 SLOG(LOG_DEBUG, TAG_TTSC, " ");
242 return TTS_SETTING_ERROR_INVALID_STATE;
245 if (NULL == engine_id) {
246 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
247 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
248 SLOG(LOG_DEBUG, TAG_TTSC, " ");
249 return TTS_SETTING_ERROR_INVALID_PARAMETER;
252 int ret = tts_setting_dbus_request_get_engine(engine_id);
254 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
256 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get current engine");
259 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
260 SLOG(LOG_DEBUG, TAG_TTSC, " ");
265 int tts_setting_set_engine(const char* engine_id)
267 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set current engine");
269 if (TTS_SETTING_STATE_NONE == g_state) {
270 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
271 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
272 SLOG(LOG_DEBUG, TAG_TTSC, " ");
273 return TTS_SETTING_ERROR_INVALID_STATE;
276 if (NULL == engine_id) {
277 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
278 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
279 SLOG(LOG_DEBUG, TAG_TTSC, " ");
280 return TTS_SETTING_ERROR_INVALID_PARAMETER;
283 int ret = tts_setting_dbus_request_set_engine(engine_id);
285 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
287 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set current engine");
290 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
291 SLOG(LOG_DEBUG, TAG_TTSC, " ");
296 int tts_setting_foreach_surpported_voices(tts_setting_supported_voice_cb callback, void* user_data)
298 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
300 if (TTS_SETTING_STATE_NONE == g_state) {
301 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
302 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
303 SLOG(LOG_DEBUG, TAG_TTSC, " ");
304 return TTS_SETTING_ERROR_INVALID_STATE;
307 if (NULL == callback) {
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
309 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
310 SLOG(LOG_DEBUG, TAG_TTSC, " ");
311 return TTS_SETTING_ERROR_INVALID_PARAMETER;
314 int ret = tts_setting_dbus_request_get_voice_list(callback, user_data);
317 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
319 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
322 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
323 SLOG(LOG_DEBUG, TAG_TTSC, " ");
328 int tts_setting_get_default_voice(char** language, tts_setting_voice_type_e* voice_type)
330 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
332 if (TTS_SETTING_STATE_NONE == g_state) {
333 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
334 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
335 SLOG(LOG_DEBUG, TAG_TTSC, " ");
336 return TTS_SETTING_ERROR_INVALID_STATE;
339 if (NULL == language || NULL == voice_type) {
340 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
341 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
342 SLOG(LOG_DEBUG, TAG_TTSC, " ");
343 return TTS_SETTING_ERROR_INVALID_PARAMETER;
346 int ret = tts_setting_dbus_request_get_default_voice(language, voice_type);
348 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
350 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
353 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
354 SLOG(LOG_DEBUG, TAG_TTSC, " ");
359 int tts_setting_set_default_voice(const char* language, tts_setting_voice_type_e voice_type)
361 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default voice");
363 if (TTS_SETTING_STATE_NONE == g_state) {
364 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
365 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
366 SLOG(LOG_DEBUG, TAG_TTSC, " ");
367 return TTS_SETTING_ERROR_INVALID_STATE;
370 if (NULL == language) {
371 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
372 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
373 SLOG(LOG_DEBUG, TAG_TTSC, " ");
374 return TTS_SETTING_ERROR_INVALID_PARAMETER;
377 if (voice_type < TTS_SETTING_VOICE_TYPE_MALE || TTS_SETTING_VOICE_TYPE_USER3 < voice_type ) {
378 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid voice type");
379 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
380 SLOG(LOG_DEBUG, TAG_TTSC, " ");
381 return TTS_SETTING_ERROR_INVALID_PARAMETER;
384 int ret = tts_setting_dbus_request_set_default_voice(language, voice_type);
386 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
388 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice");
391 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
392 SLOG(LOG_DEBUG, TAG_TTSC, " ");
398 int tts_setting_get_default_speed(tts_setting_speed_e* speed)
400 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default speed");
402 if (TTS_SETTING_STATE_NONE == g_state) {
403 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
404 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
405 SLOG(LOG_DEBUG, TAG_TTSC, " ");
406 return TTS_SETTING_ERROR_INVALID_STATE;
410 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
411 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
412 SLOG(LOG_DEBUG, TAG_TTSC, " ");
413 return TTS_SETTING_ERROR_INVALID_PARAMETER;
419 int ret = tts_setting_dbus_request_get_default_speed(&temp);
421 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
424 *speed = (tts_setting_speed_e)temp;
425 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default speed : %d ", (int)*speed);
428 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
429 SLOG(LOG_DEBUG, TAG_TTSC, " ");
435 int tts_setting_set_default_speed(tts_setting_speed_e speed)
437 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default speed");
439 if (TTS_SETTING_STATE_NONE == g_state) {
440 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
441 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
442 SLOG(LOG_DEBUG, TAG_TTSC, " ");
443 return TTS_SETTING_ERROR_INVALID_STATE;
446 if (speed < TTS_SETTING_SPEED_VERY_SLOW || TTS_SETTING_SPEED_VERY_FAST < speed) {
447 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid speed");
448 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
449 SLOG(LOG_DEBUG, TAG_TTSC, " ");
450 return TTS_SETTING_ERROR_INVALID_PARAMETER;
453 int ret = tts_setting_dbus_request_set_default_speed((int)speed);
455 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
457 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default speed");
460 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
461 SLOG(LOG_DEBUG, TAG_TTSC, " ");
466 int tts_setting_foreach_engine_settings(tts_setting_engine_setting_cb callback, void* user_data)
468 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach engine setting");
470 if (TTS_SETTING_STATE_NONE == g_state) {
471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
472 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
473 SLOG(LOG_DEBUG, TAG_TTSC, " ");
474 return TTS_SETTING_ERROR_INVALID_STATE;
477 if (NULL == callback) {
478 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
479 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
480 SLOG(LOG_DEBUG, TAG_TTSC, " ");
481 return TTS_SETTING_ERROR_INVALID_PARAMETER;
484 int ret = tts_setting_dbus_request_get_engine_setting(callback, user_data);
486 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
488 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
491 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
492 SLOG(LOG_DEBUG, TAG_TTSC, " ");
497 int tts_setting_set_engine_setting(const char* key, const char* value)
499 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set engine setting");
501 if (TTS_SETTING_STATE_NONE == g_state) {
502 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
503 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
504 SLOG(LOG_DEBUG, TAG_TTSC, " ");
505 return TTS_SETTING_ERROR_INVALID_STATE;
508 if(NULL == key || NULL == value) {
509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
510 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
511 SLOG(LOG_DEBUG, TAG_TTSC, " ");
512 return TTS_SETTING_ERROR_INVALID_PARAMETER;
515 int ret = tts_setting_dbus_request_set_engine_setting(key, value);
517 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
519 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
522 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
523 SLOG(LOG_DEBUG, TAG_TTSC, " ");
528 int __setting_get_cmd_line(char *file, char *buf)
532 fp = fopen(file, "r");
534 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
539 if (NULL == fgets(buf, 256, fp)) {
540 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail fgets command line");
549 /* Functions for tts-daemon fork */
550 static bool __tts_setting_is_alive()
553 struct dirent *entry;
554 struct stat filestat;
560 dir = opendir("/proc");
562 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
566 while ((entry = readdir(dir)) != NULL) {
567 if (0 != lstat(entry->d_name, &filestat))
570 if (!S_ISDIR(filestat.st_mode))
573 pid = atoi(entry->d_name);
574 if (pid <= 0) continue;
576 sprintf(tempPath, "/proc/%d/cmdline", pid);
577 if (0 != __setting_get_cmd_line(tempPath, cmdLine)) {
581 if (0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
582 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
583 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
584 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !! \n");
589 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !! \n");
596 static int __check_setting_tts_daemon()
598 if( TRUE == __tts_setting_is_alive() )
601 /* fork-exec tts-daemom */
608 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create tts-daemon ");
613 for( i = 0 ; i < _NSIG ; i++ )
616 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);