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
00031
00032
00033 PRIVATE CHAR *_hak_id8 = "AhoHak1\n";
00034
00035 #define FIELD_PROP 10
00036 #define FIELD_MARK 15
00037 #define FIELD_EOH 3
00038
00039
00040
00041 INT32 int32read( FILE *f, BOOL bigendian )
00042 {
00043 INT32 n;
00044
00045 xfread(&n,sizeof(n),1,f);
00046 if (bigendian) endian_frombig32(&n);
00047 else endian_fromlittle32(&n);
00048 return n;
00049 }
00050
00051
00052
00053 VOID int32write( INT32 n, FILE *f, BOOL bigendian )
00054 {
00055 if (bigendian) endian_tobig32(&n);
00056 else endian_tolittle32(&n);
00057 xfwrite(&n,sizeof(n),1,f);
00058 }
00059
00060
00061
00062 VOID strwrite( const CHAR *s, FILE *f, BOOL bigendian )
00063 {
00064 INT32 len;
00065
00066 len = strlen(s);
00067 int32write(len,f,bigendian);
00068 if (len) xfwrite(s,1,(size_t)len,f);
00069 }
00070
00071
00072
00073 CHAR * strread( FILE *f, BOOL bigendian )
00074 {
00075 CHAR *s;
00076 INT32 len = int32read(f,bigendian);
00077 INT ilen=(INT)len;
00078 cdie_beep(len+1 != ilen+1, "String too long (%ld) for this machine's arquitecture",(long)len);
00079 s=(CHAR*)xmalloc(ilen+1);
00080 s[ilen]='\0';
00081 if (ilen) xfread(s,1,ilen,f);
00082 return s;
00083 }
00084
00085
00086
00087 LONG AFHak::HdrR( FILE *f, KVStrList &, BOOL override )
00088 {
00089 LONG nSamp;
00090 UINT8 byte;
00091 BOOL bigendian;
00092
00093 if (!testFile(f))
00094 fprintf(stderr,"%s warning: probably not a .hak file!\n",fFormat());
00095 xfseek(f,8,SEEK_SET);
00096
00097 xfread(&byte,sizeof(byte),1,f);
00098 bigendian=(byte!=0);
00099 ADDIFNOV(CAUDIO_BIGENDIAN,bigendian?"yes":"no");
00100
00101 while (1) {
00102 xfread(&byte,sizeof(byte),1,f);
00103 if (byte==FIELD_EOH) break;
00104 else if (byte==FIELD_PROP) {
00105 char *k=strread(f,bigendian);
00106 char *v=strread(f,bigendian);
00107 fa->info().add(k,v);
00108 xfree(k);
00109 xfree(v);
00110 }
00111 else if (byte==FIELD_MARK) {
00112 LONG pos = int32read(f,bigendian);
00113 LONG span = int32read(f,bigendian);
00114 char *lbl=strread(f,bigendian);
00115 fa->marks().append(pos,span,lbl);
00116 xfree(lbl);
00117 }
00118 else die_beep("%s error: invalid field code in HAK file (%d)",fFormat(),(int)byte);
00119 }
00120
00121 lc = xftell(f);
00122
00123 nSamp = fa->info().lval(CAUDIO_NSAMPLES,-1);
00124 fa->info().add(CAUDIO_SAMPTYPE,SAMPTYPE_STR_FLOAT64);
00125
00126 return nSamp;
00127 }
00128
00129
00130
00131
00132 VOID AFHak::HdrW( FILE *f, LONG nSamp )
00133 {
00134 LONG nlc;
00135 UINT8 byte;
00136 Lix p;
00137 BOOL bigendian;
00138
00139 ADD(CAUDIO_NSAMPLES,nSamp);
00140 ADD(CAUDIO_SRATE,fa->getSRate());
00141 ADD(CAUDIO_NCHAN,(LONG)fa->getNChan());
00142
00143
00144 nlc=8+2;
00145 for (p=fa->info().first(); p!=0; p=fa->info().next(p)) {
00146 nlc++;
00147 nlc += (4+strlen(fa->info().itemkey(p)));
00148 nlc += (4+strlen(fa->info().itemval(p)));
00149 }
00150 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00151 nlc+= 1+4+4;
00152 nlc+= (4+strlen(fa->marks().label(p)));
00153 }
00154
00155
00156 if (nlc>lc) xfinsn(f,0,nlc-lc);
00157
00158 else if (nlc<lc) xfdeln(f,0,lc-nlc);
00159 lc = nlc;
00160
00161 fseek(f,0,SEEK_SET);
00162 xfwrite(_hak_id8,8,1,f);
00163 bigendian = fa->getBigEndian();
00164 byte= bigendian? 1:0;
00165 xfwrite(&byte,sizeof(byte),1,f);
00166
00167 byte=FIELD_PROP;
00168 for (p=fa->info().first(); p!=0; p=fa->info().next(p)) {
00169 xfwrite(&byte,sizeof(byte),1,f);
00170 strwrite(fa->info().itemkey(p),f,bigendian);
00171 strwrite(fa->info().itemval(p),f,bigendian);
00172 }
00173
00174 byte=FIELD_MARK;
00175 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00176 xfwrite(&byte,sizeof(byte),1,f);
00177 int32write(fa->marks().pos(p),f,bigendian);
00178 int32write(fa->marks().span(p),f,bigendian);
00179 strwrite(fa->marks().label(p),f,bigendian);
00180 }
00181
00182 byte=FIELD_EOH;
00183 xfwrite(&byte,sizeof(byte),1,f);
00184
00185 cdie_beep(lc!=xftell(f),
00186 "%s error: header length incorrectly computed (%d!=%d)",fFormat(),(int)lc,(int)xftell(f));
00187 }
00188
00189
00190
00191
00192 VOID AFHak::HdrG( KVStrList &def, BOOL override )
00193 {
00194 lc = 0;
00195
00196 ADD(CAUDIO_NSAMPLES,0);
00197 ADDIFNOV(CAUDIO_SRATE,def.dval(CAUDIO_SRATE,8000));
00198
00199 ADDIFNOV(CAUDIO_BIGENDIAN,def.val(CAUDIO_BIGENDIAN,CAUDIO_BIGENDIAN_DEFAULT?"yes":"no"));
00200 ADDIFNOV(CAUDIO_NCHAN,def.lval(CAUDIO_NCHAN,1));
00201
00202 fa->info().add(CAUDIO_SAMPTYPE,SAMPTYPE_STR_FLOAT64);
00203 }
00204
00205
00206
00207 BOOL AFHak::testFile( FILE *f )
00208 {
00209 CHAR id[9];
00210
00211 memset(id,0,sizeof(id));
00212 fseek(f,0,SEEK_SET);
00213 fread(id,8,1,f);
00214 return (!strcmp(id,_hak_id8));
00215 }
00216
00217