AudioBufferSource.cxx

Go to the documentation of this file.
00001 #include "AudioBufferSource.hxx"
00002 #include "ProcessingFactory.hxx"
00003 #include "Audio.hxx"
00004 
00005 namespace CLAM
00006 {
00007 
00008 namespace
00009 {
00010         static const char* metadata[] = {
00011                 "key", "AudioBufferSource",
00012                 "category", "Audio I/O",
00013                 "description", "AudioBufferSource",
00014                 "port_source_type", typeid(Audio).name(),
00015                 "icon", "source.svg",
00016                 "embedded_svg", "source.svg",
00017                 0
00018         };
00019         static FactoryRegistrator<ProcessingFactory, AudioBufferSource> reg = metadata;
00020 }
00021 
00022 AudioBufferSource::Config::~Config() { }
00023 
00024 bool AudioBufferSource::Do()
00025 {
00026         for (Ports::iterator it = _ports.begin(); it != _ports.end(); ++it)
00027         {
00028                 Port& port = (*it);
00029                 OutPort<Audio>* out = port.mPort;
00030 
00031                 CLAM::Audio& so=out->GetData();
00032                 CLAM_DEBUG_ASSERT(!port.mFloatBuffer || !port.mDoubleBuffer, "AudioBufferSource: Just one buffer should be set");
00033                 CLAM_DEBUG_ASSERT(port.mFloatBuffer || port.mDoubleBuffer, "AudioBufferSource: No external buffer set");
00034                 CLAM_DEBUG_ASSERT(port.mBufferSize>0, "AudioBufferSource: internal buffer size must be greater than 0");
00035 
00036                 so.SetSize(port.mBufferSize);
00037 
00038                 CLAM::TData * audioBuffer = so.GetBuffer().GetPtr();
00039 
00040                 if (port.mFloatBuffer)
00041                         for (unsigned i=0; i<port.mBufferSize; i++)
00042                                 audioBuffer[i] = port.mFloatBuffer[i];
00043                 else
00044                         for (unsigned i=0; i<port.mBufferSize; i++)
00045                                 audioBuffer[i] = port.mDoubleBuffer[i];
00046 
00047                 for (int i=port.mBufferSize; i<out->GetSize(); i++)
00048                         audioBuffer[i] = 0.;
00049 
00050                 out->Produce();
00051         }
00052         return true;
00053 }
00054 
00055 void AudioBufferSource::SetExternalBuffer(const float* buf, unsigned nframes, unsigned index)
00056 {
00057     //std::cout << "AudioBufferSink::SetExternalBuffer using float" << std::endl;
00058         CLAM_ASSERT(index < _ports.size(), "OutPort<Audio> index out of range");
00059         Port& port = _ports[index];
00060         port.mPort->SetSize(1);
00061         port.mPort->SetHop(1);
00062         port.mFloatBuffer = buf;
00063         port.mBufferSize = nframes;
00064         port.mDoubleBuffer = 0;
00065 }
00066 
00067 void AudioBufferSource::SetExternalBuffer(const double* buf, unsigned nframes, unsigned index)
00068 {
00069     //std::cout << "AudioBufferSink::SetExternalBuffer using double" << std::endl;
00070         CLAM_ASSERT(index < _ports.size(), "OutPort<Audio> index out of range");
00071         Port& port = _ports[index];
00072         port.mPort->SetSize(1);
00073         port.mPort->SetHop(1);
00074         port.mDoubleBuffer = buf;
00075         port.mBufferSize = nframes;
00076         port.mFloatBuffer = 0;
00077 }
00078 
00079 } //namespace CLAM
00080 
Generated by  doxygen 1.6.3