]> granicus.if.org Git - taglib/commitdiff
Proper .oga file handling in FileRef
authorLukáš Lalinský <lalinsky@gmail.com>
Sat, 24 Oct 2009 12:17:08 +0000 (12:17 +0000)
committerLukáš Lalinský <lalinsky@gmail.com>
Sat, 24 Oct 2009 12:17:08 +0000 (12:17 +0000)
This fixes a problem introduced in r983337. OGA files are mostly likely going
to be Ogg::FLAC, if applications are following the Xiph recommendation. But
they can be using any Ogg codec, so we must check multiple formats (Sound Juicer
on Ubuntu used to produce .oga files for Ogg Vorbis, I believe it doesn't do that
anymore).

git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1039708 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

taglib/fileref.cpp
tests/test_fileref.cpp

index 8e4272dd685ee3137439112226c83a818857557d..93a72407aa057dfefc0fff407d5947ee3ca13afe 100644 (file)
@@ -205,12 +205,17 @@ File *FileRef::create(FileName fileName, bool readAudioProperties,
   int pos = s.rfind(".");
   if(pos != -1) {
     String ext = s.substr(pos + 1).upper();
-    if(ext == "OGG" || ext == "OGA")
-      return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle);
     if(ext == "MP3")
       return new MPEG::File(fileName, readAudioProperties, audioPropertiesStyle);
-    if(ext == "OGA")
-      return new Ogg::FLAC::File(fileName, 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;
+      return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle);
+    }
     if(ext == "FLAC")
       return new FLAC::File(fileName, readAudioProperties, audioPropertiesStyle);
     if(ext == "MPC")
index 6617ccd13e4583d123478661b6c756bdbca3ab28..b0247a3962a21e042403ea26fc0157dcc2819421 100644 (file)
@@ -3,6 +3,8 @@
 #include <stdio.h>
 #include <tag.h>
 #include <fileref.h>
+#include <oggflacfile.h>
+#include <vorbisfile.h>
 #include "utils.h"
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -22,6 +24,8 @@ class TestFileRef : public CppUnit::TestFixture
   CPPUNIT_TEST(testSpeex);
   CPPUNIT_TEST(testFLAC);
   CPPUNIT_TEST(testMP3);
+  CPPUNIT_TEST(testOGA_FLAC);
+  CPPUNIT_TEST(testOGA_Vorbis);
 #ifdef TAGLIB_WITH_MP4
   CPPUNIT_TEST(testMP4_1);
   CPPUNIT_TEST(testMP4_2);
@@ -131,6 +135,20 @@ public:
   }
 #endif
 
+  void testOGA_FLAC()
+  {
+      FileRef *f = new FileRef("data/empty_flac.oga");
+      CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f->file()) == NULL);
+      CPPUNIT_ASSERT(dynamic_cast<Ogg::FLAC::File *>(f->file()) != NULL);
+  }
+
+  void testOGA_Vorbis()
+  {
+      FileRef *f = new FileRef("data/empty_vorbis.oga");
+      CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f->file()) != NULL);
+      CPPUNIT_ASSERT(dynamic_cast<Ogg::FLAC::File *>(f->file()) == NULL);
+  }
+
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(TestFileRef);