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 <stdio.h>
00027 #include <stdlib.h>
00028 #include <assert.h>
00029
00030 #include "caudiox.hpp"
00031
00032 #include "xalloc.h"
00033 #include "uti.h"
00034 #include "cabecer.h"
00035 #include "cabctrl.h"
00036
00037
00038
00039
00040
00041 LONG AFAho1::HdrR( FILE *f, KVStrList &, BOOL override )
00042 {
00043 LONG nSamp;
00044 struct cgsenal cgs;
00045
00046 xfseek(f,0,SEEK_SET);
00047 reset_cgsenal(&cgs);
00048 vleecfs(f,&cgs);
00049
00050 nSamp = (LONG)cgs.nm;
00051
00052 ADDIFNOV(CAUDIO_SRATE,(DOUBLE)cgs.fm);
00053 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00054 ADD(CAUDIO_SAMPTYPE, SAMPTYPE_STR_PCM16);
00055 ADD(CAUDIO_NCHAN, 1);
00056
00057 if (cgs.locu.ltxt) ADDIFNOV(INFO_SPEAKER,cgs.locu.txt);
00058 if (cgs.texto.ltxt) ADDIFNOV(INFO_TEXT, cgs.texto.txt);
00059 if (cgs.version.ltxt) ADDIFNOV(INFO_VERSION,cgs.version.txt);
00060 if (cgs.obs.ltxt) ADDIFNOV(INFO_COMMENTS,cgs.obs.txt);
00061
00062 if ( (cgs.marc.nmarc>0)
00063 && (fa->marks().length()==0) || override) {
00064 fa->marks().clear();
00065 for (LONG i=0; i<(LONG)cgs.marc.nmarc; i++)
00066 fa->marks().append(cgs.marc.marcas[(size_t)i]*cgs.marc.unimarc);
00067 }
00068
00069 free_cgsenal(&cgs);
00070
00071 if (fa->info().bval(CAUDIO_BIGENDIAN))
00072 fprintf(stderr,"%s warning: reading big endian file!.\n",fFormat());
00073
00074 return nSamp;
00075 }
00076
00077
00078
00079
00080 VOID AFAho1::HdrG( KVStrList &def, BOOL override )
00081 {
00082 ADD(CAUDIO_NSAMPLES,0);
00083 ADDIFNOV(CAUDIO_SRATE,def.dval(CAUDIO_SRATE,8000));
00084 ADDIFNOV(CAUDIO_SAMPTYPE,def.val(CAUDIO_SAMPTYPE,SAMPTYPE_STR_PCM16));
00085 ADDIFNOV(CAUDIO_NCHAN,def.dval(CAUDIO_NCHAN,1));
00086
00087 cdie_beep(SampType_a2i(fa->info().val(CAUDIO_SAMPTYPE))!=SAMPTYPE_PCM16,
00088 "%s: sampType %s not supported",fFormat(),
00089 (const char *)fa->info().val(CAUDIO_SAMPTYPE));
00090 cdie_beep(fa->info().lval(CAUDIO_NCHAN)!=1,
00091 "%s: multichannel (%ld) not supported",fFormat(),
00092 (long)(fa->info().lval(CAUDIO_NCHAN)));
00093
00094 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00095 }
00096
00097
00098
00099
00100 VOID AFAho1::HdrW( FILE *f, LONG nSamp )
00101 {
00102 #define TXT(prop,field) { \
00103 cgs.##field##.txt = (char*)fa->info().val(prop,""); \
00104 cgs.##field##.ltxt = strlen(cgs.##field##.txt); \
00105 }
00106
00107 struct cgsenal cgs;
00108 Lix p;
00109
00110 cdie_beep(fa->getSampType()!=SAMPTYPE_PCM16,
00111 "%s: sampType %s not supported",fFormat(),fa->getSampType_a());
00112 cdie_beep(fa->getNChan()!=1,
00113 "%s: multichannel (%ld) not supported",fFormat(),
00114 (long)(fa->getNChan()));
00115
00116 cgs.nm = nSamp;
00117 cgs.fm = fa->getSRate();
00118
00119
00120 cgs.locu.txt = (char*)fa->info().val(INFO_SPEAKER,"");
00121 cgs.locu.ltxt = strlen(cgs.locu.txt);
00122
00123 cgs.texto.txt = (char*)fa->info().val(INFO_TEXT,"");
00124 cgs.texto.ltxt = strlen(cgs.texto.txt);
00125
00126 cgs.version.txt = (char*)fa->info().val(INFO_VERSION,"");
00127 cgs.version.ltxt = strlen(cgs.version.txt);
00128
00129 cgs.obs.txt = (char*)fa->info().val(INFO_COMMENTS,"");
00130 cgs.obs.ltxt = strlen(cgs.obs.txt);
00131
00132 LONG max=0;
00133 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00134 LONG x= fa->marks().pos(p);
00135 if (max<x) max=x;
00136 }
00137 cgs.marc.unimarc = (UINT32)(max/32768L+1);
00138 cgs.marc.nmarc = fa->marks().length();
00139 cgs.marc.marcas = (pUINT32)xmalloc(sizeof(UINT32)*cgs.marc.nmarc);
00140 LONG i=0;
00141 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p))
00142 cgs.marc.marcas[(size_t)i++] = (fa->marks().pos(p)+cgs.marc.unimarc/2)/cgs.marc.unimarc;
00143 vescribecfs(f,&cgs);
00144
00145 if (cgs.marc.marcas) xfree(cgs.marc.marcas);
00146
00147 if (fa->getBigEndian())
00148 fprintf(stderr,"%s warning: saving big endian file!\n",fFormat());
00149
00150 }
00151
00152
00153
00154 BOOL AFAho1::testFile( FILE * )
00155 {
00156 return FALSE;
00157 }
00158
00159