⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headers.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * This material contains unpublished, proprietary software of  * Entropic Research Laboratory, Inc. Any reproduction, distribution,  * or publication of this work must be authorized in writing by Entropic  * Research Laboratory, Inc., and must bear the notice:  * *    "Copyright (c) 1987-1990  Entropic Speech, Inc.  *    "Copyright (c) 1990-1996  Entropic Research Laboratory, Inc.  *                   All rights reserved" * * The copyright notice above does not evidence any actual or intended  * publication of this source code.      * * Written by:  Joseph T. Buck * Checked by: * Revised by:  Alan Parker * * Entry points:							      *    read_header(stream):  reads a header from stream and returns *        a pointer to it.					 *    write_header(h, stream):  writes the header *h to stream. *    new_zfunc(ns,ds,num,den):  creates a new zfunc structure. *    new_header(type):  creates a new, zero header.		 *    copy_header(h):  returns a pointer to a copy of h. *    add_source_file(oh, name, ih):  adds a source file and a source *        header to the output header.				 *    add_comment(h, text):  appends a string to the comment field * */static char *sccs_id = "@(#)headers.c	1.108	5/2/98	ESI/ERL";#include <stdio.h>#include <pwd.h>#include <errno.h>#include <sys/types.h>#include <sys/file.h>#ifdef DEC_ALPHA#undef MIN#undef MAX#endif#ifndef APOLLO_68K#include <unistd.h>#endif#include <sys/stat.h>#include <esps/esps.h>#include <esps/filt.h>#include <esps/unix.h>#include <esps/fea.h>#include <esps/feasd.h>#include <esps/esignal_fea.h>#include <esps/pc_wav.h>/* Minimum number of bytes to read to recognize an ESPS file. * The ESPS magic number is a 4-byte long following four others * (if there is a preamble). */#define ESPS_PREFIX_SIZE    (ESPS_MAGIC_OFFSET + 4)#define ESPS_MAGIC_OFFSET   16#define ESPS_BYTE  8#define ESPS_SHORT  4#undef BYTE#undef SHORTextern int errno;extern int debug_level; #define MAX_PARAM_LEN 6000/*  This is a temp hack to work around a bug whereby a comment could be  longer than the maximum size of a variable header item.   In the next  version of esps change MAX_PARAM_LEN above to 8192, and removed the redefine  of MAX_STRING*/#undef MAX_STRING	#define MAX_STRING 6000*4#define SIZINT (sizeof (int))#define SIZFLT (sizeof (float))#define SIZSHO (sizeof (short))#define SIZLO  (sizeof (long))#define SIZCHAR (sizeof (char))#define SIZZF(z) (z ? (2*SIZSHO + (z->nsiz+z->dsiz)*SIZFLT)/SIZINT : 0)#define BADHEAD(lev,text) { badhead (lev, text); return NULL; }char    head_errtxt[100];static int  buf[MAX_PARAM_LEN];#define buf2 &buf[MAX_PARAM_LEN/2]/* 2nd half of buf */long long_dummy;char   *savestring ();static void badhead (); static void recursive_wh (), put_shorts ();static short  *get_shorts (), *copy_shorts ();static float  *copy_floats (), *get_floats ();static void write_genhd ();char   *add_genhd ();static void hd_error (), put_longs ();static long   *copy_longs (), *get_longs ();static void set_ana_type(), set_pit_type(), set_spec_type(), set_ros_type();void set_filt_type(), set_scbk_type();void add_comment();#ifndef DEC_ALPHAstatic long swap_longs();#elsestatic int swap_longs();#endifvoid add_genzfunc();int read_preamble();static void rec_free_hdr();	/* used by free_header */static void free_zfunc();	/* used by free_header */static void free_strlist();	/* used by free_header */static void f_copy(), putnulls(), write_par();static int old_version();static long edr_bytes_to_long();    /* used by recursive_rh */static long lsbf_bytes_to_long();   /* used by recursive_rh */double atof();#ifdef DEMO#define NOKEY 1#endif#ifndef NO_LICvoid check_header();#endif#define PRE_DERIVED "1.34"	/* last version of header.h without 				   derived fields for feature files */#define PRE_NEWSIZ  "1.44"	/* last version with ndouble, nfloat,				   nlong, nshort, nchar, and fixpartsiz				   as shorts */#define PRE_FIELD_ORDER "1.57"	/* last version without ability to read or				   write feature files in field order */#define PRE_COMPLEX "1.70"	/* last version without complex fea fields */#define PRE_ALIGNMENT "1.73"	/* last version without alignment pad */#include <esps/mach_codes.h>static int	edr_flag=0;		/* global EDR flag for reading */static int	machine_code;		/* global machine_code flag */int		EspsDebug = 0;		/* debug code enabled in this module */#ifdef DEMOstatic int	hash();			/* simple hash function */#endif/* copy zfunc, copies a zfunc from one header to another*/struct zfunc   *copy_zfunc (src)struct zfunc   *src;{    if (src == NULL)	return (NULL);    return (new_zfunc (src -> nsiz, src -> dsiz, src -> zeros, src -> poles));}/*	new_zfunc creates a new zfunc structure from dynamic memory.*/struct zfunc   *new_zfunc (ns, ds, num, den)int     ns, ds;float   num[], den[];{    struct zfunc   *z = (struct zfunc  *) malloc ((unsigned) sizeof *z);    spsassert(z,"new_zfunc: malloc failed");    if (ns > 0) {	z -> zeros = (float *) malloc ((unsigned) (ns * SIZFLT));        spsassert(z->zeros,"new_zfunc: malloc failed");	f_copy (z -> zeros, num, ns);    }    else	z -> zeros = NULL;    if (ds > 0) {	z -> poles = (float *) malloc ((unsigned) (ds * SIZFLT));        spsassert(z->poles,"new_zfunc: malloc failed");	f_copy (z -> poles, den, ds);    }    else	z -> poles = NULL;    z -> nsiz = ns;    z -> dsiz = ds;    return z;}static struct zfunc *read_zfunc (lev, fd) int    lev;FILE * fd; {    short   ns, ds;    if (!miio_get_short (&ns, 1, edr_flag, machine_code, fd) ||	    !miio_get_short (&ds,  1, edr_flag, machine_code, fd))	BADHEAD (lev, "zfunc read error");    if (ns != 0)	if (!miio_get_float ((float *)buf,  ns, edr_flag, machine_code, fd))	    BADHEAD (lev, "zfunc read error");    if (ds != 0)	if (!miio_get_float ((float *)buf2,  ds, edr_flag, machine_code, fd))	    BADHEAD (lev, "zfunc read error");    return new_zfunc (ns, ds, (float *) buf, (float *) buf2);}static  voidwrite_zfunc (code, z, fd)short   code;struct zfunc   *z;FILE * fd;{    short   len = SIZZF (z);    if (!miio_put_short(&code, 1, edr_flag, fd) ||	    !miio_put_short(&len, 1, edr_flag, fd) ||	    !miio_put_short(&z -> nsiz, 1, edr_flag, fd) ||	    !miio_put_short(&z -> dsiz, 1, edr_flag, fd))	hd_error ("write_zfunc");    if (z -> nsiz != 0)	if (!miio_put_float(z -> zeros,  z -> nsiz, edr_flag, fd))	    hd_error ("write_zfunc");    if (z -> dsiz != 0)	if (!miio_put_float(z -> poles, z -> dsiz, edr_flag, fd))	    hd_error ("write_zfunc");}static inttypesiz (type)int     type;{    switch (type) {	case DOUBLE: 	    return sizeof (double);	case FLOAT: 	    return sizeof (float);	case LONG: 	    return sizeof (long);	case ESPS_SHORT: 	    return sizeof (short);	case CODED: 	    return sizeof (short);	case CHAR: 	case ESPS_BYTE: 	case EFILE:	case AFILE:	    return sizeof (char);	case DOUBLE_CPLX:            return sizeof(double_cplx);    	case FLOAT_CPLX:            return sizeof(float_cplx);    	case LONG_CPLX:            return sizeof(long_cplx);    	case SHORT_CPLX:            return sizeof(short_cplx);    	case BYTE_CPLX:            return sizeof(byte_cplx);    }    spsassert(NO, "typesiz: unrecognized type code");    return 0;	/* not reached, just to keep lint happy */}static  voidwrite_genhd (code, np, fp)short   code;struct gen_hd  *np;FILE * fp;{    short len;/* * do not write out generic for sphere_hd_ptr, esignal_hd_ptr, * or pc_wav_hd_ptr */    if (!strcmp(np->name, "sphere_hd_ptr")	|| !strcmp(np->name, "esignal_hd_ptr")	|| !strcmp(np->name, "pc_wav_hd_ptr"))	return;    write_par (code, np -> name, fp);    if (!miio_put_int (&np -> size, 1, edr_flag, fp) ||	    !miio_put_short(&np -> type, 1, edr_flag, fp))	hd_error ("write_genhd");    if (np->type == CODED) {	char **p = np->codes;	while (*p != NULL) {		len = strlen(*p)+1;		if(!miio_put_short(&len, 1, edr_flag, fp) ||		   !miio_put_char(*p, len, edr_flag, fp)) 			hd_error ("write_genhd");		p++;	}	len = 0;	if(!miio_put_short(&len, 1, edr_flag, fp))		hd_error ("write_genhd");    }     switch (np->type) {	case DOUBLE:	if (!miio_put_double((double *)np->d_ptr, (int)np->size, 	     edr_flag, fp))		hd_error ("write_genhd");	break;	case FLOAT:	if (!miio_put_float((float *)np->d_ptr, (int)np->size, 	     edr_flag, fp))		hd_error ("write_genhd");	break;	case LONG:	if (!miio_put_long((long *)np->d_ptr, (int)np->size, 	     edr_flag, fp))		hd_error ("write_genhd");	break;	case ESPS_SHORT:	case CODED:	if (!miio_put_short((short *)np->d_ptr, (int)np->size, 	     edr_flag, fp))		hd_error ("write_genhd");	break;	case CHAR:	case ESPS_BYTE:	case EFILE:	case AFILE:	if (!miio_put_char((char *)np->d_ptr, (int)np->size, 	     edr_flag, fp))		hd_error ("write_genhd");	break;     }	}staticread_genhd (lev, fd, hd, name)int     lev;FILE * fd;struct header  *hd;char   *name;{    unsigned int    size;    short   type, len;    char   *ptr;    char **codes;    int data_rep = hd->common.edr;    int mach_code = hd->common.machine_code;    if (!miio_get_int (&size,  1, data_rep, mach_code, fd) ||	    !miio_get_short (&type, 1, data_rep, mach_code, fd))	BADHEAD (lev, "read_genhd read error");    if (type != CODED) {    	ptr = add_genhd (name, type, (int) size, (char *)NULL, 		(char **)NULL, hd);    }    else {	int i=0;	codes = (char **)calloc(1,sizeof(char *));	spsassert(codes != NULL,"read_genhd: calloc failed!");        if (!miio_get_short (&len, 1, data_rep, mach_code, fd)) 	    BADHEAD (lev, "read_genhd read error");	while (len != 0) {	    ptr = malloc(SIZCHAR*len);	    spsassert(ptr != NULL,"read_genhd: malloc failed!");	    if (!miio_get_char (ptr, len, data_rep, mach_code, fd))	        BADHEAD (lev, "read_genhd read error");	    codes[i++] = ptr;	    codes = (char **)realloc((char *)codes, sizeof(char *)*(i+1));	    spsassert(codes != NULL,"read_genhd: realloc failed!");	    codes[i] = NULL;            if (!miio_get_short (&len, 1, data_rep, mach_code, fd))	        BADHEAD (lev, "read_genhd read error");	}    	ptr = add_genhd (name, type, (int) size, (char *)NULL, 		codes, hd);    }    switch (type) {	case DOUBLE:	if (!miio_get_double((double *)ptr, (int)size, data_rep, mach_code, fd))        	BADHEAD (lev, "read_genhd read error");	break;	case FLOAT:	if (!miio_get_float((float *)ptr, (int)size, data_rep, mach_code, fd))        	BADHEAD (lev, "read_genhd read error");	break;	case LONG:	if (!miio_get_long((long *)ptr, (int)size, data_rep, mach_code, fd))        	BADHEAD (lev, "read_genhd read error");	break;	case ESPS_SHORT:	case CODED:	if (!miio_get_short((short *)ptr, (int)size, data_rep, mach_code, fd))        	BADHEAD (lev, "read_genhd read error");	break;	case CHAR:	case ESPS_BYTE:	case EFILE:	case AFILE:	if (!miio_get_char((char *)ptr, (int)size, data_rep, mach_code, fd))        	BADHEAD (lev, "read_genhd read error");	break;     }    return 0;}/*	read_header reads in a file header. recursive_rh really does the	work.*//* #define NDREC1  *//* define NDREC1 to get beta case of ndrec not being   set to -1 for pipes.   Remove this to get esps 3.0 code */static long data_offset;static long align_pad_size;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -