]> granicus.if.org Git - taglib/commitdiff
Restore FileRef::create() in order not to change the previous behavior.
authorTsuda Kageyu <tsuda.kageyu@gmail.com>
Tue, 6 Jun 2017 00:17:34 +0000 (09:17 +0900)
committerTsuda Kageyu <tsuda.kageyu@gmail.com>
Tue, 6 Jun 2017 00:17:34 +0000 (09:17 +0900)
taglib/fileref.cpp
taglib/fileref.h
tests/test_fileref.cpp

index d5df2a11beccfed035a01c62eb0d953e999e3a17..935c371bddd83f2513b035c0f096d2a84d192e91 100644 (file)
@@ -186,6 +186,78 @@ namespace
 
     return 0;
   }
+
+  // Internal function that supports FileRef::create().
+  // This looks redundant, but necessary in order not to change the previous
+  // behavior of FileRef::create().
+
+  File* createInternal(FileName fileName, bool readAudioProperties,
+                       AudioProperties::ReadStyle audioPropertiesStyle)
+  {
+    File *file = detectByResolvers(fileName, readAudioProperties, audioPropertiesStyle);
+    if(file)
+      return file;
+
+#ifdef _WIN32
+    const String s = fileName.toString();
+#else
+    const String s(fileName);
+#endif
+
+    String ext;
+    const int pos = s.rfind(".");
+    if(pos != -1)
+      ext = s.substr(pos + 1).upper();
+
+    if(ext.isEmpty())
+      return 0;
+
+    if(ext == "MP3")
+      return new MPEG::File(fileName, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle);
+    if(ext == "OGG")
+      return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "OGA") {
+      /* .oga can be any audio in the Ogg container. First try FLAC, then Vorbis. */
+      File *file = new Ogg::FLAC::File(fileName, readAudioProperties, audioPropertiesStyle);
+      if(file->isValid())
+        return file;
+      delete file;
+      return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle);
+    }
+    if(ext == "FLAC")
+      return new FLAC::File(fileName, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle);
+    if(ext == "MPC")
+      return new MPC::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "WV")
+      return new WavPack::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "SPX")
+      return new Ogg::Speex::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "OPUS")
+      return new Ogg::Opus::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "TTA")
+      return new TrueAudio::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "M4A" || ext == "M4R" || ext == "M4B" || ext == "M4P" || ext == "MP4" || ext == "3G2" || ext == "M4V")
+      return new MP4::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "WMA" || ext == "ASF")
+      return new ASF::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "AIF" || ext == "AIFF" || ext == "AFC" || ext == "AIFC")
+      return new RIFF::AIFF::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "WAV")
+      return new RIFF::WAV::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "APE")
+      return new APE::File(fileName, readAudioProperties, audioPropertiesStyle);
+    // module, nst and wow are possible but uncommon extensions
+    if(ext == "MOD" || ext == "MODULE" || ext == "NST" || ext == "WOW")
+      return new Mod::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "S3M")
+      return new S3M::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "IT")
+      return new IT::File(fileName, readAudioProperties, audioPropertiesStyle);
+    if(ext == "XM")
+      return new XM::File(fileName, readAudioProperties, audioPropertiesStyle);
+
+    return 0;
+  }
 }
 
 class FileRef::FileRefPrivate : public RefCounter
@@ -350,7 +422,7 @@ bool FileRef::operator!=(const FileRef &ref) const
 File *FileRef::create(FileName fileName, bool readAudioProperties,
                       AudioProperties::ReadStyle audioPropertiesStyle) // static
 {
-  return 0;
+  return createInternal(fileName, readAudioProperties, audioPropertiesStyle);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
index ff14924e83ee0a5eba8326278d9d84c0e4e60f7e..c36f54cbd33af8b5ebe4ea317959512111bd2732 100644 (file)
@@ -268,7 +268,7 @@ namespace TagLib {
      * \note You generally shouldn't use this method, but instead the constructor
      * directly.
      *
-     * \deprecated Always returns null.
+     * \deprecated
      */
     static File *create(FileName fileName,
                         bool readAudioProperties = true,
index ee2d48d8eecad8f81af91fcf8bcba803157b7c40..e766a891556ee8761a69b7ae5cdc363eac4428a5 100644 (file)
@@ -80,6 +80,7 @@ class TestFileRef : public CppUnit::TestFixture
   CPPUNIT_TEST(testAIFF_1);
   CPPUNIT_TEST(testAIFF_2);
   CPPUNIT_TEST(testUnsupported);
+  CPPUNIT_TEST(testCreate);
   CPPUNIT_TEST(testFileResolver);
   CPPUNIT_TEST_SUITE_END();
 
@@ -297,6 +298,19 @@ public:
     CPPUNIT_ASSERT(f2.isNull());
   }
 
+  void testCreate()
+  {
+    // This is depricated. But worth it to test.
+
+    File *f = FileRef::create(TEST_FILE_PATH_C("empty_vorbis.oga"));
+    CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File*>(f));
+    delete f;
+
+    f = FileRef::create(TEST_FILE_PATH_C("xing.mp3"));
+    CPPUNIT_ASSERT(dynamic_cast<MPEG::File*>(f));
+    delete f;
+  }
+
   void testFileResolver()
   {
     {