comparison data/fileio/CodedAudioFileReader.cpp @ 758:babed5be1ae7

Better general approach
author Chris Cannam
date Fri, 08 Mar 2013 20:05:49 +0000
parents b98f5daab19e
children a43acbe3988f
comparison
equal deleted inserted replaced
757:b98f5daab19e 758:babed5be1ae7
293 } 293 }
294 294
295 void 295 void
296 CodedAudioFileReader::pushBuffer(float *buffer, size_t sz, bool final) 296 CodedAudioFileReader::pushBuffer(float *buffer, size_t sz, bool final)
297 { 297 {
298 m_fileFrameCount += sz;
299
300 float ratio = 1.f;
301 if (m_resampler && m_fileRate != 0) {
302 ratio = float(m_sampleRate) / float(m_fileRate);
303 }
304
305 if (ratio != 1.f) {
306 pushBufferResampling(buffer, sz, ratio, final);
307 } else {
308 pushBufferNonResampling(buffer, sz);
309 }
310 }
311
312 void
313 CodedAudioFileReader::pushBufferNonResampling(float *buffer, size_t sz)
314 {
298 float max = 1.0; 315 float max = 1.0;
299 size_t count = sz * m_channelCount; 316 size_t count = sz * m_channelCount;
300
301 m_fileFrameCount += sz;
302
303 float ratio = 1.f;
304
305 if (m_resampler && m_fileRate != 0) {
306
307 ratio = float(m_sampleRate) / float(m_fileRate);
308
309 if (ratio != 1.f) {
310
311 size_t out = m_resampler->resampleInterleaved
312 (buffer,
313 m_resampleBuffer,
314 sz,
315 ratio,
316 final);
317
318 buffer = m_resampleBuffer;
319 sz = out;
320 count = sz * m_channelCount;
321 }
322 }
323 317
324 for (size_t i = 0; i < count; ++i) { 318 for (size_t i = 0; i < count; ++i) {
325 if (buffer[i] > max) buffer[i] = max; 319 if (buffer[i] > max) buffer[i] = max;
326 } 320 }
327 for (size_t i = 0; i < count; ++i) { 321 for (size_t i = 0; i < count; ++i) {
347 } 341 }
348 MUNLOCK_SAMPLEBLOCK(m_data); 342 MUNLOCK_SAMPLEBLOCK(m_data);
349 m_dataLock.unlock(); 343 m_dataLock.unlock();
350 break; 344 break;
351 } 345 }
352 346 }
353 if (final && m_resampler && ratio != 1.f) { 347
354 size_t equivFileFrames = m_frameCount / ratio; 348 void
355 if (equivFileFrames < m_fileFrameCount) { 349 CodedAudioFileReader::pushBufferResampling(float *buffer, size_t sz,
356 size_t padFrames = m_fileFrameCount - equivFileFrames + 32; 350 float ratio, bool final)
357 size_t padSamples = padFrames * m_channelCount; 351 {
358 std::cerr << "frameCount = " << m_frameCount << ", equivFileFrames = " << equivFileFrames << ", m_fileFrameCount = " << m_fileFrameCount << ", padFrames= " << padFrames << ", padSamples = " << padSamples << std::endl; 352 size_t out = m_resampler->resampleInterleaved
359 float *padding = new float[padSamples]; 353 (buffer,
360 for (int i = 0; i < padSamples; ++i) padding[i] = 0.f; 354 m_resampleBuffer,
361 355 sz,
362 //!!! these are not file frames (ugh this is horrible) 356 ratio,
363 m_fileFrameCount -= padFrames; 357 false);
364 358
365 pushBuffer(padding, padFrames, true); 359 pushBufferNonResampling(m_resampleBuffer, out);
366 delete[] padding; 360
367 } 361 if (final) {
362
363 size_t padFrames = 1;
364 if (m_frameCount / ratio < m_fileFrameCount) {
365 padFrames = m_fileFrameCount - (m_frameCount / ratio) + 1;
366 }
367
368 size_t padSamples = padFrames * m_channelCount;
369
370 std::cerr << "frameCount = " << m_frameCount << ", equivFileFrames = " << m_frameCount / ratio << ", m_fileFrameCount = " << m_fileFrameCount << ", padFrames= " << padFrames << ", padSamples = " << padSamples << std::endl;
371
372 float *padding = new float[padSamples];
373 for (int i = 0; i < padSamples; ++i) padding[i] = 0.f;
374
375 out = m_resampler->resampleInterleaved
376 (padding,
377 m_resampleBuffer,
378 padFrames,
379 ratio,
380 true);
381
382 pushBufferNonResampling(m_resampleBuffer, out);
383 delete[] padding;
368 } 384 }
369 } 385 }
370 386
371 void 387 void
372 CodedAudioFileReader::getInterleavedFrames(size_t start, size_t count, 388 CodedAudioFileReader::getInterleavedFrames(size_t start, size_t count,