comparison data/model/WaveFileModel.cpp @ 1086:9f4505ac9072

Tidy dense time-value model API a bit; add first simple unit test for FFT model
author Chris Cannam
date Wed, 10 Jun 2015 17:06:02 +0100
parents 0fd3661bcfff
children 4d9816ba0ebe b9faee02afa5
comparison
equal deleted inserted replaced
1085:bf6f64dabe73 1086:9f4505ac9072
250 250
251 return i; 251 return i;
252 } 252 }
253 253
254 sv_frame_t 254 sv_frame_t
255 WaveFileModel::getData(int channel, sv_frame_t start, sv_frame_t count, 255 WaveFileModel::getMultiChannelData(int fromchannel, int tochannel,
256 double *buffer) const 256 sv_frame_t start, sv_frame_t count,
257 { 257 float **buffer) const
258 #ifdef DEBUG_WAVE_FILE_MODEL
259 cout << "WaveFileModel::getData(double)[" << this << "]: " << channel << ", " << start << ", " << count << ", " << buffer << endl;
260 #endif
261
262 if (start > m_startFrame) {
263 start -= m_startFrame;
264 } else {
265 for (sv_frame_t i = 0; i < count; ++i) buffer[i] = 0.0;
266 if (count <= m_startFrame - start) {
267 return 0;
268 } else {
269 count -= (m_startFrame - start);
270 start = 0;
271 }
272 }
273
274 if (!m_reader || !m_reader->isOK() || count == 0) {
275 for (sv_frame_t i = 0; i < count; ++i) buffer[i] = 0.0;
276 return 0;
277 }
278
279 int channels = getChannelCount();
280
281 SampleBlock frames = m_reader->getInterleavedFrames(start, count);
282
283 sv_frame_t i = 0;
284
285 int ch0 = channel, ch1 = channel;
286 if (channel == -1) {
287 ch0 = 0;
288 ch1 = channels - 1;
289 }
290
291 while (i < count) {
292
293 buffer[i] = 0.0;
294
295 for (int ch = ch0; ch <= ch1; ++ch) {
296
297 sv_frame_t index = i * channels + ch;
298 if (index >= (sv_frame_t)frames.size()) break;
299
300 float sample = frames[index];
301 buffer[i] += sample;
302 }
303
304 ++i;
305 }
306
307 return i;
308 }
309
310 sv_frame_t
311 WaveFileModel::getData(int fromchannel, int tochannel,
312 sv_frame_t start, sv_frame_t count,
313 float **buffer) const
314 { 258 {
315 #ifdef DEBUG_WAVE_FILE_MODEL 259 #ifdef DEBUG_WAVE_FILE_MODEL
316 cout << "WaveFileModel::getData[" << this << "]: " << fromchannel << "," << tochannel << ", " << start << ", " << count << ", " << buffer << endl; 260 cout << "WaveFileModel::getData[" << this << "]: " << fromchannel << "," << tochannel << ", " << start << ", " << count << ", " << buffer << endl;
317 #endif 261 #endif
318 262