00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef MARSYAS_WAVFILESINK_H
00020 #define MARSYAS_WAVFILESINK_H
00021
00022 #include "common_header.h"
00023 #include "SoundFileSink.h"
00024 #include "WavFileSource.h"
00025 #include "FileName.h"
00026 #include "AbsSoundFileSink.h"
00027
00028 namespace Marsyas
00029 {
00039 struct wavhdr {
00040 char riff[4];
00041 signed int file_size;
00042
00043 char wave[4];
00044
00045 char fmt[4];
00046 signed int chunk_size;
00047 signed short format_tag;
00048 signed short num_chans;
00049 signed int sample_rate;
00050 signed int bytes_per_sec;
00051 signed short bytes_per_samp;
00052 signed short bits_per_samp;
00053 char data[4];
00054 signed int data_length;
00055 };
00056
00057 class WavFileSink: public AbsSoundFileSink
00058 {
00059 private:
00060 wavhdr hdr_;
00061 unsigned long written_;
00062 long fpos_;
00063
00064 short * sdata_;
00065 unsigned char *cdata_;
00066
00067 std::string filename_;
00068 FILE *sfp_;
00069 long sfp_begin_;
00070 mrs_natural nChannels_;
00071
00072 unsigned long ByteSwapLong(unsigned long nLongNumber);
00073 unsigned short ByteSwapShort (unsigned short nValue);
00074
00075 void addControls();
00076 void myUpdate(MarControlPtr sender);
00077
00078 public:
00079 WavFileSink(std::string name);
00080 ~WavFileSink();
00081 MarSystem* clone() const;
00082
00083 void putLinear16Swap(realvec& slice);
00084 void putHeader(std::string filename);
00085 bool checkExtension(std::string filename);
00086 void myProcess(realvec& in, realvec& out);
00087 };
00088
00089 }
00090
00091 #endif
00092
00093
00094
00095
00096