00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
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
00083
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
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