CLAM-Development  1.4.0
MonoOfflineNetworkPlayer.cxx
Go to the documentation of this file.
4 #include <fstream>
5 
6 namespace CLAM
7 {
8 
10 {
12  return _filenames.size()!=GetNSinks()+GetNSources();
13 }
14 
16 {
17  std::stringstream ss;
18  ss << GetNSources() << " inputs and "
19  << GetNSinks() << " outputs needed but just "
20  << _filenames.size() << " files provided" << std::ends;
21  return ss.str();
22 }
23 
25 {
26  if ( IsPlaying() )
27  return;
28  BePlaying();
29 
31 
32  const int frameSize = 512;
33  const int sampleRate = 48000; //TODO deduce from inputs.
34 
35  std::vector<Audio> audioBuffers(_filenames.size());
36  std::vector<MonoAudioFileReader*> readers;
37  MonoAudioFileReaderConfig readercfg;
38  unsigned fileIndex=0;
39  for (unsigned i=0; i<GetNSources(); i++)
40  {
41  CLAM_ASSERT(fileIndex<_filenames.size(),
42  "Not all the network inputs could be fullfiled. Have you checked the IsWorking() method?");
43  {
44  std::ifstream checkfile(_filenames[fileIndex].c_str());
45  CLAM_ASSERT(checkfile.is_open(), std::string(std::string("Could not open one of the input files: ")+_filenames[fileIndex]).c_str());
46  }
47  readercfg.SetSourceFile(_filenames[fileIndex]);
48  readercfg.SetLoop(_enableLoopInputWavs);
49  MonoAudioFileReader * fileReader = new MonoAudioFileReader(readercfg);
50  fileReader->GetOutPort("Samples Read").SetSize( frameSize );
51  fileReader->GetOutPort("Samples Read").SetHop( frameSize );
52  readers.push_back(fileReader);
53  audioBuffers[fileIndex].SetSize( frameSize );
54 
55  TData * buffer = &audioBuffers[fileIndex].GetBuffer()[0];
56  SetSourceBuffer(i, buffer, frameSize);
57  std::cout << " In " << SourceName(i) << ":" << _filenames[fileIndex] << std::endl;
58  fileIndex++;
59  }
60 
61  std::vector<MonoAudioFileWriter*> writers;
62  MonoAudioFileWriterConfig writercfg;
63  for (unsigned i=0; i<GetNSinks(); i++)
64  {
65  if (fileIndex>=_filenames.size())
66  {
67  std::cerr <<
68  "Not all the network outputs could be fullfiled.";
69  break;
70  }
71 
72  writercfg.SetTargetFile(_filenames[fileIndex]);
73  writercfg.SetSampleRate(sampleRate);
74  MonoAudioFileWriter * fileWriter = new MonoAudioFileWriter(writercfg);
75  writers.push_back(fileWriter);
76  audioBuffers[fileIndex].SetSize( frameSize );
77 
78  TData * buffer = &audioBuffers[fileIndex].GetBuffer()[0];
79  SetSinkBuffer(i, buffer, frameSize);
80  std::cout << " Out: " << SinkName(i) << ":" << _filenames[fileIndex] << std::endl;
81  fileIndex++;
82  }
83 
84  for (unsigned i = 0; i<readers.size(); i++)
85  readers[i]->Start();
86  for (unsigned i = 0; i<writers.size(); i++)
87  writers[i]->Start();
88 
89  long iterationIndex = 0;
90  bool timeLimitedMode = _resultWavsTime > 0.001;
91  while ( true )
92  {
93  std::cout << "." << std::flush;
94  unsigned audioIndex =0;
95  bool someInputFinished=false;
96  for (unsigned i = 0; i<readers.size(); i++)
97  someInputFinished |= !readers[i]->Do(audioBuffers[audioIndex++]);
98  if (someInputFinished and not _enableLoopInputWavs ) break;
99  GetNetwork().Do();
100  for (unsigned i = 0; i<writers.size(); i++)
101  writers[i]->Do(audioBuffers[audioIndex++]);
102  if (timeLimitedMode and float(iterationIndex*frameSize)/sampleRate > _resultWavsTime)
103  {
104  std::cout << "REACHED MAX TIME - finalizing"<< std::endl;
105  break;
106  }
107  iterationIndex++;
108  }
109 
110  for (unsigned i = 0; i<readers.size(); i++)
111  readers[i]->Stop();
112  for (unsigned i = 0; i<writers.size(); i++)
113  writers[i]->Stop();
114 }
115 
117 {
118  if ( IsStopped() ) return;
119  BeStopped();
120  //TODO close files
121 }
122 
124 {
125  GetNetwork().Do();
126 }
127 
128 void MonoOfflineNetworkPlayer::AddInputFile( const std::string& filename )
129 {
130  _filenames.push_back(filename);
131 }
132 
133 void MonoOfflineNetworkPlayer::AddOutputFile( const std::string& filename )
134 {
135  _filenames.push_back(filename);
136 }
137 
138 } //namespace
139