AudioFileReaderFactory.cpp

Go to the documentation of this file.
00001 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
00002 
00003 /*
00004     Sonic Visualiser
00005     An audio file viewer and annotation editor.
00006     Centre for Digital Music, Queen Mary, University of London.
00007     This file copyright 2006 Chris Cannam and QMUL.
00008     
00009     This program is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU General Public License as
00011     published by the Free Software Foundation; either version 2 of the
00012     License, or (at your option) any later version.  See the file
00013     COPYING included with this distribution for more information.
00014 */
00015 
00016 #include "AudioFileReaderFactory.h"
00017 
00018 #include "WavFileReader.h"
00019 #include "ResamplingWavFileReader.h"
00020 #include "OggVorbisFileReader.h"
00021 #include "MP3FileReader.h"
00022 #include "QuickTimeFileReader.h"
00023 
00024 #include <QString>
00025 #include <QFileInfo>
00026 #include <iostream>
00027 
00028 QString
00029 AudioFileReaderFactory::getKnownExtensions()
00030 {
00031     std::set<QString> extensions;
00032 
00033     WavFileReader::getSupportedExtensions(extensions);
00034 #ifdef HAVE_MAD
00035     MP3FileReader::getSupportedExtensions(extensions);
00036 #endif
00037 #ifdef HAVE_OGGZ
00038 #ifdef HAVE_FISHSOUND
00039     OggVorbisFileReader::getSupportedExtensions(extensions);
00040 #endif
00041 #endif
00042 #ifdef HAVE_QUICKTIME
00043     QuickTimeFileReader::getSupportedExtensions(extensions);
00044 #endif
00045 
00046     QString rv;
00047     for (std::set<QString>::const_iterator i = extensions.begin();
00048          i != extensions.end(); ++i) {
00049         if (i != extensions.begin()) rv += " ";
00050         rv += "*." + *i;
00051     }
00052 
00053     return rv;
00054 }
00055 
00056 AudioFileReader *
00057 AudioFileReaderFactory::createReader(FileSource source, size_t targetRate)
00058 {
00059     return create(source, targetRate, false);
00060 }
00061 
00062 AudioFileReader *
00063 AudioFileReaderFactory::createThreadingReader(FileSource source, size_t targetRate)
00064 {
00065     return create(source, targetRate, true);
00066 }
00067 
00068 AudioFileReader *
00069 AudioFileReaderFactory::create(FileSource source, size_t targetRate, bool threading)
00070 {
00071     QString err;
00072 
00073 //    std::cerr << "AudioFileReaderFactory::createReader(\"" << source.getLocation().toStdString() << "\"): Requested rate: " << targetRate << std::endl;
00074 
00075     if (!source.isOK() || !source.isAvailable()) {
00076         std::cerr << "AudioFileReaderFactory::createReader(\"" << source.getLocation().toStdString() << "\": Source unavailable" << std::endl;
00077         return 0;
00078     }
00079 
00080     AudioFileReader *reader = 0;
00081 
00082     // Try to construct a preferred reader based on the extension or
00083     // MIME type.
00084 
00085     if (WavFileReader::supports(source)) {
00086 
00087         reader = new WavFileReader(source);
00088 
00089         if (targetRate != 0 &&
00090             reader->isOK() &&
00091             reader->getSampleRate() != targetRate) {
00092 
00093             std::cerr << "AudioFileReaderFactory::createReader: WAV file rate: " << reader->getSampleRate() << ", creating resampling reader" << std::endl;
00094 
00095             delete reader;
00096             reader = new ResamplingWavFileReader
00097                 (source,
00098                  threading ?
00099                  ResamplingWavFileReader::ResampleThreaded :
00100                  ResamplingWavFileReader::ResampleAtOnce,
00101                  ResamplingWavFileReader::CacheInTemporaryFile,
00102                  targetRate);
00103         }
00104     }
00105     
00106 #ifdef HAVE_OGGZ
00107 #ifdef HAVE_FISHSOUND
00108     if (!reader) {
00109         if (OggVorbisFileReader::supports(source)) {
00110             reader = new OggVorbisFileReader
00111                 (source,
00112                  threading ?
00113                  OggVorbisFileReader::DecodeThreaded :
00114                  OggVorbisFileReader::DecodeAtOnce,
00115                  OggVorbisFileReader::CacheInTemporaryFile,
00116                  targetRate);
00117         }
00118     }
00119 #endif
00120 #endif
00121 
00122 #ifdef HAVE_MAD
00123     if (!reader) {
00124         if (MP3FileReader::supports(source)) {
00125             reader = new MP3FileReader
00126                 (source,
00127                  threading ?
00128                  MP3FileReader::DecodeThreaded :
00129                  MP3FileReader::DecodeAtOnce,
00130                  MP3FileReader::CacheInTemporaryFile,
00131                  targetRate);
00132         }
00133     }
00134 #endif
00135 
00136 #ifdef HAVE_QUICKTIME
00137     if (!reader) {
00138         if (QuickTimeFileReader::supports(source)) {
00139             reader = new QuickTimeFileReader
00140                 (source,
00141                  threading ?
00142                  QuickTimeFileReader::DecodeThreaded : 
00143                  QuickTimeFileReader::DecodeAtOnce,
00144                  QuickTimeFileReader::CacheInTemporaryFile,
00145                  targetRate);
00146         }
00147     }
00148 #endif
00149 
00150     if (reader) {
00151         if (reader->isOK()) {
00152 //            std::cerr << "AudioFileReaderFactory: Reader is OK" << std::endl;
00153             return reader;
00154         }
00155         std::cerr << "AudioFileReaderFactory: Preferred reader for "
00156                   << "url \"" << source.getLocation().toStdString()
00157                   << "\" (content type \""
00158                   << source.getContentType().toStdString() << "\") failed";
00159 
00160         if (reader->getError() != "") {
00161             std::cerr << ": \"" << reader->getError().toStdString() << "\"";
00162         }
00163         std::cerr << std::endl;
00164         delete reader;
00165         reader = 0;
00166     }
00167 
00168     std::cerr << "AudioFileReaderFactory: No reader" << std::endl;
00169     return reader;
00170 }
00171 

Generated on Wed Feb 20 15:45:24 2008 for SonicVisualiser by  doxygen 1.5.1