libjulius/src/callback.c

Go to the documentation of this file.
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 /* end of file */

Generated on Tue Dec 18 15:59:51 2007 for Julius by  doxygen 1.5.4