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.
16 #include <sound_manager.h>
17 #include <sound_manager_internal.h>
19 #include "ttsd_main.h"
20 #include "ttsd_player.h"
21 #include "ttsd_data.h"
22 #include "ttsd_dbus.h"
24 #include "tts_internal.h"
25 #include "ttsd_server.h"
28 * Internal data structure
34 AUDIO_STATE_WAIT_FOR_PLAYING,
39 int uid; /** client id */
40 app_tts_state_e state; /** client state */
42 /* Current utterance information */
43 ttse_result_event_e event; /** event of last utterance */
47 sound_data_s* paused_data;
50 #define SOUND_BUFFER_LENGTH 2048
51 #define FOCUS_SERVER_READY "/tmp/.sound_server_ready"
53 /* Sound buf save for test */
58 static char g_temp_file_name[128] = {'\0',};
62 static int g_count = 1;
65 /** player init info */
66 static bool g_player_init = false;
69 static GList *g_player_list;
71 /** current player information */
72 static player_s* g_playing_info;
75 static audio_state_e g_audio_state;
77 static ttse_audio_type_e g_audio_type;
79 static int g_sampling_rate;
81 static audio_out_h g_audio_h;
83 static sound_stream_info_h g_stream_info_h;
85 static sound_stream_ducking_h g_media_stream_ducking;
86 static sound_stream_ducking_h g_system_stream_ducking;
87 static sound_stream_ducking_h g_notification_stream_ducking;
88 static sound_stream_ducking_h g_alarm_stream_ducking;
90 static bool g_is_set_policy;
92 // static bool ducking_flag;
94 #define SND_MGR_DUCKING_DURATION 500
96 static int g_focus_watch_id = -1;
98 static double g_bg_volume_ratio;
101 * Internal Interfaces
104 player_s* __player_get_item(int uid)
107 player_s *data = NULL;
109 if (0 < g_list_length(g_player_list)) {
110 /* Get a first item */
111 iter = g_list_first(g_player_list);
113 while (NULL != iter) {
114 /* Get handle data from list */
115 data = (player_s*)iter->data;
118 if (uid == data->uid)
122 iter = g_list_next(iter);
129 void __player_focus_state_cb(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state,
130 sound_stream_focus_change_reason_e reason_for_change, int sound_behavior, const char *extra_info, void *user_data)
132 SLOG(LOG_DEBUG, tts_tag(), "@@@ Focus state changed cb");
134 if (stream_info != g_stream_info_h) {
135 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Invalid stream info handle");
138 SLOG(LOG_WARN, tts_tag(), "[Player] focus state changed to (%d) with reason(%d) and extra info(%s)", (int)focus_state, (int)reason_for_change, extra_info);
140 if ((AUDIO_STATE_PLAY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state) && focus_mask == SOUND_STREAM_FOCUS_FOR_PLAYBACK && SOUND_STREAM_FOCUS_STATE_RELEASED == focus_state) {
141 if (TTSD_MODE_DEFAULT == ttsd_get_mode()) {
142 g_audio_state = AUDIO_STATE_READY;
144 if (NULL == g_playing_info) {
145 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] No current player");
149 if (APP_STATE_PLAYING == g_playing_info->state) {
150 int uid = g_playing_info->uid;
152 if (0 != ttsd_player_pause(uid)) {
153 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to pause the player");
157 ttsd_data_set_client_state(uid, APP_STATE_PAUSED);
158 int pid = ttsd_data_get_pid(uid);
159 /* send message to client about changing state */
160 ttsdc_send_set_state_message(pid, uid, APP_STATE_PAUSED);
163 SLOG(LOG_DEBUG, tts_tag(), "[Player] Ignore focus state cb - mode(%d)", ttsd_get_mode());
167 /* if (AUDIO_STATE_READY == g_audio_state && focus_mask == SOUND_STREAM_FOCUS_FOR_PLAYBACK && SOUND_STREAM_FOCUS_STATE_ACQUIRED == focus_state) {
168 if (TTSD_MODE_DEFAULT == ttsd_get_mode()) {
169 g_audio_state = AUDIO_STATE_PLAY;
171 if (NULL == g_playing_info) {
172 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] No current player");
176 if (APP_STATE_PAUSED == g_playing_info->state) {
177 int uid = g_playing_info->uid;
179 g_audio_state = AUDIO_STATE_PLAY;
180 if (0 != ttsd_player_resume(uid)) {
181 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to resume the player");
182 g_audio_state = AUDIO_STATE_READY;
186 ttsd_data_set_client_state(uid, APP_STATE_PLAYING);
187 int pid = ttsd_data_get_pid(uid);
188 ttsdc_send_set_state_message(pid, uid, APP_STATE_PLAYING);
192 SLOG(LOG_DEBUG, tts_tag(), "[Player] Ignore focus state cb - mode(%d)", ttsd_get_mode());
196 SLOG(LOG_DEBUG, tts_tag(), "@@@");
201 void __player_focus_state_watch_cb(int id, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state, sound_stream_focus_change_reason_e reason,
202 const char *extra_info, void *user_data)
204 SLOG(LOG_DEBUG, tts_tag(), "@@@ Focus state watch cb");
206 ttsd_mode_e mode = ttsd_get_mode();
208 if (TTSD_MODE_SCREEN_READER != mode && TTSD_MODE_NOTIFICATION != mode) {
209 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] This is not screen-reader mode and notification mode.");
213 if (SOUND_STREAM_FOCUS_CHANGED_BY_VOICE_INFORMATION == reason && NULL != extra_info && 0 == strncmp(extra_info, "TTSD_MODE_INTERRUPT", strlen(extra_info))) {
214 /* If the focus is changed by "Interrupt" mode and current players of "SR" and "Noti" modes are on going, please stop all players. */
215 SLOG(LOG_INFO, tts_tag(), "[Player INFO] All stop the playing or the request to play. audio state(%d)", g_audio_state);
217 // if (AUDIO_STATE_PLAY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state)
218 g_audio_state = AUDIO_STATE_READY;
220 ttsd_send_all_stop();
222 /* if (NULL == g_playing_info) {
223 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] No current player");
227 if (APP_STATE_PLAYING == g_playing_info->state) {
228 int uid = g_playing_info->uid;
230 if (0 != ttsd_server_stop(uid)) {
231 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to stop TTS server");
234 if (0 != ttsd_player_stop(uid)) {
235 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to stop the player");
239 ttsd_data_set_client_state(uid, APP_STATE_READY);
240 int pid = ttsd_data_get_pid(uid);
241 // send message to client about changing state
242 ttsdc_send_set_state_message(pid, uid, APP_STATE_READY);
244 SLOG(LOG_DEBUG, tts_tag(), "[Player] Not playing state");
247 SLOG(LOG_DEBUG, tts_tag(), "[Player] Extra info is not Interrupt mode(%s) or not playing state(%d).", (NULL == extra_info) ? "NULL" : extra_info, g_audio_state);
253 void __sound_stream_ducking_state_changed_cb(sound_stream_ducking_h stream_ducking, bool is_ducked, void *user_data)
255 SLOG(LOG_DEBUG, tts_tag(), "@@@ ducking state changed cb");
256 SLOG(LOG_DEBUG, tts_tag(), "[Player] is ducked : %d", is_ducked);
257 // ducking_flag = true;
261 static char* __get_ducking_stream(sound_stream_type_e stream_type)
263 if (SOUND_STREAM_TYPE_MEDIA == stream_type)
264 return "Media stream";
265 else if (SOUND_STREAM_TYPE_SYSTEM == stream_type)
266 return "System stream";
267 else if (SOUND_STREAM_TYPE_NOTIFICATION == stream_type)
268 return "Notification stream";
269 else if (SOUND_STREAM_TYPE_ALARM == stream_type)
270 return "Alarm stream";
271 return "Non matched stream";
274 static int __activate_ducking_sound_stream(sound_stream_type_e stream_type, sound_stream_ducking_h stream_ducking_h)
276 bool is_ducked = false;
277 int ret = sound_manager_is_ducked(stream_ducking_h, &is_ducked);
279 SLOG(LOG_DEBUG, tts_tag(), "[Player] The %s is already ducked", __get_ducking_stream(stream_type));
281 ret = sound_manager_activate_ducking(stream_ducking_h, SND_MGR_DUCKING_DURATION, g_bg_volume_ratio);
282 if (SOUND_MANAGER_ERROR_NONE != ret) {
283 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to activate ducking for %s", __get_ducking_stream(stream_type));
285 SLOG(LOG_INFO, tts_tag(), "[Player SUCCESS] Activate ducking for %s", __get_ducking_stream(stream_type));
291 static void __change_background_volume()
293 SLOG(LOG_INFO, tts_tag(), "[Player] volume ratio(%lf)", g_bg_volume_ratio);
294 if (1.0 > g_bg_volume_ratio) {
295 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking);
296 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking);
297 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking);
298 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking);
302 static int __deactivate_ducking_sound_stream(sound_stream_type_e stream_type, sound_stream_ducking_h stream_ducking_h)
304 bool is_ducked = false;
305 int ret = sound_manager_is_ducked(stream_ducking_h, &is_ducked);
307 SLOG(LOG_DEBUG, tts_tag(), "[Player] The %s is already recovered from ducking", __get_ducking_stream(stream_type));
309 ret = sound_manager_deactivate_ducking(stream_ducking_h);
310 if (SOUND_MANAGER_ERROR_NONE != ret) {
311 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to deactivate ducking for %s", __get_ducking_stream(stream_type));
313 SLOG(LOG_INFO, tts_tag(), "[Player SUCCESS] Deactivate ducking for %s", __get_ducking_stream(stream_type));
319 static void __recover_background_volume()
321 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking);
322 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking);
323 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking);
324 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking);
327 static int __create_audio_out(ttse_audio_type_e type, int rate)
330 audio_sample_type_e sample_type;
332 if (TTSE_AUDIO_TYPE_RAW_S16 == type) {
333 sample_type = AUDIO_SAMPLE_TYPE_S16_LE;
335 sample_type = AUDIO_SAMPLE_TYPE_U8;
338 ret = audio_out_create_new(rate, AUDIO_CHANNEL_MONO, sample_type, &g_audio_h);
339 if (AUDIO_IO_ERROR_NONE != ret) {
340 g_audio_state = AUDIO_STATE_NONE;
342 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to create audio");
345 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Create audio");
349 g_sampling_rate = rate;
351 g_audio_state = AUDIO_STATE_READY;
356 static int __destroy_audio_out()
358 if (NULL == g_audio_h) {
359 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Current handle is not valid");
364 ret = audio_out_destroy(g_audio_h);
365 if (AUDIO_IO_ERROR_NONE != ret) {
366 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to destroy audio");
369 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Destroy audio");
375 g_audio_state = AUDIO_STATE_NONE;
381 static void __end_play_thread(void *data, Ecore_Thread *thread)
383 SLOG(LOG_ERROR, tts_tag(), "@@@ End thread");
390 static void __set_policy_for_playing(int volume)
393 __change_background_volume();
395 /* Set stream info */
397 ttsd_mode_e mode = ttsd_get_mode();
398 if (TTSD_MODE_DEFAULT == mode) {
399 ret = sound_manager_acquire_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL);
400 if (SOUND_MANAGER_ERROR_NONE != ret) {
401 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to acquire focus");
403 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Success to acquire focus (default mode)");
405 } else if (TTSD_MODE_INTERRUPT == mode) {
406 ret = sound_manager_acquire_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, "TTSD_MODE_INTERRUPT");
407 if (SOUND_MANAGER_ERROR_NONE != ret) {
408 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to acquire focus");
410 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Success to acquire focus (interrupt mode)");
414 ret = audio_out_set_sound_stream_info(g_audio_h, g_stream_info_h);
415 if (AUDIO_IO_ERROR_NONE != ret) {
416 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to set stream info");
419 g_is_set_policy = true;
421 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] set policy for playing");
426 static void __unset_policy_for_playing()
429 ttsd_mode_e mode = ttsd_get_mode();
430 /* Unset stream info */
431 if (TTSD_MODE_DEFAULT == mode || TTSD_MODE_INTERRUPT == mode) {
432 sound_stream_focus_state_e state_for_playing = SOUND_STREAM_FOCUS_STATE_ACQUIRED;
433 ret = sound_manager_get_focus_state(g_stream_info_h, &state_for_playing, NULL);
434 if (SOUND_MANAGER_ERROR_NONE != ret) {
435 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to get focus state: %d", ret);
438 if (SOUND_STREAM_FOCUS_STATE_ACQUIRED == state_for_playing) {
439 if (TTSD_MODE_DEFAULT == mode || TTSD_MODE_INTERRUPT == mode) {
440 ret = sound_manager_release_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL);
441 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] release focus (mode: %d)", mode);
444 if (SOUND_MANAGER_ERROR_NONE != ret) {
445 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to release focus");
450 __recover_background_volume();
452 g_is_set_policy = false;
454 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] unset policy for playing");
459 int ttsd_player_check_current_playback_focus(bool *is_current_interrupt)
462 ttsd_mode_e mode = ttsd_get_mode();
464 if (TTSD_MODE_INTERRUPT != mode) {
465 /* check the current playback focus */
466 sound_stream_focus_change_reason_e reason;
467 int sound_behavior = 0;
468 char *extra_info = NULL;
470 ret = sound_manager_get_current_playback_focus(&reason, &sound_behavior, &extra_info);
472 SLOG(LOG_DEBUG, tts_tag(), "[Player] current playback focus: extra_info(%s), reason(%d), sound_behavior(%d)", extra_info, reason, sound_behavior);
474 if (SOUND_MANAGER_ERROR_NONE == ret && NULL != extra_info && 0 < strlen(extra_info)) {
475 if (SOUND_STREAM_FOCUS_CHANGED_BY_VOICE_INFORMATION == reason && 0 == strncmp(extra_info, "TTSD_MODE_INTERRUPT", strlen(extra_info))) {
476 SLOG(LOG_DEBUG, tts_tag(), "[Player] The current focus in Interrupt. Cannot play the requested sound data");
477 *is_current_interrupt = true;
482 return TTSD_ERROR_NONE;
486 if (NULL != extra_info) {
492 *is_current_interrupt = false;
494 return TTSD_ERROR_NONE;
497 static void __play_thread(void *data, Ecore_Thread *thread)
499 SLOG(LOG_DEBUG, tts_tag(), "@@@ Start thread");
505 snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/tts_temp_%d_%d", getpid(), g_count);
506 int ret = access(g_temp_file_name, 0);
509 SLOG(LOG_ERROR, tts_tag(), "[Recorder ERROR] File is already exist");
510 if (0 == remove(g_temp_file_name)) {
511 SLOG(LOG_DEBUG, tts_tag(), "[Recorder] Remove file");
521 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Recorder] Temp file name=[%s]", g_temp_file_name);
524 g_pFile = fopen(g_temp_file_name, "wb+x");
526 SLOG(LOG_ERROR, tts_tag(), "[Recorder ERROR] File not found!");
531 if (NULL == g_playing_info) {
532 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] No current player");
536 player_s* player = g_playing_info;
537 sound_data_s* sound_data = NULL;
540 int len = SOUND_BUFFER_LENGTH;
543 /* set volume policy as 40% */
544 __set_policy_for_playing(40);
545 while (1) { // 1st while(1)
546 /* check g_playing_info one more time */
547 if (NULL == g_playing_info) {
548 SLOG(LOG_INFO, tts_tag(), "[Player INFO] No current player");
549 g_audio_state = AUDIO_STATE_READY;
550 __unset_policy_for_playing();
554 if (true == player->is_paused_data && NULL != player->paused_data) {
556 if (NULL != sound_data) {
557 ttsd_data_clear_sound_data(&sound_data);
560 sound_data = (sound_data_s*)calloc(1, sizeof(sound_data_s));
561 if (NULL == sound_data || player->paused_data->data_size <= 0) {
562 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Out of memory OR paused_data is empty");
563 ttsd_data_clear_sound_data(&sound_data);
565 sound_data = player->paused_data;
566 player->paused_data = NULL;
567 } else { // NULL != sound_data && NULL != temp && player->paused_data->data_size > 0
568 char* temp = (char*)calloc(player->paused_data->data_size + 5, sizeof(char));
570 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Copy paused_data to sound_data");
571 sound_data->data = NULL;
572 sound_data->rate = 0;
573 sound_data->data_size = 0;
574 sound_data->utt_id = player->paused_data->utt_id;
575 sound_data->event = player->paused_data->event;
576 sound_data->audio_type = player->paused_data->audio_type;
577 sound_data->rate = player->paused_data->rate;
579 sound_data->data = temp;
580 memcpy(sound_data->data, player->paused_data->data, player->paused_data->data_size);
581 sound_data->data_size = player->paused_data->data_size;
582 ttsd_data_clear_sound_data(&player->paused_data);
587 player->is_paused_data = false;
590 if (NULL == sound_data) {
591 /* Request unprepare */
592 ret = audio_out_unprepare(g_audio_h);
593 if (AUDIO_IO_ERROR_NONE != ret) {
594 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
596 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Unprepare audio");
599 g_audio_state = AUDIO_STATE_READY;
601 /* unset volume policy, volume will be 100% */
602 __unset_policy_for_playing();
605 SLOG(LOG_INFO, tts_tag(), "[Player] Sound info : id(%d) data(%p) size(%d) audiotype(%d) rate(%d) event(%d)",
606 sound_data->utt_id, sound_data->data, sound_data->data_size, sound_data->audio_type, sound_data->rate, sound_data->event);
607 } else { // NO player->is_paused_data
609 ret = ttsd_data_get_sound_data(player->uid, &sound_data);
610 if (0 != ret || NULL == sound_data) {
612 SLOG(LOG_ERROR, tts_tag(), "[Player] No sound data. Waiting mode");
614 /* wait for new audio data come */
615 while (1) { // 2nd while(1)
617 if (NULL == g_playing_info) {
618 /* current playing uid is replaced */
619 SLOG(LOG_INFO, tts_tag(), "[Player] Finish thread");
620 if (AUDIO_STATE_PLAY == g_audio_state) {
621 /* release audio & recover session */
622 ret = audio_out_unprepare(g_audio_h);
623 if (AUDIO_IO_ERROR_NONE != ret) {
624 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
626 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Unprepare audio");
628 g_audio_state = AUDIO_STATE_READY;
630 /* unset volume policy, volume will be 100% */
631 __unset_policy_for_playing();
633 } else if (0 < ttsd_data_get_sound_data_size(player->uid)) {
634 /* new audio data come */
635 SLOG(LOG_INFO, tts_tag(), "[Player] Resume thread");
636 break; // exit from 2nd while(1)
639 /* If engine is not on processing */
640 if (TTSD_SYNTHESIS_CONTROL_DOING != ttsd_get_synth_control()) {
641 if (AUDIO_STATE_PLAY == g_audio_state) {
642 /* release audio & recover session */
643 ret = audio_out_unprepare(g_audio_h);
644 if (AUDIO_IO_ERROR_NONE != ret) {
645 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
647 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Unprepare audio");
649 g_audio_state = AUDIO_STATE_READY;
651 /* unset volume policy, volume will be 100% */
652 __unset_policy_for_playing();
654 } else { // TTSD_SYNTHESIS_CONTROL_DOING
655 SLOG(LOG_ERROR, tts_tag(), "[Player] Sound data is NULL, while engine is on processing to synthesize");
657 } // end of 2nd while(1). waiting for new audio data come
659 SLOG(LOG_INFO, tts_tag(), "[Player] Finish to wait for new audio data come");
661 if (AUDIO_STATE_READY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state) {
662 /* set volume policy as 40%, when resume play thread*/
663 __set_policy_for_playing(40);
666 /* resume play thread */
667 player->state = APP_STATE_PLAYING;
669 } // NULL == sound_data
671 /* If wdata's event is 'start', current wdata is first data of engine for synthesis.
672 * If wdata's event is 'finish', player should check previous event to know whether this wdata is first or not.
673 * When previous wdata's event is 'finish' and current wdata's event is 'finish',
674 * the player should send utt started event.
676 if (TTSE_RESULT_EVENT_START == sound_data->event ||
677 (TTSE_RESULT_EVENT_FINISH == player->event && TTSE_RESULT_EVENT_FINISH == sound_data->event)) {
678 int pid = ttsd_data_get_pid(player->uid);
681 SLOG(LOG_WARN, tts_tag(), "[Send WARNIING] Current player is not valid");
682 /* unset volume policy, volume will be 100% */
683 __unset_policy_for_playing();
684 ttsd_data_clear_sound_data(&sound_data);
688 if (0 != ttsdc_send_utt_start_message(pid, player->uid, sound_data->utt_id)) {
689 SLOG(LOG_ERROR, tts_tag(), "[Send ERROR] Fail to send Utterance Start Signal : pid(%d), uid(%d), uttid(%d)",
690 pid, player->uid, sound_data->utt_id);
692 SLOG(LOG_INFO, tts_tag(), "[Player] Start utterance : uid(%d), uttid(%d)", player->uid, sound_data->utt_id);
693 } // (TTSE_RESULT_EVENT_START == sound_data->event || (TTSE_RESULT_EVENT_FINISH == player->event && TTSE_RESULT_EVENT_FINISH == sound_data->event))
695 /* Save last event to check utterance start */
696 player->event = sound_data->event;
699 if (NULL == sound_data->data || 0 >= sound_data->data_size) {
700 if (TTSE_RESULT_EVENT_FINISH == sound_data->event) {
701 SLOG(LOG_DEBUG, tts_tag(), "No sound data");
702 /* send utterence finish signal */
703 int pid = ttsd_data_get_pid(player->uid);
706 SLOG(LOG_WARN, tts_tag(), "[Send WARNIING] Current player is not valid");
707 /* unset volume policy, volume will be 100% */
708 __unset_policy_for_playing();
709 ttsd_data_clear_sound_data(&sound_data);
713 __unset_policy_for_playing();
715 if (0 != ttsdc_send_utt_finish_message(pid, player->uid, sound_data->utt_id)) {
716 SLOG(LOG_ERROR, tts_tag(), "[Send ERROR] Fail to send Utterance Completed Signal : pid(%d), uid(%d), uttid(%d)",
717 pid, player->uid, sound_data->utt_id);
719 SLOG(LOG_INFO, tts_tag(), "[Player] Finish utterance : uid(%d), uttid(%d)", player->uid, sound_data->utt_id);
721 } // TTSE_RESULT_EVENT_FINISH == sound_data->event
722 SLOG(LOG_INFO, tts_tag(), "[Player] Event(%d) utterance : uid(%d), uttid(%d)", sound_data->event, player->uid, sound_data->utt_id);
723 ttsd_data_clear_sound_data(&sound_data);
725 } // (NULL == sound_data->data || 0 >= sound_data->data_size)
726 } // NO player->is_paused_data
728 // If there is any change in audio format, recreate audio handle
729 if (g_sampling_rate != sound_data->rate || g_audio_type != sound_data->audio_type) {
730 SLOG(LOG_INFO, tts_tag(), "[Player] Change audio handle : org type(%d) org rate(%d)", g_audio_type, g_sampling_rate);
731 if (NULL != g_audio_h) {
732 __destroy_audio_out();
735 if (0 > __create_audio_out(sound_data->audio_type, sound_data->rate)) {
736 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to create audio out");
737 /* unset volume policy, volume will be 100% */
738 __unset_policy_for_playing();
740 ttsd_data_clear_sound_data(&sound_data);
745 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Success to destroy and recreate audio out");
746 __set_policy_for_playing(40);
749 while (APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) {
750 if ((unsigned int)idx >= sound_data->data_size)
753 if ((unsigned int)idx + SOUND_BUFFER_LENGTH > sound_data->data_size) {
754 len = sound_data->data_size - idx;
756 len = SOUND_BUFFER_LENGTH;
759 // Check whether set_policy is done or not
760 if (false == g_is_set_policy) {
761 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Set policy");
762 __set_policy_for_playing(40);
765 if (AUDIO_STATE_READY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state) {
766 /* Request prepare */
767 ret = audio_out_prepare(g_audio_h);
768 if (AUDIO_IO_ERROR_NONE != ret) {
769 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to prepare audio : %d", ret);
770 g_playing_info = NULL;
771 /* unset volume policy, volume will be 100% */
772 __unset_policy_for_playing();
774 ttsd_data_clear_sound_data(&sound_data);
778 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Prepare audio");
779 g_audio_state = AUDIO_STATE_PLAY;
780 } // (AUDIO_STATE_READY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state)
782 char* temp_data = sound_data->data;
783 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Before audio_out_write. data(%p), data[%d](%p), uid(%d), utt_id(%d), len(%d)",
784 temp_data, idx, &temp_data[idx], player->uid, sound_data->utt_id, len);
786 /* write pcm buffer */
787 fwrite(&temp_data[idx], 1, len, g_pFile);
789 ret = audio_out_write(g_audio_h, &temp_data[idx], len);
791 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to audio write - %d", ret);
794 SLOG(LOG_INFO, tts_tag(), "[Player INFO] After audio_out_write");
797 if (NULL == g_playing_info && APP_STATE_PAUSED != player->state) {
798 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Current player is NULL");
799 g_audio_state = AUDIO_STATE_READY;
800 ret = audio_out_unprepare(g_audio_h);
801 if (AUDIO_IO_ERROR_NONE != ret) {
802 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
804 /* unset volume policy, volume will be 100% */
805 __unset_policy_for_playing();
807 ttsd_data_clear_sound_data(&sound_data);
810 } // (NULL == g_playing_info && APP_STATE_PAUSED != player->state)
812 if (APP_STATE_PAUSED == player->state) {
814 SLOG(LOG_DEBUG, tts_tag(), "[Player] player(%p)", player);
815 ttsd_data_clear_sound_data(&player->paused_data);
817 player->paused_data = sound_data;
819 player->is_paused_data = true;
822 g_audio_state = AUDIO_STATE_READY;
824 SLOG(LOG_INFO, tts_tag(), "[Player] Stop player thread by pause");
826 /* Request prepare */
827 ret = audio_out_unprepare(g_audio_h);
828 if (AUDIO_IO_ERROR_NONE != ret) {
829 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
831 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Unprepare audio");
833 /* unset volume policy, volume will be 100% */
834 __unset_policy_for_playing();
836 } // (APP_STATE_PAUSED == player->state)
837 } // while (APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state)
839 if (NULL == g_playing_info && APP_STATE_READY == player->state) {
841 g_audio_state = AUDIO_STATE_READY;
842 SLOG(LOG_DEBUG, tts_tag(), "[Player] Stop player thread");
844 /* Request prepare */
845 ret = audio_out_unprepare(g_audio_h);
846 if (AUDIO_IO_ERROR_NONE != ret) {
847 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
849 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Unprepare audio");
852 /* unset volume policy, volume will be 100% */
853 __unset_policy_for_playing();
854 ttsd_data_clear_sound_data(&sound_data);
856 } // (NULL == g_playing_info && APP_STATE_READY == player->state)
858 if ((APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) &&
859 (TTSE_RESULT_EVENT_FINISH == sound_data->event)) {
860 /* send utterence finish signal */
861 int pid = ttsd_data_get_pid(player->uid);
864 SLOG(LOG_WARN, tts_tag(), "[Send WARNIING] Current player is not valid");
865 /* unset volume policy, volume will be 100% */
866 __unset_policy_for_playing();
867 ttsd_data_clear_sound_data(&sound_data);
871 if (0 != ttsdc_send_utt_finish_message(pid, player->uid, sound_data->utt_id)) {
872 SLOG(LOG_ERROR, tts_tag(), "[Send ERROR] Fail to send Utterance Completed Signal : pid(%d), uid(%d), uttid(%d)",
873 pid, player->uid, sound_data->utt_id);
874 /* unset volume policy, volume will be 100% */
875 __unset_policy_for_playing();
876 ttsd_data_clear_sound_data(&sound_data);
880 SLOG(LOG_INFO, tts_tag(), "[Player] Finish utterance : uid(%d), uttid(%d)", player->uid, sound_data->utt_id);
881 } // ((APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) && (TTSE_RESULT_EVENT_FINISH == sound_data->event))
883 ttsd_data_clear_sound_data(&sound_data);
885 if (NULL == g_playing_info) {
886 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Current player is NULL");
887 g_audio_state = AUDIO_STATE_READY;
888 ret = audio_out_unprepare(g_audio_h);
889 if (AUDIO_IO_ERROR_NONE != ret) {
890 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to unprepare audio : %d", ret);
892 /* unset volume policy, volume will be 100% */
893 __unset_policy_for_playing();
894 ttsd_data_clear_sound_data(&sound_data);
897 } // end of 1st while(1)
900 int __create_ducking_handle(void)
903 if (NULL == g_media_stream_ducking) {
904 ret = sound_manager_create_stream_ducking(SOUND_STREAM_TYPE_MEDIA, __sound_stream_ducking_state_changed_cb, NULL, &g_media_stream_ducking);
905 if (SOUND_MANAGER_ERROR_NONE != ret)
906 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create stream ducking for type media, ret(%d)", ret);
908 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for media stream is already created");
911 if (NULL == g_system_stream_ducking) {
912 ret = sound_manager_create_stream_ducking(SOUND_STREAM_TYPE_SYSTEM, __sound_stream_ducking_state_changed_cb, NULL, &g_system_stream_ducking);
913 if (SOUND_MANAGER_ERROR_NONE != ret)
914 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create stream ducking for system type, ret(%d)", ret);
916 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for system stream is already created");
919 if (NULL == g_notification_stream_ducking) {
920 ret = sound_manager_create_stream_ducking(SOUND_STREAM_TYPE_NOTIFICATION, __sound_stream_ducking_state_changed_cb, NULL, &g_notification_stream_ducking);
921 if (SOUND_MANAGER_ERROR_NONE != ret)
922 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create stream ducking for notification type, ret(%d)", ret);
924 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for notification stream is already created");
927 if (NULL == g_alarm_stream_ducking) {
928 ret = sound_manager_create_stream_ducking(SOUND_STREAM_TYPE_ALARM, __sound_stream_ducking_state_changed_cb, NULL, &g_alarm_stream_ducking);
929 if (SOUND_MANAGER_ERROR_NONE != ret)
930 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create stream ducking for alarm type, ret(%d)", ret);
932 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for alarm stream is already created");
941 int ttsd_player_init()
943 g_playing_info = NULL;
944 g_audio_state = AUDIO_STATE_NONE;
949 ecore_thread_max_set(1);
953 if (0 == access(FOCUS_SERVER_READY, F_OK)) {
954 SLOG(LOG_ERROR, tts_tag(), "[Player SUCCESS] focus server is available");
958 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] focus server is not available");
963 ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_VOICE_INFORMATION, __player_focus_state_cb, NULL, &g_stream_info_h);
964 if (SOUND_MANAGER_ERROR_NONE != ret) {
965 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to create stream info");
968 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Create stream info");
971 /* add sound focus state watch callback */
972 ret = sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_PLAYBACK, __player_focus_state_watch_cb, NULL, &g_focus_watch_id);
973 if (SOUND_MANAGER_ERROR_NONE != ret) {
974 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to add sound focus watch callback");
975 sound_manager_destroy_stream_information(g_stream_info_h);
976 g_stream_info_h = NULL;
979 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Add sound focus watch callback");
982 ret = __create_ducking_handle();
983 if (SOUND_MANAGER_ERROR_NONE != ret) {
984 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create ducking handle, ret(%d)", ret);
986 SLOG(LOG_INFO, tts_tag(), "[Player SUCCESS] Create ducking handle");
989 ecore_thread_max_set(1);
991 ret = __create_audio_out(TTSE_AUDIO_TYPE_RAW_S16, 16000);
993 sound_manager_destroy_stream_information(g_stream_info_h);
994 sound_manager_remove_focus_state_watch_cb(g_focus_watch_id);
995 g_stream_info_h = NULL;
996 g_focus_watch_id = -1;
1001 g_player_init = true;
1006 int __destroy_ducking_handle(void)
1009 if (g_media_stream_ducking) {
1010 ret = sound_manager_destroy_stream_ducking(g_media_stream_ducking);
1011 if (SOUND_MANAGER_ERROR_NONE != ret)
1012 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy media stream ducking, ret(%d)", ret);
1013 g_media_stream_ducking = NULL;
1015 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for media stream is already created");
1018 if (g_system_stream_ducking) {
1019 ret = sound_manager_destroy_stream_ducking(g_system_stream_ducking);
1020 if (SOUND_MANAGER_ERROR_NONE != ret)
1021 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy system stream ducking, ret(%d)", ret);
1022 g_system_stream_ducking = NULL;
1024 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for system stream is already created");
1027 if (g_notification_stream_ducking) {
1028 ret = sound_manager_destroy_stream_ducking(g_notification_stream_ducking);
1029 if (SOUND_MANAGER_ERROR_NONE != ret)
1030 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy notification stream ducking, ret(%d)", ret);
1031 g_notification_stream_ducking = NULL;
1033 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for notification stream is already created");
1036 if (g_alarm_stream_ducking) {
1037 ret = sound_manager_destroy_stream_ducking(g_alarm_stream_ducking);
1038 if (SOUND_MANAGER_ERROR_NONE != ret)
1039 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy alarm stream ducking, ret(%d)", ret);
1040 g_alarm_stream_ducking = NULL;
1042 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for alarm stream is already created");
1047 int ttsd_player_release(void)
1049 if (false == g_player_init) {
1050 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1051 return TTSD_ERROR_OPERATION_FAILED;
1056 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] @@@@@");
1057 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Active thread count : %d", ecore_thread_active_get());
1058 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] @@@@@");
1060 /* The thread should be released */
1061 int thread_count = ecore_thread_active_get();
1063 while (0 < thread_count) {
1068 SLOG(LOG_WARN, tts_tag(), "[Player WARNING!!] Thread is blocked. Player release continue.");
1072 thread_count = ecore_thread_active_get();
1075 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Thread is released");
1077 ret = __destroy_audio_out();
1081 ret = sound_manager_destroy_stream_information(g_stream_info_h);
1082 if (SOUND_MANAGER_ERROR_NONE != ret) {
1083 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy stream info");
1085 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Destroy stream info");
1088 /* remove focus state watch callback */
1089 ret = sound_manager_remove_focus_state_watch_cb(g_focus_watch_id);
1090 if (SOUND_MANAGER_ERROR_NONE != ret) {
1091 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to remove the focus state watch cb");
1093 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Remove the focus state watch cb");
1096 ret = __destroy_ducking_handle();
1097 if (SOUND_MANAGER_ERROR_NONE != ret)
1098 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy stream ducking, ret(%d)", ret);
1100 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Destroy stream ducking");
1102 /* clear g_player_list */
1103 g_playing_info = NULL;
1104 g_player_init = false;
1106 g_stream_info_h = NULL;
1107 g_focus_watch_id = -1;
1112 int ttsd_player_create_instance(int uid)
1114 if (false == g_player_init) {
1115 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1119 /* Check uid is duplicated */
1120 if (NULL != __player_get_item(uid)) {
1121 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is already registered", uid);
1125 player_s* new_client = (player_s*)calloc(1, sizeof(player_s));
1126 if (NULL == new_client) {
1127 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to allocate memory");
1128 return TTSE_ERROR_OUT_OF_MEMORY;
1131 new_client->uid = uid;
1132 new_client->event = TTSE_RESULT_EVENT_FINISH;
1133 new_client->state = APP_STATE_READY;
1134 new_client->is_paused_data = false;
1135 new_client->idx = 0;
1136 new_client->paused_data = NULL;
1138 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Player] Create player : uid(%d)", uid);
1140 g_player_list = g_list_append(g_player_list, new_client);
1145 int ttsd_player_destroy_instance(int uid)
1147 if (false == g_player_init) {
1148 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1153 current = __player_get_item(uid);
1154 if (NULL == current) {
1155 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is not valid", uid);
1159 if (NULL != g_playing_info) {
1160 if (uid == g_playing_info->uid) {
1161 g_playing_info = NULL;
1166 player_s *data = NULL;
1168 if (0 < g_list_length(g_player_list)) {
1169 /* Get a first item */
1170 iter = g_list_first(g_player_list);
1172 while (NULL != iter) {
1173 /* Get handle data from list */
1174 data = (player_s*)iter->data;
1178 if (uid == data->uid) {
1179 g_player_list = g_list_remove_link(g_player_list, iter);
1188 iter = g_list_next(iter);
1192 SLOG(LOG_DEBUG, tts_tag(), "[PLAYER Success] Destroy instance");
1197 int ttsd_player_play(int uid)
1199 if (false == g_player_init) {
1200 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1204 if (NULL != g_playing_info) {
1205 if (uid == g_playing_info->uid) {
1206 SLOG(LOG_DEBUG, tts_tag(), "[Player] uid(%d) has already played", g_playing_info->uid);
1209 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] stop old player (%d)", g_playing_info->uid);
1210 ttsd_player_stop(g_playing_info->uid);
1214 SLOG(LOG_DEBUG, tts_tag(), "[Player] start play : uid(%d)", uid);
1216 /* Check sound queue size */
1217 if (0 == ttsd_data_get_sound_data_size(uid)) {
1218 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] A sound queue of current player(%d) is empty", uid);
1224 current = __player_get_item(uid);
1225 if (NULL == current) {
1226 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is not valid", uid);
1230 current->state = APP_STATE_PLAYING;
1232 g_playing_info = current;
1234 SLOG(LOG_INFO, tts_tag(), "[Player DEBUG] Active thread count : %d", ecore_thread_active_get());
1236 if (0 < ttsd_data_get_sound_data_size(current->uid)) {
1237 SLOG(LOG_INFO, tts_tag(), "[Player] Run thread");
1238 ecore_thread_run(__play_thread, __end_play_thread, NULL, NULL);
1244 int ttsd_player_stop(int uid)
1246 int ret = ttsd_player_clear(uid);
1248 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to stop player, ret(%d)", ret);
1252 /* check whether uid is current playing or not */
1253 if (NULL != g_playing_info) {
1254 if (uid == g_playing_info->uid) {
1255 /* release current playing info */
1256 g_playing_info = NULL;
1259 SLOG(LOG_DEBUG, tts_tag(), "[Player] No current playing");
1262 if (NULL == g_playing_info) {
1263 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1264 SLOG(LOG_ERROR, tts_tag(), "[Player] Active thread count : %d", ecore_thread_active_get());
1265 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1267 /* The thread should be released */
1268 int thread_count = ecore_thread_active_get();
1270 while (0 < thread_count) {
1275 SLOG(LOG_WARN, tts_tag(), "[Player WARNING!!] Thread is blocked. Player release continue.");
1279 thread_count = ecore_thread_active_get();
1282 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1283 SLOG(LOG_ERROR, tts_tag(), "[Player] Active thread count : %d", ecore_thread_active_get());
1284 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1287 SLOG(LOG_INFO, tts_tag(), "[Player SUCCESS] Stop player : uid(%d)", uid);
1292 int ttsd_player_clear(int uid)
1294 if (false == g_player_init) {
1295 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1301 current = __player_get_item(uid);
1302 if (NULL == current) {
1303 SECURE_SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is not valid", uid);
1307 if (true == current->is_paused_data) {
1308 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Clear paused data");
1309 ttsd_data_clear_sound_data(¤t->paused_data);
1312 current->event = TTSE_RESULT_EVENT_FINISH;
1313 current->state = APP_STATE_READY;
1314 current->is_paused_data = false;
1317 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Clear player : uid(%d)", uid);
1322 int ttsd_player_pause(int uid)
1324 SLOG(LOG_DEBUG, tts_tag(), "[Player] pause player : uid(%d)", uid);
1326 if (false == g_player_init) {
1327 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1333 current = __player_get_item(uid);
1334 if (NULL == current) {
1335 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] ttsd_player_pause() : uid(%d) is not valid", uid);
1339 /* check whether uid is current playing or not */
1340 if (NULL != g_playing_info) {
1341 if (uid == g_playing_info->uid) {
1342 /* release current playing info */
1343 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] release current playing info (%d)", uid);
1344 g_playing_info = NULL;
1350 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] current player (%p), g_playing_info(%p)", current, g_playing_info);
1352 current->state = APP_STATE_PAUSED;
1354 if (NULL == g_playing_info) {
1355 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1356 SLOG(LOG_ERROR, tts_tag(), "[Player] Active thread count : %d", ecore_thread_active_get());
1357 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1359 /* The thread should be released */
1360 int thread_count = ecore_thread_active_get();
1362 while (0 < thread_count) {
1366 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] current(%p), state(%d)", current, current->state);
1369 SLOG(LOG_WARN, tts_tag(), "[Player WARNING!!] Thread is blocked. Player release continue. current(%p) current state(%d)", current, current->state);
1373 thread_count = ecore_thread_active_get();
1376 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1377 SLOG(LOG_ERROR, tts_tag(), "[Player] Active thread count : %d", ecore_thread_active_get());
1378 SLOG(LOG_DEBUG, tts_tag(), "[Player] @@@@@");
1382 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Pause player : uid(%d)", uid);
1387 int ttsd_player_resume(int uid)
1389 SLOG(LOG_DEBUG, tts_tag(), "[Player] Resume player : uid(%d)", uid);
1391 if (false == g_player_init) {
1392 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1398 current = __player_get_item(uid);
1399 if (NULL == current) {
1400 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is not valid", uid);
1404 /* check current player */
1405 if (NULL != g_playing_info)
1406 g_playing_info = NULL;
1408 current->state = APP_STATE_PLAYING;
1409 g_playing_info = current;
1411 SLOG(LOG_INFO, tts_tag(), "[Player] Resume to run thread");
1412 ecore_thread_run(__play_thread, __end_play_thread, NULL, NULL);
1417 int ttsd_player_all_stop()
1419 if (false == g_player_init) {
1420 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1424 g_playing_info = NULL;
1427 player_s *data = NULL;
1429 if (0 < g_list_length(g_player_list)) {
1430 /* Get a first item */
1431 iter = g_list_first(g_player_list);
1433 while (NULL != iter) {
1434 /* Get handle data from list */
1435 data = (player_s*)iter->data;
1437 app_tts_state_e state;
1438 if (0 > ttsd_data_get_client_state(data->uid, &state)) {
1439 SLOG(LOG_ERROR, tts_tag(), "[player ERROR] uid(%d) is not valid", data->uid);
1440 ttsd_player_destroy_instance(data->uid);
1441 iter = g_list_next(iter);
1445 if (APP_STATE_PLAYING == state || APP_STATE_PAUSED == state) {
1446 data->event = TTSE_RESULT_EVENT_FINISH;
1447 data->state = APP_STATE_READY;
1449 if (true == data->is_paused_data) {
1450 SLOG(LOG_INFO, tts_tag(), "[Player INFO] Clear paused data");
1451 ttsd_data_clear_sound_data(&data->paused_data);
1454 data->is_paused_data = false;
1459 iter = g_list_next(iter);
1463 SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] player all stop!!");
1468 int ttsd_player_play_pcm(int uid)
1470 if (false == g_player_init) {
1471 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Not Initialized");
1475 if (NULL != g_playing_info) {
1476 if (uid == g_playing_info->uid) {
1477 SLOG(LOG_DEBUG, tts_tag(), "[Player] uid(%d) has already played", g_playing_info->uid);
1480 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] stop old player (%d)", g_playing_info->uid);
1481 ttsd_player_stop(g_playing_info->uid);
1485 SLOG(LOG_DEBUG, tts_tag(), "[Player] start play : uid(%d)", uid);
1487 /* Check sound queue size */
1488 if (0 == ttsd_data_get_sound_data_size(uid)) {
1489 SLOG(LOG_WARN, tts_tag(), "[Player WARNING] A sound queue of current player(%d) is empty", uid);
1494 current = __player_get_item(uid);
1495 if (NULL == current) {
1496 SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] uid(%d) is not valid", uid);
1500 current->state = APP_STATE_PLAYING;
1502 g_playing_info = current;
1504 SLOG(LOG_INFO, tts_tag(), "[Player DEBUG] Active thread count : %d", ecore_thread_active_get());
1506 if (0 <= ttsd_data_get_sound_data_size(current->uid)) {
1507 SLOG(LOG_INFO, tts_tag(), "[Player] Run thread");
1508 ecore_thread_run(__play_thread, __end_play_thread, NULL, NULL);
1514 int ttsd_player_get_background_volume_ratio(double* ratio)
1519 *ratio = g_bg_volume_ratio;
1521 return TTSD_ERROR_NONE;
1524 int ttsd_player_set_background_volume_ratio(double ratio)
1526 SLOG(LOG_INFO, tts_tag(), "[Player DEBUG] ttsd_player_set_background_volume_ratio : %lf", ratio);
1528 double prev_ratio = g_bg_volume_ratio;
1529 g_bg_volume_ratio = ratio;
1531 if (g_bg_volume_ratio != prev_ratio) {
1532 SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Check whether sound is ducked and Change volume. as-is(%lf), to-be(%lf)", prev_ratio, g_bg_volume_ratio);
1534 bool is_ducked = false;
1535 int ret = sound_manager_is_ducked(g_media_stream_ducking, &is_ducked);
1536 if (0 == ret && true == is_ducked) {
1537 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking);
1538 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking);
1540 ret = sound_manager_is_ducked(g_system_stream_ducking, &is_ducked);
1541 if (0 == ret && true == is_ducked) {
1542 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking);
1543 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking);
1545 ret = sound_manager_is_ducked(g_notification_stream_ducking, &is_ducked);
1546 if (0 == ret && true == is_ducked) {
1547 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking);
1548 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking);
1550 ret = sound_manager_is_ducked(g_alarm_stream_ducking, &is_ducked);
1551 if (0 == ret && true == is_ducked) {
1552 __deactivate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking);
1553 __activate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking);
1557 return TTSD_ERROR_NONE;
1560 int ttsd_player_wait_to_play(int uid)
1562 SLOG(LOG_INFO, tts_tag(), "[Player INFO] wait to play (%d)", uid);
1564 g_audio_state = AUDIO_STATE_WAIT_FOR_PLAYING;
1566 return TTSD_ERROR_NONE;