00001 #ifndef __CAUDIO_HPP__
00002 #define __CAUDIO_HPP__
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
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "mark.hpp"
00042 #include "strl.hpp"
00043 #include "samp.hpp"
00044
00045
00046
00047 #ifndef __cplusplus
00048 #error Must use C++ compiler
00049 #endif
00050
00051
00052
00053 #define CAUDIO_FFORMAT "FFormat"
00054 #define CAUDIO_TXHRULE "TxhRule"
00055 #define CAUDIO_TXHNAME "TxhName"
00056 #define CAUDIO_FNAME "FName"
00057
00058 #define CAUDIO_SAMPTYPE "SampType"
00059 #define CAUDIO_SRATE "SRate"
00060 #define CAUDIO_NCHAN "NChan"
00061 #define CAUDIO_NSAMPLES "NSamples"
00062 #define CAUDIO_BIGENDIAN "BigEndian"
00063
00064 #define CAUDIO_ENVOPTS "CAUDIOOPTS"
00065 #define CAUDIO_OPTS_DEFAULT "FFormat=AutoRaw SampType=PCM16 NChan=1 SRate=8000"
00066
00067 #ifdef __BIG_ENDIAN__
00068 #define CAUDIO_BIGENDIAN_DEFAULT TRUE
00069 #else
00070 #define CAUDIO_BIGENDIAN_DEFAULT FALSE
00071 #endif
00072
00073 #define CAUDIO_TXTCOMMENT "TxtComment"
00074 #define CAUDIO_TXTCOLUMNS "TxtColumns"
00075
00076
00077
00078 #define INFO_SPEAKER "Speaker"
00079 #define INFO_TEXT "Text"
00080 #define INFO_VERSION "Version"
00081 #define INFO_COMMENTS "Comments"
00082
00083 #define INFO_SAMPLES "Samples"
00084
00085 #define CAUDIO_PARAMSET "ParamSet"
00086 #define CAUDIO_FRAMERATEMS "FrameRateMs"
00087 #define CAUDIO_ORIGINMS "OriginMs"
00088
00089 #define CAUDIO_DIMMIN "DimMin"
00090 #define CAUDIO_DIMMAX "DimMax"
00091 #define CAUDIO_DIMUNITS "DimUnits"
00092
00093 #define CAUDIO_VALMIN "ValMin"
00094 #define CAUDIO_VALMAX "ValMax"
00095 #define CAUDIO_VALUNITS "ValUnits"
00096
00097
00098
00099 class CAudio {
00100 private:
00101 public:
00102 CAudio ( VOID ) {};
00103 virtual ~CAudio ( VOID ) {};
00104 virtual BOOL OK( VOID ) const = 0;
00105
00106 virtual LONG getNSamples( VOID ) const = 0;
00107 virtual DOUBLE getSRate( VOID ) const = 0;
00108 virtual INT getSampType( VOID ) const = 0;
00109 virtual UINT getNChan( VOID ) const = 0;
00110 virtual BOOL getBigEndian( VOID ) const = 0;
00111 virtual const char *getSampType_a( VOID ) const = 0;
00112 virtual LONG getPos( VOID ) const = 0;
00113 virtual VOID setPos( LONG pos ) = 0;
00114
00115 virtual UINT get( INT16& sample ) = 0;
00116 virtual UINT set( INT16 sample ) = 0;
00117 virtual UINT ins( INT16 sample ) = 0;
00118 virtual UINT get( DOUBLE& sample ) = 0;
00119 virtual UINT set( DOUBLE sample ) = 0;
00120 virtual UINT ins( DOUBLE sample ) = 0;
00121 virtual UINT del( VOID ) = 0;
00122 virtual UINT getBlk( INT16* block, UINT len ) = 0;
00123 virtual UINT setBlk( const INT16* block, UINT len ) = 0;
00124 virtual UINT insBlk( const INT16* block, UINT len ) = 0;
00125 virtual UINT getBlk( DOUBLE* block, UINT len ) = 0;
00126 virtual UINT setBlk( const DOUBLE* block, UINT len ) = 0;
00127 virtual UINT insBlk( const DOUBLE* block, UINT len ) = 0;
00128 virtual UINT delBlk( UINT len ) = 0;
00129
00130 virtual INT16* get_i16( UINT len, BOOL reloadall=FALSE ) = 0;
00131 virtual DOUBLE* get_d( UINT len, BOOL reloadall=FALSE ) = 0;
00132
00133 virtual VOID minmax( LONG len, DOUBLE *min, DOUBLE *max );
00134 virtual VOID minmax( LONG len, INT16 *min, INT16 *max );
00135 virtual LONG maxfr( UINT framelen, UINT winlen, LONG nframes=-1 );
00136 };
00137
00138
00139
00140 class AFFormat;
00141
00142 class CAudioFile : public CAudio {
00143 protected:
00144 KVStrList myOpts;
00145
00146 KVStrList myInfo;
00147 Mark1DList myMarks;
00148 Samp mySamp;
00149 DOUBLE mySRate;
00150 INT mySampType;
00151 UINT myNChan;
00152 BOOL myBigEndian;
00153
00154 AFFormat * afFormat;
00155 FILE* myFile;
00156 BOOL trackMarks;
00157
00158 BOOL updatable;
00159 BOOL txhUpdatable;
00160
00161 AFFormat *getAFFormatObject( const CHAR *fname,const CHAR *mode );
00162 VOID txhGetName( const CHAR *fName );
00163 VOID txhLoad( const CHAR *mode );
00164 VOID txhWrite( VOID );
00165 public:
00166 CAudioFile( VOID );
00167 ~CAudioFile( VOID ) { close(); };
00168 BOOL OK( VOID ) const ;
00169 const String& getOpt( const String &option ) const { return myOpts.val(option); };
00170
00171 const char* getFFormat( VOID ) const { return getOpt(CAUDIO_FFORMAT); };
00172 const char* getFName( VOID ) const { return getOpt(CAUDIO_FNAME); };
00173
00174 VOID open( const CHAR* fName, const CHAR* mode, const KVStrList &Opts);
00175 VOID open( const CHAR* fName, const CHAR* mode="r", const CHAR* options="", ... );
00176 VOID open( const CHAR* fName, const CAudioFile &fa, const CHAR* options="", ... );
00177 VOID open( const CHAR* fName, const CHAR* mode, const CHAR* options, va_list va );
00178 VOID open( const CHAR* fName, const CAudioFile &fa, const CHAR* options, va_list va );
00179
00180 VOID open( const CHAR* fName, const CAudioFile &fa, const KVStrList &Opts );
00181 BOOL openFromTxt( const CHAR *fname, FILE *ftxt, const KVStrList &Opts );
00182 BOOL openFromTxt( const CHAR *fname, FILE *ftxt, const CHAR* options="", ... );
00183 BOOL openFromTxt( const CHAR *fname, FILE *ftxt, const CHAR* options, va_list va );
00184
00185 VOID set_updatable( BOOL update );
00186 BOOL update( VOID );
00187 VOID close( VOID );
00188
00189 KVStrList& info( VOID ) { return myInfo; }
00190 Mark1DList& marks( VOID ) { return myMarks; }
00191
00192 DOUBLE getSRate( VOID ) const { return mySRate; }
00193 BOOL getBigEndian( VOID ) const { return myBigEndian; }
00194 VOID setSRate( DOUBLE srate, BOOL adjustMarks=FALSE );
00195 VOID setBigEndian( BOOL big ) { myBigEndian=big; mySamp.setendian(big?-1:1); }
00196 INT getSampType( VOID ) const { return mySampType; }
00197 UINT getNChan( VOID ) const { return myNChan; }
00198 const char *getSampType_a( VOID ) const { return SampType_i2a(mySampType); }
00199
00200 VOID setPos( LONG pos ) { mySamp.setPos(pos); }
00201 LONG getPos( VOID ) const { return mySamp.getPos(); }
00202 LONG getNSamples( VOID ) const { return mySamp.getN(); }
00203 VOID setPosNoCh( LONG pos ) { mySamp.setPosNoCh(pos); }
00204 LONG getPosNoCh( VOID ) const { return mySamp.getPosNoCh(); }
00205 LONG getNSamplesNoCh( VOID ) const { return mySamp.getNNoCh(); }
00206
00207 UINT get( INT16& mySample ) { return mySamp.get(mySample); }
00208 UINT set( INT16 mySample ) { return mySamp.set(mySample); }
00209 UINT ins( INT16 mySample ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.ins(mySample); }
00210 UINT get( DOUBLE& mySample ) { return mySamp.get(mySample); }
00211 UINT set( DOUBLE mySample ) { return mySamp.set(mySample); }
00212 UINT ins( DOUBLE mySample ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.ins(mySample); }
00213 UINT del( VOID ) { if (trackMarks) myMarks.adjust_del(getPos()); return mySamp.del(); }
00214 UINT getBlk( INT16* block, UINT len ) { return mySamp.getBlk(block,len); }
00215 UINT setBlk( const INT16* block, UINT len ) { return mySamp.setBlk(block,len); }
00216 UINT insBlk( const INT16* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlk(block,len); }
00217 UINT getBlk( DOUBLE* block, UINT len ) { return mySamp.getBlk(block,len); }
00218 UINT setBlk( const DOUBLE* block, UINT len ) { return mySamp.setBlk(block,len); }
00219 UINT insBlk( const DOUBLE* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlk(block,len); }
00220 UINT delBlk( UINT len ) { if (trackMarks) myMarks.adjust_del(getPos(),len); return mySamp.delBlk(len); }
00221
00222 UINT getCh( INT16& mySample, UINT ch ) { return mySamp.getCh(mySample,ch); }
00223 UINT setCh( INT16 mySample, UINT ch ) { return mySamp.setCh(mySample,ch); }
00224 UINT insCh( INT16 mySample, UINT ch ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insCh(mySample,ch); }
00225 UINT getCh( DOUBLE& mySample, UINT ch ) { return mySamp.getCh(mySample,ch); }
00226 UINT setCh( DOUBLE mySample, UINT ch ) { return mySamp.setCh(mySample,ch); }
00227 UINT insCh( DOUBLE mySample, UINT ch ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insCh(mySample,ch); }
00228 UINT delCh( UINT ch ) { if (trackMarks) myMarks.adjust_del(getPos()); return mySamp.delCh(ch); }
00229 UINT getBlkCh( INT16* block, UINT len, UINT ch ) { return mySamp.getBlkCh(block,len,ch); }
00230 UINT setBlkCh( const INT16* block, UINT len, UINT ch ) { return mySamp.setBlkCh(block,len,ch); }
00231 UINT insBlkCh( const INT16* block, UINT len, UINT ch ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkCh(block,len,ch); }
00232 UINT getBlkCh( DOUBLE* block, UINT len, UINT ch ) { return mySamp.getBlkCh(block,len,ch); }
00233 UINT setBlkCh( const DOUBLE* block, UINT len, UINT ch ) { return mySamp.setBlkCh(block,len,ch); }
00234 UINT insBlkCh( const DOUBLE* block, UINT len, UINT ch ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkCh(block,len,ch); }
00235 UINT delBlkCh( UINT len, UINT ch ) { if (trackMarks) myMarks.adjust_del(getPos(),len); return mySamp.delBlkCh(len,ch); }
00236
00237 UINT getChAll( INT16* mySamplev ) { return mySamp.getChAll(mySamplev); }
00238 UINT setChAll( const INT16* mySamplev ) { return mySamp.setChAll(mySamplev); }
00239 UINT insChAll( const INT16* mySamplev ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insChAll(mySamplev); }
00240 UINT getChAll( DOUBLE* mySamplev ) { return mySamp.getChAll(mySamplev); }
00241 UINT setChAll( const DOUBLE* mySamplev ) { return mySamp.setChAll(mySamplev); }
00242 UINT insChAll( const DOUBLE* mySamplev ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insChAll(mySamplev); }
00243 UINT delChAll( VOID ) { if (trackMarks) myMarks.adjust_del(getPos()); return mySamp.delChAll(); }
00244 UINT getBlkChAll( INT16* block, UINT len ) { return mySamp.getBlkChAll(block,len); }
00245 UINT setBlkChAll( const INT16* block, UINT len ) { return mySamp.setBlkChAll(block,len); }
00246 UINT insBlkChAll( const INT16* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkChAll(block,len); }
00247 UINT getBlkChAll( DOUBLE* block, UINT len ) { return mySamp.getBlkChAll(block,len); }
00248 UINT setBlkChAll( const DOUBLE* block, UINT len ) { return mySamp.setBlkChAll(block,len); }
00249 UINT insBlkChAll( const DOUBLE* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkChAll(block,len); }
00250 UINT delBlkChAll( UINT len ) { if (trackMarks) myMarks.adjust_del(getPos(),len); return mySamp.delBlkChAll(len); }
00251
00252 UINT getChRange( INT16* mySample, UINT ch1, UINT ch2 ) { return mySamp.getChRange(mySample,ch1,ch2); }
00253 UINT setChRange( const INT16* mySample, UINT ch1, UINT ch2 ) { return mySamp.setChRange(mySample,ch1,ch2); }
00254 UINT insChRange( const INT16* mySample, UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insChRange(mySample,ch1,ch2); }
00255 UINT getChRange( DOUBLE* mySample, UINT ch1, UINT ch2 ) { return mySamp.getChRange(mySample,ch1,ch2); }
00256 UINT setChRange( const DOUBLE* mySample, UINT ch1, UINT ch2 ) { return mySamp.setChRange(mySample,ch1,ch2); }
00257 UINT insChRange( const DOUBLE* mySample, UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insChRange(mySample,ch1,ch2); }
00258 UINT delChRange( UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_del(getPos()); return mySamp.delChRange(ch1,ch2); }
00259 UINT getBlkChRange( INT16* block, UINT len, UINT ch1, UINT ch2 ) { return mySamp.getBlkChRange(block,len,ch1,ch2); }
00260 UINT setBlkChRange( const INT16* block, UINT len, UINT ch1, UINT ch2 ) { return mySamp.setBlkChRange(block,len,ch1,ch2); }
00261 UINT insBlkChRange( const INT16* block, UINT len, UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkChRange(block,len,ch1,ch2); }
00262 UINT getBlkChRange( DOUBLE* block, UINT len, UINT ch1, UINT ch2 ) { return mySamp.getBlkChRange(block,len,ch1,ch2); }
00263 UINT setBlkChRange( const DOUBLE* block, UINT len, UINT ch1, UINT ch2 ) { return mySamp.setBlkChRange(block,len,ch1,ch2); }
00264 UINT insBlkChRange( const DOUBLE* block, UINT len, UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkChRange(block,len,ch1,ch2); }
00265 UINT delBlkChRange( UINT len, UINT ch1, UINT ch2 ) { if (trackMarks) myMarks.adjust_del(getPos(),len); return mySamp.delBlkChRange(len,ch1,ch2); }
00266
00267 UINT getNoCh( INT16& mySample ) { return mySamp.getNoCh(mySample); }
00268 UINT setNoCh( INT16 mySample ) { return mySamp.setNoCh(mySample); }
00269 UINT insNoCh( INT16 mySample ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insNoCh(mySample); }
00270 UINT getNoCh( DOUBLE& mySample ) { return mySamp.getNoCh(mySample); }
00271 UINT setNoCh( DOUBLE mySample ) { return mySamp.setNoCh(mySample); }
00272 UINT insNoCh( DOUBLE mySample ) { if (trackMarks) myMarks.adjust_ins(getPos()); return mySamp.insNoCh(mySample); }
00273 UINT delNoCh( VOID ) { if (trackMarks) myMarks.adjust_del(getPos()); return mySamp.delNoCh(); }
00274 UINT getBlkNoCh( INT16* block, UINT len ) { return mySamp.getBlkNoCh(block,len); }
00275 UINT setBlkNoCh( const INT16* block, UINT len ) { return mySamp.setBlkNoCh(block,len); }
00276 UINT insBlkNoCh( const INT16* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkNoCh(block,len); }
00277 UINT getBlkNoCh( DOUBLE* block, UINT len ) { return mySamp.getBlkNoCh(block,len); }
00278 UINT setBlkNoCh( const DOUBLE* block, UINT len ) { return mySamp.setBlkNoCh(block,len); }
00279 UINT insBlkNoCh( const DOUBLE* block, UINT len ) { if (trackMarks) myMarks.adjust_ins(getPos(),len); return mySamp.insBlkNoCh(block,len); }
00280 UINT delBlkNoCh( UINT len ) { if (trackMarks) myMarks.adjust_del(getPos(),len); return mySamp.delBlkNoCh(len); }
00281
00282 INT16* get_i16( UINT len, BOOL reloadall=FALSE ) { return mySamp.get_i16(len,reloadall); }
00283 DOUBLE* get_d( UINT len, BOOL reloadall=FALSE ) { return mySamp.get_d(len,reloadall); }
00284 INT16* getChAll_i16( UINT len, BOOL reloadall=FALSE ) { return mySamp.getChAll_i16(len,reloadall); }
00285 DOUBLE* getChAll_d( UINT len, BOOL reloadall=FALSE ) { return mySamp.getChAll_d(len,reloadall); }
00286
00287 VOID txtWriteAllInfo( FILE *f, BOOL force_nsamp=TRUE );
00288 VOID writeToTxt( FILE *f );
00289
00290 VOID sndCopy( CAudioFile &fromf, LONG n );
00291 };
00292
00293
00294
00295
00296
00297
00298 #endif