00001
00047
00048
00049
00050
00051
00052
00053
00054 #include <sent/stddefs.h>
00055 #include <sent/htk_hmm.h>
00056 #include <sent/ptree.h>
00057
00058 static boolean
00059 load_hmmlist_callback(void **data_p, void *data, FILE *fp)
00060 {
00061 HTK_HMM_INFO *hmminfo = data;
00062 HMM_Logical *new;
00063 int len;
00064 char buf[MAX_HMMNAME_LEN];
00065 HTK_HMM_Data *d;
00066
00067 new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));
00068 if (myfread(&(new->is_pseudo), sizeof(boolean), 1, fp) < 1) return FALSE;
00069 if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00070 new->name = (char *)mybmalloc2(len, &(hmminfo->lroot));
00071 if (myfread(new->name, len, 1, fp) < 1) return FALSE;
00072 if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00073 if (myfread(buf, len, 1, fp) < 1) return FALSE;
00074 if (new->is_pseudo) {
00075 jlog("Error: sorry, pseudo logical phone saving not implemented yet\n");
00076 return FALSE;
00077 } else {
00078 d = htk_hmmdata_lookup_physical(hmminfo, buf);
00079 if (d == NULL) {
00080 jlog("Error: load_hmmlist_callback: no name \"%s\" in hmmdefs!\n", buf);
00081 return FALSE;
00082 }
00083 new->body.defined = d;
00084 }
00085 new->next = hmminfo->lgstart;
00086 hmminfo->lgstart = new;
00087
00088 *data_p = new;
00089
00090 return TRUE;
00091 }
00092
00093 boolean
00094 load_hmmlist_bin(FILE *fp, HTK_HMM_INFO *hmminfo)
00095 {
00096 HMM_Logical *l;
00097 int n;
00098
00099 if (aptree_read(fp, &(hmminfo->logical_root), &(hmminfo->lroot), hmminfo, load_hmmlist_callback) == FALSE) {
00100 jlog("Error: load_hmmlist_bin: failed to read hmmlist from binary file\n");
00101 return FALSE;
00102 }
00103 n = 0;
00104 for(l=hmminfo->lgstart;l;l=l->next) n++;
00105 hmminfo->totallogicalnum = n;
00106
00107 return TRUE;
00108 }