2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
29 #include "candidate-factory.h"
30 #include "ise-stt-mode.h"
31 #include "ise-stt-option.h"
32 #include "ise-stt-common.h"
34 #define _EDJ(x) elm_layout_edje_get(x)
36 #define STT_EDJ_FILE "edje/" PROFILE_NAME"/w-input-stt.edj"
38 static VoiceData *my_voicedata = NULL;
41 static void set_guide_text(VoiceData *vd, const char* text, bool translatable = false);
44 void voice_result_string_flush()
46 if (my_voicedata && my_voicedata->partial_result) {
47 SECURE_LOGD("***** result_text : %s *******", my_voicedata->partial_result);
48 const int BUF_LEN = 256;
49 char retStr[BUF_LEN] = {0};
50 snprintf(retStr, BUF_LEN, "%s", my_voicedata->partial_result);
51 ise_send_string(retStr);
57 if (my_voicedata != NULL) {
59 my_voicedata->state = STT_STATE_VAL_INIT;
60 my_voicedata->sttmanager->Stop();
62 catch (is::stt::SttException &e) {
67 void send_result_text(void *data)
72 VoiceData* voicedata = (VoiceData*)data;
73 SECURE_LOGD("result_text = %s", voicedata->partial_result);
74 ise_update_preedit_string(voicedata->partial_result);
77 void voice_get_string(const char *keyValue, VoiceData *voicedata)
84 strbuf = elm_entry_utf8_to_markup(keyValue);
86 SECURE_LOGD("text : %s, voicedata->partial_result=%s", strbuf, voicedata->partial_result);
89 if (voicedata->partial_result) { // partial_result is not Null so replace
90 if (strcmp(voicedata->partial_result, strbuf)) {
92 LOGD("different replace");
94 voicedata->stt_results.pop_back();
95 voicedata->stt_results.push_back(strbuf);
97 free(voicedata->partial_result);
98 voicedata->partial_result = strdup(strbuf);
100 } else { // partial_result is Null so first case
102 voicedata->stt_results.push_back(strbuf);
103 voicedata->partial_result = strdup(strbuf);
107 send_result_text(voicedata);
115 static Eina_Bool _recognition_failure_cb(void *data)
117 VoiceData *voicedata = (VoiceData *) data;
118 if (!voicedata) return ECORE_CALLBACK_CANCEL;
120 voicedata->state = STT_STATE_VAL_INIT;
121 set_animation_state(voicedata);
122 voicedata->refresh_timer = NULL;
124 return ECORE_CALLBACK_CANCEL;
128 static Eina_Bool change_guide_text(void *data){
129 VoiceData *voicedata = (VoiceData *) data;
130 if (!voicedata || !voicedata->sttmanager) return ECORE_CALLBACK_CANCEL;
132 stt_state_e state = voicedata->sttmanager->GetCurrent();
133 if (state == STT_STATE_RECORDING || state == STT_STATE_PROCESSING)
134 elm_object_domain_translatable_part_text_set(voicedata->layout_main, "elm.text", PACKAGE, SK_TAP_TO_PAUSE);
136 return ECORE_CALLBACK_CANCEL;
139 static void set_guide_text(VoiceData *vd, const char* text, bool translatable)
142 elm_object_signal_emit(vd->layout_main, "idle,state,guide_text,bottom", "elm");
144 elm_object_signal_emit(vd->layout_main, "idle,state,guide_text,up", "elm");
148 elm_object_domain_translatable_part_text_set(vd->layout_main, "elm.text", PACKAGE, text);
150 elm_object_part_text_set(vd->layout_main, "elm.text", text);
152 if (!strcmp(text, SK_SPEAK_NOW)) {
153 if (vd->guide_text_timer == NULL)
154 vd->guide_text_timer = ecore_timer_add(1.0, change_guide_text, vd);
159 void start_by_press(VoiceData *voicedata)
161 LOGD("start_by_press ");
163 edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "MIC_ICON");
165 edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
169 static void on_mic_button_press_cb(void *data, Evas_Object *obj, void *event_info)
171 LOGD("on_mic_button_press_cb");
172 VoiceData *voicedata = (VoiceData *)data;
173 if (!voicedata) return;
175 if (voicedata->sttmanager != NULL &&
176 (voicedata->sttmanager->GetCurrent() == STT_STATE_RECORDING
177 || voicedata->sttmanager->GetCurrent() == STT_STATE_PROCESSING)) {
179 voicedata->state = STT_STATE_VAL_INIT;
180 voicedata->sttmanager->Stop();
182 edje_object_signal_emit(_EDJ(voicedata->layout_main), "elm,state,init", "elm");
183 elm_object_part_text_set(voicedata->layout_main, "switch.text", "Off");
186 catch (is::stt::SttException &e) {
189 if (voicedata->effector)
190 voicedata->effector->Stop(true);
192 if (NULL != voicedata->start_timer) {
193 ecore_timer_del(voicedata->start_timer);
194 voicedata->start_timer = NULL;
196 if (NULL != voicedata->guide_text_timer) {
197 ecore_timer_del(voicedata->guide_text_timer);
198 voicedata->guide_text_timer = NULL;
200 if (NULL != voicedata->init_timer) {
201 ecore_timer_del(voicedata->init_timer);
202 voicedata->init_timer = NULL;
204 if (NULL != voicedata->refresh_timer) {
205 ecore_timer_del(voicedata->refresh_timer);
206 voicedata->refresh_timer = NULL;
209 if (NULL != voicedata->guide_text_timer) {
210 ecore_timer_del(voicedata->guide_text_timer);
211 voicedata->guide_text_timer = NULL;
214 elm_object_part_text_set(voicedata->layout_main, "switch.text", "On");
215 edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "MIC_ICON");
217 edje_object_signal_emit(_EDJ(voicedata->layout_main), "mouse,clicked,1", "background");
222 static Eina_Bool _mic_button_enable_cb(void *data)
224 VoiceData* voicedata = (VoiceData*)data;
225 if (!voicedata) return ECORE_CALLBACK_CANCEL;
227 voicedata->btn_disabling_timer = NULL;
229 Evas_Object *button = (Evas_Object *)voicedata->mic_button;
230 elm_object_disabled_set(button, EINA_FALSE);
232 return ECORE_CALLBACK_CANCEL;
235 void init_customizing_theme(void)
237 char *resource_path = app_get_resource_path();
239 std::string stt_edj_path = resource_path;
240 stt_edj_path = stt_edj_path + STT_EDJ_FILE;
241 elm_theme_extension_add(NULL, stt_edj_path.c_str());
246 bool _app_stt_initialize(VoiceData *voice_data)
248 LOGD("_app_stt_initialize ");
249 VoiceData *vd = (VoiceData *)voice_data;
250 if (!vd) return false;
253 if (vd->sttmanager) {
254 vd->sttmanager->Cancel();
255 delete vd->sttmanager;
256 vd->sttmanager = NULL;
259 if (vd->sttfeedback) {
260 delete vd->sttfeedback;
261 vd->sttfeedback = NULL;
264 vd->sttfeedback = new is::stt::SttFeedback();
265 if (vd->sttfeedback) {
266 vd->sttfeedback->SetVoiceData(vd);
268 vd->sttmanager = new is::stt::SttManager(*(vd->sttfeedback));
270 vd->sttmanager->Prepare();
272 LOGW("Failed to allocate SttManager");
274 LOGW("Failed to allocate SttFeedback");
276 } catch(std::exception &e) {
277 LOGD("%s", e.what());
284 static Eina_Bool _idler_cb(void *data)
287 if (!data) return ECORE_CALLBACK_CANCEL;
289 if (my_voicedata == NULL) {
290 LOGD("_idler_cb : my_voicedata is null");
291 return ECORE_CALLBACK_CANCEL;
294 VoiceData *voicedata = (VoiceData *)data;
296 if (true == _app_stt_initialize(voicedata)) {
297 LOGD("_app_stt_initialize None Error");
298 voicedata->voicefw_state = 1;
299 voicedata->state = STT_STATE_VAL_INIT;
301 voicedata->voicefw_state = 0;
302 LOGD("Initialization Fail!<br>Check STT-daemon is running");
305 Evas_Object *canvas = elm_object_part_content_get(voicedata->layout_main, "EFFECT_BG");
307 is::ui::WInputSttMicEffect *ieffect = new is::ui::WInputSttMicEffect();
308 if (ieffect && voicedata->sttmanager) {
309 ieffect->SetSttHandle(voicedata->sttmanager->GetSttHandle());
312 is::ui::MicEffector *effector = new is::ui::MicEffector(canvas, voicedata->layout_main, *ieffect);
313 voicedata->ieffect = ieffect;
314 voicedata->effector = effector;
316 if (ieffect && voicedata->progressbar) {
317 ieffect->SetProgressBar(voicedata->progressbar);
320 elm_access_highlight_set(voicedata->mic_button);
322 return ECORE_CALLBACK_CANCEL;
326 * @brief - function to send the signal to edc
327 * to change the animation as per stt state
330 void set_animation_state(VoiceData *voicedata)
332 if (voicedata->state == STT_STATE_VAL_INIT) {
334 if (voicedata->sttmanager->GetCurrent() == STT_STATE_READY) {
335 set_guide_text(voicedata, "", false);
336 //_elm_access_say(voicedata->layout_main, _(SK_INIT));
338 PRINTFUNC(DLOG_DEBUG, "SK_NETWORK_ERROR [%d]", voicedata->sttmanager->GetCurrent());
339 set_guide_text(voicedata, _(SK_NETWORK_ERROR));
340 //_elm_access_say(voicedata->layout_main, _(SK_NETWORK_CONNECTION_ERROR));
344 if (voicedata->effector)
345 voicedata->effector->Stop(true);
347 set_guide_text(voicedata, SK_TAP_TO_SPEAK, true);
349 } else if (voicedata->state == STT_STATE_VAL_LISTENING) {
351 set_guide_text(voicedata, SK_SPEAK_NOW, true);
353 if (voicedata->effector)
354 voicedata->effector->Start();
356 } else if (voicedata->state == STT_STATE_VAL_PROCESSING) {
358 set_guide_text(voicedata, "");
360 if (voicedata->effector)
361 voicedata->effector->Stop();
365 set_guide_text(voicedata, _(SK_RECOGNITION_FAILED));
367 //_elm_access_say(voicedata->layout_main, _(SK_RECOGNITION_FAILED));
369 voicedata->state = STT_STATE_VAL_NOT_RECOGNISED;
371 if (voicedata->refresh_timer) {
372 ecore_timer_del(voicedata->refresh_timer);
375 if (voicedata->effector)
376 voicedata->effector->Stop(true);
378 voicedata->refresh_timer = ecore_timer_add(2.0, _recognition_failure_cb, voicedata);
382 void show_error_message(VoiceData *vd, stt_error_e reason)
385 if (reason == STT_ERROR_OUT_OF_NETWORK) {
386 set_guide_text(vd, _(SK_NETWORK_ERROR));
387 vd->state = STT_STATE_VAL_INIT;
389 set_guide_text(vd, _(SK_STT_BUSY));
390 vd->state = STT_STATE_VAL_INIT;
393 vd->state = STT_STATE_VAL_INIT;
397 static Eina_Bool _start_timer_cb(void* data)
399 LOGD("_start_timer_cb");
401 VoiceData *voicedata = (VoiceData *) data;
402 if (!voicedata) return ECORE_CALLBACK_CANCEL;
405 voicedata->state = STT_STATE_VAL_PREPARE_LISTENING;
406 if (voicedata->sttmanager)
407 voicedata->sttmanager->Start();
409 catch (is::stt::SttException &e) {
411 if (e.GetEcode() == STT_ERROR_OUT_OF_NETWORK)
413 set_guide_text(voicedata, _(SK_NETWORK_ERROR));
414 voicedata->state = STT_STATE_VAL_INIT;
416 set_guide_text(voicedata, _(SK_STT_BUSY));
417 voicedata->state = STT_STATE_VAL_INIT;
420 voicedata->state = STT_STATE_VAL_INIT;
424 voicedata->start_timer = NULL;
426 return ECORE_CALLBACK_CANCEL;
430 * @brief - cancel button press callback for cross button
434 void on_initial_anim_press_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
436 LOGD("on_initial_anim_press_cb");
437 VoiceData *vd = (VoiceData *)data;
438 if (vd == NULL || vd->sttmanager == NULL)
441 int tempVal = vd->sttmanager->GetCurrent();
442 if (tempVal == STT_STATE_CREATED) {
443 LOGD("IGNORE TOUCH event before STT READY. STT is preparing");
447 LOGD("SttManager State : %d", vd->sttmanager->GetCurrent());
448 LOGD("Ui Voice State : %d", vd->state);
451 case STT_STATE_VAL_INIT:
452 LOGD("%s", "STT_STATE_VAL_INIT");
453 get_stt_default_language(vd);
454 vd->sttmanager->SetLanguage(std::string(vd->kbd_lang));
456 if (vd->start_timer) {
457 ecore_timer_del(vd->start_timer);
458 vd->start_timer = NULL;
461 vd->start_timer = ecore_timer_add(0.0, _start_timer_cb, vd);
464 case STT_STATE_VAL_LISTENING :
465 LOGD("%s", "STT_STATE_VAL_LISTENING");
467 vd->state = STT_STATE_VAL_PREPARE_PROCESSING;
468 vd->sttmanager->Stop();
471 * Cuased touch reponse time, it can be called to stop animator.
475 set_guide_text(vd, "");
479 vd->effector->Stop();
481 catch (is::stt::SttException &e) {
482 LOGD("%s", e.what());
483 if (e.GetEcode() != STT_ERROR_INVALID_STATE) {
485 set_guide_text(vd, _(SK_RECOGNITION_FAILED));
487 vd->state = STT_STATE_VAL_INIT;
490 vd->effector->Stop(true);
495 case STT_STATE_VAL_PROCESSING:
496 LOGD("%s", "STT_STATE_VAL_PROCESSING");
498 //vd->state = STT_STATE_VAL_PREPARE_CANCEL;
499 vd->sttmanager->Cancel();
501 catch (is::stt::SttException &e) {
504 vd->effector->Stop(true);
508 case STT_STATE_VAL_NOT_RECOGNISED:
509 LOGD("%s", "STT_STATE_VAL_NOT_RECOGNISED");
510 vd->state = STT_STATE_VAL_INIT ;
513 LOGD("default [%d]", vd->state);
518 static Evas_Object *create_progressbar(Evas_Object *parent)
520 Evas_Object *progressbar = NULL;
522 progressbar = elm_progressbar_add(parent);
523 elm_object_style_set(progressbar, "voice_input/process/small");
524 elm_progressbar_pulse(progressbar, EINA_TRUE);
526 evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
527 evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
529 //ea_theme_object_color_replace(progressbar, "B065L6", "AO012");
531 evas_object_show(progressbar);
536 int init_voicedata(VoiceData *r_voicedata)
538 VoiceData *voicedata = (VoiceData *)r_voicedata;
543 voicedata->voicefw_state = 0;
544 voicedata->voicefw_handle = NULL;
545 voicedata->win = NULL;
546 voicedata->layout_main = NULL;
547 voicedata->progressbar = NULL;
548 voicedata->scroller = NULL;
549 voicedata->main_entry = NULL;
550 voicedata->mic_button = NULL;
551 voicedata->state = STT_STATE_VAL_INIT;
552 voicedata->kbd_lang = NULL;
553 voicedata->start_timer = NULL;
554 voicedata->refresh_timer = NULL;
555 voicedata->progressbar_timer = NULL;
556 voicedata->textblock_timer = NULL;
557 voicedata->guide_text_timer = NULL;
558 voicedata->btn_disabling_timer = NULL;
559 voicedata->power_unlock_timer = NULL;
560 voicedata->init_timer = NULL;
562 voicedata->stt_results.clear();
563 voicedata->partial_result = NULL;
564 voicedata->result_type = 0;
565 voicedata->disclaimer = 0;
566 voicedata->sttfeedback = NULL;
567 voicedata->sttmanager = NULL;
568 voicedata->ieffect = NULL;
569 voicedata->effector = NULL;
574 int init_voice(Evas_Object *parent, const char *lang, VoiceData *r_voicedata)
578 VoiceData *voicedata = (VoiceData *)r_voicedata;
584 LOGD("Parent is NULL\n");
587 LOGD("Parent is there");
590 voicedata->voicefw_state = 0;
592 /* Set Voice Language */
593 if (voicedata->kbd_lang) {
594 free(voicedata->kbd_lang);
595 voicedata->kbd_lang = NULL;
598 //stt_get_default_language(my_voicedata->voicefw_handle, &my_voicedata->kbd_lang);
599 get_stt_default_language(voicedata);
600 if (NULL == voicedata->kbd_lang || FALSE == is_lang_supported_by_stt(voicedata->kbd_lang)) {
601 voicedata->kbd_lang = strdup("en_US");
604 LOGD("Voice input active language is : %s", voicedata->kbd_lang);
606 voicedata->win = parent;
608 if (NULL == voicedata->win) {
612 if (NULL != voicedata->textblock_timer) {
613 ecore_timer_del(voicedata->textblock_timer);
614 voicedata->textblock_timer = NULL;
616 LOGD("init_voice end");
621 Evas_Object *create_fullview(Evas_Object *win, VoiceData *r_voicedata)
623 LOGD("create_fullview");
625 VoiceData *voicedata = r_voicedata;
628 init_customizing_theme();
630 Evas_Object *layout_main = elm_layout_add(win);
631 evas_object_size_hint_weight_set(layout_main, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
632 evas_object_size_hint_align_set(layout_main, EVAS_HINT_FILL, EVAS_HINT_FILL);
634 voicedata->layout_main = layout_main;
636 std::string edj_path;
637 char *resource_path = app_get_resource_path();
639 edj_path = resource_path;
641 resource_path = NULL;
643 edj_path = edj_path + STT_EDJ_FILE;
644 LOGD("edj_path = %s", edj_path.c_str());
646 ret = elm_layout_file_set(layout_main, edj_path.c_str(), "mic_control");
647 LOGD("elm_layout_file_set result = %d", ret);
649 //Canvas for Cairo effect
650 Evas_Object *canvas = evas_object_image_filled_add(evas_object_evas_get(layout_main));
651 evas_object_propagate_events_set(canvas, EINA_TRUE);
652 evas_object_image_alpha_set(canvas, EINA_TRUE);
653 evas_object_size_hint_align_set(canvas, EVAS_HINT_FILL, EVAS_HINT_FILL);
654 evas_object_size_hint_weight_set(canvas, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
657 Candidate *candidate = get_candidate();
658 if (candidate && candidate->get_visible()){
660 ise_app_candidate_hide();
663 y = candidate->get_height();
666 read_ise_config_values();
667 CONFIG_VALUES *config_values = get_config_values();
668 if (config_values && config_values->floating_mode)
669 y += FLOATING_TITLE_BAR_HEIGHT;
670 evas_object_move(layout_main, 0, y);
671 elm_object_part_content_set(layout_main, "EFFECT_BG", canvas);
674 Evas_Object *m_mic_button = elm_button_add(layout_main);
675 elm_object_style_set(m_mic_button, "vic/micbutton");
676 elm_object_part_content_set(layout_main, "MIC", m_mic_button);
678 elm_object_disabled_set(m_mic_button, EINA_TRUE);
679 evas_object_smart_callback_add(m_mic_button, "clicked", on_mic_button_press_cb, (void *) voicedata);
681 voicedata->mic_button = m_mic_button;
683 if (voicedata->btn_disabling_timer == NULL) {
684 voicedata->btn_disabling_timer = ecore_timer_add(2.0, _mic_button_enable_cb, voicedata);
687 if (voicedata->init_timer == NULL) {
688 voicedata->init_timer = ecore_timer_add(0.6, _idler_cb, voicedata);
692 Evas_Object *progress_bar = create_progressbar(layout_main);
693 elm_object_part_content_set(layout_main, "PROGRESS_BAR", progress_bar);
694 voicedata->progressbar = progress_bar;
697 elm_object_signal_callback_add(layout_main, "idle,state,pulse,visible", "", on_initial_anim_press_cb, voicedata);
699 CSCLUI *ui = get_ui();
701 SCLDisplayMode display_mode = ui->get_display_mode();
702 if (display_mode >= 0 && display_mode < DISPLAYMODE_MAX) {
703 const char *input_mode = ui->get_input_mode();
705 SclSize rect = ui->get_input_mode_size(input_mode, display_mode);
706 CONFIG_VALUES *config_values = get_config_values();
707 if (config_values && config_values->floating_mode)
708 evas_object_resize(layout_main, rect.width * FLOATING_SCALE_RATE, rect.height * FLOATING_SCALE_RATE);
710 evas_object_resize(layout_main, rect.width, rect.height);
715 evas_object_layer_set(layout_main, 32000);
720 Eina_Bool init_view(void *data)
724 VoiceData *voicedata = (VoiceData *)data;
726 if (voicedata == NULL) {
727 LOGD("init_view : voicedata == NULL");
728 return ECORE_CALLBACK_CANCEL;
731 voicedata->layout_main = create_fullview(voicedata->win, voicedata);
733 if (voicedata->layout_main) {
734 evas_object_show(voicedata->layout_main);
737 return ECORE_CALLBACK_CANCEL;
740 Evas_Object *show_voice_window(Evas_Object *parent, VoiceData *r_voicedata)
742 LOGD("show_voice_window");
744 VoiceData *voicedata = (VoiceData *)r_voicedata;
750 LOGD("Parent is NULL\n");
753 LOGD("Parent is there");
756 if (NULL != voicedata->layout_main) {
757 evas_object_del((voicedata)->layout_main);
758 (voicedata)->layout_main = NULL;
761 if (NULL != voicedata->effector) {
762 delete (voicedata->effector);
763 (voicedata)->effector = NULL;
766 if (NULL != voicedata->ieffect) {
767 delete (voicedata->ieffect);
768 voicedata->ieffect = NULL;
771 init_view((void *)voicedata);
772 return voicedata->layout_main;
775 void on_destroy(VoiceData *r_voicedata)
779 VoiceData *voicedata = (VoiceData *)r_voicedata;
781 if (NULL != voicedata) {
782 if (NULL != voicedata->layout_main) {
783 evas_object_del(voicedata->layout_main);
784 voicedata->layout_main = NULL;
787 if (NULL != voicedata->win) {
788 voicedata->win = NULL;
791 if (NULL != voicedata->start_timer) {
792 ecore_timer_del(voicedata->start_timer);
793 voicedata->start_timer = NULL;
796 if (NULL != voicedata->refresh_timer) {
797 ecore_timer_del(voicedata->refresh_timer);
798 voicedata->refresh_timer = NULL;
801 if (NULL != voicedata->progressbar_timer) {
802 ecore_timer_del(voicedata->progressbar_timer);
803 voicedata->progressbar_timer = NULL;
804 elm_progressbar_pulse(voicedata->progressbar, EINA_FALSE);
807 if (NULL != voicedata->textblock_timer) {
808 ecore_timer_del(voicedata->textblock_timer);
809 voicedata->textblock_timer = NULL;
812 if (NULL != voicedata->guide_text_timer) {
813 ecore_timer_del(voicedata->guide_text_timer);
814 voicedata->guide_text_timer = NULL;
817 if (NULL != voicedata->btn_disabling_timer) {
818 ecore_timer_del(voicedata->btn_disabling_timer);
819 voicedata->btn_disabling_timer = NULL;
822 if (NULL != voicedata->power_unlock_timer) {
823 ecore_timer_del(voicedata->power_unlock_timer);
824 voicedata->power_unlock_timer = NULL;
827 if (NULL != voicedata->init_timer) {
828 ecore_timer_del(voicedata->init_timer);
829 voicedata->init_timer = NULL;
832 if (voicedata->kbd_lang) {
833 free(voicedata->kbd_lang);
834 voicedata->kbd_lang = NULL;
837 if (voicedata->ieffect) {
838 delete voicedata->ieffect;
839 voicedata->ieffect = NULL;
842 if (voicedata->effector) {
843 delete voicedata->effector;
844 voicedata->effector = NULL;
847 if (voicedata->sttmanager) {
848 delete voicedata->sttmanager;
849 voicedata->sttmanager = NULL;
852 if (voicedata->sttfeedback) {
853 delete voicedata->sttfeedback;
854 voicedata->sttfeedback = NULL;
863 LOGD("destroy_voice");
864 vconf_ignore_key_changed(VCONFKEY_ISE_STT_LANGUAGE, _stt_lang_changed_cb);
867 on_destroy(my_voicedata);
872 void show_voice_input(Evas_Object *parent, const char *lang, void (*get_string)(char *, int))
874 LOGD("show_voice_input");
880 my_voicedata = new VoiceData;
881 if (my_voicedata == NULL) {
882 LOGD("%d::::Heap Overflow, Voice Input cannot be shown!", __LINE__);
885 init_voicedata(my_voicedata);
889 init = init_voice(parent, lang, my_voicedata);
891 if (my_voicedata->win) {
892 //ise_stt_start(my_voicedata);
893 show_voice_window(my_voicedata->win, my_voicedata);
897 LOGD("%d::::Fail to create Voice window!", __LINE__);
902 vconf_notify_key_changed(VCONFKEY_ISE_STT_LANGUAGE, _stt_lang_changed_cb, my_voicedata);
905 void ise_show_stt_mode(Evas_Object *win)
910 show_voice_input(win, NULL, NULL);
912 const int BUF_LEN = 256;
913 static char buf[BUF_LEN] = {0};
914 snprintf(buf, BUF_LEN, "%s", gettext("IDS_ST_SK_CANCEL"));
915 CSCLUI *ui = get_ui();
917 ui->set_string_substitution("Cancel", buf);
920 void ise_hide_stt_mode()
923 CSCLUI *ui = get_ui();
925 ui->unset_string_substitution("Cancel");