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;
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
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 }
00125