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.
20 #include "ActivatedModes.h"
22 #include "ttsd_data.h"
37 app_tts_state_e state;
38 tts_app_play_type_e type;
40 ttse_result_event_e result_event;
42 std::list<speak_data_s*> m_speak_data;
43 std::list<sound_data_s*> m_wav_data;
44 bool paused_data_existing;
46 std::list<used_voice_s> m_used_voice;
47 tts_ipc_method_e ipc_method;
50 int registered_event_mask;
53 static vector<app_data_s> g_app_list;
55 static mutex g_app_data_mutex;
57 /* If engine is running */
58 static atomic<ttsd_synthesis_control_e> g_synth_control;
60 static ActivatedModes g_activated_modes;
63 static void __data_show_list()
65 SLOG(LOG_DEBUG, tts_tag(), "----- client list -----");
68 for (auto& appData : g_app_list) {
69 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[%dth] pid(%d), uid(%u), state(%d)", i, appData.pid, appData.uid, appData.state);
74 SLOG(LOG_DEBUG, tts_tag(), "No Client");
77 SLOG(LOG_DEBUG, tts_tag(), "-----------------------");
80 static void __data_show_sound_list(app_data_s& app_data)
82 SLOG(LOG_DEBUG, tts_tag(), "----- Sound list -----");
85 for (auto& wavData : app_data.m_wav_data) {
86 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)",
87 i + 1, wavData, wavData->data, wavData->data_size, wavData->utt_id, wavData->audio_type);
92 SLOG(LOG_DEBUG, tts_tag(), "No Sound Data");
95 SLOG(LOG_DEBUG, tts_tag(), "----------------------");
98 static void __data_show_text_list(app_data_s& app_data)
100 SLOG(LOG_DEBUG, tts_tag(), "----- Text list -----");
103 for (auto& speakData : app_data.m_speak_data) {
104 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)",
105 i + 1, speakData, speakData->lang, speakData->vctype, speakData->speed, speakData->utt_id, speakData->text);
110 SLOG(LOG_DEBUG, tts_tag(), "No Text Data");
113 SLOG(LOG_DEBUG, tts_tag(), "---------------------");
116 static void __data_show_used_voice_list(app_data_s& app_data)
118 SLOG(LOG_DEBUG, tts_tag(), "----- Used voice list -----");
121 for (auto& usedVoice : app_data.m_used_voice) {
122 SLOG(LOG_DEBUG, tts_tag(), "[%dth] lang(%s), vctype(%d)", i + 1, usedVoice.lang, usedVoice.vctype);
127 SLOG(LOG_DEBUG, tts_tag(), "No Voice Data");
130 SLOG(LOG_DEBUG, tts_tag(), "---------------------------");
135 * ttsd data functions
138 int ttsd_data_set_synth_control(ttsd_synthesis_control_e control)
140 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] set synth_control(%d)", control);
141 g_synth_control = control;
145 ttsd_synthesis_control_e ttsd_data_get_synth_control()
147 return g_synth_control.load();
150 static app_data_s* __get_client_app_data(unsigned int uid)
152 for (auto& app_data : g_app_list) {
153 if (app_data.uid == uid) {
161 int ttsd_data_new_client(int pid, unsigned int uid, ttsd_mode_e mode, int registered_event_mask, tts_ipc_method_e method)
163 lock_guard<mutex> lock(g_app_data_mutex);
164 if(nullptr != __get_client_app_data(uid) ) {
165 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is already registered (%u)", uid);
166 return TTSD_ERROR_INVALID_PARAMETER;
172 app.utt_id_stopped = 0;
173 app.state = APP_STATE_READY;
174 app.type = TTS_APP_PLAY_TYPE_SYNTH;
176 app.result_event = TTSE_RESULT_EVENT_FAIL;
177 app.ipc_method = method;
178 app.credential = nullptr;
179 app.paused_data_existing = false;
180 app.registered_event_mask = registered_event_mask;
182 g_app_list.push_back(app);
183 g_activated_modes.addMode(mode);
189 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] New client. pid(%d), uid(%u)", app.pid, app.uid);
191 return TTSD_ERROR_NONE;
194 static inline void __destroy_speak_data(speak_data_s* speak_data)
196 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)",
197 speak_data->utt_id, speak_data->text, speak_data->lang, speak_data->vctype, speak_data->speed);
199 free(speak_data->text);
200 free(speak_data->lang);
205 static inline void __destroy_sound_data(sound_data_s* sound_data)
207 SLOG(LOG_ERROR, tts_tag(), "[DEBUG][%p] event(%d) data(%p) size(%d) rate(%d) utt(%d)",
208 sound_data, sound_data->event, sound_data->data, sound_data->data_size, sound_data->rate, sound_data->utt_id);
210 delete[] sound_data->data;
214 static void __clean_data(app_data_s& app_data)
216 SLOG(LOG_ERROR, tts_tag(), "[INFO] Clean data. uid(%u)", app_data.uid);
218 int removed_last_uttid = -1;
219 for (auto& speak_data : app_data.m_speak_data) {
220 if (nullptr == speak_data) {
224 removed_last_uttid = speak_data->utt_id;
226 __destroy_speak_data(speak_data);
227 speak_data = nullptr;
230 if (-1 != removed_last_uttid) {
231 app_data.utt_id_stopped = removed_last_uttid;
234 for (auto& sound_data : app_data.m_wav_data) {
235 if (nullptr == sound_data) {
239 __destroy_sound_data(sound_data);
240 sound_data = nullptr;
243 app_data.m_speak_data.clear();
244 app_data.m_wav_data.clear();
247 int ttsd_data_delete_client(unsigned int uid)
249 lock_guard<mutex> lock(g_app_data_mutex);
251 for (auto& app_data : g_app_list) {
252 if (app_data.uid == uid) {
259 if (index >= (int)g_app_list.size()) {
260 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
261 return TTSD_ERROR_INVALID_PARAMETER;
264 __clean_data(g_app_list[index]);
266 ttsd_mode_e mode = g_app_list[index].mode;
267 g_app_list.erase(g_app_list.begin() + index);
268 g_activated_modes.removeMode(mode);
274 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Client is deleted. uid(%u), index(%d)", uid, index);
276 return TTSD_ERROR_NONE;
279 int ttsd_data_is_client(unsigned int uid)
281 lock_guard<mutex> lock(g_app_data_mutex);
282 int vsize = g_app_list.size();
283 for (int i = 0; i < vsize; i++) {
284 if(g_app_list[i].uid == uid) {
289 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no corresponding client. uid(%u)", uid);
294 int ttsd_data_get_client_count()
296 int num_client = g_app_list.size();
297 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Number of clients(%d)", num_client);
302 int ttsd_data_get_pid(unsigned int uid)
304 lock_guard<mutex> lock(g_app_data_mutex);
305 app_data_s* app_data = __get_client_app_data(uid);
306 if (nullptr == app_data) {
307 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
311 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u), pid(%d)", uid, app_data->pid);
313 return app_data->pid;
316 tts_ipc_method_e ttsd_data_get_ipc_method(unsigned int uid)
318 lock_guard<mutex> lock(g_app_data_mutex);
319 app_data_s* app_data = __get_client_app_data(uid);
320 if (nullptr == app_data) {
321 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
322 return TTS_IPC_METHOD_UNDEFINED;
325 return app_data->ipc_method;
328 ttsd_mode_e ttsd_data_get_mode(unsigned int uid)
330 lock_guard<mutex> lock(g_app_data_mutex);
331 app_data_s* app_data = __get_client_app_data(uid);
332 if (nullptr == app_data) {
333 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
334 return TTSD_MODE_DEFAULT;
337 return app_data->mode;
340 int ttsd_data_set_credential(unsigned int uid, const char* credential)
342 lock_guard<mutex> lock(g_app_data_mutex);
343 app_data_s* app_data = __get_client_app_data(uid);
344 if (nullptr == app_data) {
345 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
346 return TTSD_ERROR_INVALID_PARAMETER;
349 free(app_data->credential);
350 app_data->credential = nullptr;
353 app_data->credential = strdup(credential);
356 return TTSD_ERROR_NONE;
359 char* ttsd_data_get_credential(unsigned int uid)
361 lock_guard<mutex> lock(g_app_data_mutex);
362 app_data_s* app_data = __get_client_app_data(uid);
363 if (nullptr == app_data) {
364 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
368 if (nullptr == app_data->credential) {
372 return strdup(app_data->credential);
375 int ttsd_data_get_speak_data_size(unsigned int uid)
377 lock_guard<mutex> lock(g_app_data_mutex);
378 app_data_s* app_data = __get_client_app_data(uid);
379 if (nullptr == app_data) {
380 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
381 return TTSD_ERROR_INVALID_PARAMETER;
384 return app_data->m_speak_data.size();
387 int ttsd_data_set_used_voice(unsigned int uid, const char* lang, int type)
389 lock_guard<mutex> lock(g_app_data_mutex);
390 app_data_s* app_data = __get_client_app_data(uid);
391 if (nullptr == app_data) {
392 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
393 return TTSD_ERROR_INVALID_PARAMETER;
397 list<used_voice_s>& usedVoices = app_data->m_used_voice;
398 for (auto& voice : usedVoices) {
399 if (0 == strncmp(lang, voice.lang, strlen(lang)) && type == voice.vctype) {
400 SLOG(LOG_DEBUG, tts_tag(), "[DATA] The voice is already registered (%s)(%d)", lang, type);
406 used_voice_s used_voice;
407 used_voice.lang = strdup(lang);
408 used_voice.vctype = type;
411 usedVoices.push_back(used_voice);
412 } catch (const std::bad_alloc&) {
413 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_used_voice (bad_alloc)");
416 SLOG(LOG_ERROR, tts_tag(), "[DATA] lang(%s), vctype(%d)", used_voice.lang, used_voice.vctype);
419 __data_show_used_voice_list(*app_data);
422 return -1; /* Need to load voice*/
425 int ttsd_data_reset_used_voice(unsigned int uid, ttsd_used_voice_cb callback)
427 unique_lock<mutex> lock(g_app_data_mutex);
428 app_data_s* app_data = __get_client_app_data(uid);
429 if (nullptr == app_data) {
430 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
431 return TTSD_ERROR_INVALID_PARAMETER;
434 if (nullptr == callback) {
435 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] Used voice callback is nullptr");
439 list<used_voice_s>& usedVoices = app_data->m_used_voice;
440 for (auto& voice : usedVoices) {
441 if (nullptr != callback) {
443 callback(voice.lang, voice.vctype);
447 if (nullptr != voice.lang) {
449 voice.lang = nullptr;
455 __data_show_used_voice_list(*app_data);
458 return TTSD_ERROR_NONE;
461 speak_data_s* ttsd_data_create_speak_data(const char* text, const char* language, int voice_type, int speed, int utt_id)
463 speak_data_s* speak_data = new speak_data_s();
464 if (nullptr == speak_data) {
465 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory for speak_data_s");
469 speak_data->text = strdup(text);
470 speak_data->lang = strdup(language);
472 speak_data->vctype = voice_type;
473 speak_data->speed = speed;
474 speak_data->utt_id = utt_id;
479 void ttsd_data_destroy_speak_data(speak_data_s* speak_data)
481 if (nullptr == speak_data) {
482 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] data is nullptr");
485 __destroy_speak_data(speak_data);
488 int ttsd_data_add_speak_data(unsigned int uid, speak_data_s* data)
490 lock_guard<mutex> lock(g_app_data_mutex);
491 app_data_s* app_data = __get_client_app_data(uid);
492 if (nullptr == app_data) {
493 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
494 return TTSD_ERROR_INVALID_PARAMETER;
497 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u)", uid);
500 list<speak_data_s*>& speakData = app_data->m_speak_data;
501 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] m_speak_data size(%zu)", speakData.size());
502 speakData.push_back(data);
503 } catch (const std::bad_alloc&) {
504 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_speak_data (bad_alloc)");
505 return TTSD_ERROR_OUT_OF_MEMORY;
508 SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), text(%s), lang(%s), vctype(%d), speed(%d)",
509 data, data->utt_id, data->text, data->lang, data->vctype, data->speed);
511 if (1 == data->utt_id)
512 app_data->utt_id_stopped = 0;
515 __data_show_text_list(*app_data);
518 return TTSD_ERROR_NONE;
521 static speak_data_s* __get_speak_data(app_data_s* app_data)
523 if (app_data->m_speak_data.empty()) {
525 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data");
531 __data_show_text_list(*app_data);
534 return app_data->m_speak_data.front();
537 int ttsd_data_get_speak_data(unsigned int uid, speak_data_s** data)
539 lock_guard<mutex> lock(g_app_data_mutex);
540 app_data_s* app_data = __get_client_app_data(uid);
541 if (nullptr == app_data) {
542 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
543 return TTSD_ERROR_INVALID_PARAMETER;
546 speak_data_s* speakData = __get_speak_data(app_data);
547 if (nullptr == speakData) {
548 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data");
549 return TTSD_ERROR_OPERATION_FAILED;
552 app_data->m_speak_data.pop_front();
555 return TTSD_ERROR_NONE;
558 sound_data_s* ttsd_data_create_sound_data(int utt_id, const void* data, unsigned int data_size, ttse_result_event_e event,
559 ttse_audio_type_e audio_type, int rate, int channels)
562 sound_data_s* sound_data = new sound_data_s();
563 if (nullptr == sound_data) {
564 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory for speak_data_s");
568 sound_data->data = nullptr;
569 sound_data->data_size = 0;
571 if (nullptr != data && 0 < data_size) {
572 sound_data->data = new char[data_size];
573 if (nullptr != sound_data->data) {
574 memcpy(sound_data->data, data, data_size);
575 sound_data->data_size = data_size;
576 SLOG(LOG_INFO, tts_tag(), "[DEBUG][memcpy] event(%d) sound_data(%p) data(%p) size(%u)",
577 event, sound_data, sound_data->data, sound_data->data_size);
579 SLOG(LOG_ERROR, tts_tag(), "Fail to allocate memory");
582 SLOG(LOG_ERROR, tts_tag(), "Sound data is nullptr");
585 sound_data->utt_id = utt_id;
586 sound_data->event = event;
587 sound_data->audio_type = audio_type;
588 sound_data->rate = rate;
589 sound_data->channels = channels;
590 sound_data->played_data_size = 0;
595 void ttsd_data_destroy_sound_data(sound_data_s* sound_data)
597 if (nullptr == sound_data) {
598 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] data is nullptr");
602 __destroy_sound_data(sound_data);
605 int ttsd_data_add_sound_data(unsigned int uid, sound_data_s* data)
607 lock_guard<mutex> lock(g_app_data_mutex);
608 app_data_s* app_data = __get_client_app_data(uid);
609 if (nullptr == app_data) {
610 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
611 return TTSD_ERROR_INVALID_PARAMETER;
614 if (nullptr == data) {
615 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] sound data is nullptr");
616 return TTSD_ERROR_INVALID_PARAMETER;
619 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u)", uid);
622 list<sound_data_s*>& wavData = app_data->m_wav_data;
623 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] m_wav_data size(%zu)", wavData.size());
624 wavData.push_back(data);
625 } catch (const std::bad_alloc&) {
626 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_sound_data (bad_alloc)");
627 return TTSD_ERROR_OUT_OF_MEMORY;
629 SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), data(%p) data size(%d), type(%d)",
630 data, data->utt_id, data->data, data->data_size, data->audio_type);
633 __data_show_sound_list(*app_data);
636 return TTSD_ERROR_NONE;
639 static sound_data_s* __get_sound_data(app_data_s* app_data)
641 if (app_data->m_wav_data.empty()) {
643 SLOG(LOG_DEBUG, tts_tag(), "[DATA] There is no wav data");
649 __data_show_sound_list(*app_data);
652 return app_data->m_wav_data.front();
655 sound_data_s* ttsd_data_get_first_sound_data(unsigned int uid)
657 lock_guard<mutex> lock(g_app_data_mutex);
658 app_data_s* app_data = __get_client_app_data(uid);
659 if (nullptr == app_data) {
660 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
664 sound_data_s* soundData = __get_sound_data(app_data);
665 if (nullptr == soundData) {
666 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no sound data");
670 app_data->m_wav_data.pop_front();
674 int ttsd_data_get_sound_data_size(unsigned int uid)
676 lock_guard<mutex> lock(g_app_data_mutex);
677 app_data_s* app_data = __get_client_app_data(uid);
678 if (nullptr == app_data) {
679 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
683 return app_data->m_wav_data.size();
686 int ttsd_data_set_last_sound_result_event(unsigned int uid, ttse_result_event_e event)
688 lock_guard<mutex> lock(g_app_data_mutex);
689 app_data_s* app_data = __get_client_app_data(uid);
690 if (nullptr == app_data) {
691 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
692 return TTSE_ERROR_INVALID_PARAMETER;
695 app_data->result_event = event;
696 return TTSE_ERROR_NONE;
699 ttse_result_event_e ttsd_data_get_last_sound_result_event(unsigned int uid)
701 lock_guard<mutex> lock(g_app_data_mutex);
702 app_data_s* app_data = __get_client_app_data(uid);
703 if (nullptr == app_data) {
704 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
705 return TTSE_RESULT_EVENT_FAIL;
708 return app_data->result_event;
711 int ttsd_data_clear_data(unsigned int uid)
713 lock_guard<mutex> lock(g_app_data_mutex);
714 app_data_s* app_data = __get_client_app_data(uid);
715 if (nullptr == app_data) {
716 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
717 return TTSD_ERROR_INVALID_PARAMETER;
720 __clean_data(*app_data);
722 return TTSD_ERROR_NONE;
725 app_tts_state_e ttsd_data_get_client_state(unsigned int uid)
727 lock_guard<mutex> lock(g_app_data_mutex);
728 app_data_s* app_data = __get_client_app_data(uid);
729 if (nullptr == app_data) {
730 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
731 return APP_STATE_NONE;
734 return app_data->state;
737 static unsigned int __get_playing_app_uid()
739 for (auto& app : g_app_list) {
740 if (APP_STATE_PLAYING == app.state) {
748 int ttsd_data_set_client_state(unsigned int uid, app_tts_state_e state)
750 lock_guard<mutex> lock(g_app_data_mutex);
751 app_data_s* app_data = __get_client_app_data(uid);
752 if (nullptr == app_data) {
753 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
754 return TTSD_ERROR_INVALID_PARAMETER;
757 if (app_data->state == state) {
758 SLOG(LOG_ERROR, tts_tag(), "[DATA] Already current state. (%d)", state);
759 return TTSD_ERROR_NONE;
762 /* The client of playing state of all clients is only one. need to check state. */
763 int playing_uid = __get_playing_app_uid();
764 if (APP_STATE_PLAYING == state && 0 < playing_uid) {
765 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] A playing client has already existed. playing app uid(%u)", playing_uid);
766 return TTSD_ERROR_OPERATION_FAILED;
769 app_data->state = state;
771 return TTSD_ERROR_NONE;
774 tts_app_play_type_e ttsd_data_get_play_type(unsigned int uid)
776 lock_guard<mutex> lock(g_app_data_mutex);
777 app_data_s* app_data = __get_client_app_data(uid);
778 if (nullptr == app_data) {
779 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
780 return TTS_APP_PLAY_TYPE_SYNTH;
783 return app_data->type;
786 int ttsd_data_set_play_type(unsigned int uid, tts_app_play_type_e type)
788 lock_guard<mutex> lock(g_app_data_mutex);
789 app_data_s* app_data = __get_client_app_data(uid);
790 if (nullptr == app_data) {
791 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
792 return TTSD_ERROR_INVALID_PARAMETER;
795 app_data->type = type;
797 return TTSD_ERROR_NONE;
800 int ttsd_data_set_paused_data(unsigned int uid, sound_data_s* sound_data)
802 lock_guard<mutex> lock(g_app_data_mutex);
803 app_data_s* app_data = __get_client_app_data(uid);
804 if (nullptr == app_data) {
805 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
806 return TTSD_ERROR_INVALID_PARAMETER;
810 app_data->m_wav_data.push_front(sound_data);
811 app_data->paused_data_existing = true;
813 app_data->paused_data_existing = false;
816 return TTSD_ERROR_NONE;
819 bool ttsd_data_is_paused_data_existing(unsigned int uid)
821 lock_guard<mutex> lock(g_app_data_mutex);
822 app_data_s* app_data = __get_client_app_data(uid);
823 if (nullptr == app_data) {
824 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
828 return app_data->paused_data_existing;
831 bool ttsd_data_is_service_state_changed_cb_set(unsigned int uid)
833 lock_guard<mutex> lock(g_app_data_mutex);
834 app_data_s* app_data = __get_client_app_data(uid);
835 if (nullptr == app_data) {
836 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
840 bool is_service_state_changed_cb_set = ((app_data->registered_event_mask & TTS_EVENT_MASK_SERVICE_STATE_CHANGED) != 0);
841 return is_service_state_changed_cb_set;
844 unsigned int ttsd_data_get_current_playing()
846 lock_guard<mutex> lock(g_app_data_mutex);
847 unsigned int uid = __get_playing_app_uid();
849 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Current playing uid(%u)", uid);
854 int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data)
856 if (nullptr == callback) {
857 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] input data is nullptr!!");
866 vector<app_data_s> temp_app_list;
868 unique_lock<mutex> lock(g_app_data_mutex);
869 int vsize = g_app_list.size();
870 for (int i = 0; i < vsize; i++) {
871 app_data_s app = {0, };
872 app.pid = g_app_list[i].pid;
873 app.uid = g_app_list[i].uid;
874 app.utt_id_stopped = 0;
875 app.state = g_app_list[i].state;
877 temp_app_list.push_back(app);
881 for (int i = 0; i < vsize; i++) {
882 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[%dth] pid(%d), uid(%u), state(%d)", i, temp_app_list[i].pid, temp_app_list[i].uid, temp_app_list[i].state);
883 if (false == callback(temp_app_list[i].pid, temp_app_list[i].uid, temp_app_list[i].state, user_data)) {
891 bool ttsd_data_is_uttid_valid(unsigned int uid, int uttid)
893 lock_guard<mutex> lock(g_app_data_mutex);
894 app_data_s* app_data = __get_client_app_data(uid);
895 if (nullptr == app_data) {
896 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
900 if (uttid < app_data->utt_id_stopped)
906 int ttsd_data_get_same_pid_client_count(int pid)
908 lock_guard<mutex> lock(g_app_data_mutex);
910 for (auto& appData : g_app_list) {
911 if(appData.pid == pid) {
919 int ttsd_data_get_activated_mode()
921 return g_activated_modes.getModes();
924 int ttsd_data_save_error_log(unsigned int uid, FILE* fp)
926 lock_guard<mutex> lock(g_app_data_mutex);
927 app_data_s* app_data = __get_client_app_data(uid);
928 if (nullptr == app_data) {
929 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid client");
934 fprintf(fp, "pid - %d", app_data->pid);
937 fprintf(fp, "app state - %d", app_data->state);
940 fprintf(fp, "----- Sound list -----");
942 for (auto& wavData : app_data->m_wav_data) {
943 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)",
944 i, wavData, wavData->data, wavData->data_size, wavData->utt_id, wavData->audio_type);
947 fprintf(fp, "----------------------");
950 fprintf(fp, "----- Text list -----");
953 for (auto& speakData : app_data->m_speak_data) {
954 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)",
955 i, speakData, speakData->lang, speakData->vctype, speakData->speed, speakData->utt_id, speakData->text);
958 fprintf(fp, "---------------------");