diff 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
line wrap: on
line diff
--- a/data/fileio/AudioFileReaderFactory.cpp	Mon Jan 21 11:45:51 2019 +0000
+++ b/data/fileio/AudioFileReaderFactory.cpp	Mon Jan 21 13:16:17 2019 +0000
@@ -50,6 +50,23 @@
     return rv;
 }
 
+bool
+AudioFileReaderFactory::isSupported(FileSource source)
+{
+#ifdef HAVE_MAD
+    if (MP3FileReader::supports(source)) {
+        return true;
+    }
+#endif
+    if (WavFileReader::supports(source)) {
+        return true;
+    }
+    if (BQAFileReader::supports(source)) {
+        return true;
+    }
+    return false;
+}
+
 AudioFileReader *
 AudioFileReaderFactory::createReader(FileSource source,
                                      Parameters params,
@@ -122,40 +139,34 @@
         }
 
 #ifdef HAVE_MAD
-        if (anyReader || MP3FileReader::supports(source)) {
+        // Having said we'll try any reader on the second pass, we
+        // actually don't want to try the mp3 reader for anything not
+        // identified as an mp3 - it can't identify files by header,
+        // it'll try to read any data and then fail with
+        // synchronisation errors - causing misleading and potentially
+        // alarming warning messages at the least
+        if (!anyReader) {
+            if (MP3FileReader::supports(source)) {
 
-            MP3FileReader::GaplessMode gapless =
-                params.gaplessMode == GaplessMode::Gapless ?
-                MP3FileReader::GaplessMode::Gapless :
-                MP3FileReader::GaplessMode::Gappy;
+                MP3FileReader::GaplessMode gapless =
+                    params.gaplessMode == GaplessMode::Gapless ?
+                    MP3FileReader::GaplessMode::Gapless :
+                    MP3FileReader::GaplessMode::Gappy;
             
-            reader = new MP3FileReader
-                (source, decodeMode, cacheMode, gapless,
-                 targetRate, normalised, reporter);
+                reader = new MP3FileReader
+                    (source, decodeMode, cacheMode, gapless,
+                     targetRate, normalised, reporter);
 
-            if (reader->isOK()) {
-                SVDEBUG << "AudioFileReaderFactory: MP3 file reader is OK, returning it" << endl;
-                return reader;
-            } else {
-                delete reader;
+                if (reader->isOK()) {
+                    SVDEBUG << "AudioFileReaderFactory: MP3 file reader is OK, returning it" << endl;
+                    return reader;
+                } else {
+                    delete reader;
+                }
             }
         }
 #endif
 
-        if (anyReader || BQAFileReader::supports(source)) {
-
-            reader = new BQAFileReader
-                (source, decodeMode, cacheMode, 
-                 targetRate, normalised, reporter);
-
-            if (reader->isOK()) {
-                SVDEBUG << "AudioFileReaderFactory: BQA reader is OK, returning it" << endl;
-                return reader;
-            } else {
-                delete reader;
-            }
-        }
-
         if (anyReader || WavFileReader::supports(source)) {
 
             reader = new WavFileReader(source);
@@ -186,6 +197,20 @@
                 delete reader;
             }
         }
+    
+        if (anyReader || BQAFileReader::supports(source)) {
+
+            reader = new BQAFileReader
+                (source, decodeMode, cacheMode, 
+                 targetRate, normalised, reporter);
+
+            if (reader->isOK()) {
+                SVDEBUG << "AudioFileReaderFactory: BQA reader is OK, returning it" << endl;
+                return reader;
+            } else {
+                delete reader;
+            }
+        }
     }
     
     SVCERR << "AudioFileReaderFactory::Failed to create a reader for "