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.
15 #include "sttd_main.h"
16 #include "sttd_server.h"
18 #include "sttd_client_data.h"
19 #include "sttd_engine_agent.h"
20 #include "sttd_config.h"
21 #include "sttd_recorder.h"
22 #include "sttd_network.h"
23 #include "sttd_dbus.h"
26 * STT Server static variable
28 static bool g_is_engine;
30 static double g_state_check_time = 15.5;
33 * STT Server Callback Functions ` *
36 Eina_Bool __stop_by_silence(void *data)
38 SLOG(LOG_DEBUG, TAG_STTD, "===== Stop by silence detection");
42 uid = sttd_client_get_current_recording();
45 if (0 != sttd_server_stop(uid))
48 int ret = sttdc_send_set_state(uid, (int)APP_STATE_PROCESSING);
50 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send state : result(%d)", ret);
53 sttd_server_finalize(uid);
57 SLOG(LOG_DEBUG, TAG_STTD, "=====");
58 SLOG(LOG_DEBUG, TAG_STTD, " ");
63 int audio_recorder_callback(const void* data, const unsigned int length)
65 if (0 != sttd_engine_recognize_audio(data, length)) {
66 int uid = sttd_client_get_current_recording();
69 if (0 != sttd_client_get_state(uid, &state)) {
70 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is not valid ");
74 if (APP_STATE_RECORDING != state) {
75 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording");
79 ecore_timer_add(0, __stop_by_silence, NULL);
81 /*if (0 != sttd_send_stop_recognition_by_daemon(uid)) {
82 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail ");
84 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] <<<< stop message : uid(%d)", uid);
93 void sttd_server_recognition_result_callback(sttp_result_event_e event, const char* type,
94 const char** data, int data_count, const char* msg, void *user_data)
96 SLOG(LOG_DEBUG, TAG_STTD, "===== Recognition Result Callback");
98 if (NULL == user_data) {
99 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] user data is NULL");
100 SLOG(LOG_DEBUG, TAG_STTD, "=====");
101 SLOG(LOG_DEBUG, TAG_STTD, " ");
106 int *uid = (int*)user_data;
108 SLOG(LOG_DEBUG, TAG_STTD, "[Server] uid (%d), event(%d)", *uid, event);
111 if (0 != sttd_client_get_state(*uid, &state)) {
112 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
113 SLOG(LOG_DEBUG, TAG_STTD, "=====");
114 SLOG(LOG_DEBUG, TAG_STTD, " ");
118 /* Delete timer for processing time out */
120 sttd_cliet_get_timer(*uid, &timer);
123 ecore_timer_del(timer);
125 /* send result to client */
126 if (STTP_RESULT_EVENT_SUCCESS == event && 0 < data_count && NULL != data) {
128 if (APP_STATE_PROCESSING == state ) {
129 SLOG(LOG_DEBUG, TAG_STTD, "[Server] the size of result from engine is '%d' %s", data_count);
131 if (0 != sttdc_send_result(*uid, type, data, data_count, msg)) {
132 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send result");
133 int reason = (int)STTD_ERROR_OPERATION_FAILED;
135 if (0 != sttdc_send_error_signal(*uid, reason, "Fail to send recognition result")) {
136 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info . Remove client data");
140 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] Current state is NOT thinking.");
142 } else if (STTP_RESULT_EVENT_NO_RESULT == event || STTP_RESULT_EVENT_ERROR == event) {
144 if (APP_STATE_PROCESSING == state ) {
145 if (0 != sttdc_send_result(*uid, type, NULL, 0, msg)) {
146 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send result ");
149 int reason = (int)STTD_ERROR_INVALID_STATE;
150 if (0 != sttdc_send_error_signal(*uid, reason, "[ERROR] Fail to send recognition result")) {
151 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info ");
155 SLOG(LOG_WARN, TAG_STTD, "[Server ERROR] Current state is NOT thinking.");
161 /* change state of uid */
162 sttd_client_set_state(*uid, APP_STATE_READY);
164 if (NULL != user_data)
167 SLOG(LOG_DEBUG, TAG_STTD, "=====");
168 SLOG(LOG_DEBUG, TAG_STTD, " ");
173 void sttd_server_partial_result_callback(sttp_result_event_e event, const char* data, void *user_data)
175 SLOG(LOG_DEBUG, TAG_STTD, "===== Partial Result Callback");
178 int *uid = (int*)user_data;
180 SLOG(LOG_DEBUG, TAG_STTD, "[Server] uid (%d), event(%d)", uid, event);
183 if (0 != sttd_client_get_state(*uid, &state)) {
184 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
185 SLOG(LOG_DEBUG, TAG_STTD, "=====");
186 SLOG(LOG_DEBUG, TAG_STTD, " ");
190 /* send result to client */
191 if (STTP_RESULT_EVENT_SUCCESS == event && NULL != data) {
192 if (0 != sttdc_send_partial_result(*uid, data)) {
193 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send partial result");
197 SLOG(LOG_DEBUG, TAG_STTD, "=====");
198 SLOG(LOG_DEBUG, TAG_STTD, " ");
201 void sttd_server_silence_dectection_callback(void *user_param)
203 SLOG(LOG_DEBUG, TAG_STTD, "===== Silence Detection Callback");
205 int uid = sttd_client_get_current_recording();
208 if (0 != sttd_client_get_state(uid, &state)) {
209 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is not valid ");
213 if (APP_STATE_RECORDING != state) {
214 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording");
218 ecore_timer_add(0, __stop_by_silence, NULL);
220 SLOG(LOG_DEBUG, TAG_STTD, "=====");
221 SLOG(LOG_DEBUG, TAG_STTD, " ");
230 int sttd_initialize()
234 if (sttd_config_initialize()) {
235 SLOG(LOG_ERROR, TAG_STTD, "[Server WARNING] Fail to initialize config.");
239 ret = sttd_recorder_init();
241 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to initialize recorder : result(%d)", ret);
245 /* Engine Agent initialize */
246 ret = sttd_engine_agent_init(sttd_server_recognition_result_callback, sttd_server_partial_result_callback,
247 sttd_server_silence_dectection_callback);
249 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to engine agent initialize : result(%d)", ret);
253 if (0 != sttd_engine_agent_initialize_current_engine()) {
254 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is No STT-Engine !!!!!");
260 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] initialize");
265 Eina_Bool sttd_cleanup_client(void *data)
267 int* client_list = NULL;
268 int client_count = 0;
270 if (0 != sttd_client_get_list(&client_list, &client_count))
273 if (NULL == client_list)
279 SLOG(LOG_DEBUG, TAG_STTD, "===== Clean up client ");
281 for (i = 0;i < client_count;i++) {
282 result = sttdc_send_hello(client_list[i]);
285 SLOG(LOG_DEBUG, TAG_STTD, "[Server] uid(%d) should be removed.", client_list[i]);
286 sttd_server_finalize(client_list[i]);
287 } else if (-1 == result) {
288 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Hello result has error");
292 SLOG(LOG_DEBUG, TAG_STTD, "=====");
293 SLOG(LOG_DEBUG, TAG_STTD, " ");
301 * STT Server Functions for Client
304 int sttd_server_initialize(int pid, int uid, bool* silence, bool* profanity, bool* punctuation)
306 if (false == g_is_engine) {
307 if (0 != sttd_engine_agent_initialize_current_engine()) {
308 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] No Engine");
310 return STTD_ERROR_ENGINE_NOT_FOUND;
316 /* check if uid is valid */
318 if (0 == sttd_client_get_state(uid, &state)) {
319 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid has already been registered");
320 return STTD_ERROR_INVALID_PARAMETER;
323 /* load if engine is unloaded */
324 if (0 == sttd_client_get_ref_count()) {
325 if (0 != sttd_engine_agent_load_current_engine()) {
326 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to load current engine");
327 return STTD_ERROR_OPERATION_FAILED;
331 /* initialize recorder using audio format from engine */
332 sttp_audio_type_e atype;
336 if (0 != sttd_engine_get_audio_format(&atype, &rate, &channels)) {
337 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get audio format of engine.");
338 return STTD_ERROR_OPERATION_FAILED;
341 sttd_recorder_channel sttchannel = STTD_RECORDER_CHANNEL_MONO;
342 sttd_recorder_audio_type sttatype = STTD_RECORDER_PCM_S16;
345 case STTP_AUDIO_TYPE_PCM_S16_LE: sttatype = STTD_RECORDER_PCM_S16; break;
346 case STTP_AUDIO_TYPE_PCM_U8: sttatype = STTD_RECORDER_PCM_U8; break;
347 case STTP_AUDIO_TYPE_AMR: sttatype = STTD_RECORDER_AMR; break;
350 sttd_engine_agent_unload_current_engine();
351 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Invalid Audio Type");
352 return STTD_ERROR_OPERATION_FAILED;
357 case 1: sttchannel = STTD_RECORDER_CHANNEL_MONO; break;
358 case 2: sttchannel = STTD_RECORDER_CHANNEL_STEREO; break;
359 default: sttchannel = STTD_RECORDER_CHANNEL_MONO; break;
362 if (0 != sttd_recorder_set(sttatype, sttchannel, rate, 60, audio_recorder_callback)) {
363 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set recorder");
364 return STTD_ERROR_OPERATION_FAILED;
367 SLOG(LOG_DEBUG, TAG_STTD, "[Server] audio type(%d), channel(%d)", (int)atype, (int)sttchannel);
369 /* Add client information to client manager */
370 if (0 != sttd_client_add(pid, uid)) {
371 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to add client info");
372 return STTD_ERROR_OPERATION_FAILED;
375 if (0 != sttd_engine_get_option_supported(silence, profanity, punctuation)) {
376 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine options supported");
377 return STTD_ERROR_OPERATION_FAILED;
380 SLOG(LOG_DEBUG, TAG_STTD, "[Server Success] Initialize");
382 return STTD_ERROR_NONE;
385 int sttd_server_finalize(const int uid)
387 /* check if uid is valid */
389 if (0 != sttd_client_get_state(uid, &state)) {
390 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
391 return STTD_ERROR_INVALID_PARAMETER;
394 /* release recorder */
395 if (APP_STATE_RECORDING == state || APP_STATE_PROCESSING == state) {
396 sttd_recorder_cancel();
397 sttd_engine_recognize_cancel();
400 /* Remove client information */
401 if (0 != sttd_client_delete(uid)) {
402 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to delete client");
405 /* unload engine, if ref count of client is 0 */
406 if (0 == sttd_client_get_ref_count()) {
407 if (0 != sttd_engine_agent_unload_current_engine()) {
408 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to unload current engine");
410 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] unload current engine");
414 return STTD_ERROR_NONE;
417 int sttd_server_get_supported_languages(const int uid, GList** lang_list)
419 /* check if uid is valid */
421 if (0 != sttd_client_get_state(uid, &state)) {
422 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
423 return STTD_ERROR_INVALID_PARAMETER;
426 /* get language list from engine */
427 int ret = sttd_engine_supported_langs(lang_list);
429 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get supported languages");
430 return STTD_ERROR_OPERATION_FAILED;
433 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] sttd_server_get_supported_languages");
435 return STTD_ERROR_NONE;
438 int sttd_server_get_current_langauage(const int uid, char** current_lang)
440 /* check if uid is valid */
442 if (0 != sttd_client_get_state(uid, &state)) {
443 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
444 return STTD_ERROR_INVALID_PARAMETER;
447 if (NULL == current_lang) {
448 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
449 return STTD_ERROR_INVALID_PARAMETER;
452 /*get current language from engine */
453 int ret = sttd_engine_get_default_lang(current_lang);
455 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get default language :result(%d)", ret);
456 return STTD_ERROR_OPERATION_FAILED;
459 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] sttd_engine_get_default_lang");
461 return STTD_ERROR_NONE;
464 int sttd_server_is_partial_result_supported(int uid, int* partial_result)
466 /* check if uid is valid */
468 if (0 != sttd_client_get_state(uid, &state)) {
469 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
470 return STTD_ERROR_INVALID_PARAMETER;
473 if (NULL == partial_result) {
474 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
475 return STTD_ERROR_INVALID_PARAMETER;
479 int ret = sttd_engine_is_partial_result_supported(&temp);
481 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get partial result supported : result(%d)", ret);
482 return STTD_ERROR_OPERATION_FAILED;
485 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] Partial result supporting is %s", temp ? "true" : "false");
487 return STTD_ERROR_NONE;
490 int sttd_server_get_audio_volume( const int uid, float* current_volume)
492 /* check if uid is valid */
494 if (0 != sttd_client_get_state(uid, &state)) {
495 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
496 return STTD_ERROR_INVALID_PARAMETER;
499 /* check uid state */
500 if (APP_STATE_RECORDING != state) {
501 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording");
502 return STTD_ERROR_INVALID_STATE;
505 if (NULL == current_volume) {
506 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
507 return STTD_ERROR_INVALID_PARAMETER;
510 /* get audio volume from recorder */
511 int ret = sttd_recorder_get_volume(current_volume);
513 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get volume : result(%d)", ret);
514 return STTD_ERROR_OPERATION_FAILED;
517 return STTD_ERROR_NONE;
520 Eina_Bool __check_recording_state(void *data)
523 int uid = sttd_client_get_current_recording();
528 if (0 != sttdc_send_get_state(uid, (int*)&state)) {
529 /* client is removed */
530 SLOG(LOG_DEBUG, TAG_STTD, "[Server] uid(%d) should be removed.", uid);
531 sttd_server_finalize(uid);
535 if (APP_STATE_READY == state) {
537 SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Ready'. The daemon should cancel recording", uid);
538 sttd_server_cancel(uid);
539 } else if (APP_STATE_PROCESSING == state) {
540 /* Cancel stt and send change state */
541 SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Processing'. The daemon should cancel recording", uid);
542 sttd_server_cancel(uid);
543 sttdc_send_set_state(uid, (int)APP_STATE_READY);
546 SLOG(LOG_DEBUG, TAG_STTD, "[Server] The states of daemon and client are identical");
553 int sttd_server_start(const int uid, const char* lang, const char* recognition_type,
554 int profanity, int punctuation, int silence)
556 /* check if uid is valid */
558 if (0 != sttd_client_get_state(uid, &state)) {
559 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
560 return STTD_ERROR_INVALID_PARAMETER;
563 /* check uid state */
564 if (APP_STATE_READY != state) {
565 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] sttd_server_start : current state is not ready");
566 return STTD_ERROR_INVALID_STATE;
569 if (0 < sttd_client_get_current_recording()) {
570 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current STT Engine is busy because of recording");
571 return STTD_ERROR_RECORDER_BUSY;
574 if (0 < sttd_client_get_current_thinking()) {
575 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current STT Engine is busy because of thinking");
576 return STTD_ERROR_RECORDER_BUSY;
579 /* check if engine use network */
580 if (true == sttd_engine_agent_need_network()) {
581 if (false == sttd_network_is_connected()) {
582 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Disconnect network. Current engine needs to network connection.");
583 return STTD_ERROR_OUT_OF_NETWORK;
587 /* engine start recognition */
589 user_data = (int*)malloc( sizeof(int) * 1);
591 /* free on result callback */
594 SLOG(LOG_DEBUG, TAG_STTD, "[Server] start : uid(%d), lang(%s), recog_type(%s)", *user_data, lang, recognition_type );
596 int ret = sttd_engine_recognize_start((char*)lang, recognition_type, profanity, punctuation, silence, (void*)user_data);
598 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to start recognition : result(%d)", ret);
599 return STTD_ERROR_OPERATION_FAILED;
603 ret = sttd_recorder_start();
605 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to start recorder : result(%d)", ret);
606 sttd_engine_recognize_cancel();
607 return STTD_ERROR_OPERATION_FAILED;
610 SLOG(LOG_DEBUG, TAG_STTD, "[Server] start recording");
612 /* change uid state */
613 sttd_client_set_state(uid, APP_STATE_RECORDING);
615 Ecore_Timer* timer = ecore_timer_add(g_state_check_time, __check_recording_state, NULL);
616 sttd_cliet_set_timer(uid, timer);
618 return STTD_ERROR_NONE;
621 Eina_Bool __time_out_for_processing(void *data)
624 int uid = sttd_client_get_current_thinking();
629 int ret = sttd_engine_recognize_cancel();
631 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
634 if (0 != sttdc_send_result(uid, STTP_RECOGNITION_TYPE_FREE, NULL, 0, "Time out not to receive recognition result.")) {
635 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send result ");
638 int reason = (int)STTD_ERROR_TIMED_OUT;
639 if (0 != sttdc_send_error_signal(uid, reason, "[ERROR] Fail to send recognition result")) {
640 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info ");
644 /* Change uid state */
645 sttd_client_set_state(uid, APP_STATE_READY);
651 int sttd_server_stop(const int uid)
653 /* check if uid is valid */
655 if (0 != sttd_client_get_state(uid, &state)) {
656 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
657 return STTD_ERROR_INVALID_PARAMETER;
660 /* check uid state */
661 if (APP_STATE_RECORDING != state) {
662 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Current state is not recording");
663 return STTD_ERROR_INVALID_STATE;
667 sttd_recorder_stop();
669 /* stop engine recognition */
670 int ret = sttd_engine_recognize_stop();
672 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop : result(%d)", ret);
673 sttd_client_set_state(uid, APP_STATE_READY);
675 return STTD_ERROR_OPERATION_FAILED;
679 sttd_cliet_get_timer(uid, &timer);
682 ecore_timer_del(timer);
684 /* change uid state */
685 sttd_client_set_state(uid, APP_STATE_PROCESSING);
687 timer = ecore_timer_add(g_state_check_time, __time_out_for_processing, NULL);
688 sttd_cliet_set_timer(uid, timer);
690 return STTD_ERROR_NONE;
693 int sttd_server_cancel(const int uid)
695 /* check if uid is valid */
697 if (0 != sttd_client_get_state(uid, &state)) {
698 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] uid is NOT valid ");
699 return STTD_ERROR_INVALID_PARAMETER;
702 /* check uid state */
703 if (APP_STATE_READY == state) {
704 SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] Current state is ready");
705 return STTD_ERROR_INVALID_STATE;
709 if (APP_STATE_RECORDING == state)
710 sttd_recorder_cancel();
712 /* cancel engine recognition */
713 int ret = sttd_engine_recognize_cancel();
715 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
716 return STTD_ERROR_OPERATION_FAILED;
720 sttd_cliet_get_timer(uid, &timer);
721 ecore_timer_del(timer);
723 /* change uid state */
724 sttd_client_set_state(uid, APP_STATE_READY);
726 return STTD_ERROR_NONE;
730 /******************************************************************************************
731 * STT Server Functions for setting
732 *******************************************************************************************/
734 int sttd_server_setting_initialize(int pid)
736 if (false == g_is_engine) {
737 if (0 != sttd_engine_agent_initialize_current_engine()) {
738 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] No Engine");
740 return STTD_ERROR_ENGINE_NOT_FOUND;
746 /* check whether pid is valid */
747 if (true == sttd_setting_client_is(pid)) {
748 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
749 return STTD_ERROR_INVALID_PARAMETER;
752 /* load if engine is unloaded */
753 if (0 == sttd_client_get_ref_count()) {
754 if (0 != sttd_engine_agent_load_current_engine()) {
755 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to load current engine");
756 return STTD_ERROR_OPERATION_FAILED;
760 /* Add setting client information to client manager (For internal use) */
761 if (0 != sttd_setting_client_add(pid)) {
762 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to add setting client");
763 return STTD_ERROR_OPERATION_FAILED;
766 return STTD_ERROR_NONE;
769 int sttd_server_setting_finalize(int pid)
771 /* Remove client information */
772 if (0 != sttd_setting_client_delete(pid)) {
773 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to delete setting client");
776 /* unload engine, if ref count of client is 0 */
777 if (0 == sttd_client_get_ref_count()) {
778 if (0 != sttd_engine_agent_unload_current_engine()) {
779 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to unload current engine");
781 SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] unload current engine");
785 return STTD_ERROR_NONE;
788 int sttd_server_setting_get_engine_list(int pid, GList** engine_list)
790 /* check whether pid is valid */
791 if (true != sttd_setting_client_is(pid)) {
792 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
793 return STTD_ERROR_INVALID_PARAMETER;
796 if (NULL == engine_list) {
797 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
798 return STTD_ERROR_INVALID_PARAMETER;
801 int ret = sttd_engine_setting_get_engine_list(engine_list);
803 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine list : result(%d)", ret);
807 return STTD_ERROR_NONE;
810 int sttd_server_setting_get_engine(int pid, char** engine_id)
812 /* check whether pid is valid */
813 if (true != sttd_setting_client_is(pid)) {
814 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
815 return STTD_ERROR_INVALID_PARAMETER;
818 if (NULL == engine_id) {
819 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
820 return STTD_ERROR_INVALID_PARAMETER;
824 int ret = sttd_engine_setting_get_engine(engine_id);
826 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine : result(%d)", ret);
830 return STTD_ERROR_NONE;
833 int sttd_server_setting_set_engine(int pid, const char* engine_id)
835 /* check whether pid is valid */
836 if (true != sttd_setting_client_is(pid)) {
837 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
838 return STTD_ERROR_INVALID_PARAMETER;
841 if (NULL == engine_id) {
842 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
843 return STTD_ERROR_INVALID_PARAMETER;
847 int ret = sttd_engine_setting_set_engine(engine_id);
849 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set engine : result(%d)", ret);
853 return STTD_ERROR_NONE;
856 int sttd_server_setting_get_lang_list(int pid, char** engine_id, GList** lang_list)
858 /* check whether pid is valid */
859 if (true != sttd_setting_client_is(pid)) {
860 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
861 return STTD_ERROR_INVALID_PARAMETER;
864 if (NULL == lang_list) {
865 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] language is NULL");
866 return STTD_ERROR_INVALID_PARAMETER;
869 int ret = sttd_engine_setting_get_lang_list(engine_id, lang_list);
871 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get language list : result(%d)", ret);
875 return STTD_ERROR_NONE;
878 int sttd_server_setting_get_default_language(int pid, char** language)
880 /* check whether pid is valid */
881 if (true != sttd_setting_client_is(pid)) {
882 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
883 return STTD_ERROR_INVALID_PARAMETER;
886 if (NULL == language) {
887 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] language is NULL");
888 return STTD_ERROR_INVALID_PARAMETER;
891 int ret = sttd_engine_setting_get_default_lang(language);
893 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get default language : result(%d)", ret);
897 return STTD_ERROR_NONE;
900 int sttd_server_setting_set_default_language(int pid, const char* language)
902 /* check whether pid is valid */
903 if (true != sttd_setting_client_is(pid)) {
904 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
905 return STTD_ERROR_INVALID_PARAMETER;
908 if (NULL == language) {
909 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] language is NULL");
910 return STTD_ERROR_INVALID_PARAMETER;
913 int ret = sttd_engine_setting_set_default_lang((char*)language);
915 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set default lang : result(%d)", ret);
919 return STTD_ERROR_NONE;
922 int sttd_server_setting_get_profanity_filter(int pid, bool* value)
924 /* check whether pid is valid */
925 if (true != sttd_setting_client_is(pid)) {
926 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
927 return STTD_ERROR_INVALID_PARAMETER;
931 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
932 return STTD_ERROR_INVALID_PARAMETER;
936 ret = sttd_engine_setting_get_profanity_filter(value);
938 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get profanity filter : result(%d)", ret);
942 return STTD_ERROR_NONE;
945 int sttd_server_setting_set_profanity_filter(int pid, bool value)
947 /* check whether pid is valid */
948 if (true != sttd_setting_client_is(pid)) {
949 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
950 return STTD_ERROR_INVALID_PARAMETER;
954 ret = sttd_engine_setting_set_profanity_filter(value);
956 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set profanity filter: result(%d)", ret);
960 return STTD_ERROR_NONE;
963 int sttd_server_setting_get_punctuation_override(int pid, bool* value)
965 /* check whether pid is valid */
966 if (true != sttd_setting_client_is(pid)) {
967 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
968 return STTD_ERROR_INVALID_PARAMETER;
972 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
973 return STTD_ERROR_INVALID_PARAMETER;
977 ret = sttd_engine_setting_get_punctuation_override(value);
979 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get punctuation override : result(%d)", ret);
983 return STTD_ERROR_NONE;
986 int sttd_server_setting_set_punctuation_override(int pid, bool value)
988 /* check whether pid is valid */
989 if (true != sttd_setting_client_is(pid)) {
990 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
991 return STTD_ERROR_INVALID_PARAMETER;
995 ret = sttd_engine_setting_set_punctuation_override(value);
997 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set punctuation override : result(%d)", ret);
1001 return STTD_ERROR_NONE;
1004 int sttd_server_setting_get_silence_detection(int pid, bool* value)
1006 /* check whether pid is valid */
1007 if (true != sttd_setting_client_is(pid)) {
1008 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
1009 return STTD_ERROR_INVALID_PARAMETER;
1012 if (NULL == value) {
1013 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Input parameter is NULL");
1014 return STTD_ERROR_INVALID_PARAMETER;
1018 ret = sttd_engine_setting_get_silence_detection(value);
1020 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get silence detection : result(%d)", ret);
1024 return STTD_ERROR_NONE;
1027 int sttd_server_setting_set_silence_detection(int pid, bool value)
1029 /* check whether pid is valid */
1030 if (true != sttd_setting_client_is(pid)) {
1031 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
1032 return STTD_ERROR_INVALID_PARAMETER;
1036 ret = sttd_engine_setting_set_silence_detection(value);
1038 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to Result(%d)", ret);
1042 return STTD_ERROR_NONE;
1045 int sttd_server_setting_get_engine_setting(int pid, char** engine_id, GList** lang_list)
1047 /* check whether pid is valid */
1048 if (true != sttd_setting_client_is(pid)) {
1049 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
1050 return STTD_ERROR_INVALID_PARAMETER;
1053 if (0 != sttd_engine_setting_get_engine_setting_info(engine_id, lang_list)) {
1054 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine setting info");
1055 return STTD_ERROR_OPERATION_FAILED;
1058 return STTD_ERROR_NONE;
1061 int sttd_server_setting_set_engine_setting(int pid, const char* key, const char* value)
1063 /* check whether pid is valid */
1064 if (true != sttd_setting_client_is(pid)) {
1065 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Setting pid is NOT valid ");
1066 return STTD_ERROR_INVALID_PARAMETER;
1069 if (0 != sttd_engine_setting_set_engine_setting(key, value)) {
1070 SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set engine setting info");
1071 return STTD_ERROR_OPERATION_FAILED;
1074 return STTD_ERROR_NONE;