AudioFileMemoryLoader.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "AudioFileMemoryLoader.hxx"
00023 #include <CLAM/ProcessingFactory.hxx>
00024
00025 #include <cmath>
00026
00027 namespace CLAM
00028 {
00029
00030 namespace Hidden
00031 {
00032 static const char * metadata[] = {
00033 "key", "AudioFileMemoryLoader",
00034 "category", "Audio File I/O",
00035 "description", "AudioFileMemoryLoader",
00036 0
00037 };
00038 static FactoryRegistrator<ProcessingFactory, AudioFileMemoryLoader> reg = metadata;
00039 }
00040
00041
00042 AudioFileMemoryLoader::AudioFileMemoryLoader( const ProcessingConfig& cfg )
00043 : _output( "Samples Read", this )
00044 , _timeOutput( "Current Time Position", this )
00045 , _positionInput( "Current Time Position (%)", this )
00046 , _lastPosition( 0 )
00047 , _position( 0 )
00048 {
00049 Configure( cfg );
00050 _positionInput.SetBounds( 0.0, 1.0 );
00051 }
00052
00053 AudioFileMemoryLoader::~AudioFileMemoryLoader()
00054 {
00055 }
00056
00057
00058 const char* AudioFileMemoryLoader::GetClassName() const
00059 {
00060 return "AudioFileMemoryLoader";
00061 }
00062
00063 const ProcessingConfig& AudioFileMemoryLoader::GetConfig() const
00064 {
00065 return _config;
00066 }
00067
00068 bool AudioFileMemoryLoader::ConcreteConfigure( const ProcessingConfig& cfgObject )
00069 {
00070 CopyAsConcreteConfig( _config, cfgObject );
00071
00072 MonoAudioFileReader reader(_config);
00073
00074 if ( !reader.IsConfigured() )
00075 {
00076 AddConfigErrorMessage(reader.GetConfigErrorMessage());
00077 return false;
00078 }
00079
00080 reader.Start();
00081 _samples.SetSize(reader.GetHeader().GetSamples());
00082 reader.Do(_samples);
00083
00084 _sampleRate = reader.GetHeader().GetSampleRate();
00085 _delta = 0.9 / reader.GetHeader().GetSamples();
00086 _position = 0;
00087 _timeOutput.SendControl(0);
00088
00089 return true;
00090 }
00091
00092 bool AudioFileMemoryLoader::ConcreteStart()
00093 {
00094 _position = 0;
00095 _timeOutput.SendControl(0);
00096 return true;
00097 }
00098
00099 bool AudioFileMemoryLoader::Do()
00100 {
00101 bool result = Do( _output.GetAudio() );
00102 _output.Produce();
00103
00104 return result;
00105 }
00106
00107 bool AudioFileMemoryLoader::Do( Audio & outputSamples )
00108 {
00109 CLAM::TData * samplesArray = &_samples.GetBuffer()[0];
00110 CLAM::TData * outputArray = &outputSamples.GetBuffer()[0];
00111
00112 CLAM::TControlData currentPosition = _positionInput.GetLastValue();
00113 if (std::fabs (currentPosition - _lastPosition) > _delta)
00114 {
00115 _lastPosition = currentPosition;
00116 _position = long(currentPosition * TControlData(_samples.GetSize()));
00117 }
00118
00119 long lastSample = _samples.GetSize() - 1;
00120 long length = outputSamples.GetSize();
00121 bool loop = _config.GetLoop();
00122 long i = 0;
00123 while (i < length)
00124 {
00125 long samplesLeft = lastSample - _position;
00126 if (samplesLeft > length - i)
00127 samplesLeft = length - i;
00128
00129 for (; samplesLeft > 0; samplesLeft--)
00130 {
00131 outputArray[i] = samplesArray[_position];
00132 i++;
00133 _position++;
00134 }
00135
00136 if (!loop)
00137 break;
00138
00139 if (_position >= lastSample)
00140 _position = 0;
00141 }
00142
00143 for (; i < length; i++)
00144 {
00145 outputArray[i] = 0.0;
00146 }
00147
00148 _timeOutput.SendControl(float(_position) / _samples.GetSize());
00149
00150 return true;
00151 }
00152
00153 unsigned long AudioFileMemoryLoader::GetSamples()
00154 {
00155 return _samples.GetSize();
00156 }
00157
00158 }
00159