2 * Copyright (c) 2011-2014 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 "stt_client.h"
19 /* Max number of handle */
20 static const int g_max_handle = 999;
21 /* allocated handle */
22 static int g_allocated_handle = 0;
24 static GList *g_client_list = NULL;
27 /* private functions */
28 static int __client_generate_uid(int pid)
32 if (g_allocated_handle > g_max_handle) {
33 g_allocated_handle = 1;
36 /* generate uid, handle number should be smaller than 1000 */
37 return pid * 1000 + g_allocated_handle;
40 int stt_client_new(stt_h* stt)
42 stt_client_s *client = NULL;
44 client = (stt_client_s*)calloc(1, sizeof(stt_client_s));
46 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
47 return STT_ERROR_OUT_OF_MEMORY;
50 stt_h temp = (stt_h)calloc(1, sizeof(struct stt_s));
52 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
54 return STT_ERROR_OUT_OF_MEMORY;
56 temp->handle = __client_generate_uid(getpid());
58 /* initialize client data */
60 client->pid = getpid();
61 client->uid = temp->handle;
63 client->recognition_result_cb = NULL;
64 client->recognition_result_user_data = NULL;
65 client->state_changed_cb = NULL;
66 client->state_changed_user_data = NULL;
67 client->error_cb = NULL;
68 client->error_user_data = NULL;
69 client->default_lang_changed_cb = NULL;
70 client->default_lang_changed_user_data = NULL;
72 client->current_engine_id = NULL;
74 client->silence_supported = false;
75 client->silence = STT_OPTION_SILENCE_DETECTION_AUTO;
78 client->data_list = NULL;
79 client->data_count = 0;
83 client->err_msg = NULL;
85 client->before_state = STT_STATE_CREATED;
86 client->current_state = STT_STATE_CREATED;
88 client->internal_state = STT_INTERNAL_STATE_NONE;
90 client->cb_ref_count = 0;
92 g_client_list = g_list_append(g_client_list, client);
99 int stt_client_destroy(stt_h stt)
102 SLOG(LOG_ERROR, TAG_STTC, "Input parameter is NULL");
107 stt_client_s *data = NULL;
109 /* if list have item */
110 if (g_list_length(g_client_list) > 0) {
111 /* Get a first item */
112 iter = g_list_first(g_client_list);
114 while (NULL != iter) {
116 if (stt->handle == data->stt->handle) {
117 g_client_list = g_list_remove_link(g_client_list, iter);
119 while (0 != data->cb_ref_count) {
120 /* wait for release callback function */
123 if (NULL != data->current_engine_id) {
124 free(data->current_engine_id);
127 if (NULL != data->err_msg) {
138 iter = g_list_next(iter);
142 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] client Not founded");
148 stt_client_s* stt_client_get(stt_h stt)
151 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
156 stt_client_s *data = NULL;
158 if (g_list_length(g_client_list) > 0) {
159 /* Get a first item */
160 iter = g_list_first(g_client_list);
162 while (NULL != iter) {
165 if (stt->handle == data->stt->handle)
169 iter = g_list_next(iter);
173 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get client by stt");
178 stt_client_s* stt_client_get_by_uid(const int uid)
181 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] out of range : handle");
186 stt_client_s *data = NULL;
188 if (g_list_length(g_client_list) > 0) {
189 /* Get a first item */
190 iter = g_list_first(g_client_list);
192 while (NULL != iter) {
194 if (uid == data->uid) {
199 iter = g_list_next(iter);
203 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get client by uid");
208 int stt_client_get_size()
210 return g_list_length(g_client_list);
213 int stt_client_use_callback(stt_client_s* client)
215 client->cb_ref_count++;
219 int stt_client_not_use_callback(stt_client_s* client)
221 client->cb_ref_count--;
225 int stt_client_get_use_callback(stt_client_s* client)
227 return client->cb_ref_count;
230 GList* stt_client_get_client_list()
232 return g_client_list;