From: Tsuda Kageyu Date: Tue, 6 Jun 2017 00:17:34 +0000 (+0900) Subject: Restore FileRef::create() in order not to change the previous behavior. X-Git-Tag: v1.12-beta-1~45^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2fe93c12b70f3ae5604564558144282af1e48c2;p=taglib Restore FileRef::create() in order not to change the previous behavior. --- diff --git a/taglib/fileref.cpp b/taglib/fileref.cpp index d5df2a11..935c371b 100644 --- a/taglib/fileref.cpp +++ b/taglib/fileref.cpp @@ -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); } //////////////////////////////////////////////////////////////////////////////// diff --git a/taglib/fileref.h b/taglib/fileref.h index ff14924e..c36f54cb 100644 --- a/taglib/fileref.h +++ b/taglib/fileref.h @@ -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, diff --git a/tests/test_fileref.cpp b/tests/test_fileref.cpp index ee2d48d8..e766a891 100644 --- a/tests/test_fileref.cpp +++ b/tests/test_fileref.cpp @@ -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(f)); + delete f; + + f = FileRef::create(TEST_FILE_PATH_C("xing.mp3")); + CPPUNIT_ASSERT(dynamic_cast(f)); + delete f; + } + void testFileResolver() { {