00001
00036 #include <julius/julius.h>
00037
00052 void
00053 callback_init(Recog *recog)
00054 {
00055 int i;
00056 for(i=0;i<SIZEOF_CALLBACK_ID;i++) recog->callback_function_num[i] = 0;
00057 recog->callback_num = 0;
00058 }
00059
00076 static int
00077 callback_add_core(Recog *recog, int code, void (*func)(), void *data)
00078 {
00079 int i;
00080 int num;
00081 int newid;
00082
00083 num = recog->callback_function_num[code];
00084
00085 if (num >= MAX_CALLBACK_HOOK) {
00086 jlog("ERROR: callback_add: failed to add callback for slot %d\n", code);
00087 jlog("ERROR: callback_add: maximum number of callback for a slot is limited to %d\n", MAX_CALLBACK_HOOK);
00088 jlog("ERROR: callback_add: please increase the value of MAX_CALLBACK_HOOK\n");
00089 return -1;
00090 }
00091
00092 for(i=0;i<num;i++) {
00093 if (recog->callback_function[code][i] == func && recog->callback_user_data[code][i] == data) {
00094 jlog("WARNING: callback_add: the same callback already registered at slot %d\n", code);
00095 return -1;
00096 }
00097 }
00098 recog->callback_function[code][num] = func;
00099 recog->callback_user_data[code][num] = data;
00100 recog->callback_function_num[code]++;
00101
00102 newid = recog->callback_num;
00103 if (newid >= MAX_CALLBACK_HOOK * SIZEOF_CALLBACK_ID) {
00104 jlog("ERROR: callback_add: callback registration count reached maximum limit (%d)!\n", MAX_CALLBACK_HOOK * SIZEOF_CALLBACK_ID);
00105 return -1;
00106 }
00107 recog->callback_list_code[newid] = code;
00108 recog->callback_list_loc[newid] = num;
00109 recog->callback_num++;
00110
00111 return newid;
00112 }
00113
00134 int
00135 callback_add(Recog *recog, int code, void (*func)(Recog *recog, void *data), void *data)
00136 {
00137 return(callback_add_core(recog, code, func, data));
00138 }
00139
00160 int
00161 callback_add_adin(Recog *recog, int code, void (*func)(Recog *recog, SP16 *buf, int len, void *data), void *data)
00162 {
00163 return(callback_add_core(recog, code, func, data));
00164 }
00165
00166
00182 void
00183 callback_exec(int code, Recog *recog)
00184 {
00185 int i;
00186
00187 if (code < 0 || code >= SIZEOF_CALLBACK_ID) {
00188 jlog("ERROR: callback_exec: failed to exec callback: invalid code number: %d\n", code);
00189 return;
00190 }
00191 for(i=0;i<recog->callback_function_num[code];i++) {
00192 (*(recog->callback_function[code][i]))(recog, recog->callback_user_data[code][i]);
00193 }
00194 }
00195
00213 void
00214 callback_exec_adin(int code, Recog *recog, SP16 *buf, int len)
00215 {
00216 int i;
00217
00218 if (code < 0 || code >= SIZEOF_CALLBACK_ID) {
00219 jlog("ERROR: callback_exec_adin: failed to exec callback: invalid code number: %d\n", code);
00220 return;
00221 }
00222 for(i=0;i<recog->callback_function_num[code];i++) {
00223 (*(recog->callback_function[code][i]))(recog, buf, len, recog->callback_user_data[code][i]);
00224 }
00225 }
00226
00245 boolean
00246 callback_exist(Recog *recog, int code)
00247 {
00248 if (recog->callback_function_num[code] == 0) return FALSE;
00249 return TRUE;
00250 }
00251
00270 boolean
00271 callback_delete(Recog *recog, int id)
00272 {
00273 int code;
00274 int loc;
00275 int i;
00276
00277 if (id >= recog->callback_num || id < 0) {
00278 jlog("ERROR: callback_delete: callback id #%d not exist!\n", id);
00279 return FALSE;
00280 }
00281
00282 code = recog->callback_list_code[id];
00283 loc = recog->callback_list_loc[id];
00284
00285 if (code == -1) {
00286 jlog("WARNING: callback_delete: callback #%d already deleted\n", id);
00287 return TRUE;
00288 }
00289
00290 for(i=loc;i<recog->callback_function_num[code]-1;i++) {
00291 recog->callback_function[code][i] = recog->callback_function[code][i+1];
00292 recog->callback_function[code][i] = recog->callback_function[code][i+1];
00293 recog->callback_user_data[code][i] = recog->callback_user_data[code][i+1];
00294 }
00295 recog->callback_function_num[code]--;
00296 recog->callback_list_code[id] = -1;
00297 recog->callback_list_loc[id] = -1;
00298
00299 jlog("STAT: callback #%d deleted\n", id);
00300 return TRUE;
00301 }
00302
00303