lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam and QMUL. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include "AudioFileReaderFactory.h" lbajardsilogic@0: lbajardsilogic@0: #include "WavFileReader.h" lbajardsilogic@0: #include "OggVorbisFileReader.h" lbajardsilogic@0: #include "MP3FileReader.h" ivand_qmul@117: //Ivan Damnjanovic 09-10/2007 added Video reader and control header lbajardsilogic@191: #ifdef HAVE_FFMPEG ivand_qmul@117: #include "VideoFileReader.h" lbajardsilogic@191: #endif ivand_qmul@117: // lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: QString lbajardsilogic@0: AudioFileReaderFactory::getKnownExtensions() lbajardsilogic@0: { lbajardsilogic@0: std::set extensions; lbajardsilogic@0: lbajardsilogic@0: WavFileReader::getSupportedExtensions(extensions); lbajardsilogic@0: #ifdef HAVE_MAD lbajardsilogic@0: MP3FileReader::getSupportedExtensions(extensions); lbajardsilogic@0: #endif lbajardsilogic@0: #ifdef HAVE_OGGZ lbajardsilogic@0: #ifdef HAVE_FISHSOUND lbajardsilogic@0: OggVorbisFileReader::getSupportedExtensions(extensions); lbajardsilogic@0: #endif lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: QString rv; lbajardsilogic@0: for (std::set::const_iterator i = extensions.begin(); lbajardsilogic@0: i != extensions.end(); ++i) { lbajardsilogic@0: if (i != extensions.begin()) rv += " "; lbajardsilogic@0: rv += "*." + *i; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return rv; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@85: bool AudioFileReaderFactory::isKnownExtensions(QString &extension) lbajardsilogic@85: { lbajardsilogic@85: bool isKnown = false; lbajardsilogic@85: lbajardsilogic@85: std::set extensions; lbajardsilogic@85: lbajardsilogic@85: WavFileReader::getSupportedExtensions(extensions); lbajardsilogic@85: #ifdef HAVE_MAD lbajardsilogic@85: MP3FileReader::getSupportedExtensions(extensions); lbajardsilogic@85: #endif lbajardsilogic@85: #ifdef HAVE_OGGZ lbajardsilogic@85: #ifdef HAVE_FISHSOUND lbajardsilogic@85: OggVorbisFileReader::getSupportedExtensions(extensions); lbajardsilogic@85: #endif lbajardsilogic@85: #endif lbajardsilogic@85: lbajardsilogic@85: std::set::iterator iter = extensions.find(extension); lbajardsilogic@85: lbajardsilogic@85: if (iter != extensions.end()) lbajardsilogic@85: { lbajardsilogic@85: isKnown = true; lbajardsilogic@85: } lbajardsilogic@85: lbajardsilogic@85: return isKnown; lbajardsilogic@85: } lbajardsilogic@85: lbajardsilogic@0: AudioFileReader * lbajardsilogic@0: AudioFileReaderFactory::createReader(QString path) lbajardsilogic@0: { lbajardsilogic@0: QString err; lbajardsilogic@0: lbajardsilogic@0: AudioFileReader *reader = 0; lbajardsilogic@0: lbajardsilogic@0: // First try to construct a preferred reader based on the lbajardsilogic@0: // extension. If we can't identify one or it fails to load the lbajardsilogic@0: // file, fall back to trying all readers in no particular order. lbajardsilogic@0: lbajardsilogic@0: QString ext = QFileInfo(path).suffix().toLower(); lbajardsilogic@0: std::set extensions; lbajardsilogic@0: lbajardsilogic@0: WavFileReader::getSupportedExtensions(extensions); lbajardsilogic@0: if (extensions.find(ext) != extensions.end()) { lbajardsilogic@0: reader = new WavFileReader(path); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: #ifdef HAVE_MAD lbajardsilogic@0: if (!reader) { lbajardsilogic@0: extensions.clear(); lbajardsilogic@0: MP3FileReader::getSupportedExtensions(extensions); lbajardsilogic@0: if (extensions.find(ext) != extensions.end()) { lbajardsilogic@0: reader = new MP3FileReader lbajardsilogic@0: (path, true, MP3FileReader::CacheInTemporaryFile); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: #endif lbajardsilogic@0: #ifdef HAVE_OGGZ lbajardsilogic@0: #ifdef HAVE_FISHSOUND lbajardsilogic@0: if (!reader) { lbajardsilogic@0: extensions.clear(); lbajardsilogic@0: OggVorbisFileReader::getSupportedExtensions(extensions); lbajardsilogic@0: if (extensions.find(ext) != extensions.end()) { lbajardsilogic@0: reader = new OggVorbisFileReader lbajardsilogic@0: (path, true, OggVorbisFileReader::CacheInTemporaryFile); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: #endif lbajardsilogic@0: #endif ivand_qmul@117: //Ivan Damnjanovic 09-10/2007 added video support ivand_qmul@117: #ifdef HAVE_FFMPEG ivand_qmul@117: if (!reader) { ivand_qmul@117: extensions.clear(); ivand_qmul@117: VideoFileReader::getSupportedExtensions(extensions); ivand_qmul@117: if (extensions.find(ext) != extensions.end()) { ivand_qmul@117: ivand_qmul@117: reader = new VideoFileReader ivand_qmul@117: (path, true, VideoFileReader::CacheInTemporaryFile); ivand_qmul@117: } ivand_qmul@117: } ivand_qmul@117: #endif ivand_qmul@117: // lbajardsilogic@0: if (reader) { lbajardsilogic@0: if (reader->isOK()) return reader; lbajardsilogic@0: if (reader->getError() != "") { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: Preferred reader for " lbajardsilogic@0: << "extension \"" << ext.toStdString() << "\" failed: \"" lbajardsilogic@0: << reader->getError().toStdString() << "\"" << std::endl; lbajardsilogic@0: } else { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: Preferred reader for " lbajardsilogic@0: << "extension \"" << ext.toStdString() << "\" failed" lbajardsilogic@0: << std::endl; lbajardsilogic@0: } lbajardsilogic@0: delete reader; lbajardsilogic@0: reader = 0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: reader = new WavFileReader(path); lbajardsilogic@0: if (reader->isOK()) return reader; lbajardsilogic@0: if (reader->getError() != "") { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: WAV file reader error: \"" lbajardsilogic@0: << reader->getError().toStdString() << "\"" << std::endl; lbajardsilogic@0: } else { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: WAV file reader failed" lbajardsilogic@0: << std::endl; lbajardsilogic@0: } lbajardsilogic@0: delete reader; lbajardsilogic@0: lbajardsilogic@0: #ifdef HAVE_OGGZ lbajardsilogic@0: #ifdef HAVE_FISHSOUND lbajardsilogic@0: reader = new OggVorbisFileReader lbajardsilogic@0: (path, true, OggVorbisFileReader::CacheInTemporaryFile); lbajardsilogic@0: if (reader->isOK()) return reader; lbajardsilogic@0: if (reader->getError() != "") { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: Ogg file reader error: \"" lbajardsilogic@0: << reader->getError().toStdString() << "\"" << std::endl; lbajardsilogic@0: } else { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: Ogg file reader failed" lbajardsilogic@0: << std::endl; lbajardsilogic@0: } lbajardsilogic@0: delete reader; lbajardsilogic@0: #endif lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: #ifdef HAVE_MAD lbajardsilogic@0: reader = new MP3FileReader lbajardsilogic@0: (path, true, MP3FileReader::CacheInTemporaryFile); lbajardsilogic@0: if (reader->isOK()) return reader; lbajardsilogic@0: if (reader->getError() != "") { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: MP3 file reader error: \"" lbajardsilogic@0: << reader->getError().toStdString() << "\"" << std::endl; lbajardsilogic@0: } else { lbajardsilogic@0: std::cerr << "AudioFileReaderFactory: MP3 file reader failed" lbajardsilogic@0: << std::endl; lbajardsilogic@0: } lbajardsilogic@0: delete reader; lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: