CLAM-Development
1.1
|
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