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"
38 app_tts_state_e state;
39 tts_app_play_type_e type;
41 ttsd_playing_mode_e playing_mode;
42 ttse_result_event_e result_event;
44 std::list<speak_data_s*> m_speak_data;
45 std::list<sound_data_s*> m_wav_data;
46 bool paused_data_existing;
48 std::list<used_voice_s> m_used_voice;
49 tts_ipc_method_e ipc_method;
52 int registered_event_mask;
55 static vector<app_data_s> g_app_list;
57 static mutex g_app_data_mutex;
59 /* If engine is running */
60 static atomic<ttsd_synthesis_control_e> g_synth_control;
62 static ActivatedModes g_activated_modes;
65 static void show_client_list()
67 SLOG(LOG_DEBUG, tts_tag(), "----- client list -----");
70 for (auto& appData : g_app_list) {
71 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[%dth] pid(%d), uid(%u), state(%d)", i, appData.pid, appData.uid, appData.state);
76 SLOG(LOG_DEBUG, tts_tag(), "No Client");
79 SLOG(LOG_DEBUG, tts_tag(), "-----------------------");
82 static void show_sound_list(app_data_s& app_data)
84 SLOG(LOG_DEBUG, tts_tag(), "----- Sound list -----");
87 for (auto& wavData : app_data.m_wav_data) {
88 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)",
89 i + 1, wavData, wavData->data, wavData->data_size, wavData->utt_id, wavData->audio_type);
94 SLOG(LOG_DEBUG, tts_tag(), "No Sound Data");
97 SLOG(LOG_DEBUG, tts_tag(), "----------------------");
100 static void show_text_list(app_data_s& app_data)
102 SLOG(LOG_DEBUG, tts_tag(), "----- Text list -----");
105 for (auto& speakData : app_data.m_speak_data) {
106 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)",
107 i + 1, speakData, speakData->lang, speakData->vctype, speakData->speed, speakData->utt_id, speakData->text);
112 SLOG(LOG_DEBUG, tts_tag(), "No Text Data");
115 SLOG(LOG_DEBUG, tts_tag(), "---------------------");
118 static void show_used_voice_list(app_data_s& app_data)
120 SLOG(LOG_DEBUG, tts_tag(), "----- Used voice list -----");
123 for (auto& usedVoice : app_data.m_used_voice) {
124 SLOG(LOG_DEBUG, tts_tag(), "[%dth] lang(%s), vctype(%d)", i + 1, usedVoice.lang, usedVoice.vctype);
129 SLOG(LOG_DEBUG, tts_tag(), "No Voice Data");
132 SLOG(LOG_DEBUG, tts_tag(), "---------------------------");
137 * ttsd data functions
140 int ttsd_data_set_synth_control(ttsd_synthesis_control_e control)
142 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] set synth_control(%d)", control);
143 g_synth_control = control;
147 ttsd_synthesis_control_e ttsd_data_get_synth_control()
149 return g_synth_control.load();
152 static app_data_s* get_client_app_data(unsigned int uid)
154 for (auto& app_data : g_app_list) {
155 if (app_data.uid == uid) {
163 int ttsd_data_new_client(int pid, unsigned int uid, ttsd_mode_e mode, ttsd_playing_mode_e playing_mode, int registered_event_mask, tts_ipc_method_e method)
165 lock_guard<mutex> lock(g_app_data_mutex);
166 if(nullptr != get_client_app_data(uid) ) {
167 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is already registered (%u)", uid);
168 return TTSD_ERROR_INVALID_PARAMETER;
174 app.utt_id_stopped = 0;
175 app.state = APP_STATE_READY;
176 app.type = TTS_APP_PLAY_TYPE_SYNTH;
178 app.playing_mode = playing_mode;
179 app.result_event = TTSE_RESULT_EVENT_FAIL;
180 app.ipc_method = method;
181 app.credential = nullptr;
182 app.paused_data_existing = false;
183 app.registered_event_mask = registered_event_mask;
185 g_app_list.push_back(app);
186 g_activated_modes.addMode(mode);
192 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] New client. pid(%d), uid(%u)", app.pid, app.uid);
194 return TTSD_ERROR_NONE;
197 static inline void destroy_speak_data(speak_data_s* speak_data)
199 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)",
200 speak_data->utt_id, speak_data->text, speak_data->voice.language, speak_data->voice.type,
201 speak_data->parameter.speed);
203 free(speak_data->text);
204 speak_data->text = nullptr;
206 free(speak_data->voice.language);
207 speak_data->voice.language = nullptr;
209 free(speak_data->voice.ptts_id);
210 speak_data->voice.ptts_id = nullptr;
215 static inline void destroy_sound_data(sound_data_s* sound_data)
217 SLOG(LOG_ERROR, tts_tag(), "[DEBUG][%p] event(%d) data(%p) size(%d) rate(%d) utt(%d)",
218 sound_data, sound_data->event, sound_data->data, sound_data->data_size, sound_data->rate, sound_data->utt_id);
220 delete[] sound_data->data;
224 static void clean_data(app_data_s& app_data)
226 SLOG(LOG_ERROR, tts_tag(), "[INFO] Clean data. uid(%u)", app_data.uid);
228 int removed_last_uttid = -1;
229 for (auto& speak_data : app_data.m_speak_data) {
230 if (nullptr == speak_data) {
234 removed_last_uttid = speak_data->utt_id;
236 destroy_speak_data(speak_data);
237 speak_data = nullptr;
240 if (-1 != removed_last_uttid) {
241 app_data.utt_id_stopped = removed_last_uttid;
244 for (auto& sound_data : app_data.m_wav_data) {
245 if (nullptr == sound_data) {
249 destroy_sound_data(sound_data);
250 sound_data = nullptr;
253 app_data.m_speak_data.clear();
254 app_data.m_wav_data.clear();
256 free(app_data.credential);
257 app_data.credential = nullptr;
260 int ttsd_data_delete_client(unsigned int uid)
262 lock_guard<mutex> lock(g_app_data_mutex);
264 for (auto& app_data : g_app_list) {
265 if (app_data.uid == uid) {
272 if (index >= (int)g_app_list.size()) {
273 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
274 return TTSD_ERROR_INVALID_PARAMETER;
277 clean_data(g_app_list[index]);
279 ttsd_mode_e mode = g_app_list[index].mode;
280 g_app_list.erase(g_app_list.begin() + index);
281 g_activated_modes.removeMode(mode);
287 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Client is deleted. uid(%u), index(%d)", uid, index);
289 return TTSD_ERROR_NONE;
292 int ttsd_data_is_client(unsigned int uid)
294 lock_guard<mutex> lock(g_app_data_mutex);
295 int vsize = g_app_list.size();
296 for (int i = 0; i < vsize; i++) {
297 if(g_app_list[i].uid == uid) {
302 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no corresponding client. uid(%u)", uid);
307 int ttsd_data_get_client_count()
309 lock_guard<mutex> lock(g_app_data_mutex);
310 int num_client = g_app_list.size();
311 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Number of clients(%d)", num_client);
316 int ttsd_data_get_pid(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);
325 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u), pid(%d)", uid, app_data->pid);
327 return app_data->pid;
330 tts_ipc_method_e ttsd_data_get_ipc_method(unsigned int uid)
332 lock_guard<mutex> lock(g_app_data_mutex);
333 app_data_s* app_data = get_client_app_data(uid);
334 if (nullptr == app_data) {
335 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
336 return TTS_IPC_METHOD_UNDEFINED;
339 return app_data->ipc_method;
342 ttsd_mode_e ttsd_data_get_mode(unsigned int uid)
344 lock_guard<mutex> lock(g_app_data_mutex);
345 app_data_s* app_data = get_client_app_data(uid);
346 if (nullptr == app_data) {
347 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
348 return TTSD_MODE_DEFAULT;
351 return app_data->mode;
354 ttsd_playing_mode_e ttsd_data_get_playing_mode(unsigned int uid)
356 lock_guard<mutex> lock(g_app_data_mutex);
357 app_data_s* app_data = get_client_app_data(uid);
358 if (nullptr == app_data) {
359 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
360 return TTSD_PLAYING_MODE_BY_SERVICE;
363 return app_data->playing_mode;
366 int ttsd_data_set_credential(unsigned int uid, const char* credential)
368 lock_guard<mutex> lock(g_app_data_mutex);
369 app_data_s* app_data = get_client_app_data(uid);
370 if (nullptr == app_data) {
371 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
372 return TTSD_ERROR_INVALID_PARAMETER;
375 free(app_data->credential);
376 app_data->credential = nullptr;
379 app_data->credential = strdup(credential);
382 return TTSD_ERROR_NONE;
385 char* ttsd_data_get_credential(unsigned int uid)
387 lock_guard<mutex> lock(g_app_data_mutex);
388 app_data_s* app_data = get_client_app_data(uid);
389 if (nullptr == app_data) {
390 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
394 if (nullptr == app_data->credential) {
398 return strdup(app_data->credential);
401 int ttsd_data_get_speak_data_size(unsigned int uid)
403 lock_guard<mutex> lock(g_app_data_mutex);
404 app_data_s* app_data = get_client_app_data(uid);
405 if (nullptr == app_data) {
406 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
407 return TTSD_ERROR_INVALID_PARAMETER;
410 return app_data->m_speak_data.size();
413 int ttsd_data_set_used_voice(unsigned int uid, const char* lang, int type)
415 lock_guard<mutex> lock(g_app_data_mutex);
416 app_data_s* app_data = get_client_app_data(uid);
417 if (nullptr == app_data) {
418 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
419 return TTSD_ERROR_INVALID_PARAMETER;
423 list<used_voice_s>& usedVoices = app_data->m_used_voice;
424 for (auto& voice : usedVoices) {
425 if (0 == strncmp(lang, voice.lang, strlen(lang)) && type == voice.vctype) {
426 SLOG(LOG_DEBUG, tts_tag(), "[DATA] The voice is already registered (%s)(%d)", lang, type);
432 used_voice_s used_voice;
433 used_voice.lang = strdup(lang);
434 used_voice.vctype = type;
437 usedVoices.push_back(used_voice);
438 } catch (const std::bad_alloc&) {
439 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_used_voice (bad_alloc)");
442 SLOG(LOG_ERROR, tts_tag(), "[DATA] lang(%s), vctype(%d)", used_voice.lang, used_voice.vctype);
445 show_used_voice_list(*app_data);
448 return -1; /* Need to load voice*/
451 int ttsd_data_reset_used_voice(unsigned int uid, ttsd_used_voice_cb callback)
453 unique_lock<mutex> lock(g_app_data_mutex);
454 app_data_s* app_data = get_client_app_data(uid);
455 if (nullptr == app_data) {
456 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
457 return TTSD_ERROR_INVALID_PARAMETER;
460 if (nullptr == callback) {
461 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] Used voice callback is nullptr");
465 list<used_voice_s>& usedVoices = app_data->m_used_voice;
466 for (auto& voice : usedVoices) {
467 if (nullptr != callback) {
469 callback(voice.lang, voice.vctype);
473 if (nullptr != voice.lang) {
475 voice.lang = nullptr;
481 show_used_voice_list(*app_data);
484 return TTSD_ERROR_NONE;
487 speak_data_s* ttsd_data_create_speak_data(const char* text, const char* language, int voice_type, int speed, int utt_id)
489 speak_data_s* speak_data = new speak_data_s();
490 if (nullptr == speak_data) {
491 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory for speak_data_s");
495 speak_data->text = strdup(text);
496 speak_data->voice.language = strdup(language);
497 speak_data->voice.ptts_id = nullptr;
498 speak_data->voice.type = voice_type;
500 speak_data->parameter.speed = speed;
501 speak_data->parameter.pitch = 0;
502 speak_data->parameter.volume = -1.0;
503 speak_data->parameter.bg_volume = -1.0;
504 speak_data->utt_id = utt_id;
509 void ttsd_data_destroy_speak_data(speak_data_s* speak_data)
511 if (nullptr == speak_data) {
512 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] data is nullptr");
515 destroy_speak_data(speak_data);
518 int ttsd_data_add_speak_data(unsigned int uid, speak_data_s* data)
520 lock_guard<mutex> lock(g_app_data_mutex);
521 app_data_s* app_data = get_client_app_data(uid);
522 if (nullptr == app_data) {
523 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
524 return TTSD_ERROR_INVALID_PARAMETER;
527 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u)", uid);
530 list<speak_data_s*>& speakData = app_data->m_speak_data;
531 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] m_speak_data size(%zu)", speakData.size());
532 speakData.push_back(data);
533 } catch (const std::bad_alloc&) {
534 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_speak_data (bad_alloc)");
535 return TTSD_ERROR_OUT_OF_MEMORY;
538 SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), text(%s), lang(%s), vctype(%d), speed(%d)",
539 data, data->utt_id, data->text, data->voice.language, data->voice.type, data->parameter.speed);
541 if (1 == data->utt_id)
542 app_data->utt_id_stopped = 0;
545 show_text_list(*app_data);
548 return TTSD_ERROR_NONE;
551 static speak_data_s* get_speak_data(app_data_s* app_data)
553 if (app_data->m_speak_data.empty()) {
555 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data");
561 show_text_list(*app_data);
564 return app_data->m_speak_data.front();
567 int ttsd_data_get_speak_data(unsigned int uid, speak_data_s** data)
569 lock_guard<mutex> lock(g_app_data_mutex);
570 app_data_s* app_data = get_client_app_data(uid);
571 if (nullptr == app_data) {
572 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
573 return TTSD_ERROR_INVALID_PARAMETER;
576 speak_data_s* speakData = get_speak_data(app_data);
577 if (nullptr == speakData) {
578 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data");
579 return TTSD_ERROR_OPERATION_FAILED;
582 app_data->m_speak_data.pop_front();
585 return TTSD_ERROR_NONE;
588 sound_data_s* ttsd_data_create_sound_data(int utt_id, const void* data, unsigned int data_size, ttse_result_event_e event,
589 ttse_audio_type_e audio_type, int rate, int channels)
592 sound_data_s* sound_data = new sound_data_s();
593 if (nullptr == sound_data) {
594 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory for speak_data_s");
598 sound_data->data = nullptr;
599 sound_data->data_size = 0;
601 if (nullptr != data && 0 < data_size) {
602 sound_data->data = new char[data_size];
603 if (nullptr != sound_data->data) {
604 memcpy(sound_data->data, data, data_size);
605 sound_data->data_size = data_size;
606 SLOG(LOG_INFO, tts_tag(), "[DEBUG][memcpy] event(%d) sound_data(%p) data(%p) size(%u)",
607 event, sound_data, sound_data->data, sound_data->data_size);
609 SLOG(LOG_ERROR, tts_tag(), "Fail to allocate memory");
612 SLOG(LOG_ERROR, tts_tag(), "Sound data is nullptr");
615 sound_data->utt_id = utt_id;
616 sound_data->event = event;
617 sound_data->audio_type = audio_type;
618 sound_data->rate = rate;
619 sound_data->channels = channels;
620 sound_data->played_data_size = 0;
625 void ttsd_data_destroy_sound_data(sound_data_s* sound_data)
627 if (nullptr == sound_data) {
628 SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] data is nullptr");
632 destroy_sound_data(sound_data);
635 int ttsd_data_add_sound_data(unsigned int uid, sound_data_s* data)
637 lock_guard<mutex> lock(g_app_data_mutex);
638 app_data_s* app_data = get_client_app_data(uid);
639 if (nullptr == app_data) {
640 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
641 return TTSD_ERROR_INVALID_PARAMETER;
644 if (nullptr == data) {
645 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] sound data is nullptr");
646 return TTSD_ERROR_INVALID_PARAMETER;
649 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] uid(%u)", uid);
652 list<sound_data_s*>& wavData = app_data->m_wav_data;
653 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] m_wav_data size(%zu)", wavData.size());
654 wavData.push_back(data);
655 } catch (const std::bad_alloc&) {
656 SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_sound_data (bad_alloc)");
657 return TTSD_ERROR_OUT_OF_MEMORY;
659 SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), data(%p) data size(%d), type(%d)",
660 data, data->utt_id, data->data, data->data_size, data->audio_type);
663 show_sound_list(*app_data);
666 return TTSD_ERROR_NONE;
669 static sound_data_s* __get_sound_data(app_data_s* app_data)
671 if (app_data->m_wav_data.empty()) {
673 SLOG(LOG_DEBUG, tts_tag(), "[DATA] There is no wav data");
679 show_sound_list(*app_data);
682 return app_data->m_wav_data.front();
685 sound_data_s* ttsd_data_get_first_sound_data(unsigned int uid)
687 lock_guard<mutex> lock(g_app_data_mutex);
688 app_data_s* app_data = get_client_app_data(uid);
689 if (nullptr == app_data) {
690 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
694 sound_data_s* soundData = __get_sound_data(app_data);
695 if (nullptr == soundData) {
696 SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no sound data");
700 app_data->m_wav_data.pop_front();
704 int ttsd_data_get_sound_data_size(unsigned int uid)
706 lock_guard<mutex> lock(g_app_data_mutex);
707 app_data_s* app_data = get_client_app_data(uid);
708 if (nullptr == app_data) {
709 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
713 return app_data->m_wav_data.size();
716 int ttsd_data_set_last_sound_result_event(unsigned int uid, ttse_result_event_e event)
718 lock_guard<mutex> lock(g_app_data_mutex);
719 app_data_s* app_data = get_client_app_data(uid);
720 if (nullptr == app_data) {
721 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
722 return TTSE_ERROR_INVALID_PARAMETER;
725 app_data->result_event = event;
726 return TTSE_ERROR_NONE;
729 ttse_result_event_e ttsd_data_get_last_sound_result_event(unsigned int uid)
731 lock_guard<mutex> lock(g_app_data_mutex);
732 app_data_s* app_data = get_client_app_data(uid);
733 if (nullptr == app_data) {
734 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
735 return TTSE_RESULT_EVENT_FAIL;
738 return app_data->result_event;
741 int ttsd_data_clear_data(unsigned int uid)
743 lock_guard<mutex> lock(g_app_data_mutex);
744 app_data_s* app_data = get_client_app_data(uid);
745 if (nullptr == app_data) {
746 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
747 return TTSD_ERROR_INVALID_PARAMETER;
750 clean_data(*app_data);
752 return TTSD_ERROR_NONE;
755 app_tts_state_e ttsd_data_get_client_state(unsigned int uid)
757 lock_guard<mutex> lock(g_app_data_mutex);
758 app_data_s* app_data = get_client_app_data(uid);
759 if (nullptr == app_data) {
760 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
761 return APP_STATE_NONE;
764 return app_data->state;
767 static unsigned int __get_playing_app_uid()
769 for (auto& app : g_app_list) {
770 if (APP_STATE_PLAYING == app.state) {
778 int ttsd_data_set_client_state(unsigned int uid, app_tts_state_e state)
780 lock_guard<mutex> lock(g_app_data_mutex);
781 app_data_s* app_data = get_client_app_data(uid);
782 if (nullptr == app_data) {
783 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
784 return TTSD_ERROR_INVALID_PARAMETER;
787 if (app_data->state == state) {
788 SLOG(LOG_ERROR, tts_tag(), "[DATA] Already current state. (%d)", state);
789 return TTSD_ERROR_NONE;
792 /* The client of playing state of all clients is only one. need to check state. */
793 int playing_uid = __get_playing_app_uid();
794 if (APP_STATE_PLAYING == state && 0 < playing_uid) {
795 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] A playing client has already existed. playing app uid(%u)", playing_uid);
796 return TTSD_ERROR_OPERATION_FAILED;
799 app_data->state = state;
801 return TTSD_ERROR_NONE;
804 tts_app_play_type_e ttsd_data_get_play_type(unsigned int uid)
806 lock_guard<mutex> lock(g_app_data_mutex);
807 app_data_s* app_data = get_client_app_data(uid);
808 if (nullptr == app_data) {
809 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
810 return TTS_APP_PLAY_TYPE_SYNTH;
813 return app_data->type;
816 int ttsd_data_set_play_type(unsigned int uid, tts_app_play_type_e type)
818 lock_guard<mutex> lock(g_app_data_mutex);
819 app_data_s* app_data = get_client_app_data(uid);
820 if (nullptr == app_data) {
821 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
822 return TTSD_ERROR_INVALID_PARAMETER;
825 app_data->type = type;
827 return TTSD_ERROR_NONE;
830 int ttsd_data_set_paused_data(unsigned int uid, sound_data_s* sound_data)
832 lock_guard<mutex> lock(g_app_data_mutex);
833 app_data_s* app_data = get_client_app_data(uid);
834 if (nullptr == app_data) {
835 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
836 return TTSD_ERROR_INVALID_PARAMETER;
840 app_data->m_wav_data.push_front(sound_data);
841 app_data->paused_data_existing = true;
843 app_data->paused_data_existing = false;
846 return TTSD_ERROR_NONE;
849 bool ttsd_data_is_paused_data_existing(unsigned int uid)
851 lock_guard<mutex> lock(g_app_data_mutex);
852 app_data_s* app_data = get_client_app_data(uid);
853 if (nullptr == app_data) {
854 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
858 return app_data->paused_data_existing;
861 bool ttsd_data_is_service_state_changed_cb_set(unsigned int uid)
863 lock_guard<mutex> lock(g_app_data_mutex);
864 app_data_s* app_data = get_client_app_data(uid);
865 if (nullptr == app_data) {
866 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
870 bool is_service_state_changed_cb_set = ((app_data->registered_event_mask & TTS_EVENT_MASK_SERVICE_STATE_CHANGED) != 0);
871 return is_service_state_changed_cb_set;
874 unsigned int ttsd_data_get_current_playing()
876 lock_guard<mutex> lock(g_app_data_mutex);
877 unsigned int uid = __get_playing_app_uid();
879 SLOG(LOG_INFO, tts_tag(), "[DATA INFO] Current playing uid(%u)", uid);
884 int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data)
886 if (nullptr == callback) {
887 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] input data is nullptr!!");
896 vector<app_data_s> temp_app_list;
898 unique_lock<mutex> lock(g_app_data_mutex);
899 int vsize = g_app_list.size();
900 for (int i = 0; i < vsize; i++) {
901 app_data_s app = {0, };
902 app.pid = g_app_list[i].pid;
903 app.uid = g_app_list[i].uid;
904 app.utt_id_stopped = 0;
905 app.state = g_app_list[i].state;
907 temp_app_list.push_back(app);
911 for (int i = 0; i < vsize; i++) {
912 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);
913 if (false == callback(temp_app_list[i].pid, temp_app_list[i].uid, temp_app_list[i].state, user_data)) {
921 unsigned int ttsd_data_get_first_client_uid()
923 unique_lock<mutex> lock(g_app_data_mutex);
924 if (g_app_list.empty()) {
925 SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] There is no valid client");
926 return TTS_INVALID_UID;
929 return g_app_list[0].uid;
932 bool ttsd_data_is_uttid_valid(unsigned int uid, int uttid)
934 lock_guard<mutex> lock(g_app_data_mutex);
935 app_data_s* app_data = get_client_app_data(uid);
936 if (nullptr == app_data) {
937 SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%u)", uid);
941 if (uttid < app_data->utt_id_stopped)
947 int ttsd_data_get_same_pid_client_count(int pid)
949 lock_guard<mutex> lock(g_app_data_mutex);
951 for (auto& appData : g_app_list) {
952 if(appData.pid == pid) {
960 int ttsd_data_get_activated_mode()
962 lock_guard<mutex> lock(g_app_data_mutex);
963 return g_activated_modes.getModes();
966 int ttsd_data_save_error_log(unsigned int uid, FILE* fp)
968 lock_guard<mutex> lock(g_app_data_mutex);
969 app_data_s* app_data = get_client_app_data(uid);
970 if (nullptr == app_data) {
971 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid client");
976 fprintf(fp, "pid - %d", app_data->pid);
979 fprintf(fp, "app state - %d", app_data->state);
982 fprintf(fp, "----- Sound list -----");
984 for (auto& wavData : app_data->m_wav_data) {
985 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)",
986 i, wavData, wavData->data, wavData->data_size, wavData->utt_id, wavData->audio_type);
989 fprintf(fp, "----------------------");
992 fprintf(fp, "----- Text list -----");
995 for (auto& speakData : app_data->m_speak_data) {
996 SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)",
997 i, speakData, speakData->voice.language, speakData->voice.type, speakData->parameter.speed,
998 speakData->utt_id, speakData->text);
1001 fprintf(fp, "---------------------");