CLAM-Development  1.4.0
ControlTrace.cxx
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2001-2004 MUSIC TECHNOLOGY GROUP (MTG)
3  * UNIVERSITAT POMPEU FABRA
4  * Copyright (c) 2007 Superlucidity Services, LLC and Zachary T Welch
5  *
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  *
21  */
22 
23 #include "ControlTrace.hxx"
24 #include "XMLAdapter.hxx"
25 #include "XMLStorage.hxx"
26 #include "XMLIterableAdapter.hxx"
27 #include "XMLAdapter.hxx"
28 #include "XmlStorageErr.hxx"
29 #include <sstream>
30 #include "ProcessingFactory.hxx"
31 
32 namespace CLAM
33 {
34 namespace Hidden
35 {
36  static const char * metadataReader[] = {
37  "key", "ControlTraceReader",
38  "category", "Controls",
39  "description", "ControlTraceReader",
40  0
41  };
43 
44  static const char * metadataWriter[] = {
45  "key", "ControlTraceWriter",
46  "category", "Controls",
47  "description", "ControlTraceWriter",
48  0
49  };
51 }
52 
54  : mRepeats(0)
55 {
56 }
58  : mRepeats(obj.mRepeats)
59  , mValues(obj.mValues)
60 {
61 }
63  : mRepeats(0)
64 {
65  mValues.resize(inputs.Size());
66  for (int i = 0; i < inputs.Size(); i++)
67  mValues[i] = inputs[i].GetLastValue();
68 }
69 
71 {
72  for (int i = 0; i < outputs.Size(); i++)
73  outputs[i].SendControl(mValues[i]);
74 }
75 
77 {
78  XMLIterableAdapter<ValueArray> vAdapter(mValues, "x", "controls", true);
79  storage.Load(vAdapter);
80 
81  XMLAdapter<unsigned int> sAdapter(mRepeats, "repeats", true);
82  storage.Load(sAdapter);
83 }
84 
85 void ControlTraceEvent::StoreOn( Storage& storage ) const
86 {
87  XMLIterableAdapter<ValueArray> vAdapter(mValues, "x", "controls", true);
88  storage.Store(vAdapter);
89 
90  if (mRepeats)
91  {
92  XMLAdapter<unsigned int> sAdapter(mRepeats, "repeats", true);
93  storage.Store(sAdapter);
94  }
95 }
96 
98 {
99  mValues = rhs.mValues;
100  return *this;
101 }
102 
104 {
105  if (mValues.size() != rhs.mValues.size())
106  return false;
107 
108  for (size_t i = 0; i < mValues.size(); i++)
109  {
110  if (mValues[i] != rhs.mValues[i])
111  return false;
112  }
113 
114  return true;
115 }
116 
117 /* ================================================================== */
118 
119 const unsigned int ControlTraceData::DumpVersion = 1;
120 
122  : mVersion(DumpVersion)
123 {
124 }
126  : mVersion(DumpVersion), mEvents(obj.mEvents)
127 {
128 }
129 
131 {
132  mVersion = 0;
133  XMLAdapter<unsigned int> versionAdapter(mVersion, "version");
134  storage.Load(versionAdapter);
135  if (!mVersion || mVersion > DumpVersion)
136  {
137  std::stringstream err;
138  err << "Unknown CLAM Control Trace file version: " << mVersion;
139  throw XmlStorageErr(err.str());
140  }
141 
142  XMLIterableAdapter<EventList> adapter(mEvents, "event", "events", true);
143  storage.Load(adapter);
144 }
145 void ControlTraceData::StoreOn( Storage& storage ) const
146 {
147  XMLAdapter<unsigned int> versionAdapter(mVersion, "version");
148  storage.Store(versionAdapter);
149 
150  XMLIterableAdapter<EventList> adapter(mEvents, "event", "events", true);
151  storage.Store(adapter);
152 }
153 
155 {
156  ControlTraceEvent &prev = mEvents.back();
157  if (prev.ValuesEqual(data))
158  prev.WasRepeated();
159  else
160  mEvents.push_back(data);
161 }
162 
163 /* ================================================================== */
164 
165 static const char clamControlTraceFileTypeFamily[] = "CLAM Control Trace";
167  { "CLAM Control Traces (v1)", "*.clamtrace" },
168  };
169 
171 {
173 }
175 {
177 }
178 
180 {
182 }
184 {
186 }
187 
188 /* ================================================================= */
189 
191 {
192  AddAll();
193  UpdateData();
194  SetNumberOfInputs(1.);
195 }
196 
198 {
200 }
201 
203 {
204  Configure( cfg );
205 }
206 
208 {
210 }
211 
213 {
215  CopyAsConcreteConfig( mConfig, cfgObj );
216  if ( !mConfig.HasTraceFile() )
217  {
218  AddConfigErrorMessage("No 'trace file' was specified in the configuration!");
219  return false;
220  }
221 
222  ControlTraceOutFilename &file = mConfig.GetTraceFile();
223  if ( file == "" )
224  {
225  AddConfigErrorMessage("No trace file selected");
226  return false;
227  }
228 
229  if (!mConfig.HasNumberOfInputs() || mConfig.GetNumberOfInputs() < 1.)
230  {
231  AddConfigErrorMessage("The number of inputs has not been configured.");
232  return false;
233  }
234 
235  mInputs.Resize(int(mConfig.GetNumberOfInputs()), "Input", this);
236  return true;
237 }
238 
240 {
241  XMLStorage::Dump(mTrace, "trace", mConfig.GetTraceFile().c_str());
242  mTrace.Clear();
243  return true;
244 }
245 
247 {
249  return true;
250 }
251 
252 
254 {
255  mInputs.Clear();
256  GetInControls().Clear();
257 }
258 
259 /* ================================================================= */
260 
262 {
263  AddAll();
264  UpdateData();
265 }
266 
268 {
270 }
271 
273 {
274  Configure( cfg );
275 }
276 
278 {
280 }
281 
283 {
285  CopyAsConcreteConfig( mConfig, cfgObj );
286  if ( !mConfig.HasTraceFile() )
287  {
288  AddConfigErrorMessage("No 'trace file' was specified in the configuration!");
289  return false;
290  }
291 
292  ControlTraceInFilename &file = mConfig.GetTraceFile();
293  if ( file == "" )
294  {
295  AddConfigErrorMessage("No trace file selected");
296  return false;
297  }
298 
299  try {
300  XMLStorage::Restore(mTrace, mConfig.GetTraceFile().c_str());
301  }
302  catch (XmlStorageErr &e)
303  {
305  return false;
306  }
307 
308  if (mTrace.GetNumberOfControls() < 1)
309  {
310  AddConfigErrorMessage("The specified file does not contain any control events.");
311  return false;
312  }
313 
314  mOutputs.Resize(mTrace.GetNumberOfControls(), "Output", this);
315  return true;
316 }
317 
319 {
320  mIterator = mTrace.Begin();
321  mRepeatCounter = 0;
322  return true;
323 }
324 
326 {
327  if (mIterator == mTrace.End())
328  return false;
329 
330  const ControlTraceEvent &event = *mIterator;
331 
332  // if this is the zeroth (first) step, update the controls
333  if (!mRepeatCounter)
334  event.UpdateControls(mOutputs);
335 
336  // if this step completes the current event, advance and reset counter
337  if (mRepeatCounter++ == event.Repeats()) {
338  mIterator++;
339  mRepeatCounter = 0;
340  }
341 
342  return true;
343 }
344 
346 {
347  mOutputs.Clear();
348  GetOutControls().Clear();
349 }
350 
351 /* ================================================================== */
352 
353 
354 
355 } // CLAM namespace
356