Mercurial > hg > svcore
comparison data/fileio/AudioFileReaderFactory.cpp @ 1592:f8e3dcbafb4d bqaudiostream
Implement title/maker in wav readers; extra handling of supported-ness for file types
| author | Chris Cannam | 
|---|---|
| date | Mon, 21 Jan 2019 13:16:17 +0000 | 
| parents | c8fad3c14a2b | 
| children | ce185d4dd408 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 1591:6e68bd92ee21 | 1592:f8e3dcbafb4d | 
|---|---|
| 46 if (i != extensions.begin()) rv += " "; | 46 if (i != extensions.begin()) rv += " "; | 
| 47 rv += "*." + *i; | 47 rv += "*." + *i; | 
| 48 } | 48 } | 
| 49 | 49 | 
| 50 return rv; | 50 return rv; | 
| 51 } | |
| 52 | |
| 53 bool | |
| 54 AudioFileReaderFactory::isSupported(FileSource source) | |
| 55 { | |
| 56 #ifdef HAVE_MAD | |
| 57 if (MP3FileReader::supports(source)) { | |
| 58 return true; | |
| 59 } | |
| 60 #endif | |
| 61 if (WavFileReader::supports(source)) { | |
| 62 return true; | |
| 63 } | |
| 64 if (BQAFileReader::supports(source)) { | |
| 65 return true; | |
| 66 } | |
| 67 return false; | |
| 51 } | 68 } | 
| 52 | 69 | 
| 53 AudioFileReader * | 70 AudioFileReader * | 
| 54 AudioFileReaderFactory::createReader(FileSource source, | 71 AudioFileReaderFactory::createReader(FileSource source, | 
| 55 Parameters params, | 72 Parameters params, | 
| 120 SVDEBUG << "AudioFileReaderFactory: Source not officially handled by any reader, trying again with each reader in turn" | 137 SVDEBUG << "AudioFileReaderFactory: Source not officially handled by any reader, trying again with each reader in turn" | 
| 121 << endl; | 138 << endl; | 
| 122 } | 139 } | 
| 123 | 140 | 
| 124 #ifdef HAVE_MAD | 141 #ifdef HAVE_MAD | 
| 125 if (anyReader || MP3FileReader::supports(source)) { | 142 // Having said we'll try any reader on the second pass, we | 
| 126 | 143 // actually don't want to try the mp3 reader for anything not | 
| 127 MP3FileReader::GaplessMode gapless = | 144 // identified as an mp3 - it can't identify files by header, | 
| 128 params.gaplessMode == GaplessMode::Gapless ? | 145 // it'll try to read any data and then fail with | 
| 129 MP3FileReader::GaplessMode::Gapless : | 146 // synchronisation errors - causing misleading and potentially | 
| 130 MP3FileReader::GaplessMode::Gappy; | 147 // alarming warning messages at the least | 
| 148 if (!anyReader) { | |
| 149 if (MP3FileReader::supports(source)) { | |
| 150 | |
| 151 MP3FileReader::GaplessMode gapless = | |
| 152 params.gaplessMode == GaplessMode::Gapless ? | |
| 153 MP3FileReader::GaplessMode::Gapless : | |
| 154 MP3FileReader::GaplessMode::Gappy; | |
| 131 | 155 | 
| 132 reader = new MP3FileReader | 156 reader = new MP3FileReader | 
| 133 (source, decodeMode, cacheMode, gapless, | 157 (source, decodeMode, cacheMode, gapless, | 
| 134 targetRate, normalised, reporter); | 158 targetRate, normalised, reporter); | 
| 135 | 159 | 
| 136 if (reader->isOK()) { | 160 if (reader->isOK()) { | 
| 137 SVDEBUG << "AudioFileReaderFactory: MP3 file reader is OK, returning it" << endl; | 161 SVDEBUG << "AudioFileReaderFactory: MP3 file reader is OK, returning it" << endl; | 
| 138 return reader; | 162 return reader; | 
| 139 } else { | 163 } else { | 
| 140 delete reader; | 164 delete reader; | 
| 165 } | |
| 141 } | 166 } | 
| 142 } | 167 } | 
| 143 #endif | 168 #endif | 
| 144 | |
| 145 if (anyReader || BQAFileReader::supports(source)) { | |
| 146 | |
| 147 reader = new BQAFileReader | |
| 148 (source, decodeMode, cacheMode, | |
| 149 targetRate, normalised, reporter); | |
| 150 | |
| 151 if (reader->isOK()) { | |
| 152 SVDEBUG << "AudioFileReaderFactory: BQA reader is OK, returning it" << endl; | |
| 153 return reader; | |
| 154 } else { | |
| 155 delete reader; | |
| 156 } | |
| 157 } | |
| 158 | 169 | 
| 159 if (anyReader || WavFileReader::supports(source)) { | 170 if (anyReader || WavFileReader::supports(source)) { | 
| 160 | 171 | 
| 161 reader = new WavFileReader(source); | 172 reader = new WavFileReader(source); | 
| 162 | 173 | 
| 184 return reader; | 195 return reader; | 
| 185 } else { | 196 } else { | 
| 186 delete reader; | 197 delete reader; | 
| 187 } | 198 } | 
| 188 } | 199 } | 
| 200 | |
| 201 if (anyReader || BQAFileReader::supports(source)) { | |
| 202 | |
| 203 reader = new BQAFileReader | |
| 204 (source, decodeMode, cacheMode, | |
| 205 targetRate, normalised, reporter); | |
| 206 | |
| 207 if (reader->isOK()) { | |
| 208 SVDEBUG << "AudioFileReaderFactory: BQA reader is OK, returning it" << endl; | |
| 209 return reader; | |
| 210 } else { | |
| 211 delete reader; | |
| 212 } | |
| 213 } | |
| 189 } | 214 } | 
| 190 | 215 | 
| 191 SVCERR << "AudioFileReaderFactory::Failed to create a reader for " | 216 SVCERR << "AudioFileReaderFactory::Failed to create a reader for " | 
| 192 << "url \"" << source.getLocation() | 217 << "url \"" << source.getLocation() | 
| 193 << "\" (local filename \"" << source.getLocalFilename() | 218 << "\" (local filename \"" << source.getLocalFilename() | 
