00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "SoundFileSink.h"
00021
00022 using namespace std;
00023 using namespace Marsyas;
00024
00025 #define UnsignedToFloat(u) (((double)((long)(u - 2147483647L - 1))) + 2147483648.0)
00026 #define FloatToUnsigned(f) ((unsigned long)(((long)(f - 2147483648.0)) + 2147483647L) + 1)
00027
00028
00029
00030 SoundFileSink::SoundFileSink(mrs_string name):MarSystem("SoundFileSink",name)
00031 {
00032
00033
00034 sdata_ = NULL;
00035 cdata_ = NULL;
00036 sfp_ = NULL;
00037 dest_ = NULL;
00038
00039 addControls();
00040 }
00041
00042
00043 SoundFileSink::SoundFileSink(const SoundFileSink& a):MarSystem(a)
00044 {
00045 sdata_ = NULL;
00046 cdata_ = NULL;
00047 sfp_ = NULL;
00048 dest_ = NULL;
00049 }
00050
00051
00052 MarSystem*
00053 SoundFileSink::clone() const
00054 {
00055 return new SoundFileSink(*this);
00056 }
00057
00058 SoundFileSink::~SoundFileSink()
00059 {
00060 delete dest_;
00061 }
00062
00063 void
00064 SoundFileSink::addControls()
00065 {
00066 addctrl("mrs_string/filename", "defaultfile");
00067 setctrlState("mrs_string/filename", true);
00068
00069 addctrl("mrs_natural/bitrate", 128);
00070 setctrlState("mrs_natural/bitrate", true);
00071 addctrl("mrs_natural/encodingQuality", 2);
00072 setctrlState("mrs_natural/encodingQuality", true);
00073 addctrl("mrs_string/id3tags", "noTitle|noArtist|noAlbum|1978|noComment|1|0");
00074 setctrlState("mrs_string/id3tags", true);}
00075
00076
00077 void
00078 SoundFileSink::putHeader()
00079 {
00080 mrs_string filename = getctrl("mrs_string/filename")->to<mrs_string>();
00081 dest_->putHeader(filename);
00082 }
00083
00084
00085
00086 bool
00087 SoundFileSink::checkType()
00088 {
00089 mrs_string filename = getctrl("mrs_string/filename")->to<mrs_string>();
00090
00091 if (filename != "defaultfile")
00092 {
00093 sfp_ = fopen(filename.c_str(), "wb");
00094 if (sfp_ == NULL)
00095 {
00096 mrs_string wrn = "SoundFileSink::checkType: Problem opening file ";
00097 wrn += filename;
00098 MRSWARN(wrn);
00099 filename = "defaultfile";
00100 return false;
00101 }
00102 fclose(sfp_);
00103 }
00104
00105
00106 mrs_string::size_type pos = filename.rfind(".", filename.length());
00107 mrs_string ext;
00108 if (pos == mrs_string::npos) ext = "";
00109 else
00110 ext = filename.substr(pos, filename.length());
00111
00112 if (ext == ".au")
00113 {
00114 delete dest_;
00115 dest_ = new AuFileSink(getName());
00116 }
00117 else if (ext == ".wav")
00118 {
00119 delete dest_;
00120 dest_ = new WavFileSink(getName());
00121 }
00122 else if (ext == ".mp3")
00123 {
00124 delete dest_;
00125 dest_ = new MP3FileSink(getName());
00126 }
00127 else
00128 {
00129 if (filename != "defaultfile")
00130 {
00131 mrs_string wrn = "Unsupported format for file ";
00132 wrn += filename;
00133 MRSWARN(wrn);
00134 filename_ = "defaultfile";
00135 setctrl("mrs_string/filename", "defaultfile");
00136 return false;
00137 }
00138 else
00139 return false;
00140 }
00141
00142 return true;
00143 }
00144
00145 void
00146 SoundFileSink::myUpdate(MarControlPtr sender)
00147 {
00148 (void) sender;
00149
00150 if (filename_ != getctrl("mrs_string/filename")->to<mrs_string>())
00151 {
00152 if (checkType() == true)
00153 {
00154 dest_->setctrl("mrs_natural/inSamples", getctrl("mrs_natural/inSamples"));
00155 dest_->setctrl("mrs_natural/inObservations", getctrl("mrs_natural/inObservations"));
00156 dest_->setctrl("mrs_real/israte", getctrl("mrs_real/israte"));
00157 dest_->update();
00158
00159 putHeader();
00160 filename_ = getctrl("mrs_string/filename")->to<mrs_string>();
00161
00162 setctrl("mrs_real/israte", dest_->getctrl("mrs_real/israte"));
00163 }
00164 else
00165 dest_ = NULL;
00166 }
00167
00168
00169 if (dest_ != NULL)
00170 {
00171 dest_->setctrl("mrs_natural/inSamples", getctrl("mrs_natural/inSamples"));
00172 dest_->setctrl("mrs_natural/inObservations", getctrl("mrs_natural/inObservations"));
00173 dest_->setctrl("mrs_real/israte", getctrl("mrs_real/israte"));
00174
00175 dest_->setctrl("mrs_string/filename", getctrl("mrs_string/filename"));
00176 dest_->setctrl("mrs_natural/bitrate", getctrl("mrs_natural/bitrate"));
00177 dest_->setctrl("mrs_natural/encodingQuality", getctrl("mrs_natural/encodingQuality"));
00178 dest_->setctrl("mrs_string/id3tags", getctrl("mrs_string/id3tags"));
00179 dest_->update();
00180
00181 setctrl("mrs_natural/onSamples", dest_->getctrl("mrs_natural/onSamples"));
00182 setctrl("mrs_natural/onObservations", dest_->getctrl("mrs_natural/onObservations"));
00183 setctrl("mrs_real/osrate", dest_->getctrl("mrs_real/israte"));
00184
00185
00186 }
00187 }
00188
00189
00190 void
00191 SoundFileSink::myProcess(realvec& in, realvec& out)
00192 {
00193 if (dest_ != NULL)
00194 {
00195 dest_->process(in,out);
00196 }
00197
00198
00199 }
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 void
00210 SoundFileSink::putFloat(mrs_natural c, realvec& win)
00211 {
00212 (void) c;
00213 (void) win;
00214 MRSWARN("SoundFileSink::putFloat not implemented");
00215 }
00216
00217
00218
00219
00220