Mercurial > hg > svcore
diff data/fileio/AudioFileReaderFactory.cpp @ 241:2b40f83e7627
* Make audio file reader factory try for a reader based on the file's
extension, before trying all readers
* Remove some debug output
author | Chris Cannam |
---|---|
date | Thu, 01 Mar 2007 12:15:08 +0000 |
parents | 84ff7ba52993 |
children | 71dfc6ab3b54 |
line wrap: on
line diff
--- a/data/fileio/AudioFileReaderFactory.cpp Wed Feb 28 11:20:14 2007 +0000 +++ b/data/fileio/AudioFileReaderFactory.cpp Thu Mar 01 12:15:08 2007 +0000 @@ -20,6 +20,7 @@ #include "MP3FileReader.h" #include <QString> +#include <QFileInfo> #include <iostream> QString @@ -54,45 +55,95 @@ AudioFileReader *reader = 0; + // First try to construct a preferred reader based on the + // extension. If we can't identify one or it fails to load the + // file, fall back to trying all readers in no particular order. + + QString ext = QFileInfo(path).suffix().toLower(); + std::set<QString> extensions; + + WavFileReader::getSupportedExtensions(extensions); + if (extensions.find(ext) != extensions.end()) { + reader = new WavFileReader(path); + } + +#ifdef HAVE_MAD + if (!reader) { + extensions.clear(); + MP3FileReader::getSupportedExtensions(extensions); + if (extensions.find(ext) != extensions.end()) { + reader = new MP3FileReader + (path, true, MP3FileReader::CacheInTemporaryFile); + } + } +#endif +#ifdef HAVE_OGGZ +#ifdef HAVE_FISHSOUND + if (!reader) { + extensions.clear(); + OggVorbisFileReader::getSupportedExtensions(extensions); + if (extensions.find(ext) != extensions.end()) { + reader = new OggVorbisFileReader + (path, true, OggVorbisFileReader::CacheInTemporaryFile); + } + } +#endif +#endif + + if (reader) { + if (reader->isOK()) return reader; + if (reader->getError() != "") { + std::cerr << "AudioFileReaderFactory: Preferred reader for " + << "extension \"" << ext.toStdString() << "\" failed: \"" + << reader->getError().toStdString() << "\"" << std::endl; + } else { + std::cerr << "AudioFileReaderFactory: Preferred reader for " + << "extension \"" << ext.toStdString() << "\" failed" + << std::endl; + } + delete reader; + reader = 0; + } + reader = new WavFileReader(path); if (reader->isOK()) return reader; - if (reader->getError() != "") err = reader->getError(); + if (reader->getError() != "") { + std::cerr << "AudioFileReaderFactory: WAV file reader error: \"" + << reader->getError().toStdString() << "\"" << std::endl; + } else { + std::cerr << "AudioFileReaderFactory: WAV file reader failed" + << std::endl; + } delete reader; - if (err != "") { - std::cerr << "AudioFileReaderFactory: WAV file reader error: \"" - << err.toStdString() << "\"" << std::endl; - } - - #ifdef HAVE_OGGZ #ifdef HAVE_FISHSOUND - reader = new OggVorbisFileReader(path, true, - OggVorbisFileReader::CacheInTemporaryFile); + reader = new OggVorbisFileReader + (path, true, OggVorbisFileReader::CacheInTemporaryFile); if (reader->isOK()) return reader; - if (reader->getError() != "") err = reader->getError(); + if (reader->getError() != "") { + std::cerr << "AudioFileReaderFactory: Ogg file reader error: \"" + << reader->getError().toStdString() << "\"" << std::endl; + } else { + std::cerr << "AudioFileReaderFactory: Ogg file reader failed" + << std::endl; + } delete reader; - - if (err != "") { - std::cerr << "AudioFileReaderFactory: Ogg file reader error: \"" - << err.toStdString() << "\"" << std::endl; - } - #endif #endif #ifdef HAVE_MAD - reader = new MP3FileReader(path, true, - MP3FileReader::CacheInTemporaryFile); + reader = new MP3FileReader + (path, true, MP3FileReader::CacheInTemporaryFile); if (reader->isOK()) return reader; - if (reader->getError() != "") err = reader->getError(); + if (reader->getError() != "") { + std::cerr << "AudioFileReaderFactory: MP3 file reader error: \"" + << reader->getError().toStdString() << "\"" << std::endl; + } else { + std::cerr << "AudioFileReaderFactory: MP3 file reader failed" + << std::endl; + } delete reader; - - if (err != "") { - std::cerr << "AudioFileReaderFactory: mp3 file reader error: \"" - << err.toStdString() << "\"" << std::endl; - } - #endif return 0;