comparison runner/FeatureExtractionManager.cpp @ 31:8b20521fc40f

* Commit old fix (which I hope was correct!) to avoid leaking fds on exceptions * Remove dependency on audioio library
author Chris Cannam
date Fri, 12 Mar 2010 12:08:21 +0000
parents 0af07912f386
children 76ea8ffc4dfa
comparison
equal deleted inserted replaced
30:1141bc562301 31:8b20521fc40f
381 381
382 void FeatureExtractionManager::extractFeatures(QString audioSource) 382 void FeatureExtractionManager::extractFeatures(QString audioSource)
383 { 383 {
384 if (m_plugins.empty()) return; 384 if (m_plugins.empty()) return;
385 385
386 testOutputFiles(audioSource);
387
386 ProgressPrinter retrievalProgress("Retrieving audio data..."); 388 ProgressPrinter retrievalProgress("Retrieving audio data...");
387 389
388 FileSource source(audioSource, &retrievalProgress); 390 FileSource source(audioSource, &retrievalProgress);
389 if (!source.isAvailable()) { 391 if (!source.isAvailable()) {
390 cerr << "ERROR: File or URL \"" << audioSource.toStdString() 392 cerr << "ERROR: File or URL \"" << audioSource.toStdString()
427 429
428 cerr << "Opened " << channels << "-channel file or URL \"" << audioSource.toStdString() << "\"" << endl; 430 cerr << "Opened " << channels << "-channel file or URL \"" << audioSource.toStdString() << "\"" << endl;
429 431
430 // reject file if it has too few channels, plugin will handle if it has too many 432 // reject file if it has too few channels, plugin will handle if it has too many
431 if ((int)channels < m_channels) { 433 if ((int)channels < m_channels) {
434 delete reader;
432 throw FileOperationFailed 435 throw FileOperationFailed
433 (audioSource, 436 (audioSource,
434 QString("read sufficient channels (found %1, require %2)") 437 QString("read sufficient channels (found %1, require %2)")
435 .arg(channels).arg(m_channels)); 438 .arg(channels).arg(m_channels));
436 } 439 }
438 // allocate audio buffers 441 // allocate audio buffers
439 float **data = new float *[m_channels]; 442 float **data = new float *[m_channels];
440 for (int c = 0; c < m_channels; ++c) { 443 for (int c = 0; c < m_channels; ++c) {
441 data[c] = new float[m_blockSize]; 444 data[c] = new float[m_blockSize];
442 } 445 }
446
447 struct LifespanMgr { // unintrusive hack introduced to ensure
448 // destruction on exceptions
449 AudioFileReader *m_r;
450 int m_c;
451 float **m_d;
452 LifespanMgr(AudioFileReader *r, int c, float **d) :
453 m_r(r), m_c(c), m_d(d) { }
454 ~LifespanMgr() { destroy(); }
455 void destroy() {
456 if (!m_r) return;
457 delete m_r;
458 for (int i = 0; i < m_c; ++i) delete[] m_d[i];
459 delete[] m_d;
460 m_r = 0;
461 }
462 };
463 LifespanMgr lifemgr(reader, m_channels, data);
443 464
444 size_t frameCount = reader->getFrameCount(); 465 size_t frameCount = reader->getFrameCount();
445 466
446 // cerr << "file has " << frameCount << " frames" << endl; 467 // cerr << "file has " << frameCount << " frames" << endl;
447 468
591 if (progress > pp) extractionProgress.setProgress(progress); 612 if (progress > pp) extractionProgress.setProgress(progress);
592 } 613 }
593 614
594 // std::cerr << "FeatureExtractionManager: deleting audio file reader" << std::endl; 615 // std::cerr << "FeatureExtractionManager: deleting audio file reader" << std::endl;
595 616
596 delete reader; 617 lifemgr.destroy(); // deletes reader, data
597 618
598 for (PluginMap::iterator pi = m_plugins.begin(); 619 for (PluginMap::iterator pi = m_plugins.begin();
599 pi != m_plugins.end(); ++pi) { 620 pi != m_plugins.end(); ++pi) {
600 621
601 Plugin *plugin = pi->first; 622 Plugin *plugin = pi->first;
720 Transform::summaryTypeToString(summaryType).toStdString()); 741 Transform::summaryTypeToString(summaryType).toStdString());
721 } 742 }
722 } 743 }
723 } 744 }
724 745
746 void FeatureExtractionManager::testOutputFiles(QString audioSource)
747 {
748 for (PluginMap::iterator pi = m_plugins.begin();
749 pi != m_plugins.end(); ++pi) {
750
751 for (TransformWriterMap::iterator ti = pi->second.begin();
752 ti != pi->second.end(); ++ti) {
753
754 vector<FeatureWriter *> &writers = ti->second;
755
756 for (int i = 0; i < (int)writers.size(); ++i) {
757 writers[i]->testOutputFile(audioSource, ti->first.getIdentifier());
758 }
759 }
760 }
761 }
762
725 void FeatureExtractionManager::finish() 763 void FeatureExtractionManager::finish()
726 { 764 {
727 for (PluginMap::iterator pi = m_plugins.begin(); 765 for (PluginMap::iterator pi = m_plugins.begin();
728 pi != m_plugins.end(); ++pi) { 766 pi != m_plugins.end(); ++pi) {
729 767