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.
17 #include <sys/types.h>
20 #include "tts_config_mgr.h"
22 #include "tts_setting.h"
25 * @brief Enumerations of setting state.
28 TTS_SETTING_STATE_NONE = 0,
29 TTS_SETTING_STATE_READY
30 } tts_setting_state_e;
33 static tts_setting_state_e g_state = TTS_SETTING_STATE_NONE;
35 static tts_setting_supported_engine_cb g_engine_cb;
37 static tts_setting_engine_changed_cb g_engine_changed_cb;
38 static void* g_engine_changed_user_data;
40 static tts_setting_voice_changed_cb g_voice_changed_cb;
41 static void* g_voice_changed_user_data;
43 static tts_setting_speed_changed_cb g_speed_changed_cb;
44 static void* g_speed_changed_user_data;
46 static tts_setting_pitch_changed_cb g_pitch_changed_cb;
47 static void* g_pitch_changed_user_data;
56 static int __setting_convert_config_error_code(tts_config_error_e code)
58 if (code == TTS_CONFIG_ERROR_NONE) return TTS_SETTING_ERROR_NONE;
59 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_SETTING_ERROR_OUT_OF_MEMORY;
60 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_SETTING_ERROR_IO_ERROR;
61 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_SETTING_ERROR_INVALID_PARAMETER;
62 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_SETTING_ERROR_INVALID_STATE;
63 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_SETTING_ERROR_INVALID_VOICE;
64 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_SETTING_ERROR_ENGINE_NOT_FOUND;
65 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_SETTING_ERROR_OPERATION_FAILED;
66 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_SETTING_ERROR_NOT_SUPPORTED_FEATURE;
68 return TTS_SETTING_ERROR_NONE;
71 void __setting_config_engine_changed_cb(const char* engine_id, const char* setting, const char* language, int voice_type, bool auto_voice, bool need_credential, void* user_data)
73 SLOG(LOG_DEBUG, TAG_TTSC, "Engine chagned : engine(%s) setting(%s) lang(%s) type(%d)",
74 engine_id, setting, language, voice_type);
76 if (NULL != g_engine_changed_cb)
77 g_engine_changed_cb(engine_id, g_engine_changed_user_data);
79 if (NULL != g_voice_changed_cb)
80 g_voice_changed_cb(language, voice_type, auto_voice, g_voice_changed_user_data);
83 void __setting_config_voice_changed_cb(const char* before_language, int before_type, const char* language, int voice_type, bool auto_voice, void* user_data)
85 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : lang(%s) type(%d) auto(%s)", language, voice_type, auto_voice ? "on" : "off");
87 if (NULL != g_voice_changed_cb)
88 g_voice_changed_cb(language, voice_type, auto_voice, g_voice_changed_user_data);
91 void __setting_config_speech_rate_changed_cb(int value, void* user_data)
93 SLOG(LOG_DEBUG, TAG_TTSC, "Speech rate : %d", value);
95 if (NULL != g_speed_changed_cb)
96 g_speed_changed_cb(value, g_speed_changed_user_data);
99 void __setting_config_pitch_changed_cb(int value, void* user_data)
101 SLOG(LOG_DEBUG, TAG_TTSC, "Pitch : %d", value);
103 if (NULL != g_pitch_changed_cb)
104 g_pitch_changed_cb(value, g_pitch_changed_user_data);
107 int tts_setting_initialize()
109 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Initialize TTS Setting");
111 if (TTS_SETTING_STATE_READY == g_state) {
112 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] TTS Setting has already been initialized.");
113 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
114 return TTS_SETTING_ERROR_NONE;
117 int ret = tts_config_mgr_initialize(getpid());
119 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize config manager : %d", ret);
120 return __setting_convert_config_error_code(ret);
123 ret = tts_config_mgr_set_callback(getpid(), __setting_config_engine_changed_cb, __setting_config_voice_changed_cb,
124 __setting_config_speech_rate_changed_cb, __setting_config_pitch_changed_cb, NULL);
126 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
127 return __setting_convert_config_error_code(ret);
130 g_state = TTS_SETTING_STATE_READY;
132 g_engine_changed_cb = NULL;
133 g_engine_changed_user_data = NULL;
135 g_voice_changed_cb = NULL;
136 g_voice_changed_user_data = NULL;
138 g_speed_changed_cb = NULL;
139 g_speed_changed_user_data = NULL;
141 g_pitch_changed_cb = NULL;
142 g_pitch_changed_user_data = NULL;
144 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
146 return TTS_SETTING_ERROR_NONE;
149 int tts_setting_finalize()
151 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Finalize TTS Setting");
153 tts_config_mgr_finalize(getpid());
155 g_state = TTS_SETTING_STATE_NONE;
157 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
159 return TTS_SETTING_ERROR_NONE;
162 bool __tts_config_mgr_get_engine_list(const char* engine_id, const char* engine_name, const char* setting, void* user_data)
164 if (NULL != g_engine_cb) {
165 return g_engine_cb(engine_id, engine_name, setting, user_data);
171 int tts_setting_foreach_supported_engines(tts_setting_supported_engine_cb callback, void* user_data)
173 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Foreach supported engines");
175 if (TTS_SETTING_STATE_NONE == g_state) {
176 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
177 return TTS_SETTING_ERROR_INVALID_STATE;
180 if (NULL == callback) {
181 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Callback is NULL");
182 return TTS_SETTING_ERROR_INVALID_PARAMETER;
185 g_engine_cb = callback;
187 int ret = tts_config_mgr_get_engine_list(__tts_config_mgr_get_engine_list, user_data);
189 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
194 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
196 return __setting_convert_config_error_code(ret);
199 int tts_setting_get_engine(char** engine_id)
201 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get current engine");
203 if (TTS_SETTING_STATE_NONE == g_state) {
204 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
205 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
206 return TTS_SETTING_ERROR_INVALID_STATE;
209 if (NULL == engine_id) {
210 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
211 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
212 return TTS_SETTING_ERROR_INVALID_PARAMETER;
215 int ret = tts_config_mgr_get_engine(engine_id);
217 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
219 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get current engine");
222 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
224 return __setting_convert_config_error_code(ret);
227 int tts_setting_set_engine(const char* engine_id)
229 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Set current engine");
231 if (TTS_SETTING_STATE_NONE == g_state) {
232 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
233 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
234 return TTS_SETTING_ERROR_INVALID_STATE;
237 if (NULL == engine_id) {
238 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine id is NULL");
239 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
240 return TTS_SETTING_ERROR_INVALID_PARAMETER;
243 int ret = tts_config_mgr_set_engine(engine_id);
245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
247 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set current engine : %s", engine_id);
250 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
252 return __setting_convert_config_error_code(ret);
255 int tts_setting_foreach_supported_voices(tts_setting_supported_voice_cb callback, void* user_data)
257 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Foreach supported voices");
259 if (TTS_SETTING_STATE_NONE == g_state) {
260 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
261 return TTS_SETTING_ERROR_INVALID_STATE;
264 if (NULL == callback) {
265 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
266 return TTS_SETTING_ERROR_INVALID_PARAMETER;
269 char* current_engine = NULL;
270 int ret = tts_config_mgr_get_engine(¤t_engine);
272 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
273 return TTS_SETTING_ERROR_OPERATION_FAILED;
276 ret = tts_config_mgr_get_voice_list(current_engine, (tts_config_supported_voice_cb)callback, user_data);
278 if (NULL != current_engine)
279 free(current_engine);
282 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
284 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Foreach supported voices");
287 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
289 return __setting_convert_config_error_code(ret);
292 int tts_setting_get_voice(char** language, int* voice_type)
294 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
296 if (TTS_SETTING_STATE_NONE == g_state) {
297 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
298 return TTS_SETTING_ERROR_INVALID_STATE;
301 if (NULL == language || NULL == voice_type) {
302 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
303 return TTS_SETTING_ERROR_INVALID_PARAMETER;
306 int ret = tts_config_mgr_get_voice(language, (int*)voice_type);
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
310 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default voices : lang(%s) type(%d)", *language, *voice_type);
313 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
315 return __setting_convert_config_error_code(ret);
318 int tts_setting_set_voice(const char* language, int voice_type)
320 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Set default voice");
322 if (TTS_SETTING_STATE_NONE == g_state) {
323 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
324 return TTS_SETTING_ERROR_INVALID_STATE;
327 if (NULL == language) {
328 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
329 return TTS_SETTING_ERROR_INVALID_PARAMETER;
332 if (voice_type < TTS_SETTING_VOICE_TYPE_MALE || TTS_SETTING_VOICE_TYPE_CHILD < voice_type) {
333 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid voice type");
334 return TTS_SETTING_ERROR_INVALID_PARAMETER;
337 int ret = tts_config_mgr_set_voice(language, (int)voice_type);
339 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
341 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice : lang(%s) type(%d)", language, voice_type);
344 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
346 return __setting_convert_config_error_code(ret);
349 int tts_setting_set_auto_voice(bool value)
351 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Set auto voice");
353 if (TTS_SETTING_STATE_NONE == g_state) {
354 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
355 return TTS_SETTING_ERROR_INVALID_STATE;
358 if (value != true && value != false) {
359 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value");
360 return TTS_SETTING_ERROR_INVALID_PARAMETER;
363 int ret = tts_config_mgr_set_auto_voice(value);
365 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
367 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set auto voice %s", value ? "on" : "off");
370 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
372 return __setting_convert_config_error_code(ret);
375 int tts_setting_get_auto_voice(bool* value)
377 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get auto voice");
379 if (TTS_SETTING_STATE_NONE == g_state) {
380 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
381 return TTS_SETTING_ERROR_INVALID_STATE;
385 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
386 return TTS_SETTING_ERROR_INVALID_PARAMETER;
389 int ret = tts_config_mgr_get_auto_voice(value);
391 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
393 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get auto voice : %d ", (int)*value);
396 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
398 return __setting_convert_config_error_code(ret);
401 int tts_setting_get_speed_range(int* min, int* normal, int* max)
403 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get speed range");
405 if (TTS_SETTING_STATE_NONE == g_state) {
406 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
407 return TTS_SETTING_ERROR_INVALID_STATE;
410 if (NULL == min || NULL == normal || NULL == max) {
411 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
412 return TTS_SETTING_ERROR_INVALID_PARAMETER;
415 *min = TTS_SPEED_MIN;
416 *normal = TTS_SPEED_NORMAL;
417 *max = TTS_SPEED_MAX;
419 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get speed range : min(%d) normal(%d) max(%d)", *min, *normal, *max);
421 return TTS_SETTING_ERROR_NONE;
424 int tts_setting_get_speed(int* speed)
426 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default speed");
428 if (TTS_SETTING_STATE_NONE == g_state) {
429 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
430 return TTS_SETTING_ERROR_INVALID_STATE;
434 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Param is NULL");
435 return TTS_SETTING_ERROR_INVALID_PARAMETER;
441 int ret = tts_config_mgr_get_speech_rate(&temp);
443 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
447 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default speed : %d ", *speed);
450 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
452 return __setting_convert_config_error_code(ret);
455 int tts_setting_set_speed(int speed)
457 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Set default speed");
459 if (TTS_SETTING_STATE_NONE == g_state) {
460 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
461 return TTS_SETTING_ERROR_INVALID_STATE;
464 if (TTS_SPEED_MIN > speed || speed > TTS_SPEED_MAX) {
465 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid speed");
466 return TTS_SETTING_ERROR_INVALID_PARAMETER;
469 int ret = tts_config_mgr_set_speech_rate(speed);
471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
473 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default speed, %d", speed);
476 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
478 return __setting_convert_config_error_code(ret);
481 int tts_setting_get_pitch_range(int* min, int* normal, int* max)
483 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get speed range");
485 if (TTS_SETTING_STATE_NONE == g_state) {
486 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
487 return TTS_SETTING_ERROR_INVALID_STATE;
490 if (NULL == min || NULL == normal || NULL == max) {
491 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
492 return TTS_SETTING_ERROR_INVALID_PARAMETER;
495 *min = TTS_PITCH_MIN;
496 *normal = TTS_PITCH_NORMAL;
497 *max = TTS_PITCH_MAX;
499 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get pitch range : min(%d) normal(%d) max(%d)", *min, *normal, *max);
501 return TTS_SETTING_ERROR_NONE;
504 int tts_setting_set_pitch(int pitch)
506 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Set default pitch");
508 if (TTS_SETTING_STATE_NONE == g_state) {
509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
510 return TTS_SETTING_ERROR_INVALID_STATE;
513 if (TTS_PITCH_MIN > pitch || pitch > TTS_PITCH_MAX) {
514 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid pitch");
515 return TTS_SETTING_ERROR_INVALID_PARAMETER;
518 int ret = tts_config_mgr_set_pitch(pitch);
520 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
522 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default pitch, %d", pitch);
525 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
527 return __setting_convert_config_error_code(ret);
530 int tts_setting_get_pitch(int* pitch)
532 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default pitch");
534 if (TTS_SETTING_STATE_NONE == g_state) {
535 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Not initialized");
536 return TTS_SETTING_ERROR_INVALID_STATE;
540 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is NULL");
541 return TTS_SETTING_ERROR_INVALID_PARAMETER;
547 int ret = tts_config_mgr_get_pitch(&temp);
549 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
553 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Get default pitch : %d ", *pitch);
556 return __setting_convert_config_error_code(ret);
559 int tts_setting_set_engine_changed_cb(tts_setting_engine_changed_cb callback, void* user_data)
561 if (NULL == callback) {
562 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input param is NULL");
563 return TTS_SETTING_ERROR_INVALID_PARAMETER;
566 g_engine_changed_cb = callback;
567 g_engine_changed_user_data = user_data;
569 return TTS_SETTING_ERROR_NONE;
572 int tts_setting_unset_engine_changed_cb()
574 g_engine_changed_cb = NULL;
575 g_engine_changed_user_data = NULL;
577 return TTS_SETTING_ERROR_NONE;
580 int tts_setting_set_voice_changed_cb(tts_setting_voice_changed_cb callback, void* user_data)
582 if (NULL == callback) {
583 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input param is NULL");
584 return TTS_SETTING_ERROR_INVALID_PARAMETER;
587 g_voice_changed_cb = callback;
588 g_voice_changed_user_data = user_data;
590 return TTS_SETTING_ERROR_NONE;
593 int tts_setting_unset_voice_changed_cb()
595 g_voice_changed_cb = NULL;
596 g_voice_changed_user_data = NULL;
598 return TTS_SETTING_ERROR_NONE;
601 int tts_setting_set_speed_changed_cb(tts_setting_speed_changed_cb callback, void* user_data)
603 if (NULL == callback) {
604 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input param is NULL");
605 return TTS_SETTING_ERROR_INVALID_PARAMETER;
608 g_speed_changed_cb = callback;
609 g_speed_changed_user_data = user_data;
611 return TTS_SETTING_ERROR_NONE;
614 int tts_setting_unset_speed_changed_cb()
616 g_speed_changed_cb = NULL;
617 g_speed_changed_user_data = NULL;
619 return TTS_SETTING_ERROR_NONE;
623 int tts_setting_set_pitch_changed_cb(tts_setting_pitch_changed_cb callback, void* user_data)
625 if (NULL == callback) {
626 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input param is NULL");
627 return TTS_SETTING_ERROR_INVALID_PARAMETER;
630 g_pitch_changed_cb = callback;
631 g_pitch_changed_user_data = user_data;
633 return TTS_SETTING_ERROR_NONE;
636 int tts_setting_unset_pitch_changed_cb()
638 g_pitch_changed_cb = NULL;
639 g_pitch_changed_user_data = NULL;
641 return TTS_SETTING_ERROR_NONE;