From: Lukáš Lalinský Date: Sat, 24 Oct 2009 12:17:08 +0000 (+0000) Subject: Proper .oga file handling in FileRef X-Git-Tag: v1.6.1~9 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e9b41f540d79bc216ce8b258c62cfabf0e62bdd;p=taglib Proper .oga file handling in FileRef 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 --- diff --git a/taglib/fileref.cpp b/taglib/fileref.cpp index 8e4272dd..93a72407 100644 --- a/taglib/fileref.cpp +++ b/taglib/fileref.cpp @@ -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") diff --git a/tests/test_fileref.cpp b/tests/test_fileref.cpp index 6617ccd1..b0247a39 100644 --- a/tests/test_fileref.cpp +++ b/tests/test_fileref.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #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(f->file()) == NULL); + CPPUNIT_ASSERT(dynamic_cast(f->file()) != NULL); + } + + void testOGA_Vorbis() + { + FileRef *f = new FileRef("data/empty_vorbis.oga"); + CPPUNIT_ASSERT(dynamic_cast(f->file()) != NULL); + CPPUNIT_ASSERT(dynamic_cast(f->file()) == NULL); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFileRef);