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
00027
00028
00029
00030 #include "afwav_i.hpp"
00031
00032
00033
00034
00035 VOID AFWav::HdrW( FILE *f, LONG nSamp )
00036 {
00037 #define WRITEIFIS(sk, key) \
00038 { \
00039 if (fa->info().contains(key)) { \
00040 const String &s=fa->info().val(key); \
00041 UINT32 n=strlen_zeven(s); \
00042 xfwrite(sk,4,1,f); \
00043 endian_tolittle32(&n); xfwrite(&n,sizeof(n),1,f); \
00044 puts_zeven((const char *)s,f); \
00045 } \
00046 }
00047
00048 long b0len=sizeof(WAVHdr)
00049 +sizeof(WAVChunk)+sizeof(FormatInfo)+sizeof(UINT16)
00050 +sizeof(WAVChunk);
00051
00052
00053 if (b0len>datapos) xfinsn(f,0,b0len-datapos);
00054
00055 else if (b0len<datapos) xfdeln(f,0,datapos-b0len);
00056 datapos=b0len;
00057
00058 WAVHdr wh = { {'R','I','F','F'}, 0, {'W','A','V','E'} };
00059 WAVChunk fiwc = { {'f','m','t',' '}, sizeof(FormatInfo)+sizeof(UINT16) };
00060 FormatInfo fi = { WFORMAT_PCM, 0, 0, 0, 0 };
00061 UINT16 ssize;
00062 switch (fa->getSampType()) {
00063 case SAMPTYPE_PCM16: ssize=16; break;
00064 case SAMPTYPE_PCM8U: ssize=8; break;
00065 default: die_beep("%s: invalid sampType (%s)",fFormat(),fa->getSampType_a());
00066 }
00067 fi.wChannels = fa->getNChan();
00068 fi.dwSamplesPerSec = (UINT32)fa->getSRate();
00069 fi.dwAvgBytesPerSec = (ssize>>3)*fi.dwSamplesPerSec*fi.wChannels;
00070 fi.wBlockAlign = (ssize>>3)*fi.wChannels;
00071 WAVChunk wc = { {'d','a','t','a'}, 0 };
00072 wc.len = nSamp*(ssize>>3)*fi.wChannels;
00073
00074 fseek(f,0,SEEK_SET);
00075 endian_tolittle32(&(wh.len)); xfwrite(&wh,sizeof(wh),1,f);
00076 endian_tolittle32(&(fiwc.len)); xfwrite(&fiwc,sizeof(fiwc),1,f);
00077 endian_tolittle16(&(fi.wFormatTag)); endian_tolittle16(&(fi.wChannels));
00078 endian_tolittle32(&(fi.dwSamplesPerSec)); endian_tolittle32(&(fi.dwAvgBytesPerSec));
00079 endian_tolittle16(&(fi.wBlockAlign)); xfwrite(&fi,sizeof(fi),1,f);
00080 endian_tolittle16(&ssize); xfwrite(&ssize,sizeof(ssize),1,f);
00081 endian_tolittle32(&(wc.len)); xfwrite(&wc,sizeof(wc),1,f); endian_fromlittle32(&(wc.len));
00082 fseek(f,wc.len,SEEK_CUR);
00083
00084 long final, pos;
00085
00086
00087 pos = xftell(f);
00088 WAVChunk inf = { {'L','I','S','T'}, 0 };
00089 CHAR8 info[4] = {'I','N','F','O'};
00090 endian_tolittle32(&(inf.len)); xfwrite(&inf,sizeof(inf),1,f);
00091 xfwrite(&info,sizeof(info),1,f);
00092 WRITEIFIS("IART","OriginalArtist");
00093 WRITEIFIS("ICMT","Comments");
00094 WRITEIFIS("ICOP","Copyright");
00095 WRITEIFIS("ICRD","CreationDate");
00096 WRITEIFIS("IENG","Engineers");
00097 WRITEIFIS("IGNR","Genre");
00098 WRITEIFIS("IKEY","KeyWords");
00099 WRITEIFIS("IMED","OriginalMedium");
00100 WRITEIFIS("INAM","Name");
00101 WRITEIFIS("ISFT","SoftwarePackage");
00102 WRITEIFIS("ISRC","SourceSupplier");
00103 WRITEIFIS("ITCH","Digitizer");
00104 WRITEIFIS("ISBJ","Subject");
00105 WRITEIFIS("ISRF","DigitizationSource");
00106
00107 final=xftell(f);
00108
00109 UINT32 ll = final-pos-8;
00110 if (ll>4) {
00111 xfseek(f,pos+4,SEEK_SET);
00112 endian_tolittle32(&ll); xfwrite(&ll,sizeof(ll),1,f);
00113 }
00114 else {
00115 xfdeln(f,pos,12);
00116 final -= 12;
00117 }
00118 xfseek(f,final,SEEK_SET);
00119
00120 if (fa->marks().length()) {
00121 WAVChunk cue = { {'c','u','e',' '}, 0 };
00122 UINT32 n32=fa->marks().length();
00123 Lix p;
00124 BOOL use_span=FALSE;
00125
00126
00127
00128 CuePoint cp;
00129 cp.dwName = cp.dwPosition = cp.dwChunkStart=cp.dwBlockStart=cp.dwSampleOffset=0;
00130 cp.fccChunk[0]='d'; cp.fccChunk[1]='a';cp.fccChunk[2]='t';cp.fccChunk[3]='a';
00131
00132 cue.len = sizeof(n32)+n32*sizeof(cp);
00133 LONG i;
00134 endian_tolittle32(&(cue.len)); xfwrite(&cue,sizeof(cue),1,f);
00135 endian_tolittle32(&n32); xfwrite(&n32,sizeof(n32),1,f);
00136 i=0;
00137 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00138 i++;
00139 cp.dwName=i;
00140 cp.dwPosition = cp.dwSampleOffset = fa->marks().pos(p);
00141 if (fa->marks().span(p)) use_span=TRUE;
00142 endian_tolittle32(&(cp.dwName)); endian_tolittle32(&(cp.dwPosition));
00143 endian_tolittle32(&(cp.dwSampleOffset)); xfwrite(&cp,sizeof(cp),1,f);
00144 }
00145 final=xftell(f);
00146 pos=final;
00147
00148
00149 WAVChunk lst = { {'L','I','S','T'}, 0 };
00150 CHAR8 adtl [4] = {'a','d','t','l'};
00151 endian_tolittle32(&(lst.len)); xfwrite(&lst,sizeof(lst),1,f);
00152 xfwrite(&adtl,sizeof(adtl),1,f);
00153
00154 use_span=TRUE;
00155 if (use_span) {
00156 WAVChunk ltxt = { {'l','t','x','t'}, 0 };
00157 i=0;
00158 struct { UINT32 n MINALIGN; UINT32 len MINALIGN; CHAR8 pur[4] MINALIGN; UINT16 country MINALIGN;
00159 UINT16 lang MINALIGN; UINT16 dialec MINALIGN; UINT16 cpage MINALIGN; } ltxts;
00160
00161 ltxts.n=0; ltxts.len=0; ltxts.pur[0]='r'; ltxts.pur[1]='g'; ltxts.pur[2]='n'; ltxts.pur[3]=' ';
00162 ltxts.country=0; ltxts.lang=0; ltxts.dialec=0; ltxts.cpage=0;
00163 ltxt.len=sizeof(ltxts); endian_tolittle32(&(ltxt.len));
00164 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00165 i++;
00166 ltxts.n=i;
00167 ltxts.len=fa->marks().span(p);
00168 xfwrite(<xt,sizeof(ltxt),1,f);
00169 endian_tolittle32(&(ltxts.n)); endian_tolittle32(&(ltxts.len)); xfwrite(<xts,sizeof(ltxts),1,f);
00170 }
00171 }
00172
00173 #ifndef IGNORE_CUE_LABEL // no salvar NADA sobre labl
00174
00175 WAVChunk label = { {'l','a','b','l'}, 0 };
00176 i=0;
00177 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00178 #ifdef IGNORE_CUE_LABEL
00179 String tmp="";
00180 #else
00181 String tmp=fa->marks().label(p).before(" // ");
00182 #endif
00183 n32= ++i;
00184 label.len=strlen_zeven(tmp)+sizeof(n32);
00185 endian_tolittle32(&(label.len)); xfwrite(&label,sizeof(label),1,f);
00186 endian_tolittle32(&n32); xfwrite(&n32,sizeof(n32),1,f);
00187 puts_zeven(tmp,f);
00188 }
00189 #endif
00190
00191
00192 WAVChunk note = { {'n','o','t','e'}, 0 };
00193 i=0;
00194 for (p=fa->marks().first(); p!=0; p=fa->marks().next(p)) {
00195 String tmp;
00196 #ifdef IGNORE_CUE_LABEL
00197 tmp=fa->marks().label(p);
00198 #else
00199 if (fa->marks().label(p).contains(" // ")) tmp=fa->marks().label(p).after(" // ");
00200 else tmp=fa->marks().label(p);
00201 #endif
00202 n32= ++i;
00203 note.len=strlen_zeven(tmp)+sizeof(n32);
00204 endian_tolittle32(&(note.len)); xfwrite(¬e,sizeof(note),1,f);
00205 endian_tolittle32(&n32); xfwrite(&n32,sizeof(n32),1,f);
00206 puts_zeven(tmp,f);
00207 }
00208
00209 final=xftell(f);
00210
00211 UINT32 l = final-pos-8;
00212 xfseek(f,pos+4,SEEK_SET);
00213 endian_tolittle32(&l); xfwrite(&l,sizeof(l),1,f);
00214 xfseek(f,final,SEEK_SET);
00215 }
00216
00217
00218 if (fa->info().contains("DisplayTitle")) {
00219 WAVChunk disp = { {'D','I','S','P'}, 0 };
00220 const String &s=fa->info().val("DisplayTitle");
00221 UINT32 x=1;
00222 disp.len=sizeof(UINT32)+strlen_zeven(s);
00223 endian_tolittle32(&(disp.len)); xfwrite(&disp,sizeof(disp),1,f);
00224 endian_tolittle32(&x); xfwrite(&x,sizeof(x),1,f);
00225 puts_zeven(s,f);
00226 }
00227
00228 final=xftell(f);
00229
00230 xfseek(f,0,SEEK_END);
00231 long fin=xftell(f);
00232 if (fin!=final) xfdeln(f,final,fin-final);
00233
00234
00235 wh.len=xftell(f)-8;
00236 xfseek(f,4,SEEK_SET);
00237 endian_tolittle32(&(wh.len)); xfwrite(&(wh.len),sizeof(wh.len),1,f);
00238
00239 xfseek(f,datapos,SEEK_SET);
00240
00241 if (fa->getBigEndian())
00242 fprintf(stderr,"%s warning: saving big endian file!\n",fFormat());
00243 }
00244
00245
00246
00247
00248 VOID AFWav::HdrG( KVStrList &def, BOOL override )
00249 {
00250
00251 datapos=0;
00252
00253 ADD(CAUDIO_NSAMPLES,0);
00254 ADDIFNOV(CAUDIO_SRATE,def.dval(CAUDIO_SRATE,8000));
00255 ADDIFNOV(CAUDIO_BIGENDIAN,"no");
00256 ADDIFNOV(CAUDIO_SAMPTYPE,def.val(CAUDIO_SAMPTYPE,SAMPTYPE_STR_PCM16));
00257 ADDIFNOV(CAUDIO_NCHAN,def.lval(CAUDIO_NCHAN,1));
00258
00259 switch (SampType_a2i(fa->info().val(CAUDIO_SAMPTYPE))) {
00260 case SAMPTYPE_PCM16:
00261 case SAMPTYPE_PCM8U: break;
00262 default:
00263 die_beep("%s: sampType %s not supported",fFormat(),
00264 (const char *)fa->info().val(CAUDIO_SAMPTYPE));
00265 }
00266 }
00267
00268
00269
00270 #ifdef __CC_MSVC__
00271 #pragma pack(pop)
00272 #endif
00273
00274