00001 /**********************************************************/ 00002 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00003 /* 00004 Copyright: 1993 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00005 00006 Nombre fuente................ FVBLK.C 00007 Nombre paquete............... - 00008 Lenguaje fuente.............. C (Borland C/C++ 3.1) 00009 Estado....................... Utilizable 00010 Dependencia Hard/OS.......... NO 00011 Codigo condicional........... SI (NDEBUG) 00012 00013 Codificacion................. Borja Etxebarria 00014 00015 Version dd/mm/aa Autor Proposito de la edicion 00016 ------- -------- -------- ----------------------- 00017 1.0.1 20/05/97 Borja eliminar warnings para compilar en g++ 00018 1.0.0 19/12/93 Borja Codificacion inicial. 00019 ======================== Contenido ======================== 00020 Lectura por bloques (entramado) de un fichero de voz. 00021 00022 Definir NDEBUG para desconectar la validacion de parametros 00023 con assert(). No definir este simbolo mientras se depuren 00024 aplicaciones, ya que aunque las funciones son algo mas lentas, 00025 el chequeo de validacion de parametros resuelve muchos problemas. 00026 =========================================================== 00027 */ 00028 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00029 /**********************************************************/ 00030 00031 #include <assert.h> 00032 00033 #include "tdef.h" 00034 #include "xalloc.h" 00035 #include "fvoz.h" 00036 #include "fvblk.h" 00037 00038 /**********************************************************/ 00039 00040 fvblk * fvblk_construct( pCHAR fname, INT fl, 00041 INT prefr, INT posfr ) 00042 { 00043 fvblk * fvb; 00044 INT i,n; 00045 assert(fl>0); 00046 assert(prefr>=0); 00047 assert(posfr>=0); 00048 00049 fvb = (fvblk *)xmalloc(sizeof(fvblk)); 00050 00051 if (fvb!=NULL) { 00052 fvb->_fs = fseni_construct(fname); 00053 fvb->_fl=fl; 00054 fvb->_prefr=prefr; 00055 fvb->_posfr=posfr; 00056 fvb->_blkn=0; 00057 fvb->_nm=fseni_getnm(fvb->_fs); 00058 fvb->_nread=0; 00059 00060 n = fl+prefr+posfr; 00061 fvb->_vblk = (pDOUBLE)xmalloc(sizeof(DOUBLE)*n); 00062 00063 if ((fvb->_fs!=NULL)&&(fvb->_vblk!=NULL)) { 00064 for (i=0; i<n; i++) 00065 fvb->_vblk[i]=0.0; 00066 } 00067 else { 00068 fvblk_destruct(fvb); 00069 fvb=NULL; 00070 } 00071 } 00072 00073 return fvb; 00074 } 00075 00076 /**********************************************************/ 00077 00078 void fvblk_destruct( fvblk * fvb ) 00079 { 00080 assert(fvb!=NULL); 00081 00082 if (fvb->_vblk!=NULL) 00083 xfree(fvb->_vblk); 00084 if (fvb->_fs!=NULL) 00085 fseni_destruct(fvb->_fs); 00086 xfree(fvb); 00087 } 00088 00089 /**********************************************************/ 00090 00091 UINT4 fvblk_getnm( fvblk * fvb ) 00092 { 00093 assert(fvb!=NULL); 00094 00095 return fseni_getnm(fvb->_fs); 00096 } 00097 00098 /**********************************************************/ 00099 00100 UINT4 fvblk_getfm( fvblk * fvb ) 00101 { 00102 assert(fvb!=NULL); 00103 00104 return (UINT4)(fseni_getfm(fvb->_fs)+0.5); 00105 } 00106 00107 /**********************************************************/ 00108 00109 UINT4 fvblk_getnblks( fvblk * fvb ) 00110 { 00111 assert(fvb!=NULL); 00112 00113 return (fseni_getnm(fvb->_fs)+fvb->_fl-1)/fvb->_fl; 00114 } 00115 00116 /**********************************************************/ 00117 00118 BOOL fvblk_forward( fvblk * fvb ) 00119 { 00120 INT i, n; 00121 UINT4 nb, onm; 00122 assert(fvb!=NULL); 00123 00124 nb = fvblk_getnblks(fvb); 00125 if (fvb->_blkn<nb) { 00126 fvb->_blkn++; 00127 n = fvb->_fl+fvb->_prefr+fvb->_posfr; 00128 onm = fvb->_nm; 00129 00130 if (fvb->_blkn==1) { 00131 for (i=n-fvb->_posfr; i<n; i++) { 00132 if (fvb->_nm) { 00133 (fvb->_nm)--; 00134 fvb->_vblk[i]=fseni_getsamp(fvb->_fs); 00135 } 00136 } 00137 } 00138 for (i=fvb->_fl; i<n; i++) 00139 fvb->_vblk[i-fvb->_fl]=fvb->_vblk[i]; 00140 for (i=n-fvb->_fl; i<n; i++) { 00141 if (fvb->_nm) { 00142 fvb->_nm--; 00143 fvb->_vblk[i]=fseni_getsamp(fvb->_fs); 00144 } 00145 else 00146 fvb->_vblk[i]=0.0; 00147 } 00148 fvb->_nread=(INT)(onm-fvb->_nm); 00149 return TRUE; 00150 } 00151 else 00152 return FALSE; 00153 } 00154 00155 /**********************************************************/ 00156 00157 INT fvblk_getnread( fvblk * fvb ) 00158 { 00159 assert(fvb!=NULL); 00160 00161 return fvb->_nread; 00162 } 00163 00164 /**********************************************************/ 00165 00166 INT fvblk_getblknsamp( fvblk * fvb ) 00167 { 00168 UINT4 n; 00169 assert(fvb!=NULL); 00170 00171 n = fseni_getnm(fvb->_fs); 00172 00173 if ((UINT4)((INT4)(fvb->_blkn)*(INT4)(fvb->_fl))<=n) 00174 return fvb->_fl; 00175 else 00176 return (INT)(n%fvb->_fl); 00177 } 00178 00179 /**********************************************************/ 00180 00181 INT fvblk_getfl( fvblk * fvb ) 00182 { 00183 assert(fvb!=NULL); 00184 00185 return fvb->_fl; 00186 } 00187 00188 /**********************************************************/ 00189 00190 pDOUBLE fvblk_getblk( fvblk * fvb ) 00191 { 00192 assert(fvb!=NULL); 00193 00194 return fvb->_vblk; 00195 } 00196 00197 /**********************************************************/ 00198 00199 UINT4 fvblk_getblknum( fvblk * fvb ) 00200 { 00201 assert(fvb!=NULL); 00202 00203 return fvb->_blkn; 00204 } 00205 00206 /**********************************************************/ 00207 00208 struct cgsenal * fvblk_getcgs( fvblk * fvb ) 00209 { 00210 assert(fvb!=NULL); 00211 00212 return fseni_getcgs(fvb->_fs); 00213 } 00214 00215 /**********************************************************/