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.
15 #include "tts_client.h"
17 /* Max number of handle */
18 static const int g_max_handle = 999;
19 /* allocated handle */
20 static int g_allocated_handle = 0;
22 static GList *g_client_list = NULL;
24 /* private functions */
25 static int __client_generate_uid(int pid)
29 if (g_allocated_handle > g_max_handle) {
30 g_allocated_handle = 1;
33 /* generate uid, handle number should be smaller than 1000 */
34 return pid * 1000 + g_allocated_handle;
37 int tts_client_new(tts_h* tts)
39 tts_client_s* client = NULL;
40 client = (tts_client_s*)calloc(1, sizeof(tts_client_s));
42 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
43 return TTS_ERROR_OUT_OF_MEMORY;
45 tts_h temp = (tts_h)calloc(1, sizeof(struct tts_s));
47 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
49 return TTS_ERROR_OUT_OF_MEMORY;
51 temp->handle = __client_generate_uid(getpid());
53 /* initialize client data */
55 client->pid = getpid();
56 client->uid = temp->handle;
57 client->current_utt_id = 0;
59 client->state_changed_cb = NULL;
60 client->state_changed_user_data = NULL;
62 client->utt_started_cb = NULL;
63 client->utt_started_user_data = NULL;
64 client->utt_completeted_cb = NULL;
65 client->utt_completed_user_data = NULL;
67 client->error_cb = NULL;
68 client->error_user_data = NULL;
69 client->default_voice_changed_cb = NULL;
70 client->default_voice_changed_user_data = NULL;
71 client->supported_voice_cb = NULL;
72 client->supported_voice_user_data = NULL;
74 client->mode = TTS_MODE_DEFAULT;
75 client->before_state = TTS_STATE_CREATED;
76 client->current_state = TTS_STATE_CREATED;
78 client->cb_ref_count = 0;
82 client->err_msg = NULL;
84 client->conn_timer = NULL;
85 client->hello_timer = NULL;
87 client->credential = NULL;
88 client->credential_needed = false;
89 client->internal = false;
91 client->text_repeat = NULL;
93 g_client_list = g_list_append(g_client_list, client);
97 SLOG(LOG_ERROR, TAG_TTSC, "[Success] Create client object : uid(%d)", client->uid);
99 return TTS_ERROR_NONE;
102 int tts_client_destroy(tts_h tts)
105 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
106 return TTS_ERROR_INVALID_PARAMETER;
110 tts_client_s *data = NULL;
112 /* if list have item */
113 if (g_list_length(g_client_list) > 0) {
114 /* Get a first item */
115 iter = g_list_first(g_client_list);
117 while (NULL != iter) {
119 if (tts->handle == data->tts->handle) {
120 g_client_list = g_list_remove_link(g_client_list, iter);
122 while (0 != data->cb_ref_count) {
123 /* wait for release callback function */
126 if (NULL != data->err_msg) {
128 data->err_msg = NULL;
131 if (NULL != data->credential) {
132 free(data->credential);
133 data->credential = NULL;
136 if (NULL != data->text_repeat) {
137 free(data->text_repeat);
138 data->text_repeat = NULL;
150 SLOG(LOG_ERROR, TAG_TTSC, "Client destroy : uid(%d)", uid);
151 return TTS_ERROR_NONE;
155 iter = g_list_next(iter);
158 SLOG(LOG_ERROR, TAG_TTSC, "Fail to destroy client : handle is not valid");
160 return TTS_ERROR_INVALID_PARAMETER;
163 tts_client_s* tts_client_get(tts_h tts)
166 SLOG(LOG_ERROR, TAG_TTSC, "Input parameter is NULL");
171 tts_client_s *data = NULL;
173 if (g_list_length(g_client_list) > 0) {
174 /* Get a first item */
175 iter = g_list_first(g_client_list);
177 while (NULL != iter) {
180 if (tts->handle == data->tts->handle)
184 iter = g_list_next(iter);
188 SLOG(LOG_ERROR, TAG_TTSC, "handle is not valid");
193 tts_client_s* tts_client_get_by_uid(const int uid)
196 SLOG(LOG_ERROR, TAG_TTSC, "out of range : handle");
201 tts_client_s *data = NULL;
203 if (g_list_length(g_client_list) > 0) {
204 /* Get a first item */
205 iter = g_list_first(g_client_list);
207 while (NULL != iter) {
209 if (uid == data->uid) {
214 iter = g_list_next(iter);
218 SLOG(LOG_WARN, TAG_TTSC, "uid is not valid");
223 int tts_client_get_size()
225 return g_list_length(g_client_list);
228 int tts_client_use_callback(tts_client_s* client)
230 client->cb_ref_count++;
234 int tts_client_not_use_callback(tts_client_s* client)
236 client->cb_ref_count--;
240 int tts_client_get_use_callback(tts_client_s* client)
242 return client->cb_ref_count;
246 int tts_client_get_connected_client_count()
249 tts_client_s *data = NULL;
252 if (g_list_length(g_client_list) > 0) {
253 /* Get a first item */
254 iter = g_list_first(g_client_list);
256 while (NULL != iter) {
258 if (0 < data->current_state) {
263 iter = g_list_next(iter);
269 int tts_client_get_mode_client_count(tts_mode_e mode)
272 tts_client_s *data = NULL;
275 if (g_list_length(g_client_list) > 0) {
276 /* Get a first item */
277 iter = g_list_first(g_client_list);
279 while (NULL != iter) {
281 if (0 < data->current_state && data->mode == mode) {
286 iter = g_list_next(iter);
292 GList* tts_client_get_client_list()
294 return g_client_list;