FreewheelingNetworkPlayer.cxx

Go to the documentation of this file.
00001 #include "FreewheelingNetworkPlayer.hxx"
00002 #include "MonoAudioFileReader.hxx"
00003 #include "MonoAudioFileWriter.hxx"
00004 #include <fstream>
00005 
00006 namespace CLAM
00007 {
00008 
00009 bool FreewheelingNetworkPlayer::IsWorking() const
00010 {
00011         return _filenames.size()!=GetAudioSinks().size()+GetAudioSources().size();
00012 }
00013 std::string FreewheelingNetworkPlayer::NonWorkingReason() const
00014 {
00015         std::stringstream ss;
00016         ss << GetAudioSources().size() << " inputs and " 
00017                 << GetAudioSinks().size() << " outputs needed but just " 
00018                 << _filenames.size() << " files provided" << std::ends;
00019         return ss.str();
00020 }
00021 void FreewheelingNetworkPlayer::Start()
00022 {
00023         if ( !IsStopped() ) return;
00024         SetStopped(false);
00025         CollectSourcesAndSinks();
00026 
00027         const int frameSize = 512;
00028         const int sampleRate = 48000; //TODO deduce from inputs.
00029 
00030         std::vector<Audio> audioBuffers(_filenames.size());
00031         std::vector<MonoAudioFileReader*> readers;
00032         MonoAudioFileReaderConfig readercfg;
00033         unsigned fileIndex=0;
00034         for (unsigned i=0; i<GetAudioSources().size(); i++)
00035         {
00036                 CLAM_ASSERT(fileIndex<_filenames.size(),
00037                         "Not all the network inputs could be fullfiled. Have you checked the IsWorking() method?");
00038                 std::ifstream checkfile(_filenames[fileIndex].c_str());
00039                 CLAM_ASSERT(checkfile.is_open(), std::string(std::string("Could not open one of the input files: ")+_filenames[fileIndex]).c_str());
00040                 AudioSource& source = *GetAudioSources()[fileIndex];
00041                 readercfg.SetSourceFile(_filenames[fileIndex]);
00042                 readercfg.SetLoop(_enableLoopInputWavs);
00043                 MonoAudioFileReader * fileReader = new MonoAudioFileReader(readercfg);
00044                 fileReader->GetOutPort("Samples Read").SetSize( frameSize );
00045                 fileReader->GetOutPort("Samples Read").SetHop( frameSize );
00046                 readers.push_back(fileReader);
00047                 audioBuffers[fileIndex].SetSize( frameSize );
00048                 source.SetExternalBuffer( &(audioBuffers[fileIndex].GetBuffer()[0]) ,frameSize);
00049                 std::cout << " In: " << _filenames[fileIndex] << std::endl;
00050                 fileIndex++;
00051         }
00052         std::vector<MonoAudioFileWriter*> writers;
00053         MonoAudioFileWriterConfig writercfg;
00054         for (unsigned i=0; i<GetAudioSinks().size(); i++)
00055         {
00056                 if (fileIndex>=_filenames.size())
00057                 {
00058                         std::cerr <<
00059                         "Not all the network outputs could be fullfiled.";
00060                         break;
00061                 }
00062                 AudioSink& sink = *GetAudioSinks()[i];
00063                 writercfg.SetTargetFile(_filenames[fileIndex]);
00064                 writercfg.SetSampleRate(sampleRate);
00065                 MonoAudioFileWriter * fileWriter = new MonoAudioFileWriter(writercfg);
00066                 writers.push_back(fileWriter);
00067                 audioBuffers[fileIndex].SetSize( frameSize );
00068                 sink.SetExternalBuffer( &(audioBuffers[fileIndex].GetBuffer()[0]) ,frameSize);
00069                 std::cout << " Out: " << _filenames[fileIndex] << std::endl;
00070                 fileIndex++;
00071         }
00072         
00073         for (unsigned i = 0; i<readers.size(); i++)
00074                 readers[i]->Start();
00075         for (unsigned i = 0; i<writers.size(); i++)
00076                 writers[i]->Start();
00077 
00078         long iterationIndex = 0;
00079         bool timeLimitedMode = _resultWavsTime > 0.001;
00080         while ( true )
00081         {
00082                 std::cout << "." << std::flush;
00083                 unsigned audioIndex =0;
00084                 bool someInputFinished=false;
00085                 for (unsigned i = 0; i<readers.size(); i++)
00086                         someInputFinished |= !readers[i]->Do(audioBuffers[audioIndex++]);
00087                 if (someInputFinished and not _enableLoopInputWavs ) break;
00088                 GetNetwork().Do();
00089                 for (unsigned i = 0; i<writers.size(); i++)
00090                         writers[i]->Do(audioBuffers[audioIndex++]);
00091                 if (timeLimitedMode and float(iterationIndex*frameSize)/sampleRate > _resultWavsTime)
00092                 {
00093                         std::cout << "REACHED MAX TIME - finalizing"<< std::endl;
00094                         break;
00095                 }
00096                 iterationIndex++;
00097         }
00098         for (unsigned i = 0; i<readers.size(); i++)
00099                 readers[i]->Stop();
00100         for (unsigned i = 0; i<writers.size(); i++)
00101                 writers[i]->Stop();
00102 }
00103 void FreewheelingNetworkPlayer::Stop()
00104 {
00105         if ( IsStopped() ) return;
00106         SetStopped(true);
00107         //TODO close files
00108 }
00109 
00110 void FreewheelingNetworkPlayer::ProcessInputFile()
00111 {
00112         GetNetwork().Do();
00113 }
00114 
00115 void FreewheelingNetworkPlayer::AddInputFile( const std::string& filename )
00116 {
00117         _filenames.push_back(filename);
00118 }
00119 void FreewheelingNetworkPlayer::AddOutputFile( const std::string& filename )
00120 {
00121         _filenames.push_back(filename);
00122 }
00123 
00124 } //namespace
00125 

Generated on Tue Aug 12 22:33:42 2008 for CLAM by  doxygen 1.5.5