esignal_fea.c
来自「speech signal process tools」· C语言 代码 · 共 1,315 行 · 第 1/3 页
C
1,315 行
*/static struct header *FieldList_to_fea(FieldList list, struct fea_data **rec, char **fnames, int copy_sources){ struct header *hdr; int i, j; FieldSpec *fld; char **codes; FieldList subfields; FieldSpec *subf; char *name; void *ptr; int spstype; long *dim; struct fea_header *fea; struct header *source; if (list == NULL) return NULL; hdr = new_header(FT_FEA); for (i = 0; (fld = list[i]) != NULL; i++) { codes = NULL; if (fld->occurrence != VIRTUAL && (subfields = fld->subfields) != NULL) { for (j = 0; (subf = subfields[j]) != NULL; j++) { if (strcmp(subf->name, "enumStrings") != 0) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: subfields " "not supported in ESPS FEA files.\n"); } else if (fld->type != SHORT) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: Non-SHORT field " "has subfield enumStrings.\n"); } else if (subf->type != CHAR) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: enumStrings not CHAR.\n"); } else if (subf->rank != 2) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: enumStrings " "not of rank 2.\n"); } else codes = StrArrayFromRect(subf->dim, subf->data); } } if (FieldIsTag(fld) && FindStr(ESPS_TAG, fnames)) hdr->common.tag = TRUE; else if (FieldIsFeaSubtype(fld)) hdr->hd.fea->fea_type = *(short *) fld->data; else { name = fld->name; switch(fld->occurrence) { case GLOBAL: { int size = (int) FieldLength(fld); ptr = fld->data; if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: " "global field[%d]: \"%s\".\n", i, name); if (fld->rank > 1) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: rank %d globals " "not supported in ESPS FEA files.\n", fld->rank); } if (size == 0) { if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: empty globals " "not supported in ESPS FEA files.\n"); } else if (codes != NULL) (void) add_genhd_e(name, (short *) ptr, size, codes, hdr); else switch (fld->type) { case DOUBLE: (void) add_genhd_d(name, (double *) ptr, size, hdr); break; case FLOAT: (void) add_genhd_f(name, (float *) ptr, size, hdr); break; case LONG: (void) add_genhd_l(name, (long *) ptr, size, hdr); break; case SHORT: (void) add_genhd_s(name, (short *) ptr, size, hdr); break; case SCHAR: case UCHAR: case CHAR: (void) add_genhd_c(name, (char *) ptr, size, hdr); break; default: if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: global type %d " "not supported in ESPS FEA files.\n", fld->type); } } break; case REQUIRED: { long size = FieldLength(fld); if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: " "required field[%d]: \"%s\".\n", i, name); if (FindStr(name, fnames)) { spstype = (codes != NULL) ? CODED : ElibTypeToEsps(fld->type); if (spstype != UNDEF) { dim = (long *) malloc(fld->rank * sizeof(long)); for (j = 0; j < fld->rank; j++) dim[j] = fld->dim[j]; add_fea_fld(name, size, fld->rank, dim, spstype, codes, hdr); } } } break; case OPTIONAL: if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: optional fields " "not supported in ESPS FEA files.\n"); break; case VIRTUAL: if (copy_sources) { if (strncmp(name, "source_", 7) != 0) { if (DebugMsgLevel) fprintf(stderr, "Field_List_to_fea: VIRTUAL " "field other than source_<n>.\n"); } else if ((subfields = fld->subfields) != NULL || fld->type == CHAR) { size_t len; char *data; source = FieldList_to_fea(subfields, NULL, NULL, TRUE); len = FieldLength(fld); data = (char *) malloc(len + 1); strncpy(data, fld->data, len); data[len] = '\0'; add_source_file(hdr, data, source); } } break; case INCLUDED: if (DebugMsgLevel) fprintf(stderr, "FieldList_to_fea: included fields " "not supported in ESPS FEA files.\n"); break; default: spsassert(0, "FieldList_to_fea: " "unrecognized occurrence code.\n"); break; } } } if (rec != NULL) { *rec = allo_fea_rec(hdr); fea = hdr->hd.fea; if (hdr->common.tag) { fld = FindField(list, ESPS_TAG); fld->data = &(*rec)->tag; } for (i = 0; i < (int) fea->field_count; i++) { name = fea->names[i]; fld = FindField(list, name); fld->data = get_fea_ptr(*rec, name, hdr); } } return hdr;}/*!*//* Same function FindStr defined in fea2esig.c as well as * here and esig2fea.c. *//* * If "arr" is non-NULL, it should point to the beginning of a * NULL-terminated string array; search for the string "str" in the * array, return TRUE if it is found and FALSE otherwise. If "arr" * is NULL, just return TRUE. (NULL is not treated as an empty string * array; it is an indicator that all strings are to be accepted, */static intFindStr(char *str, char **arr){ int i; spsassert(str != NULL, "FindStr: NULL string."); if (arr == NULL) return TRUE; /* NULL array implies all fields */ for (i = 0; arr[i] != NULL; i++) if (strcmp(str, arr[i]) == 0) return TRUE; return FALSE;}/* * Convert a rectangular array of characters into a NULL-terminated * string array in which each string holds a copy of the contents of a * corresponding row of the character array (up to the first null * character---the rows are assumed to be null-padded on the right). * The beginning of the rectangular array is indicated by "data", and * its dimensions are given by dim[0] and dim[1]. The return value is * a pointer to the beginning of the string array. */static char **StrArrayFromRect(long *dim, void *data){ char **strarr; long len, wid, i; char *row; len = 1 + dim[0]; strarr = (char **) malloc(len * sizeof(char *)); len -= 1; wid = dim[1]; row = data; for (i = 0; i < len; i++) {/*!*//* Should check for null termination of rows. */ strarr[i] = savestring(row); row += wid; } strarr[len] = NULL; return strarr;}/* * Return TRUE if "fld" points to an Esignal field specification for a * LONG, scalar, REQUIRED field named "Tag"; return FALSE otherwise. * (Such a field in an Esignal file represents the ESPS tag in a FEA * file, not an ordinary FEA field named "Tag".) */static intFieldIsTag(FieldSpec *fld){ if (strcmp(fld->name, ESPS_TAG) != 0) return FALSE; if (fld->occurrence != REQUIRED) { if (DebugMsgLevel) fprintf(stderr, "FieldIsTag: non-REQUIRED field named \"%s\".\n", ESPS_TAG); return FALSE; } if (fld->type != LONG) { if (DebugMsgLevel) fprintf(stderr, "FieldIsTag: type of field named \"%s\" not LONG.\n", ESPS_TAG); return FALSE; } if (fld->rank != 0) { if (DebugMsgLevel) fprintf(stderr, "FieldIsTag: rank of field named \"%s\" not 0.\n", ESPS_TAG); return FALSE; } return TRUE;}/* * Return TRUE if "fld" points to an Esignal field specification for a * SHORT, scalar, GLOBAL field named "FeaSubtype"; return FALSE * otherwise. (Such a occurs field in an Esignal file that results from * converting an ESPS FEA file that belongs to one of the special FEA * subtypes (FEA_SD, FEA_SPEC, etc.) For the transformation to be * reversible, the field should give a value to hd.fea->fea_type in the * FEA header instead of being translated into a generic header item * named "FeaSubtype". */static intFieldIsFeaSubtype(FieldSpec *fld){ if (strcmp(fld->name, ESPS_FEA_SUBTYPE) != 0) return FALSE; if (fld->occurrence != GLOBAL) { if (DebugMsgLevel) fprintf(stderr, "FieldIsFeaSubtype: non-GLOBAL field named \"%s\".\n", ESPS_FEA_SUBTYPE); return FALSE; } if (fld->type != SHORT) { if (DebugMsgLevel) fprintf(stderr, "FieldIsFeaSubtype: " "type of field named \"%s\" not SHORT.\n", ESPS_FEA_SUBTYPE); return FALSE; } if (fld->rank != 0) { if (DebugMsgLevel) fprintf(stderr, "FieldIsFeaSubtype: rank of field named \"%s\" not 0.\n", ESPS_FEA_SUBTYPE); return FALSE; } if (fld->data == NULL) { if (DebugMsgLevel) fprintf(stderr, "FieldIsFeaSubtype: " "field named \"%s\" has NULL data pointer.\n", ESPS_FEA_SUBTYPE); return FALSE; } return TRUE;}/* * If "type" is an Esignal data-type code, return the corresponding * ESPS data-type code, or UNDEF if no such ESPS data type exists. */static intElibTypeToEsps(int type){ switch (type) { case DOUBLE: return FDOUBLE; case FLOAT: return FFLOAT; case LONG: return FLONG; case SHORT: return FSHORT; case SCHAR: return BYTE; case UCHAR: case CHAR: return FCHAR; case DOUBLE_COMPLEX: return DOUBLE_CPLX; case FLOAT_COMPLEX: return FLOAT_CPLX; case LONG_COMPLEX: return LONG_CPLX; case SHORT_COMPLEX: return SHORT_CPLX; case SCHAR_COMPLEX: return BYTE_CPLX; default: return UNDEF; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?