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(tts_setting_initialized_cb callback, void* user_data)
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.");
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");
98 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
99 SLOG(LOG_DEBUG, TAG_TTSC, " ");
100 return TTS_SETTING_ERROR_OPERATION_FAILED;
103 g_initialized_cb = callback;
104 g_user_data = user_data;
106 g_setting_connect_timer = ecore_timer_add(0, __tts_setting_connect_daemon, NULL);
108 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
109 SLOG(LOG_DEBUG, TAG_TTSC, " ");
111 return TTS_SETTING_ERROR_NONE;
114 int tts_setting_initialize_async(tts_setting_initialized_cb callback, void* user_data)
116 SLOG(LOG_DEBUG, TAG_TTSC, "===== Initialize TTS Setting");
118 if (TTS_SETTING_STATE_READY == g_state) {
119 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized.");
120 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
121 SLOG(LOG_DEBUG, TAG_TTSC, " ");
122 return TTS_SETTING_ERROR_NONE;
125 if( 0 != tts_setting_dbus_open_connection() ) {
126 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open connection");
127 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
128 SLOG(LOG_DEBUG, TAG_TTSC, " ");
129 return TTS_SETTING_ERROR_OPERATION_FAILED;
132 g_initialized_cb = callback;
133 g_user_data = user_data;
135 g_setting_connect_timer = ecore_timer_add(0, __tts_setting_connect_daemon, NULL);
137 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
138 SLOG(LOG_DEBUG, TAG_TTSC, " ");
140 return TTS_SETTING_ERROR_NONE;
144 int tts_setting_finalize()
146 SLOG(LOG_DEBUG, TAG_TTSC, "===== Finalize TTS Setting");
150 if (TTS_SETTING_STATE_READY == g_state) {
151 ret = tts_setting_dbus_request_finalilze();
153 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
157 if (NULL != g_setting_connect_timer) {
158 SLOG(LOG_DEBUG, TAG_TTSC, "Setting Connect Timer is remained");
159 ecore_timer_del(g_setting_connect_timer);
162 g_is_daemon_started = false;
164 if (0 != tts_setting_dbus_close_connection()) {
165 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
167 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Finalize");
170 g_state = TTS_SETTING_STATE_NONE;
172 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
173 SLOG(LOG_DEBUG, TAG_TTSC, " ");
175 return TTS_SETTING_ERROR_NONE;
178 int tts_setting_foreach_supported_engines(tts_setting_supported_engine_cb callback, void* user_data)
180 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported engines");
182 if (TTS_SETTING_STATE_NONE == g_state) {
183 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
184 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
185 SLOG(LOG_DEBUG, TAG_TTSC, " ");
186 return TTS_SETTING_ERROR_INVALID_STATE;
189 if (NULL == callback) {
190 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Callback is NULL");
191 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
192 SLOG(LOG_DEBUG, TAG_TTSC, " ");
193 return TTS_SETTING_ERROR_INVALID_PARAMETER;
196 int ret = tts_setting_dbus_request_get_engine_list(callback, user_data);
198 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
200 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported engines");
203 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
204 SLOG(LOG_DEBUG, TAG_TTSC, " ");
209 int tts_setting_get_engine(char** engine_id)
211 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get current engine");
213 if (TTS_SETTING_STATE_NONE == g_state) {
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
215 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
216 SLOG(LOG_DEBUG, TAG_TTSC, " ");
217 return TTS_SETTING_ERROR_INVALID_STATE;
220 if (NULL == engine_id) {
221 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
222 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
223 SLOG(LOG_DEBUG, TAG_TTSC, " ");
224 return TTS_SETTING_ERROR_INVALID_PARAMETER;
227 int ret = tts_setting_dbus_request_get_engine(engine_id);
229 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
231 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get current engine");
234 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
235 SLOG(LOG_DEBUG, TAG_TTSC, " ");
240 int tts_setting_set_engine(const char* engine_id)
242 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set current engine");
244 if (TTS_SETTING_STATE_NONE == g_state) {
245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
246 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
247 SLOG(LOG_DEBUG, TAG_TTSC, " ");
248 return TTS_SETTING_ERROR_INVALID_STATE;
251 if (NULL == engine_id) {
252 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
253 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
254 SLOG(LOG_DEBUG, TAG_TTSC, " ");
255 return TTS_SETTING_ERROR_INVALID_PARAMETER;
258 int ret = tts_setting_dbus_request_set_engine(engine_id);
260 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
262 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set current engine");
265 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
266 SLOG(LOG_DEBUG, TAG_TTSC, " ");
271 int tts_setting_foreach_surpported_voices(tts_setting_supported_voice_cb callback, void* user_data)
273 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
275 if (TTS_SETTING_STATE_NONE == g_state) {
276 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
277 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
278 SLOG(LOG_DEBUG, TAG_TTSC, " ");
279 return TTS_SETTING_ERROR_INVALID_STATE;
282 if (NULL == callback) {
283 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
284 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
285 SLOG(LOG_DEBUG, TAG_TTSC, " ");
286 return TTS_SETTING_ERROR_INVALID_PARAMETER;
289 int ret = tts_setting_dbus_request_get_voice_list(callback, user_data);
292 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
294 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
297 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
298 SLOG(LOG_DEBUG, TAG_TTSC, " ");
303 int tts_setting_get_default_voice(char** language, tts_setting_voice_type_e* voice_type)
305 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
307 if (TTS_SETTING_STATE_NONE == g_state) {
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
309 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
310 SLOG(LOG_DEBUG, TAG_TTSC, " ");
311 return TTS_SETTING_ERROR_INVALID_STATE;
314 if (NULL == language || NULL == voice_type) {
315 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
316 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
317 SLOG(LOG_DEBUG, TAG_TTSC, " ");
318 return TTS_SETTING_ERROR_INVALID_PARAMETER;
321 int ret = tts_setting_dbus_request_get_default_voice(language, voice_type);
323 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
325 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
328 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
329 SLOG(LOG_DEBUG, TAG_TTSC, " ");
334 int tts_setting_set_default_voice(const char* language, tts_setting_voice_type_e voice_type)
336 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default voice");
338 if (TTS_SETTING_STATE_NONE == g_state) {
339 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
340 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
341 SLOG(LOG_DEBUG, TAG_TTSC, " ");
342 return TTS_SETTING_ERROR_INVALID_STATE;
345 if (NULL == language) {
346 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
347 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
348 SLOG(LOG_DEBUG, TAG_TTSC, " ");
349 return TTS_SETTING_ERROR_INVALID_PARAMETER;
352 if (voice_type < TTS_SETTING_VOICE_TYPE_MALE || TTS_SETTING_VOICE_TYPE_USER3 < voice_type ) {
353 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid voice type");
354 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
355 SLOG(LOG_DEBUG, TAG_TTSC, " ");
356 return TTS_SETTING_ERROR_INVALID_PARAMETER;
359 int ret = tts_setting_dbus_request_set_default_voice(language, voice_type);
361 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
363 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice");
366 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
367 SLOG(LOG_DEBUG, TAG_TTSC, " ");
373 int tts_setting_get_default_speed(tts_setting_speed_e* speed)
375 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default speed");
377 if (TTS_SETTING_STATE_NONE == g_state) {
378 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
379 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
380 SLOG(LOG_DEBUG, TAG_TTSC, " ");
381 return TTS_SETTING_ERROR_INVALID_STATE;
385 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
386 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
387 SLOG(LOG_DEBUG, TAG_TTSC, " ");
388 return TTS_SETTING_ERROR_INVALID_PARAMETER;
394 int ret = tts_setting_dbus_request_get_default_speed(&temp);
396 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
399 *speed = (tts_setting_speed_e)temp;
400 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default speed : %d ", (int)*speed);
403 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
404 SLOG(LOG_DEBUG, TAG_TTSC, " ");
410 int tts_setting_set_default_speed(tts_setting_speed_e speed)
412 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set default speed");
414 if (TTS_SETTING_STATE_NONE == g_state) {
415 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
416 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
417 SLOG(LOG_DEBUG, TAG_TTSC, " ");
418 return TTS_SETTING_ERROR_INVALID_STATE;
421 if (speed < TTS_SETTING_SPEED_VERY_SLOW || TTS_SETTING_SPEED_VERY_FAST < speed) {
422 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid speed");
423 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
424 SLOG(LOG_DEBUG, TAG_TTSC, " ");
425 return TTS_SETTING_ERROR_INVALID_PARAMETER;
428 int ret = tts_setting_dbus_request_set_default_speed((int)speed);
430 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
432 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default speed");
435 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
436 SLOG(LOG_DEBUG, TAG_TTSC, " ");
441 int tts_setting_foreach_engine_settings(tts_setting_engine_setting_cb callback, void* user_data)
443 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach engine setting");
445 if (TTS_SETTING_STATE_NONE == g_state) {
446 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
447 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
448 SLOG(LOG_DEBUG, TAG_TTSC, " ");
449 return TTS_SETTING_ERROR_INVALID_STATE;
452 if (NULL == callback) {
453 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
454 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
455 SLOG(LOG_DEBUG, TAG_TTSC, " ");
456 return TTS_SETTING_ERROR_INVALID_PARAMETER;
459 int ret = tts_setting_dbus_request_get_engine_setting(callback, user_data);
461 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
463 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
466 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
467 SLOG(LOG_DEBUG, TAG_TTSC, " ");
472 int tts_setting_set_engine_setting(const char* key, const char* value)
474 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set engine setting");
476 if (TTS_SETTING_STATE_NONE == g_state) {
477 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
478 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
479 SLOG(LOG_DEBUG, TAG_TTSC, " ");
480 return TTS_SETTING_ERROR_INVALID_STATE;
483 if(NULL == key || NULL == value) {
484 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
485 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
486 SLOG(LOG_DEBUG, TAG_TTSC, " ");
487 return TTS_SETTING_ERROR_INVALID_PARAMETER;
490 int ret = tts_setting_dbus_request_set_engine_setting(key, value);
492 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
494 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach engine setting");
497 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
498 SLOG(LOG_DEBUG, TAG_TTSC, " ");
503 int __setting_get_cmd_line(char *file, char *buf)
507 fp = fopen(file, "r");
509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
514 if (NULL == fgets(buf, 256, fp)) {
515 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail fgets command line");
524 /* Functions for tts-daemon fork */
525 static bool __tts_setting_is_alive()
528 struct dirent *entry;
529 struct stat filestat;
535 dir = opendir("/proc");
537 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
541 while ((entry = readdir(dir)) != NULL) {
542 if (0 != lstat(entry->d_name, &filestat))
545 if (!S_ISDIR(filestat.st_mode))
548 pid = atoi(entry->d_name);
549 if (pid <= 0) continue;
551 sprintf(tempPath, "/proc/%d/cmdline", pid);
552 if (0 != __setting_get_cmd_line(tempPath, cmdLine)) {
556 if (0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
557 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
558 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
559 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
564 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !!");
571 static int __check_setting_tts_daemon()
573 if( TRUE == __tts_setting_is_alive() )
576 /* fork-exec tts-daemom */
583 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create tts-daemon ");
588 for( i = 0 ; i < _NSIG ; i++ )
591 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);