Chris@235: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@235: Chris@235: /* Chris@235: Sonic Visualiser Chris@235: An audio file viewer and annotation editor. Chris@235: Centre for Digital Music, Queen Mary, University of London. Chris@235: This file copyright 2006 Chris Cannam and QMUL. Chris@235: Chris@235: This program is free software; you can redistribute it and/or Chris@235: modify it under the terms of the GNU General Public License as Chris@235: published by the Free Software Foundation; either version 2 of the Chris@235: License, or (at your option) any later version. See the file Chris@235: COPYING included with this distribution for more information. Chris@235: */ Chris@235: Chris@235: #include "AudioFileReaderFactory.h" Chris@235: Chris@235: #include "WavFileReader.h" Chris@297: #include "ResamplingWavFileReader.h" Chris@235: #include "OggVorbisFileReader.h" Chris@235: #include "MP3FileReader.h" Chris@281: #include "QuickTimeFileReader.h" Chris@235: Chris@235: #include Chris@241: #include Chris@235: #include Chris@235: Chris@290: QString Chris@235: AudioFileReaderFactory::getKnownExtensions() Chris@235: { Chris@290: std::set extensions; Chris@235: Chris@235: WavFileReader::getSupportedExtensions(extensions); Chris@235: #ifdef HAVE_MAD Chris@235: MP3FileReader::getSupportedExtensions(extensions); Chris@235: #endif Chris@235: #ifdef HAVE_OGGZ Chris@235: #ifdef HAVE_FISHSOUND Chris@235: OggVorbisFileReader::getSupportedExtensions(extensions); Chris@235: #endif Chris@235: #endif Chris@281: #ifdef HAVE_QUICKTIME Chris@281: QuickTimeFileReader::getSupportedExtensions(extensions); Chris@281: #endif Chris@235: Chris@290: QString rv; Chris@290: for (std::set::const_iterator i = extensions.begin(); Chris@235: i != extensions.end(); ++i) { Chris@235: if (i != extensions.begin()) rv += " "; Chris@235: rv += "*." + *i; Chris@235: } Chris@235: Chris@235: return rv; Chris@235: } Chris@235: Chris@235: AudioFileReader * Chris@317: AudioFileReaderFactory::createReader(FileSource source, size_t targetRate) Chris@235: { Chris@327: return create(source, targetRate, false); Chris@327: } Chris@327: Chris@327: AudioFileReader * Chris@327: AudioFileReaderFactory::createThreadingReader(FileSource source, size_t targetRate) Chris@327: { Chris@327: return create(source, targetRate, true); Chris@327: } Chris@327: Chris@327: AudioFileReader * Chris@327: AudioFileReaderFactory::create(FileSource source, size_t targetRate, bool threading) Chris@327: { Chris@290: QString err; Chris@235: Chris@327: // std::cerr << "AudioFileReaderFactory::createReader(\"" << source.getLocation().toStdString() << "\"): Requested rate: " << targetRate << std::endl; Chris@316: Chris@316: if (!source.isOK() || !source.isAvailable()) { Chris@316: std::cerr << "AudioFileReaderFactory::createReader(\"" << source.getLocation().toStdString() << "\": Source unavailable" << std::endl; Chris@316: return 0; Chris@316: } Chris@297: Chris@235: AudioFileReader *reader = 0; Chris@235: Chris@316: // Try to construct a preferred reader based on the extension or Chris@316: // MIME type. Chris@241: Chris@316: if (WavFileReader::supports(source)) { Chris@241: Chris@316: reader = new WavFileReader(source); Chris@297: Chris@297: if (targetRate != 0 && Chris@297: reader->isOK() && Chris@297: reader->getSampleRate() != targetRate) { Chris@297: Chris@297: std::cerr << "AudioFileReaderFactory::createReader: WAV file rate: " << reader->getSampleRate() << ", creating resampling reader" << std::endl; Chris@297: Chris@297: delete reader; Chris@297: reader = new ResamplingWavFileReader Chris@316: (source, Chris@327: threading ? Chris@327: ResamplingWavFileReader::ResampleThreaded : Chris@327: ResamplingWavFileReader::ResampleAtOnce, Chris@297: ResamplingWavFileReader::CacheInTemporaryFile, Chris@297: targetRate); Chris@297: } Chris@241: } Chris@241: Chris@241: #ifdef HAVE_OGGZ Chris@241: #ifdef HAVE_FISHSOUND Chris@241: if (!reader) { Chris@316: if (OggVorbisFileReader::supports(source)) { Chris@241: reader = new OggVorbisFileReader Chris@316: (source, Chris@327: threading ? Chris@327: OggVorbisFileReader::DecodeThreaded : Chris@327: OggVorbisFileReader::DecodeAtOnce, Chris@297: OggVorbisFileReader::CacheInTemporaryFile, Chris@297: targetRate); Chris@241: } Chris@241: } Chris@241: #endif Chris@241: #endif Chris@241: Chris@281: #ifdef HAVE_MAD Chris@281: if (!reader) { Chris@316: if (MP3FileReader::supports(source)) { Chris@281: reader = new MP3FileReader Chris@316: (source, Chris@327: threading ? Chris@327: MP3FileReader::DecodeThreaded : Chris@327: MP3FileReader::DecodeAtOnce, Chris@297: MP3FileReader::CacheInTemporaryFile, Chris@297: targetRate); Chris@281: } Chris@281: } Chris@281: #endif Chris@281: Chris@281: #ifdef HAVE_QUICKTIME Chris@281: if (!reader) { Chris@316: if (QuickTimeFileReader::supports(source)) { Chris@281: reader = new QuickTimeFileReader Chris@316: (source, Chris@327: threading ? Chris@327: QuickTimeFileReader::DecodeThreaded : Chris@327: QuickTimeFileReader::DecodeAtOnce, Chris@297: QuickTimeFileReader::CacheInTemporaryFile, Chris@297: targetRate); Chris@281: } Chris@281: } Chris@281: #endif Chris@281: Chris@241: if (reader) { Chris@316: if (reader->isOK()) { Chris@327: // std::cerr << "AudioFileReaderFactory: Reader is OK" << std::endl; Chris@316: return reader; Chris@316: } Chris@316: std::cerr << "AudioFileReaderFactory: Preferred reader for " Chris@316: << "url \"" << source.getLocation().toStdString() Chris@316: << "\" (content type \"" Chris@316: << source.getContentType().toStdString() << "\") failed"; Chris@316: Chris@241: if (reader->getError() != "") { Chris@316: std::cerr << ": \"" << reader->getError().toStdString() << "\""; Chris@316: } Chris@316: std::cerr << std::endl; Chris@241: delete reader; Chris@241: reader = 0; Chris@241: } Chris@241: Chris@316: std::cerr << "AudioFileReaderFactory: No reader" << std::endl; Chris@308: return reader; Chris@235: } Chris@235: