2 * Copyright (c) 2012 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.
19 #include "tts_setting.h"
20 #include "tts_setting_dbus.h"
22 static bool g_is_daemon_started = false;
24 static int __check_tts_daemon();
26 static tts_setting_state_e g_state = TTS_SETTING_STATE_NONE;
28 static tts_setting_initialized_cb g_initialized_cb;
29 static void* g_user_data;
33 /* API Implementation */
34 static Eina_Bool __tts_setting_initialized(void *data)
36 g_initialized_cb(g_state, g_reason, g_user_data);
41 static Eina_Bool __tts_setting_connect_daemon(void *data)
44 if (0 != tts_setting_dbus_request_hello()) {
45 if (false == g_is_daemon_started) {
46 g_is_daemon_started = true;
52 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
54 /* do request initialize */
57 ret = tts_setting_dbus_request_initialize();
59 if (TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret) {
60 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
61 } else if (TTS_SETTING_ERROR_NONE != ret) {
62 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection : %d", ret);
64 /* success to connect tts-daemon */
65 g_state = TTS_SETTING_STATE_READY;
70 ecore_timer_add(0, __tts_setting_initialized, NULL);
72 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
73 SLOG(LOG_DEBUG, TAG_TTSC, " ");
78 int tts_setting_initialize()
80 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
82 if (TTS_SETTING_STATE_READY == g_state) {
83 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
84 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
85 SLOG(LOG_DEBUG, TAG_TTSC, " ");
86 return TTS_SETTING_ERROR_NONE;
89 if( 0 != tts_setting_dbus_open_connection() ) {
90 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
91 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
92 SLOG(LOG_DEBUG, TAG_TTSC, " ");
93 return TTS_SETTING_ERROR_OPERATION_FAILED;
97 if (0 != tts_setting_dbus_request_hello()) {
105 ret = tts_setting_dbus_request_initialize();
107 if( TTS_SETTING_ERROR_ENGINE_NOT_FOUND == ret ) {
108 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
113 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Connection Time out");
114 ret = TTS_SETTING_ERROR_TIMED_OUT;
119 /* success to connect tts-daemon */
124 if (TTS_SETTING_ERROR_NONE == ret) {
125 g_state = TTS_SETTING_STATE_READY;
126 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Initialize");
129 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
130 SLOG(LOG_DEBUG, TAG_TTSC, " ");
135 int tts_setting_initialize_async(tts_setting_initialized_cb callback, void* user_data)
137 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
139 if (TTS_SETTING_STATE_READY == g_state) {
140 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized. \n");
141 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
142 SLOG(LOG_DEBUG, TAG_TTSC, " ");
143 return TTS_SETTING_ERROR_NONE;
146 if( 0 != tts_setting_dbus_open_connection() ) {
147 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection\n ");
148 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
149 SLOG(LOG_DEBUG, TAG_TTSC, " ");
150 return TTS_SETTING_ERROR_OPERATION_FAILED;
153 g_initialized_cb = callback;
154 g_user_data = user_data;
156 ecore_timer_add(0, __tts_setting_connect_daemon, NULL);
158 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
159 SLOG(LOG_DEBUG, TAG_TTSC, " ");
161 return TTS_SETTING_ERROR_NONE;
165 int tts_setting_finalize()
167 SLOG(LOG_DEBUG, TAG_TTSC, "===== Finalize TTS Setting");
169 if (TTS_SETTING_STATE_NONE == g_state) {
170 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Not initialized");
171 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
172 SLOG(LOG_DEBUG, TAG_TTSC, " ");
173 return TTS_SETTING_ERROR_INVALID_STATE;
176 int ret = tts_setting_dbus_request_finalilze();
178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
179 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
180 SLOG(LOG_DEBUG, TAG_TTSC, " ");
182 return TTS_SETTING_ERROR_OPERATION_FAILED;
185 if (0 != tts_setting_dbus_close_connection()) {
186 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection\n ");
188 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Finalize");
191 g_state = TTS_SETTING_STATE_NONE;
193 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
194 SLOG(LOG_DEBUG, TAG_TTSC, " ");
196 return TTS_SETTING_ERROR_NONE;
199 int tts_setting_foreach_supported_engines(tts_setting_supported_engine_cb callback, void* user_data)
201 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported engines");
203 if (TTS_SETTING_STATE_NONE == g_state) {
204 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
205 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
206 SLOG(LOG_DEBUG, TAG_TTSC, " ");
207 return TTS_SETTING_ERROR_INVALID_STATE;
210 if (NULL == callback) {
211 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Callback is NULL");
212 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
213 SLOG(LOG_DEBUG, TAG_TTSC, " ");
214 return TTS_SETTING_ERROR_INVALID_PARAMETER;
217 int ret = tts_setting_dbus_request_get_engine_list(callback, user_data);
219 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
221 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported engines");
224 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
225 SLOG(LOG_DEBUG, TAG_TTSC, " ");
230 int tts_setting_get_engine(char** engine_id)
232 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get current engine");
234 if (TTS_SETTING_STATE_NONE == g_state) {
235 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
236 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
237 SLOG(LOG_DEBUG, TAG_TTSC, " ");
238 return TTS_SETTING_ERROR_INVALID_STATE;
241 if (NULL == engine_id) {
242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
243 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
244 SLOG(LOG_DEBUG, TAG_TTSC, " ");
245 return TTS_SETTING_ERROR_INVALID_PARAMETER;
248 int ret = tts_setting_dbus_request_get_engine(engine_id);
250 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
252 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get current engine");
255 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
256 SLOG(LOG_DEBUG, TAG_TTSC, " ");
261 int tts_setting_set_engine(const char* engine_id)
263 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set current engine");
265 if (TTS_SETTING_STATE_NONE == g_state) {
266 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
267 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
268 SLOG(LOG_DEBUG, TAG_TTSC, " ");
269 return TTS_SETTING_ERROR_INVALID_STATE;
272 if (NULL == engine_id) {
273 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
274 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
275 SLOG(LOG_DEBUG, TAG_TTSC, " ");
276 return TTS_SETTING_ERROR_INVALID_PARAMETER;
279 int ret = tts_setting_dbus_request_set_engine(engine_id);
281 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
283 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set current engine");
286 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
287 SLOG(LOG_DEBUG, TAG_TTSC, " ");
292 int tts_setting_foreach_surpported_voices(tts_setting_supported_voice_cb callback, void* user_data)
294 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
296 if (TTS_SETTING_STATE_NONE == g_state) {
297 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
298 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
299 SLOG(LOG_DEBUG, TAG_TTSC, " ");
300 return TTS_SETTING_ERROR_INVALID_STATE;
303 if (NULL == callback) {
304 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
305 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
306 SLOG(LOG_DEBUG, TAG_TTSC, " ");
307 return TTS_SETTING_ERROR_INVALID_PARAMETER;
310 int ret = tts_setting_dbus_request_get_voice_list(callback, user_data);
313 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
315 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
318 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
319 SLOG(LOG_DEBUG, TAG_TTSC, " ");
324 int tts_setting_get_default_voice(char** language, tts_setting_voice_type_e* voice_type)
326 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
328 if (TTS_SETTING_STATE_NONE == g_state) {
329 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
330 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
331 SLOG(LOG_DEBUG, TAG_TTSC, " ");
332 return TTS_SETTING_ERROR_INVALID_STATE;
335 if (NULL == language || NULL == voice_type) {
336 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
337 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
338 SLOG(LOG_DEBUG, TAG_TTSC, " ");
339 return TTS_SETTING_ERROR_INVALID_PARAMETER;
342 int ret = tts_setting_dbus_request_get_default_voice(language, voice_type);
344 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
346 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
349 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
350 SLOG(LOG_DEBUG, TAG_TTSC, " ");
355 int tts_setting_set_default_voice(const char* language, tts_setting_voice_type_e voice_type)
357 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default voice");
359 if (TTS_SETTING_STATE_NONE == g_state) {
360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
361 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
363 return TTS_SETTING_ERROR_INVALID_STATE;
366 if (NULL == language) {
367 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
368 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
369 SLOG(LOG_DEBUG, TAG_TTSC, " ");
370 return TTS_SETTING_ERROR_INVALID_PARAMETER;
373 if (voice_type < TTS_SETTING_VOICE_TYPE_MALE || TTS_SETTING_VOICE_TYPE_USER3 < voice_type ) {
374 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid voice type");
375 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
376 SLOG(LOG_DEBUG, TAG_TTSC, " ");
377 return TTS_SETTING_ERROR_INVALID_PARAMETER;
380 int ret = tts_setting_dbus_request_set_default_voice(language, voice_type);
382 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
384 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice");
387 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
388 SLOG(LOG_DEBUG, TAG_TTSC, " ");
394 int tts_setting_get_default_speed(tts_setting_speed_e* speed)
396 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default speed");
398 if (TTS_SETTING_STATE_NONE == g_state) {
399 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
400 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
401 SLOG(LOG_DEBUG, TAG_TTSC, " ");
402 return TTS_SETTING_ERROR_INVALID_STATE;
406 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
407 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
408 SLOG(LOG_DEBUG, TAG_TTSC, " ");
409 return TTS_SETTING_ERROR_INVALID_PARAMETER;
415 int ret = tts_setting_dbus_request_get_default_speed(&temp);
417 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
420 *speed = (tts_setting_speed_e)temp;
421 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default speed : %d ", (int)*speed);
424 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
425 SLOG(LOG_DEBUG, TAG_TTSC, " ");
431 int tts_setting_set_default_speed(tts_setting_speed_e speed)
433 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default speed");
435 if (TTS_SETTING_STATE_NONE == g_state) {
436 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
437 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
438 SLOG(LOG_DEBUG, TAG_TTSC, " ");
439 return TTS_SETTING_ERROR_INVALID_STATE;
442 if (speed < TTS_SETTING_SPEED_VERY_SLOW || TTS_SETTING_SPEED_VERY_FAST < speed) {
443 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid speed");
444 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
445 SLOG(LOG_DEBUG, TAG_TTSC, " ");
446 return TTS_SETTING_ERROR_INVALID_PARAMETER;
449 int ret = tts_setting_dbus_request_set_default_speed((int)speed);
451 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
453 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default speed");
456 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
457 SLOG(LOG_DEBUG, TAG_TTSC, " ");
462 int tts_setting_foreach_engine_settings(tts_setting_engine_setting_cb callback, void* user_data)
464 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach engine setting");
466 if (TTS_SETTING_STATE_NONE == g_state) {
467 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
468 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
469 SLOG(LOG_DEBUG, TAG_TTSC, " ");
470 return TTS_SETTING_ERROR_INVALID_STATE;
473 if (NULL == callback) {
474 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
475 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
476 SLOG(LOG_DEBUG, TAG_TTSC, " ");
477 return TTS_SETTING_ERROR_INVALID_PARAMETER;
480 int ret = tts_setting_dbus_request_get_engine_setting(callback, user_data);
482 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
484 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
487 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
488 SLOG(LOG_DEBUG, TAG_TTSC, " ");
493 int tts_setting_set_engine_setting(const char* key, const char* value)
495 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set engine setting");
497 if (TTS_SETTING_STATE_NONE == g_state) {
498 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
499 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
500 SLOG(LOG_DEBUG, TAG_TTSC, " ");
501 return TTS_SETTING_ERROR_INVALID_STATE;
504 if(NULL == key || NULL == value) {
505 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
506 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
507 SLOG(LOG_DEBUG, TAG_TTSC, " ");
508 return TTS_SETTING_ERROR_INVALID_PARAMETER;
511 int ret = tts_setting_dbus_request_set_engine_setting(key, value);
513 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
515 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
518 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
519 SLOG(LOG_DEBUG, TAG_TTSC, " ");
526 /* Functions for tts-daemon fork */
527 static bool __tts_is_alive()
533 memset(buff, '\0', sizeof(char) * 256);
534 memset(cmd, '\0', sizeof(char) * 256);
536 fp = popen("ps", "r");
538 SLOG(LOG_DEBUG, TAG_TTSC, "[TTS SETTING ERROR] popen error");
542 while (fgets(buff, 255, fp)) {
543 strcpy(cmd, buff + 26);
545 if( 0 == strncmp(cmd, "[tts-daemon]", strlen("[tts-daemon]")) ||
546 0 == strncmp(cmd, "tts-daemon", strlen("tts-daemon")) ||
547 0 == strncmp(cmd, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))
549 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
557 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !! \n");
562 static void __my_sig_child(int signo, siginfo_t *info, void *data)
565 pid_t child_pid, child_pgid;
567 child_pgid = getpgid(info->si_pid);
568 SLOG(LOG_DEBUG, TAG_TTSC, "Signal handler: dead pid = %d, pgid = %d", info->si_pid, child_pgid);
570 while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
571 if(child_pid == child_pgid)
572 killpg(child_pgid, SIGKILL);
578 static int __check_tts_daemon()
580 if( TRUE == __tts_is_alive() )
583 /* fork-exec tts-daemom */
585 struct sigaction act, dummy;
587 act.sa_handler = NULL;
588 act.sa_sigaction = __my_sig_child;
589 sigemptyset(&act.sa_mask);
590 act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
592 if (sigaction(SIGCHLD, &act, &dummy) < 0) {
593 SLOG(LOG_ERROR, TAG_TTSC, "Cannot make a signal handler");
601 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create tts-daemon ");
606 for( i = 0 ; i < _NSIG ; i++ )
609 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);