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 "tdef.h"
00027 #include "caudiox.hpp"
00028 #include "uti.h"
00029 #include "xalloc.h"
00030 #include "cabecer.h"
00031 #include "cabctrl.h"
00032 #include "cabcod.h"
00033
00034
00035
00036
00037
00038
00039
00040
00041 LONG AFAho2::HdrR( FILE *f, KVStrList &, BOOL override )
00042 {
00043 UCHAR8 tdato;
00044 struct cgsenal cgs;
00045 LONG nSamp;
00046
00047 if (!testFile(f))
00048 fprintf(stderr,"%s warning: probably not a .aho (v.2) file!\n",fFormat());
00049
00050 xfseek(f,0,SEEK_SET);
00051 reset_cgsenal(&cgs);
00052 tdato = leecfs(f,&cgs,-1);
00053
00054
00055 lcgs = xftell(f) - sizeof(struct cfich) - sizeof(UINT32);
00056
00057 nSamp = cgs.nm;
00058
00059 ADDIFNOV(CAUDIO_SRATE,(DOUBLE)cgs.fm);
00060 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00061 if (cgs.locu.ltxt) ADDIFNOV(INFO_SPEAKER,cgs.locu.txt);
00062 if (cgs.texto.ltxt) ADDIFNOV(INFO_TEXT, cgs.texto.txt);
00063 if (cgs.version.ltxt) ADDIFNOV(INFO_VERSION,cgs.version.txt);
00064 if (cgs.obs.ltxt) ADDIFNOV(INFO_COMMENTS,cgs.obs.txt);
00065
00066 if ( (cgs.marc.nmarc>0)
00067 && (fa->marks().length()==0) || override) {
00068 fa->marks().clear();
00069 for (LONG i=0; i<(LONG)cgs.marc.nmarc; i++)
00070 fa->marks().append(cgs.marc.marcas[(size_t)i]*cgs.marc.unimarc);
00071
00072 }
00073
00074 free_cgsenal(&cgs);
00075
00076 switch (tdato) {
00077 case TD_INT2: ADD(CAUDIO_SAMPTYPE, SAMPTYPE_STR_PCM16); break;
00078 case TD_FLOAT4: ADD(CAUDIO_SAMPTYPE, SAMPTYPE_STR_FLOAT32); break;
00079 case TD_FLOAT8: ADD(CAUDIO_SAMPTYPE, SAMPTYPE_STR_FLOAT64); break;
00080 default: die_beep("%s: data type %u not supported",fFormat(),(unsigned)tdato);
00081 }
00082
00083 ADD(CAUDIO_NCHAN,1);
00084
00085 if (fa->info().bval(CAUDIO_BIGENDIAN))
00086 fprintf(stderr,"%s warning: reading big endian file!.\n",fFormat());
00087
00088 return nSamp;
00089 }
00090
00091
00092 #ifdef MRK_SORT
00093 int ui32cmp(const void *a, const void *b)
00094 {
00095 INT32 i= *(UINT32*)a - *(UINT32*)b;
00096
00097 if (i>0) return 1;
00098 if (i<0) return -1;
00099 return 0;
00100 }
00101 #endif
00102
00103
00104
00105
00106 VOID AFAho2::HdrW( FILE *f, LONG nSamp )
00107 {
00108 #define TXT(prop,field) { \
00109 cgs.##field##.txt = (char *)fa->info().val(prop,""); \
00110 cgs.##field##.ltxt = strlen(cgs.##field##.txt); \
00111 }
00112 UCHAR8 tdato;
00113 struct cgsenal cgs;
00114 Lix p;
00115
00116 cdie_beep(fa->getNChan()!=1,"%s error: multichannel (%ld) not supported!",
00117 fFormat(),(long)(fa->getNChan()));
00118
00119 cgs.nm = nSamp;
00120 cgs.fm = fa->getSRate();
00121
00122
00123 cgs.locu.txt = (char*)fa->info().val(INFO_SPEAKER,"");
00124 cgs.locu.ltxt = strlen(cgs.locu.txt);
00125
00126 cgs.texto.txt = (char*)fa->info().val(INFO_TEXT,"");
00127 cgs.texto.ltxt = strlen(cgs.texto.txt);
00128
00129 cgs.version.txt = (char*)fa->info().val(INFO_VERSION,"");
00130 cgs.version.ltxt = strlen(cgs.version.txt);
00131
00132 cgs.obs.txt = (char*)fa->info().val(INFO_COMMENTS,"");
00133 cgs.obs.ltxt = strlen(cgs.obs.txt);
00134
00135 LONG max=0;
00136 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00137 LONG x= fa->marks().pos(p);
00138 if (max<x) max=x;
00139 }
00140 cgs.marc.unimarc = (UINT32)(max/32768L+1);
00141 cgs.marc.nmarc = fa->marks().length();
00142 cgs.marc.marcas = (pUINT32)xmalloc(sizeof(UINT32)*cgs.marc.nmarc);
00143 LONG i=0;
00144 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p))
00145 cgs.marc.marcas[(size_t)i++] = (fa->marks().pos(p)+cgs.marc.unimarc/2)/cgs.marc.unimarc;
00146 #ifdef MRK_SORT
00147 qsort(cgs.marc.marcas,(size_t)i,sizeof(UINT32),ui32cmp);
00148 #endif
00149
00150 switch (fa->getSampType()) {
00151 case SAMPTYPE_PCM16:
00152 cgs.rango.min = -32768.;
00153 cgs.rango.max = +32768.;
00154 tdato = TD_INT2;
00155 break;
00156 case SAMPTYPE_FLOAT32:
00157 cgs.rango.min = -1.;
00158 cgs.rango.max = +1.;
00159 tdato = TD_FLOAT4;
00160 break;
00161 case SAMPTYPE_FLOAT64:
00162 cgs.rango.min = -1.;
00163 cgs.rango.max = +1.;
00164 tdato = TD_FLOAT8;
00165 break;
00166 default:
00167 tdato = 0;
00168 die_beep("%s: sampType %s not supported",fFormat(),fa->getSampType_a());
00169 }
00170
00171 LONG nlcgs = long_cgsenal(&cgs);
00172
00173
00174 if (nlcgs>lcgs) xfinsn(f,0,nlcgs-lcgs);
00175
00176 else if (nlcgs<lcgs) xfdeln(f,0,lcgs-nlcgs);
00177 lcgs = nlcgs;
00178
00179 escribecfs_ftyp(f,&cgs,TF_SORIG,tdato);
00180 if (cgs.marc.marcas) xfree(cgs.marc.marcas);
00181
00182 if (fa->getBigEndian())
00183 fprintf(stderr,"%s warning: saving big endian file!\n",fFormat());
00184
00185 }
00186
00187
00188
00189
00190 VOID AFAho2::HdrG( KVStrList &def, BOOL override )
00191 {
00192 lcgs = 0;
00193
00194 ADD(CAUDIO_NSAMPLES,0);
00195 ADDIFNOV(CAUDIO_SRATE,def.dval(CAUDIO_SRATE,8000));
00196 ADDIFNOV(CAUDIO_SAMPTYPE,def.val(CAUDIO_SAMPTYPE,SAMPTYPE_STR_PCM16));
00197 ADDIFNOV(CAUDIO_NCHAN,def.lval(CAUDIO_NCHAN,1));
00198
00199 switch (SampType_a2i(fa->info().val(CAUDIO_SAMPTYPE))) {
00200 case SAMPTYPE_PCM16:
00201 case SAMPTYPE_FLOAT32:
00202 case SAMPTYPE_FLOAT64: break;
00203 default:
00204 die_beep("%s: sampType %s not supported",fFormat(),
00205 (const char *)fa->info().val(CAUDIO_SAMPTYPE));
00206 }
00207 cdie_beep(fa->info().lval(CAUDIO_NCHAN)!=1,"%s error: multichannel (%ld) not supported!",
00208 fFormat(),(long)(fa->info().lval(CAUDIO_NCHAN)));
00209
00210 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00211 }
00212
00213
00214
00215
00216 BOOL AFAho2::testFile( FILE *f )
00217 {
00218 struct cfich cf;
00219
00220 memset(&cf,0,sizeof(cf));
00221 fseek(f,0,SEEK_SET);
00222 if (fread(&cf,sizeof(cf),1,f)) {
00223 endian_fromlittle16(&(cf.tfich));
00224 endian_fromlittle32(&(cf.mcab));
00225 if ((cf.tfich==TF_SORIG)&&
00226 ((cf.tdato==TD_INT2)||(cf.tdato==TD_FLOAT4)||
00227 (cf.tdato==TD_FLOAT8))&&(cf.mcab==MC_SENAL))
00228 return TRUE;
00229 }
00230 return FALSE;
00231 }
00232
00233