00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <string.h>
00027
00028 #include "uti.h"
00029 #include "caudiox.hpp"
00030
00031
00032
00033 #define BD_LENFILEID 4
00034 #define BD_LENLOCUTOR 30
00035 #define BD_LENORIGEN 20
00036 #define BD_LENMICROFONO 20
00037 #define BD_LENUNIDADES 150
00038
00039
00040
00041 #ifdef __CC_MSVC__
00042 #pragma pack(push,1)
00043 #elif __CC_BORLANDC__
00044 typedef struct {CHAR8 x; INT2 y; } ____tmp_tdef_align_test___;
00045 #if sizeof(____tmp_tdef_align_test___)>3
00046 #error You must disable Word Alignment
00047 #endif
00048 #endif
00049
00050
00051
00052
00053 typedef union _tagHeaderFileC30 {
00054 BYTE buffer[512] MINALIGN;
00055 struct _tagFile {
00056 CHAR8 FileID[BD_LENFILEID] MINALIGN;
00057 INT32 NumeroPuntos MINALIGN;
00058 INT32 Frecuencia MINALIGN;
00059 INT32 NumberOfChannels MINALIGN;
00060 INT32 TimeId MINALIGN;
00061 INT16 FiltroAntialiasing MINALIGN;
00062 CHAR Locutor[BD_LENLOCUTOR] MINALIGN;
00063 CHAR Sexo MINALIGN;
00064 INT16 Edad MINALIGN;
00065 CHAR Origen[BD_LENORIGEN] MINALIGN;
00066 CHAR TipoMicrofono[BD_LENMICROFONO] MINALIGN;
00067 INT16 NumeroParesSegmentos MINALIGN;
00068 CHAR Unidades[BD_LENUNIDADES] MINALIGN;
00069 INT16 NumeroParesSubUnidades MINALIGN;
00070 } T;
00071 } HEADERFILEC30 MINALIGN;
00072
00073 #ifdef __CC_MSVC__
00074 #pragma pack(pop)
00075 #endif
00076
00077
00078
00079 LONG AFTei::HdrR( FILE *f, KVStrList &, BOOL override )
00080 {
00081 HEADERFILEC30 Header;
00082 LONG nSamp;
00083
00084 xfseek(f,0,SEEK_SET);
00085 xfread(&Header,sizeof(Header),1,f);
00086 if (strcmp(Header.T.FileID, "LTI")) die_beep("Tei: not a .tei file");
00087 endian_fromlittle32(&(Header.T.NumeroPuntos));
00088 endian_fromlittle32(&(Header.T.Frecuencia));
00089 endian_fromlittle32(&(Header.T.NumberOfChannels));
00090 endian_fromlittle32(&(Header.T.TimeId));
00091 endian_fromlittle16(&(Header.T.FiltroAntialiasing));
00092 endian_fromlittle16(&(Header.T.Edad));
00093 endian_fromlittle16(&(Header.T.NumeroParesSegmentos));
00094 endian_fromlittle16(&(Header.T.NumeroParesSubUnidades));
00095
00096 if (Header.T.NumeroPuntos) nSamp = Header.T.NumeroPuntos;
00097 else {
00098 long pos0 = xftell(f);
00099 xfseek(f,0,SEEK_END);
00100 LONG fsize = xftell(f)-pos0;
00101 fseek(f,pos0,SEEK_SET);
00102 nSamp = (fsize-(Header.T.NumeroParesSegmentos*sizeof(INT32)*2))/sizeof(INT16);
00103 }
00104 ADD(CAUDIO_SAMPTYPE,SAMPTYPE_STR_PCM16);
00105 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00106
00107 ADDIFNOV(CAUDIO_SRATE,(LONG)(Header.T.Frecuencia));
00108 ADDIFNOV(CAUDIO_NCHAN,(LONG)(Header.T.NumberOfChannels));
00109 ADDIFNOV("TimeID",(LONG)(Header.T.TimeId));
00110 ADDIFNOV("AntiAliasFilterFrec",(LONG)(Header.T.FiltroAntialiasing));
00111 if (*(Header.T.Locutor)) ADDIFNOV(INFO_SPEAKER,Header.T.Locutor);
00112 ADDIFNOV("SpeakerSex",String(Header.T.Sexo));
00113 ADDIFNOV("SpeakerAge",(LONG)(Header.T.Edad));
00114 if (*(Header.T.Origen)) ADDIFNOV("SpeakerOrigin",Header.T.Origen);
00115 if (*(Header.T.TipoMicrofono)) ADDIFNOV("MicType",Header.T.TipoMicrofono);
00116 if (*(Header.T.Unidades)) ADDIFNOV("Units",Header.T.Unidades);
00117
00118 if ( (Header.T.NumeroParesSegmentos>0)
00119 && (fa->marks().length()==0) || override) {
00120 fa->marks().clear();
00121 xfseek(f,sizeof(Header)+sizeof(INT16)*nSamp,SEEK_SET);
00122 for (LONG i=0; i<Header.T.NumeroParesSegmentos; i++) {
00123 INT32 m, m2;
00124 xfread(&m,sizeof(m),1,f); xfread(&m2,sizeof(m2),1,f);
00125 endian_fromlittle32(&m);
00126 endian_fromlittle32(&m2);
00127 if (m2!=m) fa->marks().append(m,m2-m+1);
00128 else fa->marks().append(m);
00129 }
00130 }
00131
00132
00133
00134 xfseek(f,sizeof(Header),SEEK_SET);
00135
00136 if (fa->info().bval(CAUDIO_BIGENDIAN))
00137 fprintf(stderr,"%s warning: reading big endian file!.\n",fFormat());
00138
00139 return nSamp;
00140 }
00141
00142
00143
00144 VOID AFTei::HdrG( KVStrList &def, BOOL override )
00145 {
00146 ADD(CAUDIO_NSAMPLES,0);
00147 ADDIFNOV(CAUDIO_SRATE,def.dval(CAUDIO_SRATE,8000));
00148 ADDIFNOV(CAUDIO_SAMPTYPE,def.val(CAUDIO_SAMPTYPE,SAMPTYPE_STR_PCM16));
00149 ADDIFNOV(CAUDIO_NCHAN,def.val(CAUDIO_NCHAN,1));
00150
00151 cdie_beep(SampType_a2i(fa->info().val(CAUDIO_SAMPTYPE))!=SAMPTYPE_PCM16,
00152 "%s: sampType %s not supported",fFormat(),
00153 (const char *)fa->info().val(CAUDIO_SAMPTYPE));
00154 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00155 }
00156
00157
00158
00159 VOID AFTei::HdrW( FILE *f, LONG nSamp )
00160 {
00161 HEADERFILEC30 Header;
00162
00163 cdie_beep(fa->getSampType()!=SAMPTYPE_PCM16,
00164 "%s: sampType %s not supported",fFormat(),fa->getSampType_a());
00165
00166 memset(&Header,0,sizeof(Header));
00167 strcpy(Header.T.FileID, "LTI");
00168 Header.T.NumeroPuntos = nSamp;
00169 Header.T.Frecuencia = (INT32)fa->getSRate();
00170 Header.T.NumberOfChannels = fa->getNChan();
00171 Header.T.TimeId = fa->info().lval("TimeID",0);
00172 Header.T.FiltroAntialiasing = (INT16)fa->info().lval("AntiAliasFilterFrec",3600);
00173 strncpy(Header.T.Locutor,fa->info().val(INFO_SPEAKER,""),BD_LENLOCUTOR);
00174 Header.T.Sexo = (fa->info().val("SpeakerSex","V"))[0];
00175 Header.T.Edad = (INT16)fa->info().lval("SpeakerAge",30);
00176 strncpy(Header.T.Origen,fa->info().val("SpeakerOrigin",""),BD_LENORIGEN);
00177 strncpy(Header.T.TipoMicrofono,fa->info().val("MicType",""),BD_LENMICROFONO);
00178 Header.T.NumeroParesSegmentos = (INT16)(fa->marks().length());
00179 strncpy(Header.T.Unidades,fa->info().val("Units",""),BD_LENUNIDADES);
00180
00181 endian_tolittle32(&(Header.T.NumeroPuntos));
00182 endian_tolittle32(&(Header.T.Frecuencia));
00183 endian_tolittle32(&(Header.T.NumberOfChannels));
00184 endian_tolittle32(&(Header.T.TimeId));
00185 endian_tolittle16(&(Header.T.FiltroAntialiasing));
00186 endian_tolittle16(&(Header.T.Edad));
00187 endian_tolittle16(&(Header.T.NumeroParesSegmentos));
00188 endian_tolittle16(&(Header.T.NumeroParesSubUnidades));
00189 xfseek(f,0,SEEK_SET);
00190 xfwrite(&Header,sizeof(Header),1,f);
00191
00192
00193 xfseek(f,sizeof(Header)+sizeof(INT16)*nSamp,SEEK_SET);
00194 for (Lix p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00195 INT32 m1, m2;
00196 m1 = fa->marks().pos(p);
00197 m2 = fa->marks().span(p);
00198 if (m2) m2+=(m1-1); else m2=m1;
00199 endian_tolittle32(&m1);
00200 endian_tolittle32(&m2);
00201 xfwrite(&m1,sizeof(m1),1,f);
00202 xfwrite(&m2,sizeof(m2),1,f);
00203 }
00204
00205
00206 xfseek(f,sizeof(Header),SEEK_SET);
00207
00208 if (fa->getBigEndian())
00209 fprintf(stderr,"%s warning: saving big endian file!\n",fFormat());
00210
00211 }
00212
00213
00214
00215 BOOL AFTei::testFile( FILE *f )
00216 {
00217 CHAR id[BD_LENFILEID];
00218
00219 memset(id,0,sizeof(id));
00220 fseek(f,0,SEEK_SET);
00221 fread(&id,sizeof(id),1,f);
00222 return (!strcmp(id,"LTI"));
00223 }
00224
00225