diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c00f47bf7..8b22070b7 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -6,6 +6,8 @@ * fixed issues when searching for metadata with accented characters * fixed issue with FfmpegDecoder that was preventing .wma files (and possibly other formats) from playing properly. +* updated to taglib 1.13. vendor the library by default on unix platforms, + and use pre-compiled version on windows. (also: remove source bundle) * fixed OpenBSD compile -------------------------------------------------------------------------------- diff --git a/src/3rdparty/bin b/src/3rdparty/bin index 8b6a9f577..6b7541d98 160000 --- a/src/3rdparty/bin +++ b/src/3rdparty/bin @@ -1 +1 @@ -Subproject commit 8b6a9f577c49864fbfe3c01e6151099bd25c4c4d +Subproject commit 6b7541d98b232ea9d2a01b8da5d723eb894bb38d diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aifffile.h b/src/3rdparty/win32_include/taglib/aifffile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aifffile.h rename to src/3rdparty/win32_include/taglib/aifffile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.h b/src/3rdparty/win32_include/taglib/aiffproperties.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.h rename to src/3rdparty/win32_include/taglib/aiffproperties.h index dbb4c2146..9ebd86ca5 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.h +++ b/src/3rdparty/win32_include/taglib/aiffproperties.h @@ -50,7 +50,7 @@ namespace TagLib { * Create an instance of AIFF::Properties with the data read from the * ByteVector \a data. * - * \deprecated + * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); @@ -71,7 +71,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; @@ -117,7 +117,7 @@ namespace TagLib { * * \note This method is just an alias of bitsPerSample(). * - * \deprecated + * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefile.h b/src/3rdparty/win32_include/taglib/apefile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefile.h rename to src/3rdparty/win32_include/taglib/apefile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefooter.h b/src/3rdparty/win32_include/taglib/apefooter.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefooter.h rename to src/3rdparty/win32_include/taglib/apefooter.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeitem.h b/src/3rdparty/win32_include/taglib/apeitem.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeitem.h rename to src/3rdparty/win32_include/taglib/apeitem.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.h b/src/3rdparty/win32_include/taglib/apeproperties.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.h rename to src/3rdparty/win32_include/taglib/apeproperties.h index ebbf949bd..c279b59b7 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.h +++ b/src/3rdparty/win32_include/taglib/apeproperties.h @@ -53,7 +53,7 @@ namespace TagLib { * Create an instance of APE::Properties with the data read from the * APE::File \a file. * - * \deprecated + * \deprecated Use Properties(File *, long, ReadStyle). */ TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average); @@ -74,7 +74,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apetag.h b/src/3rdparty/win32_include/taglib/apetag.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apetag.h rename to src/3rdparty/win32_include/taglib/apetag.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfattribute.h b/src/3rdparty/win32_include/taglib/asfattribute.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfattribute.h rename to src/3rdparty/win32_include/taglib/asfattribute.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asffile.h b/src/3rdparty/win32_include/taglib/asffile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asffile.h rename to src/3rdparty/win32_include/taglib/asffile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfpicture.h b/src/3rdparty/win32_include/taglib/asfpicture.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfpicture.h rename to src/3rdparty/win32_include/taglib/asfpicture.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.h b/src/3rdparty/win32_include/taglib/asfproperties.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.h rename to src/3rdparty/win32_include/taglib/asfproperties.h index 317bf104f..5aa453f8e --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.h +++ b/src/3rdparty/win32_include/taglib/asfproperties.h @@ -86,7 +86,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.h b/src/3rdparty/win32_include/taglib/asftag.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.h rename to src/3rdparty/win32_include/taglib/asftag.h index bbd98212f..ca06868ec --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.h +++ b/src/3rdparty/win32_include/taglib/asftag.h @@ -152,7 +152,8 @@ namespace TagLib { virtual bool isEmpty() const; /*! - * \deprecated + * \deprecated Use attributeListMap() const, contains(), removeItem(), + * attribute(), setAttribute(), addAttribute(). */ AttributeListMap &attributeListMap(); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/attachedpictureframe.h b/src/3rdparty/win32_include/taglib/attachedpictureframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/attachedpictureframe.h rename to src/3rdparty/win32_include/taglib/attachedpictureframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/audioproperties.h b/src/3rdparty/win32_include/taglib/audioproperties.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/audioproperties.h rename to src/3rdparty/win32_include/taglib/audioproperties.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.h b/src/3rdparty/win32_include/taglib/chapterframe.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.h rename to src/3rdparty/win32_include/taglib/chapterframe.h index 64ee19d3d..0eaa140f2 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.h +++ b/src/3rdparty/win32_include/taglib/chapterframe.h @@ -57,7 +57,7 @@ namespace TagLib { * \a startTime, end time \a endTime, start offset \a startOffset, * end offset \a endOffset and optionally a list of embedded frames, * whose ownership will then be taken over by this Frame, in - * \a embeededFrames; + * \a embeddedFrames; * * All times are in milliseconds. */ diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/commentsframe.h b/src/3rdparty/win32_include/taglib/commentsframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/commentsframe.h rename to src/3rdparty/win32_include/taglib/commentsframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/eventtimingcodesframe.h b/src/3rdparty/win32_include/taglib/eventtimingcodesframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/eventtimingcodesframe.h rename to src/3rdparty/win32_include/taglib/eventtimingcodesframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.h b/src/3rdparty/win32_include/taglib/fileref.h old mode 100755 new mode 100644 similarity index 94% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.h rename to src/3rdparty/win32_include/taglib/fileref.h index c36f54cbd..db23bbbbd --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.h +++ b/src/3rdparty/win32_include/taglib/fileref.h @@ -108,6 +108,16 @@ namespace TagLib { audioPropertiesStyle = AudioProperties::Average) const = 0; }; + class TAGLIB_EXPORT StreamTypeResolver : public FileTypeResolver + { + TAGLIB_IGNORE_MISSING_DESTRUCTOR + public: + virtual File *createFileFromStream(IOStream *stream, + bool readAudioProperties = true, + AudioProperties::ReadStyle + audioPropertiesStyle = AudioProperties::Average) const = 0; + }; + /*! * Creates a null FileRef. */ @@ -166,8 +176,8 @@ namespace TagLib { * \warning This pointer will become invalid when this FileRef and all * copies pass out of scope. * - * \warning Do not cast it to any subclasses of \class Tag. - * Use tag returning methods of appropriate subclasses of \class File instead. + * \warning Do not cast it to any subclasses of Tag. + * Use tag returning methods of appropriate subclasses of File instead. * * \see File::tag() */ @@ -268,7 +278,7 @@ namespace TagLib { * \note You generally shouldn't use this method, but instead the constructor * directly. * - * \deprecated + * \deprecated Use FileRef(FileName, bool, AudioProperties::ReadStyle). */ static File *create(FileName fileName, bool readAudioProperties = true, diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.h b/src/3rdparty/win32_include/taglib/flacfile.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.h rename to src/3rdparty/win32_include/taglib/flacfile.h index 1b8654ebd..9346d9b41 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.h +++ b/src/3rdparty/win32_include/taglib/flacfile.h @@ -238,7 +238,7 @@ namespace TagLib { * when * * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor + * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacmetadatablock.h b/src/3rdparty/win32_include/taglib/flacmetadatablock.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacmetadatablock.h rename to src/3rdparty/win32_include/taglib/flacmetadatablock.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacpicture.h b/src/3rdparty/win32_include/taglib/flacpicture.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacpicture.h rename to src/3rdparty/win32_include/taglib/flacpicture.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.h b/src/3rdparty/win32_include/taglib/flacproperties.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.h rename to src/3rdparty/win32_include/taglib/flacproperties.h index 743e58722..17e00425f --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.h +++ b/src/3rdparty/win32_include/taglib/flacproperties.h @@ -70,7 +70,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; @@ -118,7 +118,7 @@ namespace TagLib { * * \note This method is just an alias of bitsPerSample(). * - * \deprecated + * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h b/src/3rdparty/win32_include/taglib/generalencapsulatedobjectframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h rename to src/3rdparty/win32_include/taglib/generalencapsulatedobjectframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1genres.h b/src/3rdparty/win32_include/taglib/id3v1genres.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1genres.h rename to src/3rdparty/win32_include/taglib/id3v1genres.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1tag.h b/src/3rdparty/win32_include/taglib/id3v1tag.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1tag.h rename to src/3rdparty/win32_include/taglib/id3v1tag.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.h b/src/3rdparty/win32_include/taglib/id3v2.h similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.h rename to src/3rdparty/win32_include/taglib/id3v2.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2extendedheader.h b/src/3rdparty/win32_include/taglib/id3v2extendedheader.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2extendedheader.h rename to src/3rdparty/win32_include/taglib/id3v2extendedheader.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2footer.h b/src/3rdparty/win32_include/taglib/id3v2footer.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2footer.h rename to src/3rdparty/win32_include/taglib/id3v2footer.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.h b/src/3rdparty/win32_include/taglib/id3v2frame.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.h rename to src/3rdparty/win32_include/taglib/id3v2frame.h index ac531f36c..e3a3db32f --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.h +++ b/src/3rdparty/win32_include/taglib/id3v2frame.h @@ -47,7 +47,7 @@ namespace TagLib { * split between a collection of frames (which are in turn split into fields * (Structure, 4) * (Frames). This class provides an API for - * gathering information about and modifying ID3v2 frames. Funtionallity + * gathering information about and modifying ID3v2 frames. Functionality * specific to a given frame type is handed in one of the many subclasses. */ @@ -55,6 +55,8 @@ namespace TagLib { { friend class Tag; friend class FrameFactory; + friend class TableOfContentsFrame; + friend class ChapterFrame; public: @@ -503,7 +505,7 @@ namespace TagLib { ByteVector render() const; /*! - * \deprecated + * \deprecated Use fileAlterPreservation(). */ TAGLIB_DEPRECATED bool frameAlterPreservation() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.h b/src/3rdparty/win32_include/taglib/id3v2framefactory.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.h rename to src/3rdparty/win32_include/taglib/id3v2framefactory.h index e8ff60627..706f9da50 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.h +++ b/src/3rdparty/win32_include/taglib/id3v2framefactory.h @@ -46,7 +46,7 @@ namespace TagLib { * * Reimplementing this factory is the key to adding support for frame types * not directly supported by TagLib to your application. To do so you would - * subclass this factory reimplement createFrame(). Then by setting your + * subclass this factory and reimplement createFrame(). Then by setting your * factory to be the default factory in ID3v2::Tag constructor you can * implement behavior that will allow for new ID3v2::Frame subclasses (also * provided by you) to be used. @@ -87,7 +87,7 @@ namespace TagLib { TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const; /*! - * \deprecated + * \deprecated Use createFrame(const ByteVector &, const Header *) const. */ // BIC: remove Frame *createFrame(const ByteVector &data, Header *tagHeader) const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2header.h b/src/3rdparty/win32_include/taglib/id3v2header.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2header.h rename to src/3rdparty/win32_include/taglib/id3v2header.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2synchdata.h b/src/3rdparty/win32_include/taglib/id3v2synchdata.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2synchdata.h rename to src/3rdparty/win32_include/taglib/id3v2synchdata.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.h b/src/3rdparty/win32_include/taglib/id3v2tag.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.h rename to src/3rdparty/win32_include/taglib/id3v2tag.h index 7709b8390..7b0f83675 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.h +++ b/src/3rdparty/win32_include/taglib/id3v2tag.h @@ -338,7 +338,7 @@ namespace TagLib { ByteVector render() const; /*! - * \deprecated + * \deprecated Use render(Version) const. */ TAGLIB_DEPRECATED ByteVector render(int version) const; @@ -393,7 +393,7 @@ namespace TagLib { void setTextFrame(const ByteVector &id, const String &value); /*! - * Dowgrade frames from ID3v2.4 (used internally and by default) to ID3v2.3 + * Downgrade frames from ID3v2.4 (used internally and by default) to ID3v2.3. */ void downgradeFrames(FrameList *existingFrames, FrameList *newFrames) const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/infotag.h b/src/3rdparty/win32_include/taglib/infotag.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/infotag.h rename to src/3rdparty/win32_include/taglib/infotag.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itfile.h b/src/3rdparty/win32_include/taglib/itfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/it/itfile.h rename to src/3rdparty/win32_include/taglib/itfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itproperties.h b/src/3rdparty/win32_include/taglib/itproperties.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/it/itproperties.h rename to src/3rdparty/win32_include/taglib/itproperties.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfile.h b/src/3rdparty/win32_include/taglib/modfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfile.h rename to src/3rdparty/win32_include/taglib/modfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfilebase.h b/src/3rdparty/win32_include/taglib/modfilebase.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfilebase.h rename to src/3rdparty/win32_include/taglib/modfilebase.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modproperties.h b/src/3rdparty/win32_include/taglib/modproperties.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modproperties.h rename to src/3rdparty/win32_include/taglib/modproperties.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modtag.h b/src/3rdparty/win32_include/taglib/modtag.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modtag.h rename to src/3rdparty/win32_include/taglib/modtag.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.h b/src/3rdparty/win32_include/taglib/mp4atom.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.h rename to src/3rdparty/win32_include/taglib/mp4atom.h index cbb0d10ad..5e234cce5 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.h +++ b/src/3rdparty/win32_include/taglib/mp4atom.h @@ -74,7 +74,7 @@ namespace TagLib { typedef TagLib::List AtomDataList; - class Atom + class TAGLIB_EXPORT Atom { public: Atom(File *file); @@ -88,11 +88,11 @@ namespace TagLib { AtomList children; private: static const int numContainers = 11; - static const char *containers[11]; + static const char *const containers[11]; }; //! Root-level atoms - class Atoms + class TAGLIB_EXPORT Atoms { public: Atoms(File *file); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4coverart.h b/src/3rdparty/win32_include/taglib/mp4coverart.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4coverart.h rename to src/3rdparty/win32_include/taglib/mp4coverart.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.h b/src/3rdparty/win32_include/taglib/mp4file.h old mode 100755 new mode 100644 similarity index 88% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.h rename to src/3rdparty/win32_include/taglib/mp4file.h index 8a46d17df..a8bb48804 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.h +++ b/src/3rdparty/win32_include/taglib/mp4file.h @@ -48,6 +48,19 @@ namespace TagLib { class TAGLIB_EXPORT File : public TagLib::File { public: + /*! + * This set of flags is used for strip() and is suitable for + * being OR-ed together. + */ + enum TagTypes { + //! Empty set. Matches no tag types. + NoTags = 0x0000, + //! Matches MP4 tags. + MP4 = 0x0001, + //! Matches all tag types. + AllTags = 0xffff + }; + /*! * Constructs an MP4 file from \a file. If \a readProperties is true the * file's audio properties will also be read. @@ -114,6 +127,15 @@ namespace TagLib { */ bool save(); + /*! + * This will strip the tags that match the OR-ed together TagTypes from the + * file. By default it strips all tags. It returns true if the tags are + * successfully stripped. + * + * \note This will update the file immediately. + */ + bool strip(int tags = AllTags); + /*! * Returns whether or not the file on disk actually has an MP4 tag, or the * file has a Metadata Item List (ilst) atom. diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4item.h b/src/3rdparty/win32_include/taglib/mp4item.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4item.h rename to src/3rdparty/win32_include/taglib/mp4item.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.h b/src/3rdparty/win32_include/taglib/mp4properties.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.h rename to src/3rdparty/win32_include/taglib/mp4properties.h index 492a48cce..d4a1f2639 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.h +++ b/src/3rdparty/win32_include/taglib/mp4properties.h @@ -55,7 +55,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.h b/src/3rdparty/win32_include/taglib/mp4tag.h old mode 100755 new mode 100644 similarity index 93% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.h rename to src/3rdparty/win32_include/taglib/mp4tag.h index e5b70af3d..ab70e84be --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.h +++ b/src/3rdparty/win32_include/taglib/mp4tag.h @@ -40,7 +40,7 @@ namespace TagLib { namespace MP4 { /*! - * \deprecated + * \deprecated Use ItemMap. */ TAGLIB_DEPRECATED typedef TagLib::Map ItemListMap; typedef TagLib::Map ItemMap; @@ -72,7 +72,7 @@ namespace TagLib { virtual bool isEmpty() const; /*! - * \deprecated Use the item() and setItem() API instead + * \deprecated Use the item() and setItem() API instead. */ TAGLIB_DEPRECATED ItemMap &itemListMap(); @@ -102,10 +102,22 @@ namespace TagLib { */ bool contains(const String &key) const; + /*! + * Saves the associated file with the tag stripped. + */ + bool strip(); + PropertyMap properties() const; void removeUnsupportedProperties(const StringList& properties); PropertyMap setProperties(const PropertyMap &properties); + protected: + /*! + * Sets the value of \a key to \a value, overwriting any previous value. + * If \a value is empty, the item is removed. + */ + void setTextItem(const String &key, const String &value); + private: AtomDataList parseData2(const Atom *atom, int expectedFlags = -1, bool freeForm = false); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.h b/src/3rdparty/win32_include/taglib/mpcfile.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.h rename to src/3rdparty/win32_include/taglib/mpcfile.h index eb3ec54a2..cc62262ad --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.h +++ b/src/3rdparty/win32_include/taglib/mpcfile.h @@ -195,7 +195,7 @@ namespace TagLib { void strip(int tags = AllTags); /*! - * \deprecated + * \deprecated Use strip(). * \see strip */ TAGLIB_DEPRECATED void remove(int tags = AllTags); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.h b/src/3rdparty/win32_include/taglib/mpcproperties.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.h rename to src/3rdparty/win32_include/taglib/mpcproperties.h index 9a902dc9e..b7143ee87 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.h +++ b/src/3rdparty/win32_include/taglib/mpcproperties.h @@ -72,7 +72,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.h b/src/3rdparty/win32_include/taglib/mpegfile.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.h rename to src/3rdparty/win32_include/taglib/mpegfile.h index 3fcb72722..31cf34cea --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.h +++ b/src/3rdparty/win32_include/taglib/mpegfile.h @@ -193,19 +193,19 @@ namespace TagLib { bool save(int tags); /*! - * \deprecated + * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers); /*! - * \deprecated + * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version); /*! - * \deprecated + * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags); @@ -315,7 +315,7 @@ namespace TagLib { * Set the ID3v2::FrameFactory to something other than the default. * * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor + * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.h b/src/3rdparty/win32_include/taglib/mpegheader.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.h rename to src/3rdparty/win32_include/taglib/mpegheader.h index ca51184cf..35902cf22 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.h +++ b/src/3rdparty/win32_include/taglib/mpegheader.h @@ -50,7 +50,7 @@ namespace TagLib { /*! * Parses an MPEG header based on \a data. * - * \deprecated + * \deprecated Use Header(File *, long, bool). */ TAGLIB_DEPRECATED Header(const ByteVector &data); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.h b/src/3rdparty/win32_include/taglib/mpegproperties.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.h rename to src/3rdparty/win32_include/taglib/mpegproperties.h index a1a1af4af..0b7f0c166 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.h +++ b/src/3rdparty/win32_include/taglib/mpegproperties.h @@ -65,7 +65,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggfile.h b/src/3rdparty/win32_include/taglib/oggfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggfile.h rename to src/3rdparty/win32_include/taglib/oggfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/flac/oggflacfile.h b/src/3rdparty/win32_include/taglib/oggflacfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/flac/oggflacfile.h rename to src/3rdparty/win32_include/taglib/oggflacfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpage.h b/src/3rdparty/win32_include/taglib/oggpage.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpage.h rename to src/3rdparty/win32_include/taglib/oggpage.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpageheader.h b/src/3rdparty/win32_include/taglib/oggpageheader.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpageheader.h rename to src/3rdparty/win32_include/taglib/oggpageheader.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusfile.h b/src/3rdparty/win32_include/taglib/opusfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusfile.h rename to src/3rdparty/win32_include/taglib/opusfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.h b/src/3rdparty/win32_include/taglib/opusproperties.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.h rename to src/3rdparty/win32_include/taglib/opusproperties.h index 2e44dea5c..8ec291ea5 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.h +++ b/src/3rdparty/win32_include/taglib/opusproperties.h @@ -67,7 +67,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/ownershipframe.h b/src/3rdparty/win32_include/taglib/ownershipframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/ownershipframe.h rename to src/3rdparty/win32_include/taglib/ownershipframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.h b/src/3rdparty/win32_include/taglib/podcastframe.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.h rename to src/3rdparty/win32_include/taglib/podcastframe.h index 7bbc2138b..a71278c3f --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.h +++ b/src/3rdparty/win32_include/taglib/podcastframe.h @@ -57,6 +57,8 @@ namespace TagLib { */ virtual String toString() const; + PropertyMap asProperties() const; + protected: // Reimplementations. diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/popularimeterframe.h b/src/3rdparty/win32_include/taglib/popularimeterframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/popularimeterframe.h rename to src/3rdparty/win32_include/taglib/popularimeterframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/privateframe.h b/src/3rdparty/win32_include/taglib/privateframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/privateframe.h rename to src/3rdparty/win32_include/taglib/privateframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.h b/src/3rdparty/win32_include/taglib/relativevolumeframe.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.h rename to src/3rdparty/win32_include/taglib/relativevolumeframe.h index de01254c1..55f13fcee --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.h +++ b/src/3rdparty/win32_include/taglib/relativevolumeframe.h @@ -155,7 +155,7 @@ namespace TagLib { * available and returns 0 if the specified channel does not exist. * * \see setVolumeAdjustmentIndex() - * \see volumeAjustment() + * \see volumeAdjustment() */ short volumeAdjustmentIndex(ChannelType type = MasterVolume) const; @@ -167,7 +167,7 @@ namespace TagLib { * By default this sets the value for the master volume. * * \see volumeAdjustmentIndex() - * \see setVolumeAjustment() + * \see setVolumeAdjustment() */ void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/rifffile.h b/src/3rdparty/win32_include/taglib/rifffile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/rifffile.h rename to src/3rdparty/win32_include/taglib/rifffile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mfile.h b/src/3rdparty/win32_include/taglib/s3mfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mfile.h rename to src/3rdparty/win32_include/taglib/s3mfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mproperties.h b/src/3rdparty/win32_include/taglib/s3mproperties.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mproperties.h rename to src/3rdparty/win32_include/taglib/s3mproperties.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexfile.h b/src/3rdparty/win32_include/taglib/speexfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexfile.h rename to src/3rdparty/win32_include/taglib/speexfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.h b/src/3rdparty/win32_include/taglib/speexproperties.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.h rename to src/3rdparty/win32_include/taglib/speexproperties.h index 3f5a20f30..ad1ba90f8 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.h +++ b/src/3rdparty/win32_include/taglib/speexproperties.h @@ -67,7 +67,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.h b/src/3rdparty/win32_include/taglib/synchronizedlyricsframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.h rename to src/3rdparty/win32_include/taglib/synchronizedlyricsframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/tableofcontentsframe.h b/src/3rdparty/win32_include/taglib/tableofcontentsframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/tableofcontentsframe.h rename to src/3rdparty/win32_include/taglib/tableofcontentsframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tag.h b/src/3rdparty/win32_include/taglib/tag.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/tag.h rename to src/3rdparty/win32_include/taglib/tag.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/tag_c.h b/src/3rdparty/win32_include/taglib/tag_c.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/bindings/c/tag_c.h rename to src/3rdparty/win32_include/taglib/tag_c.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/taglib.h b/src/3rdparty/win32_include/taglib/taglib.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/taglib.h rename to src/3rdparty/win32_include/taglib/taglib.h index d2dd68386..8ea0b99b7 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/taglib.h +++ b/src/3rdparty/win32_include/taglib/taglib.h @@ -26,13 +26,11 @@ #ifndef TAGLIB_H #define TAGLIB_H -#ifndef WIN32 #include "taglib_config.h" -#endif #define TAGLIB_MAJOR_VERSION 1 -#define TAGLIB_MINOR_VERSION 11 -#define TAGLIB_PATCH_VERSION 1 +#define TAGLIB_MINOR_VERSION 13 +#define TAGLIB_PATCH_VERSION 0 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__) #define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/taglib_config.h.cmake b/src/3rdparty/win32_include/taglib/taglib_config.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/taglib_config.h.cmake rename to src/3rdparty/win32_include/taglib/taglib_config.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/taglib_export.h b/src/3rdparty/win32_include/taglib/taglib_export.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/taglib_export.h rename to src/3rdparty/win32_include/taglib/taglib_export.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.h b/src/3rdparty/win32_include/taglib/tbytevector.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.h rename to src/3rdparty/win32_include/taglib/tbytevector.h index 41373c720..22cf625d1 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.h +++ b/src/3rdparty/win32_include/taglib/tbytevector.h @@ -278,7 +278,7 @@ namespace TagLib { * * \see isEmpty() * - * \deprecated + * \deprecated Use isEmpty(), do not differentiate between null and empty. */ // BIC: remove TAGLIB_DEPRECATED bool isNull() const; @@ -592,7 +592,7 @@ namespace TagLib { * \warning Do not modify this variable. It will mess up the internal state * of TagLib. * - * \deprecated + * \deprecated Use ByteVector(). */ // BIC: remove TAGLIB_DEPRECATED static ByteVector null; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorlist.h b/src/3rdparty/win32_include/taglib/tbytevectorlist.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorlist.h rename to src/3rdparty/win32_include/taglib/tbytevectorlist.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorstream.h b/src/3rdparty/win32_include/taglib/tbytevectorstream.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorstream.h rename to src/3rdparty/win32_include/taglib/tbytevectorstream.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebuglistener.h b/src/3rdparty/win32_include/taglib/tdebuglistener.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebuglistener.h rename to src/3rdparty/win32_include/taglib/tdebuglistener.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/textidentificationframe.h b/src/3rdparty/win32_include/taglib/textidentificationframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/textidentificationframe.h rename to src/3rdparty/win32_include/taglib/textidentificationframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.h b/src/3rdparty/win32_include/taglib/tfile.h old mode 100755 new mode 100644 similarity index 96% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.h rename to src/3rdparty/win32_include/taglib/tfile.h index 4243fe7a5..b9ac95ad9 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.h +++ b/src/3rdparty/win32_include/taglib/tfile.h @@ -72,11 +72,11 @@ namespace TagLib { /*! * Used to specify if when saving files, if values between different tag - * types should be syncronized. + * types should be synchronized. */ enum DuplicateTags { - Duplicate, // &erase(const Key &key); + /*! + * Returns the value associated with \a key. + * + * If the map does not contain \a key, it returns defaultValue. + * If no defaultValue is specified, it returns a default-constructed value. + */ + const T value(const Key &key, const T &defaultValue = T()) const; + /*! * Returns a reference to the value associated with \a key. * diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tmap.tcc b/src/3rdparty/win32_include/taglib/tmap.tcc old mode 100755 new mode 100644 similarity index 96% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tmap.tcc rename to src/3rdparty/win32_include/taglib/tmap.tcc index 2e4ed5ebf..18eec1107 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tmap.tcc +++ b/src/3rdparty/win32_include/taglib/tmap.tcc @@ -155,6 +155,13 @@ unsigned int Map::size() const return static_cast(d->map.size()); } +template +const T Map::value(const Key &key, const T &defaultValue) const +{ + ConstIterator it = d->map.find(key); + return it != d->map.end() ? it->second : defaultValue; +} + template const T &Map::operator[](const Key &key) const { diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.h b/src/3rdparty/win32_include/taglib/tpropertymap.h old mode 100755 new mode 100644 similarity index 90% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.h rename to src/3rdparty/win32_include/taglib/tpropertymap.h index 5933b89b2..de497869a --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.h +++ b/src/3rdparty/win32_include/taglib/tpropertymap.h @@ -29,6 +29,11 @@ #include "tmap.h" #include "tstringlist.h" +#ifdef _MSC_VER +// Explained at end of tpropertymap.cpp +extern template class TAGLIB_EXPORT TagLib::Map; +#endif + namespace TagLib { typedef Map SimplePropertyMap; @@ -68,6 +73,7 @@ namespace TagLib { * - ALBUMSORT * - ARTISTSORT * - ALBUMARTISTSORT + * - COMPOSERSORT * * Credits: * @@ -75,7 +81,7 @@ namespace TagLib { * - LYRICIST * - CONDUCTOR * - REMIXER - * - PERFORMER: + * - PERFORMER:\ * * Other tags: * @@ -90,12 +96,16 @@ namespace TagLib { * - LABEL * - CATALOGNUMBER * - BARCODE + * - RELEASECOUNTRY + * - RELEASESTATUS + * - RELEASETYPE * * MusicBrainz identifiers: * * - MUSICBRAINZ_TRACKID * - MUSICBRAINZ_ALBUMID * - MUSICBRAINZ_RELEASEGROUPID + * - MUSICBRAINZ_RELEASETRACKID * - MUSICBRAINZ_WORKID * - MUSICBRAINZ_ARTISTID * - MUSICBRAINZ_ALBUMARTISTID @@ -181,6 +191,15 @@ namespace TagLib { */ PropertyMap &merge(const PropertyMap &other); + /*! + * Returns the value associated with \a key. + * + * If the map does not contain \a key, it returns defaultValue. + * If no defaultValue is specified, it returns an empty string list. + */ + const StringList value(const String &key, + const StringList &defaultValue = StringList()) const; + /*! * Returns a reference to the value associated with \a key. * @@ -199,12 +218,12 @@ namespace TagLib { StringList &operator[](const String &key); /*! - * Returns true if and only if \other has the same contents as this map. + * Returns true if and only if \a other has the same contents as this map. */ bool operator==(const PropertyMap &other) const; /*! - * Returns false if and only \other has the same contents as this map. + * Returns false if and only \a other has the same contents as this map. */ bool operator!=(const PropertyMap &other) const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/trefcounter.h b/src/3rdparty/win32_include/taglib/trefcounter.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/trefcounter.h rename to src/3rdparty/win32_include/taglib/trefcounter.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.h b/src/3rdparty/win32_include/taglib/trueaudiofile.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.h rename to src/3rdparty/win32_include/taglib/trueaudiofile.h index 1f664d25d..0f883c86c --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.h +++ b/src/3rdparty/win32_include/taglib/trueaudiofile.h @@ -164,7 +164,7 @@ namespace TagLib { * Set the ID3v2::FrameFactory to something other than the default. * * \see ID3v2FrameFactory - * \deprecated This value should be passed in via the constructor + * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.h b/src/3rdparty/win32_include/taglib/trueaudioproperties.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.h rename to src/3rdparty/win32_include/taglib/trueaudioproperties.h index d25c7a775..bfef2bbe9 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.h +++ b/src/3rdparty/win32_include/taglib/trueaudioproperties.h @@ -67,7 +67,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.h b/src/3rdparty/win32_include/taglib/tstring.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.h rename to src/3rdparty/win32_include/taglib/tstring.h index 7028aab2f..e6bbbe7bf --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.h +++ b/src/3rdparty/win32_include/taglib/tstring.h @@ -337,7 +337,7 @@ namespace TagLib { * * \see isEmpty() * - * \deprecated + * \deprecated Use isEmpty(), do not differentiate between null and empty. */ // BIC: remove TAGLIB_DEPRECATED bool isNull() const; @@ -522,7 +522,7 @@ namespace TagLib { * \warning Do not modify this variable. It will mess up the internal state * of TagLib. * - * \deprecated + * \deprecated Use String(). */ // BIC: remove TAGLIB_DEPRECATED static String null; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.h b/src/3rdparty/win32_include/taglib/tstringlist.h old mode 100755 new mode 100644 similarity index 97% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.h rename to src/3rdparty/win32_include/taglib/tstringlist.h index 41b7f6ecd..ddf0f04d5 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.h +++ b/src/3rdparty/win32_include/taglib/tstringlist.h @@ -110,6 +110,6 @@ namespace TagLib { * \related TagLib::StringList * Send the StringList to an output stream. */ -std::ostream &operator<<(std::ostream &s, const TagLib::StringList &l); +std::ostream TAGLIB_EXPORT &operator<<(std::ostream &s, const TagLib::StringList &l); #endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h b/src/3rdparty/win32_include/taglib/uniquefileidentifierframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h rename to src/3rdparty/win32_include/taglib/uniquefileidentifierframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unknownframe.h b/src/3rdparty/win32_include/taglib/unknownframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unknownframe.h rename to src/3rdparty/win32_include/taglib/unknownframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h b/src/3rdparty/win32_include/taglib/unsynchronizedlyricsframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h rename to src/3rdparty/win32_include/taglib/unsynchronizedlyricsframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/urllinkframe.h b/src/3rdparty/win32_include/taglib/urllinkframe.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/urllinkframe.h rename to src/3rdparty/win32_include/taglib/urllinkframe.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisfile.h b/src/3rdparty/win32_include/taglib/vorbisfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisfile.h rename to src/3rdparty/win32_include/taglib/vorbisfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.h b/src/3rdparty/win32_include/taglib/vorbisproperties.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.h rename to src/3rdparty/win32_include/taglib/vorbisproperties.h index 472e0390a..b1cd5f0a5 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.h +++ b/src/3rdparty/win32_include/taglib/vorbisproperties.h @@ -73,7 +73,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.h b/src/3rdparty/win32_include/taglib/wavfile.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.h rename to src/3rdparty/win32_include/taglib/wavfile.h index bc9ce3126..02db890c8 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.h +++ b/src/3rdparty/win32_include/taglib/wavfile.h @@ -160,7 +160,7 @@ namespace TagLib { virtual bool save(); /*! - * \deprecated + * \deprecated Use save(TagTypes, StripTags, ID3v2::Version). */ TAGLIB_DEPRECATED bool save(TagTypes tags, bool stripOthers, int id3v2Version = 4); diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackfile.h b/src/3rdparty/win32_include/taglib/wavpackfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackfile.h rename to src/3rdparty/win32_include/taglib/wavpackfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.h b/src/3rdparty/win32_include/taglib/wavpackproperties.h old mode 100755 new mode 100644 similarity index 99% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.h rename to src/3rdparty/win32_include/taglib/wavpackproperties.h index e6acdcc3c..fee714d04 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.h +++ b/src/3rdparty/win32_include/taglib/wavpackproperties.h @@ -77,7 +77,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.h b/src/3rdparty/win32_include/taglib/wavproperties.h old mode 100755 new mode 100644 similarity index 96% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.h rename to src/3rdparty/win32_include/taglib/wavproperties.h index 1ca73100b..1d9401f59 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.h +++ b/src/3rdparty/win32_include/taglib/wavproperties.h @@ -53,7 +53,7 @@ namespace TagLib { * Create an instance of WAV::Properties with the data read from the * ByteVector \a data. * - * \deprecated + * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); @@ -61,7 +61,7 @@ namespace TagLib { * Create an instance of WAV::Properties with the data read from the * ByteVector \a data and the length calculated using \a streamLength. * - * \deprecated + * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, unsigned int streamLength, ReadStyle style); @@ -82,7 +82,7 @@ namespace TagLib { * * \note This method is just an alias of lengthInSeconds(). * - * \deprecated + * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; @@ -128,7 +128,7 @@ namespace TagLib { * * \note This method is just an alias of bitsPerSample(). * - * \deprecated + * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/xingheader.h b/src/3rdparty/win32_include/taglib/xingheader.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/xingheader.h rename to src/3rdparty/win32_include/taglib/xingheader.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.h b/src/3rdparty/win32_include/taglib/xiphcomment.h old mode 100755 new mode 100644 similarity index 98% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.h rename to src/3rdparty/win32_include/taglib/xiphcomment.h index 674d61697..7925fa03b --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.h +++ b/src/3rdparty/win32_include/taglib/xiphcomment.h @@ -35,6 +35,11 @@ #include "flacpicture.h" #include "taglib_export.h" +#ifdef _MSC_VER +// Explained at end of tpropertymap.cpp +extern template class TAGLIB_EXPORT TagLib::Map; +#endif + namespace TagLib { namespace Ogg { diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmfile.h b/src/3rdparty/win32_include/taglib/xmfile.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmfile.h rename to src/3rdparty/win32_include/taglib/xmfile.h diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmproperties.h b/src/3rdparty/win32_include/taglib/xmproperties.h old mode 100755 new mode 100644 similarity index 100% rename from src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmproperties.h rename to src/3rdparty/win32_include/taglib/xmproperties.h diff --git a/src/plugins/taglib_plugin/TaglibMetadataReader.cpp b/src/plugins/taglib_plugin/TaglibMetadataReader.cpp index f9f348aba..b43a9a50d 100644 --- a/src/plugins/taglib_plugin/TaglibMetadataReader.cpp +++ b/src/plugins/taglib_plugin/TaglibMetadataReader.cpp @@ -36,55 +36,29 @@ #include -#ifdef WIN32 - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#else - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -580,13 +554,13 @@ bool TaglibMetadataReader::ReadID3V2(TagLib::ID3v2::Tag *id3v2, ITagStore *track /* TRCK is the track number (or "trackNum/totalTracks") */ if (!allTags["TRCK"].isEmpty()) { - std::string trackNumber = allTags["TRCK"].front()->toString().toCString(true); + std::string trackNumber = allTags["TRCK"].front()->toString().to8Bit(true); this->SetTagValueWithPossibleTotal(trackNumber, "track", "totaltracks", track); } /* TPOS is the disc number (or "discNum/totalDiscs") */ if (!allTags["TPOS"].isEmpty()) { - std::string discNumber = allTags["TPOS"].front()->toString().toCString(true); + std::string discNumber = allTags["TPOS"].front()->toString().to8Bit(true); this->SetTagValueWithPossibleTotal(discNumber, "disc", "totaldiscs", track); } else { diff --git a/src/plugins/taglib_plugin/TaglibMetadataReader.h b/src/plugins/taglib_plugin/TaglibMetadataReader.h index c7101df22..21736674e 100644 --- a/src/plugins/taglib_plugin/TaglibMetadataReader.h +++ b/src/plugins/taglib_plugin/TaglibMetadataReader.h @@ -36,25 +36,15 @@ #include "config.h" -#ifdef WIN32 - #pragma warning(push, 0) - #include - #include - #include - #include - #include - #include - #include - #pragma warning(pop) -#else - #include - #include - #include - #include - #include - #include - #include -#endif +#pragma warning(push, 0) +#include +#include +#include +#include +#include +#include +#include +#pragma warning(pop) #include diff --git a/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/checked.h b/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/checked.h deleted file mode 100644 index 2aef5838d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/checked.h +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright 2006-2016 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - - -#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 -#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 - -#include "core.h" -#include - -namespace utf8 -{ - // Base for the exceptions that may be thrown from the library - class exception : public ::std::exception { - }; - - // Exceptions that may be thrown from the library functions. - class invalid_code_point : public exception { - uint32_t cp; - public: - invalid_code_point(uint32_t codepoint) : cp(codepoint) {} - virtual const char* what() const throw() { return "Invalid code point"; } - uint32_t code_point() const {return cp;} - }; - - class invalid_utf8 : public exception { - uint8_t u8; - public: - invalid_utf8 (uint8_t u) : u8(u) {} - virtual const char* what() const throw() { return "Invalid UTF-8"; } - uint8_t utf8_octet() const {return u8;} - }; - - class invalid_utf16 : public exception { - uint16_t u16; - public: - invalid_utf16 (uint16_t u) : u16(u) {} - virtual const char* what() const throw() { return "Invalid UTF-16"; } - uint16_t utf16_word() const {return u16;} - }; - - class not_enough_room : public exception { - public: - virtual const char* what() const throw() { return "Not enough space"; } - }; - - /// The library API - functions intended to be called by the users - - template - octet_iterator append(uint32_t cp, octet_iterator result) - { - if (!utf8::internal::is_code_point_valid(cp)) - throw invalid_code_point(cp); - - if (cp < 0x80) // one octet - *(result++) = static_cast(cp); - else if (cp < 0x800) { // two octets - *(result++) = static_cast((cp >> 6) | 0xc0); - *(result++) = static_cast((cp & 0x3f) | 0x80); - } - else if (cp < 0x10000) { // three octets - *(result++) = static_cast((cp >> 12) | 0xe0); - *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); - *(result++) = static_cast((cp & 0x3f) | 0x80); - } - else { // four octets - *(result++) = static_cast((cp >> 18) | 0xf0); - *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); - *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); - *(result++) = static_cast((cp & 0x3f) | 0x80); - } - return result; - } - - template - output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) - { - while (start != end) { - octet_iterator sequence_start = start; - internal::utf_error err_code = utf8::internal::validate_next(start, end); - switch (err_code) { - case internal::UTF8_OK : - for (octet_iterator it = sequence_start; it != start; ++it) - *out++ = *it; - break; - case internal::NOT_ENOUGH_ROOM: - throw not_enough_room(); - case internal::INVALID_LEAD: - out = utf8::append (replacement, out); - ++start; - break; - case internal::INCOMPLETE_SEQUENCE: - case internal::OVERLONG_SEQUENCE: - case internal::INVALID_CODE_POINT: - out = utf8::append (replacement, out); - ++start; - // just one replacement mark for the sequence - while (start != end && utf8::internal::is_trail(*start)) - ++start; - break; - } - } - return out; - } - - template - inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) - { - static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); - return utf8::replace_invalid(start, end, out, replacement_marker); - } - - template - uint32_t next(octet_iterator& it, octet_iterator end) - { - uint32_t cp = 0; - internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); - switch (err_code) { - case internal::UTF8_OK : - break; - case internal::NOT_ENOUGH_ROOM : - throw not_enough_room(); - case internal::INVALID_LEAD : - case internal::INCOMPLETE_SEQUENCE : - case internal::OVERLONG_SEQUENCE : - throw invalid_utf8(*it); - case internal::INVALID_CODE_POINT : - throw invalid_code_point(cp); - } - return cp; - } - - template - uint32_t peek_next(octet_iterator it, octet_iterator end) - { - return utf8::next(it, end); - } - - template - uint32_t prior(octet_iterator& it, octet_iterator start) - { - // can't do much if it == start - if (it == start) - throw not_enough_room(); - - octet_iterator end = it; - // Go back until we hit either a lead octet or start - while (utf8::internal::is_trail(*(--it))) - if (it == start) - throw invalid_utf8(*it); // error - no lead byte in the sequence - return utf8::peek_next(it, end); - } - - /// Deprecated in versions that include "prior" - template - uint32_t previous(octet_iterator& it, octet_iterator pass_start) - { - octet_iterator end = it; - while (utf8::internal::is_trail(*(--it))) - if (it == pass_start) - throw invalid_utf8(*it); // error - no lead byte in the sequence - octet_iterator temp = it; - return utf8::next(temp, end); - } - - template - void advance (octet_iterator& it, distance_type n, octet_iterator end) - { - for (distance_type i = 0; i < n; ++i) - utf8::next(it, end); - } - - template - typename std::iterator_traits::difference_type - distance (octet_iterator first, octet_iterator last) - { - typename std::iterator_traits::difference_type dist; - for (dist = 0; first < last; ++dist) - utf8::next(first, last); - return dist; - } - - template - octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) - { - while (start != end) { - uint32_t cp = utf8::internal::mask16(*start++); - // Take care of surrogate pairs first - if (utf8::internal::is_lead_surrogate(cp)) { - if (start != end) { - uint32_t trail_surrogate = utf8::internal::mask16(*start++); - if (utf8::internal::is_trail_surrogate(trail_surrogate)) - cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; - else - throw invalid_utf16(static_cast(trail_surrogate)); - } - else - throw invalid_utf16(static_cast(cp)); - - } - // Lone trail surrogate - else if (utf8::internal::is_trail_surrogate(cp)) - throw invalid_utf16(static_cast(cp)); - - result = utf8::append(cp, result); - } - return result; - } - - template - u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) - { - while (start < end) { - uint32_t cp = utf8::next(start, end); - if (cp > 0xffff) { //make a surrogate pair - *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); - *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); - } - else - *result++ = static_cast(cp); - } - return result; - } - - template - octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) - { - while (start != end) - result = utf8::append(*(start++), result); - - return result; - } - - template - u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) - { - while (start < end) - (*result++) = utf8::next(start, end); - - return result; - } - - // The iterator class - template - class iterator : public std::iterator { - octet_iterator it; - octet_iterator range_start; - octet_iterator range_end; - public: - iterator () {} - explicit iterator (const octet_iterator& octet_it, - const octet_iterator& rangestart, - const octet_iterator& rangeend) : - it(octet_it), range_start(rangestart), range_end(rangeend) - { - if (it < range_start || it > range_end) - throw std::out_of_range("Invalid utf-8 iterator position"); - } - // the default "big three" are OK - octet_iterator base () const { return it; } - uint32_t operator * () const - { - octet_iterator temp = it; - return utf8::next(temp, range_end); - } - bool operator == (const iterator& rhs) const - { - if (range_start != rhs.range_start || range_end != rhs.range_end) - throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); - return (it == rhs.it); - } - bool operator != (const iterator& rhs) const - { - return !(operator == (rhs)); - } - iterator& operator ++ () - { - utf8::next(it, range_end); - return *this; - } - iterator operator ++ (int) - { - iterator temp = *this; - utf8::next(it, range_end); - return temp; - } - iterator& operator -- () - { - utf8::prior(it, range_start); - return *this; - } - iterator operator -- (int) - { - iterator temp = *this; - utf8::prior(it, range_start); - return temp; - } - }; // class iterator - -} // namespace utf8 - -#endif //header guard - - diff --git a/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/core.h b/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/core.h deleted file mode 100644 index ae0f367db..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/3rdparty/utf8-cpp/core.h +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2006 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - - -#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 -#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 - -#include - -namespace utf8 -{ - // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers - // You may need to change them to match your system. - // These typedefs have the same names as ones from cstdint, or boost/cstdint - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - -// Helper code - not intended to be directly called by the library users. May be changed at any time -namespace internal -{ - // Unicode constants - // Leading (high) surrogates: 0xd800 - 0xdbff - // Trailing (low) surrogates: 0xdc00 - 0xdfff - const uint16_t LEAD_SURROGATE_MIN = 0xd800u; - const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; - const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; - const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; - const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); - const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; - - // Maximum valid value for a Unicode code point - const uint32_t CODE_POINT_MAX = 0x0010ffffu; - - template - inline uint8_t mask8(octet_type oc) - { - return static_cast(0xff & oc); - } - template - inline uint16_t mask16(u16_type oc) - { - return static_cast(0xffff & oc); - } - template - inline bool is_trail(octet_type oc) - { - return ((utf8::internal::mask8(oc) >> 6) == 0x2); - } - - template - inline bool is_lead_surrogate(u16 cp) - { - return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); - } - - template - inline bool is_trail_surrogate(u16 cp) - { - return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); - } - - template - inline bool is_surrogate(u16 cp) - { - return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); - } - - template - inline bool is_code_point_valid(u32 cp) - { - return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); - } - - template - inline typename std::iterator_traits::difference_type - sequence_length(octet_iterator lead_it) - { - uint8_t lead = utf8::internal::mask8(*lead_it); - if (lead < 0x80) - return 1; - else if ((lead >> 5) == 0x6) - return 2; - else if ((lead >> 4) == 0xe) - return 3; - else if ((lead >> 3) == 0x1e) - return 4; - else - return 0; - } - - template - inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) - { - if (cp < 0x80) { - if (length != 1) - return true; - } - else if (cp < 0x800) { - if (length != 2) - return true; - } - else if (cp < 0x10000) { - if (length != 3) - return true; - } - - return false; - } - - enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; - - /// Helper for get_sequence_x - template - utf_error increase_safely(octet_iterator& it, octet_iterator end) - { - if (++it == end) - return NOT_ENOUGH_ROOM; - - if (!utf8::internal::is_trail(*it)) - return INCOMPLETE_SEQUENCE; - - return UTF8_OK; - } - - #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} - - /// get_sequence_x functions decode utf-8 sequences of the length x - template - utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) - { - if (it == end) - return NOT_ENOUGH_ROOM; - - code_point = utf8::internal::mask8(*it); - - return UTF8_OK; - } - - template - utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) - { - if (it == end) - return NOT_ENOUGH_ROOM; - - code_point = utf8::internal::mask8(*it); - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); - - return UTF8_OK; - } - - template - utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) - { - if (it == end) - return NOT_ENOUGH_ROOM; - - code_point = utf8::internal::mask8(*it); - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point += (*it) & 0x3f; - - return UTF8_OK; - } - - template - utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) - { - if (it == end) - return NOT_ENOUGH_ROOM; - - code_point = utf8::internal::mask8(*it); - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; - - UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) - - code_point += (*it) & 0x3f; - - return UTF8_OK; - } - - #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR - - template - utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) - { - if (it == end) - return NOT_ENOUGH_ROOM; - - // Save the original value of it so we can go back in case of failure - // Of course, it does not make much sense with i.e. stream iterators - octet_iterator original_it = it; - - uint32_t cp = 0; - // Determine the sequence length based on the lead octet - typedef typename std::iterator_traits::difference_type octet_difference_type; - const octet_difference_type length = utf8::internal::sequence_length(it); - - // Get trail octets and calculate the code point - utf_error err = UTF8_OK; - switch (length) { - case 0: - return INVALID_LEAD; - case 1: - err = utf8::internal::get_sequence_1(it, end, cp); - break; - case 2: - err = utf8::internal::get_sequence_2(it, end, cp); - break; - case 3: - err = utf8::internal::get_sequence_3(it, end, cp); - break; - case 4: - err = utf8::internal::get_sequence_4(it, end, cp); - break; - } - - if (err == UTF8_OK) { - // Decoding succeeded. Now, security checks... - if (utf8::internal::is_code_point_valid(cp)) { - if (!utf8::internal::is_overlong_sequence(cp, length)){ - // Passed! Return here. - code_point = cp; - ++it; - return UTF8_OK; - } - else - err = OVERLONG_SEQUENCE; - } - else - err = INVALID_CODE_POINT; - } - - // Failure branch - restore the original value of the iterator - it = original_it; - return err; - } - - template - inline utf_error validate_next(octet_iterator& it, octet_iterator end) { - uint32_t ignored; - return utf8::internal::validate_next(it, end, ignored); - } - -} // namespace internal - - /// The library API - functions intended to be called by the users - - // Byte order mark - const uint8_t bom[] = {0xef, 0xbb, 0xbf}; - - template - octet_iterator find_invalid(octet_iterator start, octet_iterator end) - { - octet_iterator result = start; - while (result != end) { - utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); - if (err_code != internal::UTF8_OK) - return result; - } - return result; - } - - template - inline bool is_valid(octet_iterator start, octet_iterator end) - { - return (utf8::find_invalid(start, end) == end); - } - - template - inline bool starts_with_bom (octet_iterator it, octet_iterator end) - { - return ( - ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && - ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && - ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) - ); - } - - //Deprecated in release 2.3 - template - inline bool is_bom (octet_iterator it) - { - return ( - (utf8::internal::mask8(*it++)) == bom[0] && - (utf8::internal::mask8(*it++)) == bom[1] && - (utf8::internal::mask8(*it)) == bom[2] - ); - } -} // namespace utf8 - -#endif // header guard - - diff --git a/src/plugins/taglib_plugin/taglib-1.11/AUTHORS b/src/plugins/taglib_plugin/taglib-1.11/AUTHORS deleted file mode 100755 index 279ee2219..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/AUTHORS +++ /dev/null @@ -1,21 +0,0 @@ -Scott Wheeler - Author, maintainer -Lukas Lalinsky - Implementation of multiple new file formats, many bug fixes, maintainer -Tsuda Kageyu - A lot of bug fixes and performance improvements, maintainer. -Stephen F. Booth - DSF metadata implementation, bug fixes, maintainer. -Ismael Orenstein - Xing header implementation -Allan Sandfeld Jensen - FLAC metadata implementation -Teemu Tervo - Numerous bug reports and fixes -Mathias Panzenböck - Mod, S3M, IT and XM metadata implementations -Damien Plisson - DSDIFF metadata implementation - -Please send all patches and questions to taglib-devel@kde.org rather than to -individual developers! diff --git a/src/plugins/taglib_plugin/taglib-1.11/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/CMakeLists.txt deleted file mode 100755 index 7bcdf06b2..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/CMakeLists.txt +++ /dev/null @@ -1,168 +0,0 @@ -cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) - -project(taglib) - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") - -if(DEFINED ENABLE_STATIC) - message(FATAL_ERROR "This option is no longer available, use BUILD_SHARED_LIBS instead") -endif() - -option(BUILD_SHARED_LIBS "Build shared libraries" OFF) -if(APPLE) - option(BUILD_FRAMEWORK "Build an OS X framework" OFF) - if(BUILD_FRAMEWORK) - set(BUILD_SHARED_LIBS ON) - #set(CMAKE_MACOSX_RPATH 1) - set(FRAMEWORK_INSTALL_DIR "/Library/Frameworks" CACHE STRING "Directory to install frameworks to.") - endif() -endif() -if(NOT BUILD_SHARED_LIBS) - add_definitions(-DTAGLIB_STATIC) -endif() -option(ENABLE_STATIC_RUNTIME "Visual Studio, link with runtime statically" OFF) - -option(ENABLE_CCACHE "Use ccache when building libtag" OFF) -if(ENABLE_CCACHE) - find_program(CCACHE_FOUND ccache) - if(CCACHE_FOUND) - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) - set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) - endif() -endif() - -option(VISIBILITY_HIDDEN "Build with -fvisibility=hidden" OFF) -option(BUILD_TESTS "Build the test suite" OFF) -option(BUILD_EXAMPLES "Build the examples" OFF) -option(BUILD_BINDINGS "Build the bindings" ON) - -option(NO_ITUNES_HACKS "Disable workarounds for iTunes bugs" OFF) - -option(PLATFORM_WINRT "Enable WinRT support" OFF) -if(PLATFORM_WINRT) - add_definitions(-DPLATFORM_WINRT) -endif() - -add_definitions(-DHAVE_CONFIG_H) -set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") - -## the following are directories where stuff will be installed to -set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)") -set(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Base directory for executables and libraries") -set(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" CACHE PATH "The subdirectory to the binaries prefix (default prefix/bin)") -set(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is /lib${LIB_SUFFIX})") -set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The subdirectory to the header prefix") - -if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -endif() - -if(MSVC AND ENABLE_STATIC_RUNTIME) - foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endforeach(flag_var) -endif() - -# Read version information from file taglib/toolkit/taglib.h into variables -# TAGLIB_LIB_MAJOR_VERSION, TAGLIB_LIB_MINOR_VERSION, TAGLIB_LIB_PATCH_VERSION. -foreach(version_part MAJOR MINOR PATCH) - set(version_var_name "TAGLIB_${version_part}_VERSION") - file(STRINGS taglib/toolkit/taglib.h version_line - REGEX "^#define +${version_var_name}") - if(NOT version_line) - message(FATAL_ERROR "${version_var_name} not found in taglib.h") - endif() - string(REGEX MATCH "${version_var_name} +([^ ]+)" result ${version_line}) - set(TAGLIB_LIB_${version_part}_VERSION ${CMAKE_MATCH_1}) -endforeach(version_part) - -# Only used to force cmake rerun when taglib.h changes. -configure_file(taglib/toolkit/taglib.h ${CMAKE_CURRENT_BINARY_DIR}/taglib.h.stamp) - -if("${TAGLIB_LIB_PATCH_VERSION}" EQUAL "0") - set(TAGLIB_LIB_VERSION_STRING "${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}") -else() - set(TAGLIB_LIB_VERSION_STRING "${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION}") -endif() - -# 1. If the library source code has changed at all since the last update, then increment revision. -# 2. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0. -# 3. If any interfaces have been added since the last public release, then increment age. -# 4. If any interfaces have been removed since the last public release, then set age to 0. -set(TAGLIB_SOVERSION_CURRENT 18) -set(TAGLIB_SOVERSION_REVISION 0) -set(TAGLIB_SOVERSION_AGE 17) - -math(EXPR TAGLIB_SOVERSION_MAJOR "${TAGLIB_SOVERSION_CURRENT} - ${TAGLIB_SOVERSION_AGE}") -math(EXPR TAGLIB_SOVERSION_MINOR "${TAGLIB_SOVERSION_AGE}") -math(EXPR TAGLIB_SOVERSION_PATCH "${TAGLIB_SOVERSION_REVISION}") - -include(ConfigureChecks.cmake) - -if(${ZLIB_FOUND}) - set(ZLIB_LIBRARIES_FLAGS -lz) -endif() - -if(NOT WIN32) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" @ONLY) - install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" DESTINATION "${BIN_INSTALL_DIR}") -endif() - -if(WIN32) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmd.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd") - install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd" DESTINATION "${BIN_INSTALL_DIR}") -endif() - -if(NOT BUILD_FRAMEWORK) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" @ONLY) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" DESTINATION "${LIB_INSTALL_DIR}/pkgconfig") -endif() - -if(NOT HAVE_ZLIB AND ZLIB_SOURCE) - set(HAVE_ZLIB 1) - set(HAVE_ZLIB_SOURCE 1) -endif() - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -configure_file(config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/config.h") - -if(WITH_ASF) - set(TAGLIB_WITH_ASF TRUE) -endif() -if(WITH_MP4) - set(TAGLIB_WITH_MP4 TRUE) -endif() - -option(TRACE_IN_RELEASE "Output debug messages even in release mode" OFF) -if(TRACE_IN_RELEASE) - set(TRACE_IN_RELEASE TRUE) -endif() - -configure_file(taglib/taglib_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/taglib_config.h") - -add_subdirectory(taglib) - -if(BUILD_BINDINGS) - add_subdirectory(bindings) -endif() - -if(BUILD_TESTS AND NOT BUILD_SHARED_LIBS) - enable_testing() - add_subdirectory(tests) -endif() - -if(BUILD_EXAMPLES) - add_subdirectory(examples) -endif() - -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile") -file(COPY doc/taglib.png DESTINATION doc) -add_custom_target(docs doxygen) - -# uninstall target -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) - -if(NOT TARGET uninstall) - add_custom_target(uninstall COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") -endif() diff --git a/src/plugins/taglib_plugin/taglib-1.11/COPYING.LGPL b/src/plugins/taglib_plugin/taglib-1.11/COPYING.LGPL deleted file mode 100755 index 4362b4915..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/COPYING.LGPL +++ /dev/null @@ -1,502 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/src/plugins/taglib_plugin/taglib-1.11/COPYING.MPL b/src/plugins/taglib_plugin/taglib-1.11/COPYING.MPL deleted file mode 100755 index 7714141d1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/COPYING.MPL +++ /dev/null @@ -1,470 +0,0 @@ - MOZILLA PUBLIC LICENSE - Version 1.1 - - --------------- - -1. Definitions. - - 1.0.1. "Commercial Use" means distribution or otherwise making the - Covered Code available to a third party. - - 1.1. "Contributor" means each entity that creates or contributes to - the creation of Modifications. - - 1.2. "Contributor Version" means the combination of the Original - Code, prior Modifications used by a Contributor, and the Modifications - made by that particular Contributor. - - 1.3. "Covered Code" means the Original Code or Modifications or the - combination of the Original Code and Modifications, in each case - including portions thereof. - - 1.4. "Electronic Distribution Mechanism" means a mechanism generally - accepted in the software development community for the electronic - transfer of data. - - 1.5. "Executable" means Covered Code in any form other than Source - Code. - - 1.6. "Initial Developer" means the individual or entity identified - as the Initial Developer in the Source Code notice required by Exhibit - A. - - 1.7. "Larger Work" means a work which combines Covered Code or - portions thereof with code not governed by the terms of this License. - - 1.8. "License" means this document. - - 1.8.1. "Licensable" means having the right to grant, to the maximum - extent possible, whether at the time of the initial grant or - subsequently acquired, any and all of the rights conveyed herein. - - 1.9. "Modifications" means any addition to or deletion from the - substance or structure of either the Original Code or any previous - Modifications. When Covered Code is released as a series of files, a - Modification is: - A. Any addition to or deletion from the contents of a file - containing Original Code or previous Modifications. - - B. Any new file that contains any part of the Original Code or - previous Modifications. - - 1.10. "Original Code" means Source Code of computer software code - which is described in the Source Code notice required by Exhibit A as - Original Code, and which, at the time of its release under this - License is not already Covered Code governed by this License. - - 1.10.1. "Patent Claims" means any patent claim(s), now owned or - hereafter acquired, including without limitation, method, process, - and apparatus claims, in any patent Licensable by grantor. - - 1.11. "Source Code" means the preferred form of the Covered Code for - making modifications to it, including all modules it contains, plus - any associated interface definition files, scripts used to control - compilation and installation of an Executable, or source code - differential comparisons against either the Original Code or another - well known, available Covered Code of the Contributor's choice. The - Source Code can be in a compressed or archival form, provided the - appropriate decompression or de-archiving software is widely available - for no charge. - - 1.12. "You" (or "Your") means an individual or a legal entity - exercising rights under, and complying with all of the terms of, this - License or a future version of this License issued under Section 6.1. - For legal entities, "You" includes any entity which controls, is - controlled by, or is under common control with You. For purposes of - this definition, "control" means (a) the power, direct or indirect, - to cause the direction or management of such entity, whether by - contract or otherwise, or (b) ownership of more than fifty percent - (50%) of the outstanding shares or beneficial ownership of such - entity. - -2. Source Code License. - - 2.1. The Initial Developer Grant. - The Initial Developer hereby grants You a world-wide, royalty-free, - non-exclusive license, subject to third party intellectual property - claims: - (a) under intellectual property rights (other than patent or - trademark) Licensable by Initial Developer to use, reproduce, - modify, display, perform, sublicense and distribute the Original - Code (or portions thereof) with or without Modifications, and/or - as part of a Larger Work; and - - (b) under Patents Claims infringed by the making, using or - selling of Original Code, to make, have made, use, practice, - sell, and offer for sale, and/or otherwise dispose of the - Original Code (or portions thereof). - - (c) the licenses granted in this Section 2.1(a) and (b) are - effective on the date Initial Developer first distributes - Original Code under the terms of this License. - - (d) Notwithstanding Section 2.1(b) above, no patent license is - granted: 1) for code that You delete from the Original Code; 2) - separate from the Original Code; or 3) for infringements caused - by: i) the modification of the Original Code or ii) the - combination of the Original Code with other software or devices. - - 2.2. Contributor Grant. - Subject to third party intellectual property claims, each Contributor - hereby grants You a world-wide, royalty-free, non-exclusive license - - (a) under intellectual property rights (other than patent or - trademark) Licensable by Contributor, to use, reproduce, modify, - display, perform, sublicense and distribute the Modifications - created by such Contributor (or portions thereof) either on an - unmodified basis, with other Modifications, as Covered Code - and/or as part of a Larger Work; and - - (b) under Patent Claims infringed by the making, using, or - selling of Modifications made by that Contributor either alone - and/or in combination with its Contributor Version (or portions - of such combination), to make, use, sell, offer for sale, have - made, and/or otherwise dispose of: 1) Modifications made by that - Contributor (or portions thereof); and 2) the combination of - Modifications made by that Contributor with its Contributor - Version (or portions of such combination). - - (c) the licenses granted in Sections 2.2(a) and 2.2(b) are - effective on the date Contributor first makes Commercial Use of - the Covered Code. - - (d) Notwithstanding Section 2.2(b) above, no patent license is - granted: 1) for any code that Contributor has deleted from the - Contributor Version; 2) separate from the Contributor Version; - 3) for infringements caused by: i) third party modifications of - Contributor Version or ii) the combination of Modifications made - by that Contributor with other software (except as part of the - Contributor Version) or other devices; or 4) under Patent Claims - infringed by Covered Code in the absence of Modifications made by - that Contributor. - -3. Distribution Obligations. - - 3.1. Application of License. - The Modifications which You create or to which You contribute are - governed by the terms of this License, including without limitation - Section 2.2. The Source Code version of Covered Code may be - distributed only under the terms of this License or a future version - of this License released under Section 6.1, and You must include a - copy of this License with every copy of the Source Code You - distribute. You may not offer or impose any terms on any Source Code - version that alters or restricts the applicable version of this - License or the recipients' rights hereunder. However, You may include - an additional document offering the additional rights described in - Section 3.5. - - 3.2. Availability of Source Code. - Any Modification which You create or to which You contribute must be - made available in Source Code form under the terms of this License - either on the same media as an Executable version or via an accepted - Electronic Distribution Mechanism to anyone to whom you made an - Executable version available; and if made available via Electronic - Distribution Mechanism, must remain available for at least twelve (12) - months after the date it initially became available, or at least six - (6) months after a subsequent version of that particular Modification - has been made available to such recipients. You are responsible for - ensuring that the Source Code version remains available even if the - Electronic Distribution Mechanism is maintained by a third party. - - 3.3. Description of Modifications. - You must cause all Covered Code to which You contribute to contain a - file documenting the changes You made to create that Covered Code and - the date of any change. You must include a prominent statement that - the Modification is derived, directly or indirectly, from Original - Code provided by the Initial Developer and including the name of the - Initial Developer in (a) the Source Code, and (b) in any notice in an - Executable version or related documentation in which You describe the - origin or ownership of the Covered Code. - - 3.4. Intellectual Property Matters - (a) Third Party Claims. - If Contributor has knowledge that a license under a third party's - intellectual property rights is required to exercise the rights - granted by such Contributor under Sections 2.1 or 2.2, - Contributor must include a text file with the Source Code - distribution titled "LEGAL" which describes the claim and the - party making the claim in sufficient detail that a recipient will - know whom to contact. If Contributor obtains such knowledge after - the Modification is made available as described in Section 3.2, - Contributor shall promptly modify the LEGAL file in all copies - Contributor makes available thereafter and shall take other steps - (such as notifying appropriate mailing lists or newsgroups) - reasonably calculated to inform those who received the Covered - Code that new knowledge has been obtained. - - (b) Contributor APIs. - If Contributor's Modifications include an application programming - interface and Contributor has knowledge of patent licenses which - are reasonably necessary to implement that API, Contributor must - also include this information in the LEGAL file. - - (c) Representations. - Contributor represents that, except as disclosed pursuant to - Section 3.4(a) above, Contributor believes that Contributor's - Modifications are Contributor's original creation(s) and/or - Contributor has sufficient rights to grant the rights conveyed by - this License. - - 3.5. Required Notices. - You must duplicate the notice in Exhibit A in each file of the Source - Code. If it is not possible to put such notice in a particular Source - Code file due to its structure, then You must include such notice in a - location (such as a relevant directory) where a user would be likely - to look for such a notice. If You created one or more Modification(s) - You may add your name as a Contributor to the notice described in - Exhibit A. You must also duplicate this License in any documentation - for the Source Code where You describe recipients' rights or ownership - rights relating to Covered Code. You may choose to offer, and to - charge a fee for, warranty, support, indemnity or liability - obligations to one or more recipients of Covered Code. However, You - may do so only on Your own behalf, and not on behalf of the Initial - Developer or any Contributor. You must make it absolutely clear than - any such warranty, support, indemnity or liability obligation is - offered by You alone, and You hereby agree to indemnify the Initial - Developer and every Contributor for any liability incurred by the - Initial Developer or such Contributor as a result of warranty, - support, indemnity or liability terms You offer. - - 3.6. Distribution of Executable Versions. - You may distribute Covered Code in Executable form only if the - requirements of Section 3.1-3.5 have been met for that Covered Code, - and if You include a notice stating that the Source Code version of - the Covered Code is available under the terms of this License, - including a description of how and where You have fulfilled the - obligations of Section 3.2. The notice must be conspicuously included - in any notice in an Executable version, related documentation or - collateral in which You describe recipients' rights relating to the - Covered Code. You may distribute the Executable version of Covered - Code or ownership rights under a license of Your choice, which may - contain terms different from this License, provided that You are in - compliance with the terms of this License and that the license for the - Executable version does not attempt to limit or alter the recipient's - rights in the Source Code version from the rights set forth in this - License. If You distribute the Executable version under a different - license You must make it absolutely clear that any terms which differ - from this License are offered by You alone, not by the Initial - Developer or any Contributor. You hereby agree to indemnify the - Initial Developer and every Contributor for any liability incurred by - the Initial Developer or such Contributor as a result of any such - terms You offer. - - 3.7. Larger Works. - You may create a Larger Work by combining Covered Code with other code - not governed by the terms of this License and distribute the Larger - Work as a single product. In such a case, You must make sure the - requirements of this License are fulfilled for the Covered Code. - -4. Inability to Comply Due to Statute or Regulation. - - If it is impossible for You to comply with any of the terms of this - License with respect to some or all of the Covered Code due to - statute, judicial order, or regulation then You must: (a) comply with - the terms of this License to the maximum extent possible; and (b) - describe the limitations and the code they affect. Such description - must be included in the LEGAL file described in Section 3.4 and must - be included with all distributions of the Source Code. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Application of this License. - - This License applies to code to which the Initial Developer has - attached the notice in Exhibit A and to related Covered Code. - -6. Versions of the License. - - 6.1. New Versions. - Netscape Communications Corporation ("Netscape") may publish revised - and/or new versions of the License from time to time. Each version - will be given a distinguishing version number. - - 6.2. Effect of New Versions. - Once Covered Code has been published under a particular version of the - License, You may always continue to use it under the terms of that - version. You may also choose to use such Covered Code under the terms - of any subsequent version of the License published by Netscape. No one - other than Netscape has the right to modify the terms applicable to - Covered Code created under this License. - - 6.3. Derivative Works. - If You create or use a modified version of this License (which you may - only do in order to apply it to code which is not already Covered Code - governed by this License), You must (a) rename Your license so that - the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", - "MPL", "NPL" or any confusingly similar phrase do not appear in your - license (except to note that your license differs from this License) - and (b) otherwise make it clear that Your version of the license - contains terms which differ from the Mozilla Public License and - Netscape Public License. (Filling in the name of the Initial - Developer, Original Code or Contributor in the notice described in - Exhibit A shall not of themselves be deemed to be modifications of - this License.) - -7. DISCLAIMER OF WARRANTY. - - COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF - DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. - THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE - IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, - YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE - COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER - OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF - ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -8. TERMINATION. - - 8.1. This License and the rights granted hereunder will terminate - automatically if You fail to comply with terms herein and fail to cure - such breach within 30 days of becoming aware of the breach. All - sublicenses to the Covered Code which are properly granted shall - survive any termination of this License. Provisions which, by their - nature, must remain in effect beyond the termination of this License - shall survive. - - 8.2. If You initiate litigation by asserting a patent infringement - claim (excluding declatory judgment actions) against Initial Developer - or a Contributor (the Initial Developer or Contributor against whom - You file such action is referred to as "Participant") alleging that: - - (a) such Participant's Contributor Version directly or indirectly - infringes any patent, then any and all rights granted by such - Participant to You under Sections 2.1 and/or 2.2 of this License - shall, upon 60 days notice from Participant terminate prospectively, - unless if within 60 days after receipt of notice You either: (i) - agree in writing to pay Participant a mutually agreeable reasonable - royalty for Your past and future use of Modifications made by such - Participant, or (ii) withdraw Your litigation claim with respect to - the Contributor Version against such Participant. If within 60 days - of notice, a reasonable royalty and payment arrangement are not - mutually agreed upon in writing by the parties or the litigation claim - is not withdrawn, the rights granted by Participant to You under - Sections 2.1 and/or 2.2 automatically terminate at the expiration of - the 60 day notice period specified above. - - (b) any software, hardware, or device, other than such Participant's - Contributor Version, directly or indirectly infringes any patent, then - any rights granted to You by such Participant under Sections 2.1(b) - and 2.2(b) are revoked effective as of the date You first made, used, - sold, distributed, or had made, Modifications made by that - Participant. - - 8.3. If You assert a patent infringement claim against Participant - alleging that such Participant's Contributor Version directly or - indirectly infringes any patent where such claim is resolved (such as - by license or settlement) prior to the initiation of patent - infringement litigation, then the reasonable value of the licenses - granted by such Participant under Sections 2.1 or 2.2 shall be taken - into account in determining the amount or value of any payment or - license. - - 8.4. In the event of termination under Sections 8.1 or 8.2 above, - all end user license agreements (excluding distributors and resellers) - which have been validly granted by You or any distributor hereunder - prior to termination shall survive termination. - -9. LIMITATION OF LIABILITY. - - UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT - (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL - DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, - OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR - ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY - CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, - WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER - COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN - INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF - LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY - RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW - PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE - EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO - THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. - -10. U.S. GOVERNMENT END USERS. - - The Covered Code is a "commercial item," as that term is defined in - 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer - software" and "commercial computer software documentation," as such - terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 - C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), - all U.S. Government End Users acquire Covered Code with only those - rights set forth herein. - -11. MISCELLANEOUS. - - This License represents the complete agreement concerning subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. This License shall be governed by - California law provisions (except to the extent applicable law, if - any, provides otherwise), excluding its conflict-of-law provisions. - With respect to disputes in which at least one party is a citizen of, - or an entity chartered or registered to do business in the United - States of America, any litigation relating to this License shall be - subject to the jurisdiction of the Federal Courts of the Northern - District of California, with venue lying in Santa Clara County, - California, with the losing party responsible for costs, including - without limitation, court costs and reasonable attorneys' fees and - expenses. The application of the United Nations Convention on - Contracts for the International Sale of Goods is expressly excluded. - Any law or regulation which provides that the language of a contract - shall be construed against the drafter shall not apply to this - License. - -12. RESPONSIBILITY FOR CLAIMS. - - As between Initial Developer and the Contributors, each party is - responsible for claims and damages arising, directly or indirectly, - out of its utilization of rights under this License and You agree to - work with Initial Developer and Contributors to distribute such - responsibility on an equitable basis. Nothing herein is intended or - shall be deemed to constitute any admission of liability. - -13. MULTIPLE-LICENSED CODE. - - Initial Developer may designate portions of the Covered Code as - "Multiple-Licensed". "Multiple-Licensed" means that the Initial - Developer permits you to utilize portions of the Covered Code under - Your choice of the NPL or the alternative licenses, if any, specified - by the Initial Developer in the file described in Exhibit A. - -EXHIBIT A -Mozilla Public License. - - ``The contents of this file are subject to the Mozilla Public License - Version 1.1 (the "License"); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS IS" - basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the - License for the specific language governing rights and limitations - under the License. - - The Original Code is ______________________________________. - - The Initial Developer of the Original Code is ________________________. - Portions created by ______________________ are Copyright (C) ______ - _______________________. All Rights Reserved. - - Contributor(s): ______________________________________. - - Alternatively, the contents of this file may be used under the terms - of the _____ license (the "[___] License"), in which case the - provisions of [______] License are applicable instead of those - above. If you wish to allow use of your version of this file only - under the terms of the [____] License and not to allow others to use - your version of this file under the MPL, indicate your decision by - deleting the provisions above and replace them with the notice and - other provisions required by the [___] License. If you do not delete - the provisions above, a recipient may use your version of this file - under either the MPL or the [___] License." - - [NOTE: The text of this Exhibit A may differ slightly from the text of - the notices in the Source Code files of the Original Code. You should - use the text of this Exhibit A rather than the text found in the - Original Code Source Code for Your Modifications.] - diff --git a/src/plugins/taglib_plugin/taglib-1.11/ConfigureChecks.cmake b/src/plugins/taglib_plugin/taglib-1.11/ConfigureChecks.cmake deleted file mode 100755 index 5e5fca2fd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/ConfigureChecks.cmake +++ /dev/null @@ -1,215 +0,0 @@ -include(CheckLibraryExists) -include(CheckTypeSize) -include(CheckCXXSourceCompiles) - -# Check if the size of numeric types are suitable. - -check_type_size("short" SIZEOF_SHORT) -if(NOT ${SIZEOF_SHORT} EQUAL 2) - message(FATAL_ERROR "TagLib requires that short is 16-bit wide.") -endif() - -check_type_size("int" SIZEOF_INT) -if(NOT ${SIZEOF_INT} EQUAL 4) - message(FATAL_ERROR "TagLib requires that int is 32-bit wide.") -endif() - -check_type_size("long long" SIZEOF_LONGLONG) -if(NOT ${SIZEOF_LONGLONG} EQUAL 8) - message(FATAL_ERROR "TagLib requires that long long is 64-bit wide.") -endif() - -check_type_size("wchar_t" SIZEOF_WCHAR_T) -if(${SIZEOF_WCHAR_T} LESS 2) - message(FATAL_ERROR "TagLib requires that wchar_t is sufficient to store a UTF-16 char.") -endif() - -check_type_size("float" SIZEOF_FLOAT) -if(NOT ${SIZEOF_FLOAT} EQUAL 4) - message(FATAL_ERROR "TagLib requires that float is 32-bit wide.") -endif() - -check_type_size("double" SIZEOF_DOUBLE) -if(NOT ${SIZEOF_DOUBLE} EQUAL 8) - message(FATAL_ERROR "TagLib requires that double is 64-bit wide.") -endif() - -# Determine which kind of atomic operations your compiler supports. - -check_cxx_source_compiles(" - #include - int main() { - std::atomic_int x(1); - ++x; - --x; - return 0; - } -" HAVE_STD_ATOMIC) - -if(NOT HAVE_STD_ATOMIC) - check_cxx_source_compiles(" - int main() { - volatile int x; - __sync_add_and_fetch(&x, 1); - int y = __sync_sub_and_fetch(&x, 1); - return 0; - } - " HAVE_GCC_ATOMIC) - - if(NOT HAVE_GCC_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile int32_t x; - OSAtomicIncrement32Barrier(&x); - int32_t y = OSAtomicDecrement32Barrier(&x); - return 0; - } - " HAVE_MAC_ATOMIC) - - if(NOT HAVE_MAC_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile LONG x; - InterlockedIncrement(&x); - LONG y = InterlockedDecrement(&x); - return 0; - } - " HAVE_WIN_ATOMIC) - - if(NOT HAVE_WIN_ATOMIC) - check_cxx_source_compiles(" - #include - int main() { - volatile int x; - __sync_add_and_fetch(&x, 1); - int y = __sync_sub_and_fetch(&x, 1); - return 0; - } - " HAVE_IA64_ATOMIC) - endif() - endif() - endif() -endif() - -# Determine which kind of byte swap functions your compiler supports. - -check_cxx_source_compiles(" - int main() { - __builtin_bswap16(0); - __builtin_bswap32(0); - __builtin_bswap64(0); - return 0; - } -" HAVE_GCC_BYTESWAP) - -if(NOT HAVE_GCC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - __bswap_16(0); - __bswap_32(0); - __bswap_64(0); - return 0; - } - " HAVE_GLIBC_BYTESWAP) - - if(NOT HAVE_GLIBC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - _byteswap_ushort(0); - _byteswap_ulong(0); - _byteswap_uint64(0); - return 0; - } - " HAVE_MSC_BYTESWAP) - - if(NOT HAVE_MSC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - OSSwapInt16(0); - OSSwapInt32(0); - OSSwapInt64(0); - return 0; - } - " HAVE_MAC_BYTESWAP) - - if(NOT HAVE_MAC_BYTESWAP) - check_cxx_source_compiles(" - #include - int main() { - swap16(0); - swap32(0); - swap64(0); - return 0; - } - " HAVE_OPENBSD_BYTESWAP) - endif() - endif() - endif() -endif() - -# Determine whether your compiler supports some safer version of vsprintf. - -check_cxx_source_compiles(" - #include - #include - int main() { - char buf[20]; - va_list args; - vsnprintf(buf, 20, \"%d\", args); - return 0; - } -" HAVE_VSNPRINTF) - -if(NOT HAVE_VSNPRINTF) - check_cxx_source_compiles(" - #include - #include - int main() { - char buf[20]; - va_list args; - vsprintf_s(buf, \"%d\", args); - return 0; - } - " HAVE_VSPRINTF_S) -endif() - -# Determine whether your compiler supports ISO _strdup. - -check_cxx_source_compiles(" - #include - int main() { - _strdup(0); - return 0; - } -" HAVE_ISO_STRDUP) - -# Determine whether zlib is installed. - -if(NOT ZLIB_SOURCE) - find_package(ZLIB) - if(ZLIB_FOUND) - set(HAVE_ZLIB 1) - else() - set(HAVE_ZLIB 0) - endif() -endif() - -# Determine whether CppUnit is installed. - -if(BUILD_TESTS AND NOT BUILD_SHARED_LIBS) - find_package(CppUnit) - if(NOT CppUnit_FOUND) - message(STATUS "CppUnit not found, disabling tests.") - set(BUILD_TESTS OFF) - endif() -endif() - -# Detect WinRT mode -if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") - set(PLATFORM WINRT 1) -endif() diff --git a/src/plugins/taglib_plugin/taglib-1.11/Doxyfile.cmake b/src/plugins/taglib_plugin/taglib-1.11/Doxyfile.cmake deleted file mode 100755 index 6da30bb5d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/Doxyfile.cmake +++ /dev/null @@ -1,210 +0,0 @@ -# Doxyfile 1.3.4 - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = TagLib -PROJECT_NUMBER = ${TAGLIB_LIB_VERSION_STRING} -OUTPUT_DIRECTORY = doc -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -DISTRIBUTE_GROUP_DOC = NO -TAB_SIZE = 4 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = YES -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -GENERATE_TODOLIST = NO -GENERATE_TESTLIST = NO -GENERATE_BUGLIST = NO -GENERATE_DEPRECATEDLIST= NO -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = NO -WARN_IF_DOC_ERROR = YES -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = @CMAKE_SOURCE_DIR@/taglib -FILE_PATTERNS = *.h \ - *.hh \ - *.H -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = @CMAKE_SOURCE_DIR@/doc/api-header.html -HTML_FOOTER = @CMAKE_SOURCE_DIR@/doc/api-footer.html -HTML_STYLESHEET = @CMAKE_SOURCE_DIR@/doc/taglib-api.css -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = YES -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = letter -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = DO_NOT_DOCUMENT \ - DOXYGEN \ - WITH_MP4 \ - WITH_ASF -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = YES -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/src/plugins/taglib_plugin/taglib-1.11/INSTALL.md b/src/plugins/taglib_plugin/taglib-1.11/INSTALL.md deleted file mode 100644 index ee9a81ae6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/INSTALL.md +++ /dev/null @@ -1,175 +0,0 @@ -TagLib Installation -=================== - -TagLib uses the CMake build system. As a user, you will most likely want to -build TagLib in release mode and install it into a system-wide location. -This can be done using the following commands: - - cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release . - make - sudo make install - -In order to build the included examples, use the `BUILD_EXAMPLES` option: - - cmake -DBUILD_EXAMPLES=ON [...] - -See http://www.cmake.org/cmake/help/runningcmake.html for generic help on -running CMake. - -Mac OS X --------- - -On Mac OS X, you might want to build a framework that can be easily integrated -into your application. If you set the BUILD_FRAMEWORK option on, it will compile -TagLib as a framework. For example, the following command can be used to build -an Universal Binary framework with Mac OS X 10.4 as the deployment target: - - cmake -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_FRAMEWORK=ON \ - -DCMAKE_C_COMPILER=/usr/bin/gcc-4.0 \ - -DCMAKE_CXX_COMPILER=/usr/bin/c++-4.0 \ - -DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.4u.sdk/ \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=10.4 \ - -DCMAKE_OSX_ARCHITECTURES="ppc;i386;x86_64" - -For a 10.6 Snow Leopard static library with both 32-bit and 64-bit code, use: - - cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=10.6 \ - -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" \ - -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_INSTALL_PREFIX="" - -After `make`, and `make install`, add `libtag.` to your XCode project, and add -the include folder to the project's User Header Search Paths. - -Windows -------- - -It's Windows ... Systems vary! -This means you need to adjust things to suit your system, especially paths. - -Tested with: -* Microsoft Visual Studio 2010, 2015, 2017 -* Microsoft C++ Build Tools 2015, 2017 (standalone packages not requiring Visual Studio) -* Gcc by mingw-w64.sf.net v4.6.3 (Strawberry Perl 32b) -* MinGW32-4.8.0 - -Requirements: -* Tool chain, build environment, whatever ya want to call it ... - Installed and working. -* CMake program. (Available at: www.cmake.org) - Installed and working. - -Optional: -* Zlib library. - Available in some tool chains, not all. - Search the web, take your choice. - -Useful configuration options used with CMake (GUI and/or command line): - Any of the `ZLIB_` variables may be used at the command line, `ZLIB_ROOT` is only - available on the command line. - - | option | description | - ---------------------| ------------| - `ZLIB_ROOT=` | Where to find ZLib's root directory. Assumes parent of: `\include` and `\lib.`| - `ZLIB_INCLUDE_DIR=` | Where to find ZLib's Include directory.| - `ZLIB_LIBRARY=` | Where to find ZLib's Library. - `ZLIB_SOURCE=` | Where to find ZLib's Source Code. Alternative to `ZLIB_INCLUDE_DIR` and `ZLIB_LIBRARY`. - `CMAKE_INSTALL_PREFIX=` | Where to install Taglib. | - `CMAKE_BUILD_TYPE=` | Release, Debug, etc ... (Not available in MSVC) | - -The easiest way is at the command prompt (Visual C++ command prompt for MSVS users – batch file and/or shortcuts are your friends). - -1. **Build the Makefiles:** - - Replace "GENERATOR" with your needs. - * For MSVS: `Visual Studio XX YYYY`, e.g. `Visual Studio 14 2015`. - - **Note**: As Visual Studio 2017 supports CMake, you can skip this step and open the taglib - folder in VS instead. - * For MinGW: `MinGW Makefiles` - - C:\GitRoot\taglib> cmake -G "GENERATOR" -DCMAKE_INSTALL_PREFIX=C:\Libraries\taglib - - Or use the CMake GUI: - 1. Open CMake GUI. - 2. Set paths: *Where is the source code* and *Where to build the binaries*. - - In the example, both would be: `C:\GitRoot\taglib` - 3. Tick: Advanced - 4. Select: Configure - 5. Select: Generator - 6. Tick: Use default native compilers - 7. Select: Finish - Wait until done. - 8. If using ZLib, Scroll down. - (to the bottom of the list of options ... should go over them all) - 1. Edit: `ZLIB_INCLUDE_DIR` - 2. Edit: `ZLIB_LIBRARY` - 9. Select: Generate - -2. **Build the project** - * MSVS: - - C:\GitRoot\taglib> msbuild all_build.vcxproj /p:Configuration=Release - OR (Depending on MSVS version or personal choice) - - C:\GitRoot\taglib> devenv all_build.vcxproj /build Release - OR in the MSVS GUI: - 1. Open MSVS. - 2. Open taglib solution. - 3. Set build type to: Release (look in the tool bars) - 2. Hit F7 to build the solution. (project) - * MinGW: - - C:\GitRoot\taglib> gmake - - OR (Depending on MinGW install) - - C:\GitRoot\taglib> mingw32-make - - - -3. **Install the project** - - (Change `install` to `uninstall` to uninstall the project) - * MSVS: - - C:\GitRoot\taglib> msbuild install.vcxproj - OR (Depending on MSVC version or personal choice) - - C:\GitRoot\taglib> devenv install.vcxproj - - Or in the MSVS GUI: - 1. Open project. - 2. Open Solution Explorer. - 3. Right Click: INSTALL - 4. Select: Project Only - 5. Select: Build Only INSTALL - * MinGW: - - C:\GitRoot\taglib> gmake install - OR (Depending on MinGW install) - - C:\GitRoot\taglib> mingw32-make install - - -To build a static library, set the following two options with CMake: - - -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON - -Including `ENABLE_STATIC_RUNTIME=ON` indicates you want TagLib built using the -static runtime library, rather than the DLL form of the runtime. - -Unit Tests ----------- - -If you want to run the test suite to make sure TagLib works properly on your -system, you need to have cppunit installed. To build the tests, include -the option `-DBUILD_TESTS=on` when running cmake. - -The test suite has a custom target in the build system, so you can run -the tests using make: - - make check diff --git a/src/plugins/taglib_plugin/taglib-1.11/NEWS b/src/plugins/taglib_plugin/taglib-1.11/NEWS deleted file mode 100755 index 434cae9e9..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/NEWS +++ /dev/null @@ -1,323 +0,0 @@ -============================ - - * Added support for DSF and DSDIFF files. - * Added support for WinRT. - * Added support for classical music tags of iTunes 12.5. - * Added support for file descriptor to FileStream. - * Added support for 'cmID', 'purl', 'egid' MP4 atoms. - * Enabled FileRef to detect file types based on the stream content. - * Dropped support for Windows 9x and NT 4.0 or older. - * Check for mandatory header objects in ASF files. - * Fixed OOB read on invalid Ogg FLAC files (CVE-2018-11439). - * Fixed handling of empty MPEG files. - * Fixed reading MP4 atoms with zero length. - * Fixed reading FLAC files with zero-sized seektables. - * Fixed handling of lowercase field names in Vorbis Comments. - * Fixed handling of 'rate' atoms in MP4 files. - * Fixed handling of invalid UTF-8 sequences. - * Fixed possible file corruptions when saving Ogg files. - * TableOfContentsFrame::toString() improved. - * UserTextIdentificationFrame::toString() improved. - * Marked FileRef::create() deprecated. - * Several smaller bug fixes and performance improvements. - -TagLib 1.11.1 (Oct 24, 2016) -============================ - - * Fixed binary incompatible change in TagLib::String. - * Fixed reading ID3v2 CTOC frames with a lot of entries. - * Fixed seeking ByteVectorStream from the end. - -TagLib 1.11 (Apr 29, 2016) -========================== - -1.11: - - * Fixed reading APE items with long keys. - * Fixed reading ID3v2 SYLT frames when description is empty. - -1.11 BETA 2: - - * Better handling of PCM WAV files with a 'fact' chunk. - * Better handling of corrupted APE tags. - * Efficient decoding of unsynchronized ID3v2 frames. - * Fixed text encoding when saving certain frames in ID3v2.3 tags. - * Fixed updating the size of RIFF files when removing chunks. - * Several smaller bug fixes and performance improvements. - -1.11 BETA: - - * New API for creating FileRef from IOStream. - * Added support for ID3v2 PCST and WFED frames. - * Added support for pictures in XiphComment. - * Added String::clear(). - * Added FLAC::File::strip() for removing non-standard tags. - * Added alternative functions to XiphComment::removeField(). - * Added BUILD_BINDINGS build option. - * Added ENABLE_CCACHE build option. - * Replaced ENABLE_STATIC build option with BUILD_SHARED_LIBS. - * Better handling of duplicate ID3v2 tags in all kinds of files. - * Better handling of duplicate tag chunks in WAV files. - * Better handling of duplicate tag chunks in AIFF files. - * Better handling of duplicate Vorbis comment blocks in FLAC files. - * Better handling of broken MPEG audio frames. - * Fixed crash when calling File::properties() after strip(). - * Fixed crash when parsing certain MPEG files. - * Fixed crash when saving Ogg files. - * Fixed possible file corruptions when saving ASF files. - * Fixed possible file corruptions when saving FLAC files. - * Fixed possible file corruptions when saving MP4 files. - * Fixed possible file corruptions when saving MPEG files. - * Fixed possible file corruptions when saving APE files. - * Fixed possible file corruptions when saving Musepack files. - * Fixed possible file corruptions when saving WavPack files. - * Fixed updating the comment field of Vorbis comments. - * Fixed reading date and time in ID3v2.3 tags. - * Marked ByteVector::null and ByteVector::isNull() deprecated. - * Marked String::null and String::isNull() deprecated. - * Marked XiphComment::removeField() deprecated. - * Marked Ogg::Page::getCopyWithNewPageSequenceNumber() deprecated. It returns null. - * Marked custom integer types deprecated. - * Many smaller bug fixes and performance improvements. - -TagLib 1.10 (Nov 11, 2015) -========================== - -1.10: - - * Added new options to the tagwriter example. - * Fixed self-assignment operator in some types. - * Fixed extraction of MP4 tag keys with an empty list. - -1.10 BETA: - - * New API for the audio length in milliseconds. - * Added support for ID3v2 ETCO and SYLT frames. - * Added support for album artist in PropertyMap API of MP4 files. - * Added support for embedded frames in ID3v2 CHAP and CTOC frames. - * Added support for AIFF-C files. - * Better handling of duplicate ID3v2 tags in MPEG files. - * Allowed generating taglib.pc on Windows. - * Added ZLIB_SOURCE build option. - * Fixed backwards-incompatible change in TagLib::String when constructing UTF16 strings. - * Fixed crash when parsing certain FLAC files. - * Fixed crash when encoding empty strings. - * Fixed saving of certain XM files on OS X. - * Changed Xiph and APE generic getters to return space-concatenated values. - * Fixed possible file corruptions when removing tags from WAV files. - * Added support for MP4 files with 64-bit atoms in certain 64-bit environments. - * Prevented ID3v2 padding from being too large. - * Fixed crash when parsing corrupted APE files. - * Fixed crash when parsing corrupted WAV files. - * Fixed crash when parsing corrupted Ogg FLAC files. - * Fixed crash when parsing corrupted MPEG files. - * Fixed saving empty tags in WAV files. - * Fixed crash when parsing corrupted Musepack files. - * Fixed possible memory leaks when parsing AIFF and WAV files. - * Fixed crash when parsing corrupted MP4 files. - * Stopped writing empty ID3v2 frames. - * Fixed possible file corruptions when saving WMA files. - * Added TagLib::MP4::Tag::isEmpty(). - * Added accessors to manipulate MP4 tags. - * Fixed crash when parsing corrupted WavPack files. - * Fixed seeking MPEG frames. - * Fixed reading FLAC files with zero-sized padding blocks. - * Added support for reading the encoder information of WMA files. - * Added support for reading the codec of WAV files. - * Added support for multi channel WavPack files. - * Added support for reading the nominal bitrate of Ogg Speex files. - * Added support for VBR headers in MPEG files. - * Marked FLAC::File::streamInfoData() deprecated. It returns an empty ByteVector. - * Marked FLAC::File::streamLength() deprecated. It returns zero. - * Fixed possible file corruptions when adding an ID3v1 tag to FLAC files. - * Many smaller bug fixes and performance improvements. - -TagLib 1.9.1 (Oct 8, 2013) -========================== - - * Fixed binary incompatible change in TagLib::Map and TagLib::List. - * Fixed constructing String from ByteVector. - * Fixed compilation on MSVC with the /Zc:wchar_t- option. - * Fixed detecting of RIFF files with invalid chunk sizes. - * Added TagLib::MP4::Properties::codec(). - -TagLib 1.9 (Oct 6, 2013) -======================== - - * Added support for the Ogg Opus file format. - * Added support for INFO tags in WAV files. - * Changed FileStream to use Windows file API. - * Included taglib-config.cmd script for Windows. - * New ID3v1::Tag methods for working directly with genre numbers. - * New MPEG::File methods for checking which tags are saved in the file. - * Added support for the PropertyMap API to ASF and MP4 files. - * Added MusicBrainz identifiers to the PropertyMap API. - * Allowed reading of MP4 cover art without an explicitly specified format. - * Better parsing of corrupted FLAC files. - * Fixed saving of PropertyMap comments without description into ID3v2 tags. - * Fixed crash when parsing certain XM files. - * Fixed compilation of unit test with clang. - * Better handling of files that can't be open or have read-only permissions. - * Improved atomic reference counting. - * New hookable API for debug messages. - * More complete Windows install instructions. - * Many smaller bug fixes and performance improvements. - -TagLib 1.8 (Sep 6, 2012) -======================== - -1.8: - - * Added support for OWNE ID3 frames. - * Changed key validation in the new PropertyMap API. - * ID3v1::Tag::setStringHandler will no londer delete the previous handler, - the caller is responsible for this. - * File objects will also no longer delete the passed IOStream objects. It - should be done in the caller code after the File object is no longer - used. - * Added ID3v2::Tag::setLatin1StringHandler for custom handling of - latin1-encoded text in ID3v2 frames. - * Fixed validation of ID3v2 frame IDs (IDs with '0' were ignored). - -1.8 BETA: - - * New API for accessing tags by name. - * New abstract I/O stream layer to allow custom I/O handlers. - * Support for writing ID3v2.3 tags. - * Support for various module file formats (MOD, S3M, IT, XM). - * Support for MP4 and ASF is now enabled by default. - * Started using atomic int operations for reference counting. - * Added methods for checking if WMA and MP4 files are DRM-protected. - * Added taglib_free to the C bindings. - * New method to allow removing pictures from FLAC files. - * Support for reading audio properties from ALAC and Musepack SV8 files. - * Added replay-gain information to Musepack audio properties. - * Support for APEv2 binary tags. - * Many AudioProperties subclasses now provide information about the total number of samples. - * Various small bug fixes. - -TagLib 1.7.2 (Apr 20, 2012) -=========================== - - * Fixed division by zero while parsing corrupted MP4 files (CVE-2012-2396). - * Fixed compilation on Haiku. - -TagLib 1.7.1 (Mar 17, 2012) -=========================== - - * Improved parsing of corrupted WMA, RIFF and OGG files. - * Fixed a memory leak in the WMA parser. - * Fixed a memory leak in the FLAC parser. - * Fixed a possible division by zero in the APE parser. - * Added detection of TTA2 files. - * Fixed saving of multiple identically named tags to Vorbis Comments. - -TagLib 1.7 (Mar 11, 2011) -========================= - -1.7: - - * Fixed memory leaks in the FLAC file format parser. - * Fixed bitrate calculation for WAV files. - -1.7 RC1: - - * Support for reading/writing tags from Monkey's Audio files. (BUG:210404) - * Support for reading/writing embedded pictures from WMA files. - * Support for reading/writing embedded pictures from FLAC files (BUG:218696). - * Implemented APE::Tag::isEmpty() to check for all APE tags, not just the - basic ones. - * Added reading of WAV audio length. (BUG:116033) - * Exposed FLAC MD5 signature of the uncompressed audio stream via - FLAC::Properties::signature(). (BUG:160172) - * Added function ByteVector::toHex() for hex-encoding of byte vectors. - * WavPack reader now tries to get the audio length by finding the final - block, if the header doesn't have the information. (BUG:258016) - * Fixed a memory leak in the ID3v2.2 PIC frame parser. (BUG:257007) - * Fixed writing of RIFF files with even chunk sizes. (BUG:243954) - * Fixed compilation on MSVC 2010. - * Removed support for building using autoconf/automake. - * API docs can be now built using "make docs". - -TagLib 1.6.3 (Apr 17, 2010) -=========================== - - * Fixed definitions of the TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF macros. - * Fixed upgrading of ID3v2.3 genre frame with ID3v1 code 0 (Blues). - * New method `int String::toInt(bool *ok)` which can return whether the - conversion to a number was successful. - * Fixed parsing of incorrectly written lengths in ID3v2 (affects mainly - compressed frames). (BUG:231075) - -TagLib 1.6.2 (Apr 9, 2010) -========================== - - * Read Vorbis Comments from the first FLAC metadata block, if there are - multiple ones. (BUG:211089) - * Fixed a memory leak in FileRef's OGA format detection. - * Fixed compilation with the Sun Studio compiler. (BUG:215225) - * Handle WM/TrackNumber attributes with DWORD content in WMA files. - (BUG:218526) - * More strict check if something is a valid MP4 file. (BUG:216819) - * Correctly save MP4 int-pair atoms with flags set to 0. - * Fixed compilation of the test runner on Windows. - * Store ASF attributes larger than 64k in the metadata library object. - * Ignore trailing non-data atoms when parsing MP4 covr atoms. - * Don't upgrade ID3v2.2 frame TDA to TDRC. (BUG:228968) - -TagLib 1.6.1 (Oct 31, 2009) -=========================== - - * Better detection of the audio codec of .oga files in FileRef. - * Fixed saving of Vorbis comments to Ogg FLAC files. TagLib tried to - include the Vorbis framing bit, which is only correct for Ogg Vorbis. - * Public symbols now have explicitly set visibility to "default" on GCC. - * Added missing exports for static ID3v1 functions. - * Fixed a typo in taglib_c.pc - * Fixed a failing test on ppc64. - * Support for binary 'covr' atom in MP4 files. TagLib 1.6 treated them - as text atoms, which corrupted them in some cases. - * Fixed ID3v1-style genre to string conversion in MP4 files. - -TagLib 1.6 (Sep 13, 2009) -========================= - -1.6: - - * New CMake option to build a static version - ENABLE_STATIC. - * Added support for disabling dllimport/dllexport on Windows using the - TAGLIB_STATIC macro. - * Support for parsing the obsolete 'gnre' MP4 atom. - * New cpp macros TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF to determine if - TagLib was built with MP4/ASF support. - -1.6 RC1: - - * Split Ogg packets larger than 64k into multiple pages. (BUG:171957) - * TagLib can now use FLAC padding block. (BUG:107659) - * ID3v2.2 frames are now not incorrectly saved. (BUG:176373) - * Support for ID3v2.2 PIC frames. (BUG:167786) - * Fixed a bug in ByteVectorList::split(). - * XiphComment::year() now falls back to YEAR if DATE doesn't exist - and XiphComment::year() falls back to TRACKNUM if TRACKNUMBER doesn't - exist. (BUG:144396) - * Improved ID3v2.3 genre parsing. (BUG:188578) - * Better checking of corrupted ID3v2 APIC data. (BUG:168382) - * Bitrate calculating using the Xing header now uses floating point - numbers. (BUG:172556) - * New TagLib::String method rfind(). - * Added support for MP4 file format with iTunes-style metadata [optional]. - * Added support for ASF (WMA) file format [optional]. - * Fixed crash when saving a Locator APEv2 tag. (BUG:169810) - * Fixed a possible crash in the non-const version of String::operator[] - and in String::operator+=. (BUG:169389) - * Added support for PRIV ID3v2 frames. - * Empty ID3v2 genres are no longer treated as numeric ID3v1 genres. - * Added support for the POPM (rating/playcount) ID3v2 frame. - * Generic RIFF file format support: - * Support for AIFF files with ID3v2 tags. - * Support for WAV files with ID3v2 tags. - * Fixed crash on handling unsupported ID3v2 frames, e.g. on encrypted - frames. (BUG:161721) - * Fixed overflow while calculating bitrate of FLAC files with a very - high bitrate. diff --git a/src/plugins/taglib_plugin/taglib-1.11/README.md b/src/plugins/taglib_plugin/taglib-1.11/README.md deleted file mode 100644 index 5f087995d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# TagLib - -[![Build Status](https://travis-ci.org/taglib/taglib.svg?branch=master)](https://travis-ci.org/taglib/taglib) - -### TagLib Audio Metadata Library - -http://taglib.org/ - -TagLib is a library for reading and editing the metadata of several -popular audio formats. Currently it supports both ID3v1 and [ID3v2][] -for MP3 files, [Ogg Vorbis][] comments and ID3 tags -in [FLAC][], MPC, Speex, WavPack, TrueAudio, WAV, AIFF, MP4, APE, -DSF, DFF, and ASF files. - -TagLib is distributed under the [GNU Lesser General Public License][] -(LGPL) and [Mozilla Public License][] (MPL). Essentially that means that -it may be used in proprietary applications, but if changes are made to -TagLib they must be contributed back to the project. Please review the -licenses if you are considering using TagLib in your project. - - [ID3v2]: http://www.id3.org - [Ogg Vorbis]: http://vorbis.com/ - [FLAC]: https://xiph.org/flac/ - [GNU Lesser General Public License]: http://www.gnu.org/licenses/lgpl.html - [Mozilla Public License]: http://www.mozilla.org/MPL/MPL-1.1.html - diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/bindings/CMakeLists.txt deleted file mode 100755 index d019843ec..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/bindings/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(c) diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/README b/src/plugins/taglib_plugin/taglib-1.11/bindings/README deleted file mode 100755 index bfbd44ae0..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/bindings/README +++ /dev/null @@ -1,6 +0,0 @@ -There are a few other people that have done bindings externally that I have -been made aware of. I have not personally reviewed these bindings, but I'm -listing them here so that those who find them useful are able to find them: - -http://developer.kde.org/~wheeler/taglib.html#bindings - diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/bindings/c/CMakeLists.txt deleted file mode 100755 index ebb1267f1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/CMakeLists.txt +++ /dev/null @@ -1,75 +0,0 @@ -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/asf - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/trueaudio -) - -set(tag_c_HDRS tag_c.h) - -add_library(tag_c tag_c.cpp ${tag_c_HDRS}) - -target_link_libraries(tag_c tag) -set_target_properties(tag_c PROPERTIES - PUBLIC_HEADER "${tag_c_HDRS}" - DEFINE_SYMBOL MAKE_TAGLIB_LIB -) -if(VISIBILITY_HIDDEN) - set_target_properties(tag_c PROPERTIES C_VISIBILITY_PRESET hidden - ) -endif() -if(BUILD_FRAMEWORK) - set_target_properties(tag_c PROPERTIES FRAMEWORK TRUE) -endif() - -# On Solaris we need to explicitly add the C++ standard and runtime -# libraries to the libs used by the C bindings, because those C bindings -# themselves won't pull in the C++ libs -- and if a C application is -# using the C bindings then we get link errors. -check_library_exists(Crun __RTTI___ "" HAVE_CRUN_LIB) -if(HAVE_CRUN_LIB) - # Which libraries to link depends critically on which - # STL version is going to be used by your application - # and which runtime is in use. While Crun is pretty much - # the only game in town, the three available STLs -- Cstd, - # stlport4 and stdcxx -- make this a mess. The KDE-Solaris - # team supports stdcxx (Apache RogueWave stdcxx 4.1.3). - - # According to http://bugs.kde.org/show_bug.cgi?id=215225 the library can have the following two names: - find_library(ROGUEWAVE_STDCXX_LIBRARY NAMES stdcxx4 stdcxx) - if(NOT ROGUEWAVE_STDCXX_LIBRARY) - message(FATAL_ERROR "Did not find supported STL library (tried stdcxx4 and stdcxx)") - endif() - target_link_libraries(tag_c ${ROGUEWAVE_STDCXX_LIBRARY} Crun) -endif() - -set_target_properties(tag_c PROPERTIES - VERSION 0.0.0 - SOVERSION 0 - DEFINE_SYMBOL MAKE_TAGLIB_C_LIB - INSTALL_NAME_DIR ${LIB_INSTALL_DIR} -) -install(TARGETS tag_c - FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} - RUNTIME DESTINATION ${BIN_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} - PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib -) - -if(NOT BUILD_FRAMEWORK) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib_c.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -endif() - diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/tag_c.cpp b/src/plugins/taglib_plugin/taglib-1.11/bindings/c/tag_c.cpp deleted file mode 100755 index 04c549566..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/tag_c.cpp +++ /dev/null @@ -1,315 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * - * USA * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tag_c.h" - -using namespace TagLib; - -namespace -{ - List strings; - bool unicodeStrings = true; - bool stringManagementEnabled = true; - - char *stringToCharArray(const String &s) - { - const std::string str = s.to8Bit(unicodeStrings); - -#ifdef HAVE_ISO_STRDUP - - return ::_strdup(str.c_str()); - -#else - - return ::strdup(str.c_str()); - -#endif - } - - String charArrayToString(const char *s) - { - return String(s, unicodeStrings ? String::UTF8 : String::Latin1); - } -} - -void taglib_set_strings_unicode(BOOL unicode) -{ - unicodeStrings = (unicode != 0); -} - -void taglib_set_string_management_enabled(BOOL management) -{ - stringManagementEnabled = (management != 0); -} - -void taglib_free(void* pointer) -{ - free(pointer); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::File wrapper -//////////////////////////////////////////////////////////////////////////////// - -TagLib_File *taglib_file_new(const char *filename) -{ - return reinterpret_cast(FileRef::create(filename)); -} - -TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type) -{ - switch(type) { - case TagLib_File_MPEG: - return reinterpret_cast(new MPEG::File(filename)); - case TagLib_File_OggVorbis: - return reinterpret_cast(new Ogg::Vorbis::File(filename)); - case TagLib_File_FLAC: - return reinterpret_cast(new FLAC::File(filename)); - case TagLib_File_MPC: - return reinterpret_cast(new MPC::File(filename)); - case TagLib_File_OggFlac: - return reinterpret_cast(new Ogg::FLAC::File(filename)); - case TagLib_File_WavPack: - return reinterpret_cast(new WavPack::File(filename)); - case TagLib_File_Speex: - return reinterpret_cast(new Ogg::Speex::File(filename)); - case TagLib_File_TrueAudio: - return reinterpret_cast(new TrueAudio::File(filename)); - case TagLib_File_MP4: - return reinterpret_cast(new MP4::File(filename)); - case TagLib_File_ASF: - return reinterpret_cast(new ASF::File(filename)); - default: - return 0; - } -} - -void taglib_file_free(TagLib_File *file) -{ - delete reinterpret_cast(file); -} - -BOOL taglib_file_is_valid(const TagLib_File *file) -{ - return reinterpret_cast(file)->isValid(); -} - -TagLib_Tag *taglib_file_tag(const TagLib_File *file) -{ - const File *f = reinterpret_cast(file); - return reinterpret_cast(f->tag()); -} - -const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file) -{ - const File *f = reinterpret_cast(file); - return reinterpret_cast(f->audioProperties()); -} - -BOOL taglib_file_save(TagLib_File *file) -{ - return reinterpret_cast(file)->save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::Tag wrapper -//////////////////////////////////////////////////////////////////////////////// - -char *taglib_tag_title(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = stringToCharArray(t->title()); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_artist(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = stringToCharArray(t->artist()); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_album(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = stringToCharArray(t->album()); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_comment(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = stringToCharArray(t->comment()); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -char *taglib_tag_genre(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - char *s = stringToCharArray(t->genre()); - if(stringManagementEnabled) - strings.append(s); - return s; -} - -unsigned int taglib_tag_year(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - return t->year(); -} - -unsigned int taglib_tag_track(const TagLib_Tag *tag) -{ - const Tag *t = reinterpret_cast(tag); - return t->track(); -} - -void taglib_tag_set_title(TagLib_Tag *tag, const char *title) -{ - Tag *t = reinterpret_cast(tag); - t->setTitle(charArrayToString(title)); -} - -void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist) -{ - Tag *t = reinterpret_cast(tag); - t->setArtist(charArrayToString(artist)); -} - -void taglib_tag_set_album(TagLib_Tag *tag, const char *album) -{ - Tag *t = reinterpret_cast(tag); - t->setAlbum(charArrayToString(album)); -} - -void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment) -{ - Tag *t = reinterpret_cast(tag); - t->setComment(charArrayToString(comment)); -} - -void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre) -{ - Tag *t = reinterpret_cast(tag); - t->setGenre(charArrayToString(genre)); -} - -void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year) -{ - Tag *t = reinterpret_cast(tag); - t->setYear(year); -} - -void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track) -{ - Tag *t = reinterpret_cast(tag); - t->setTrack(track); -} - -void taglib_tag_free_strings() -{ - if(!stringManagementEnabled) - return; - - for(List::ConstIterator it = strings.begin(); it != strings.end(); ++it) - free(*it); - strings.clear(); -} - -//////////////////////////////////////////////////////////////////////////////// -// TagLib::AudioProperties wrapper -//////////////////////////////////////////////////////////////////////////////// - -int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->length(); -} - -int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->bitrate(); -} - -int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->sampleRate(); -} - -int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties) -{ - const AudioProperties *p = reinterpret_cast(audioProperties); - return p->channels(); -} - -void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding) -{ - String::Type type = String::Latin1; - - switch(encoding) - { - case TagLib_ID3v2_Latin1: - type = String::Latin1; - break; - case TagLib_ID3v2_UTF16: - type = String::UTF16; - break; - case TagLib_ID3v2_UTF16BE: - type = String::UTF16BE; - break; - case TagLib_ID3v2_UTF8: - type = String::UTF8; - break; - } - - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(type); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/taglib_c.pc.cmake b/src/plugins/taglib_plugin/taglib-1.11/bindings/c/taglib_c.pc.cmake deleted file mode 100755 index 232f4f784..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/bindings/c/taglib_c.pc.cmake +++ /dev/null @@ -1,12 +0,0 @@ -prefix=${CMAKE_INSTALL_PREFIX} -exec_prefix=${CMAKE_INSTALL_PREFIX} -libdir=${LIB_INSTALL_DIR} -includedir=${INCLUDE_INSTALL_DIR} - - -Name: TagLib C Bindings -Description: Audio meta-data library (C bindings) -Requires: taglib -Version: ${TAGLIB_LIB_VERSION_STRING} -Libs: -L${LIB_INSTALL_DIR} -ltag_c -Cflags: -I${INCLUDE_INSTALL_DIR}/taglib diff --git a/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/FindCppUnit.cmake b/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/FindCppUnit.cmake deleted file mode 100755 index adaaeb614..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/FindCppUnit.cmake +++ /dev/null @@ -1,69 +0,0 @@ -# - Try to find the libcppunit libraries -# Once done this will define -# -# CppUnit_FOUND - system has libcppunit -# CPPUNIT_INCLUDE_DIR - the libcppunit include directory -# CPPUNIT_LIBRARIES - libcppunit library - -include (MacroEnsureVersion) - -if(NOT CPPUNIT_MIN_VERSION) - SET(CPPUNIT_MIN_VERSION 1.12.0) -endif(NOT CPPUNIT_MIN_VERSION) - -FIND_PROGRAM(CPPUNIT_CONFIG_EXECUTABLE cppunit-config ) - -IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - # in cache already - SET(CppUnit_FOUND TRUE) - -ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CPPUNIT_INCLUDE_DIR) - SET(CPPUNIT_LIBRARIES) - - IF(CPPUNIT_CONFIG_EXECUTABLE) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_CFLAGS) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_LIBRARIES) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) - STRING(REGEX REPLACE "-I(.+)" "\\1" CPPUNIT_CFLAGS "${CPPUNIT_CFLAGS}") - ELSE(CPPUNIT_CONFIG_EXECUTABLE) - # in case win32 needs to find it the old way? - FIND_PATH(CPPUNIT_CFLAGS cppunit/TestRunner.h PATHS /usr/include /usr/local/include ) - FIND_LIBRARY(CPPUNIT_LIBRARIES NAMES cppunit PATHS /usr/lib /usr/local/lib ) - # how can we find cppunit version? - MESSAGE (STATUS "Ensure you cppunit installed version is at least ${CPPUNIT_MIN_VERSION}") - SET (CPPUNIT_INSTALLED_VERSION ${CPPUNIT_MIN_VERSION}) - ENDIF(CPPUNIT_CONFIG_EXECUTABLE) - - SET(CPPUNIT_INCLUDE_DIR ${CPPUNIT_CFLAGS} "${CPPUNIT_CFLAGS}/cppunit") - -ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - -IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CppUnit_FOUND TRUE) - - if(NOT CppUnit_FIND_QUIETLY) - MESSAGE (STATUS "Found cppunit: ${CPPUNIT_LIBRARIES}") - endif(NOT CppUnit_FIND_QUIETLY) - - IF(CPPUNIT_CONFIG_EXECUTABLE) - EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) - ENDIF(CPPUNIT_CONFIG_EXECUTABLE) - - macro_ensure_version( ${CPPUNIT_MIN_VERSION} ${CPPUNIT_INSTALLED_VERSION} CPPUNIT_INSTALLED_VERSION_OK ) - - IF(NOT CPPUNIT_INSTALLED_VERSION_OK) - MESSAGE ("** CppUnit version is too old: found ${CPPUNIT_INSTALLED_VERSION} installed, ${CPPUNIT_MIN_VERSION} or major is required") - SET(CppUnit_FOUND FALSE) - ENDIF(NOT CPPUNIT_INSTALLED_VERSION_OK) - -ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - - SET(CppUnit_FOUND FALSE CACHE BOOL "Not found cppunit library") - -ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) - -MARK_AS_ADVANCED(CPPUNIT_INCLUDE_DIR CPPUNIT_LIBRARIES) diff --git a/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/MacroEnsureVersion.cmake b/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/MacroEnsureVersion.cmake deleted file mode 100755 index c6df537a4..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/cmake/modules/MacroEnsureVersion.cmake +++ /dev/null @@ -1,71 +0,0 @@ -# This macro compares version numbers of the form "x.y.z" -# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) -# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION -# where both have to be in a 3-part-version format, leading and trailing -# text is ok, e.g. -# MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) -# which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system - -# Copyright (c) 2006, David Faure, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) - - # parse the parts of the version string - STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") - - STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") - - # compute an overall version number which can be compared at once - MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") - MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") - - if (found_vers_num LESS req_vers_num) - set( ${var_too_old} FALSE ) - else (found_vers_num LESS req_vers_num) - set( ${var_too_old} TRUE ) - endif (found_vers_num LESS req_vers_num) - -ENDMACRO(MACRO_ENSURE_VERSION) - - -# This macro compares version numbers of the form "x.y" -# MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) -# will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION -# where both have to be in a 2-part-version format, leading and trailing -# text is ok, e.g. -# MACRO_ENSURE_VERSION( "0.5" "foo 0.6" VERSION_OK) -# which means 0.5 is required and "foo 0.6" is what was found on the system - -# Copyright (c) 2006, David Faure, -# Copyright (c) 2007, Pino Toscano, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -MACRO(MACRO_ENSURE_VERSION2 requested_version found_version var_too_old) - - # parse the parts of the version string - STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" req_major_vers "${requested_version}") - STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" req_minor_vers "${requested_version}") - - STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") - STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+).*" "\\1" found_minor_vers "${found_version}") - - # compute an overall version number which can be compared at once - MATH(EXPR req_vers_num "${req_major_vers}*100 + ${req_minor_vers}") - MATH(EXPR found_vers_num "${found_major_vers}*100 + ${found_minor_vers}") - - if (found_vers_num LESS req_vers_num) - set( ${var_too_old} FALSE ) - else (found_vers_num LESS req_vers_num) - set( ${var_too_old} TRUE ) - endif (found_vers_num LESS req_vers_num) - -ENDMACRO(MACRO_ENSURE_VERSION2) diff --git a/src/plugins/taglib_plugin/taglib-1.11/cmake_uninstall.cmake.in b/src/plugins/taglib_plugin/taglib-1.11/cmake_uninstall.cmake.in deleted file mode 100755 index 72e030fb3..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/cmake_uninstall.cmake.in +++ /dev/null @@ -1,21 +0,0 @@ -if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") - message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") -endif() - -file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) -string(REGEX REPLACE "\n" ";" files "${files}") -foreach (file ${files}) - message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") - if (EXISTS "$ENV{DESTDIR}${file}") - execute_process( - COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}" - OUTPUT_VARIABLE rm_out - RESULT_VARIABLE rm_retval - ) - if(NOT ${rm_retval} EQUAL 0) - message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") - endif () - else () - message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") - endif () -endforeach() diff --git a/src/plugins/taglib_plugin/taglib-1.11/config.h.cmake b/src/plugins/taglib_plugin/taglib-1.11/config.h.cmake deleted file mode 100755 index c1a310948..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/config.h.cmake +++ /dev/null @@ -1,35 +0,0 @@ -/* config.h. Generated by cmake from config.h.cmake */ - -#ifndef TAGLIB_CONFIG_H -#define TAGLIB_CONFIG_H - -/* Defined if your compiler supports some byte swap functions */ -#cmakedefine HAVE_GCC_BYTESWAP 1 -#cmakedefine HAVE_GLIBC_BYTESWAP 1 -#cmakedefine HAVE_MSC_BYTESWAP 1 -#cmakedefine HAVE_MAC_BYTESWAP 1 -#cmakedefine HAVE_OPENBSD_BYTESWAP 1 - -/* Defined if your compiler supports some atomic operations */ -#cmakedefine HAVE_STD_ATOMIC 1 -#cmakedefine HAVE_GCC_ATOMIC 1 -#cmakedefine HAVE_MAC_ATOMIC 1 -#cmakedefine HAVE_WIN_ATOMIC 1 -#cmakedefine HAVE_IA64_ATOMIC 1 - -/* Defined if your compiler supports some safer version of vsprintf */ -#cmakedefine HAVE_VSNPRINTF 1 -#cmakedefine HAVE_VSPRINTF_S 1 - -/* Defined if your compiler supports ISO _strdup */ -#cmakedefine HAVE_ISO_STRDUP 1 - -/* Defined if zlib is installed */ -#cmakedefine HAVE_ZLIB 1 - -/* Indicates whether debug messages are shown even in release mode */ -#cmakedefine TRACE_IN_RELEASE 1 - -#cmakedefine TESTS_DIR "@TESTS_DIR@" - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/doc/README b/src/plugins/taglib_plugin/taglib-1.11/doc/README deleted file mode 100755 index b2ebd36d6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/doc/README +++ /dev/null @@ -1 +0,0 @@ -Run "make docs" in the parent directory to generate the TagLib API documentation. diff --git a/src/plugins/taglib_plugin/taglib-1.11/doc/api-footer.html b/src/plugins/taglib_plugin/taglib-1.11/doc/api-footer.html deleted file mode 100755 index 9b151ee89..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/doc/api-footer.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/plugins/taglib_plugin/taglib-1.11/doc/api-header.html b/src/plugins/taglib_plugin/taglib-1.11/doc/api-header.html deleted file mode 100755 index ab133c258..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/doc/api-header.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - $title ($projectname) - - - - - -
- - - - - - -
- - -
- - - - - -

TagLib $projectnumber ($title)

- -
-
-
- -
diff --git a/src/plugins/taglib_plugin/taglib-1.11/doc/taglib-api.css b/src/plugins/taglib_plugin/taglib-1.11/doc/taglib-api.css deleted file mode 100755 index 3fa820e25..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/doc/taglib-api.css +++ /dev/null @@ -1,395 +0,0 @@ -body { - font-family: sans-serif; - background: white; - color: black; - margin: 0px; - padding: 15px; -} - -a:link { - font-weight: bold; - text-decoration: none; - color: gray; -} - -a:visited { - font-weight: bold; - text-decoration: none; - color: gray; -} - -a:hover { - color: #cccccc; - text-decoration: underline; -} - -a:active { - color: #cccccc; - text-decoration: underline; -} - -img { - border-style: none; -} - -h1 { - font-family: sans-serif; -} - -h2 { - font-family: sans-serif; -} - -h3 { - font-family: sans-serif; -} - -/* container */ - -#container { - position: absolute; - border-width: thin; - border-style: solid; - width: 95%; -} - -/* intro */ - -#intro { - padding: 5px; - margin: 0px; - background: #cccccc; - border-width: medium; - border-style: solid; -} - -#intro h1 { - margin: 5px; - padding: 5px; -} - -/* links */ - -#links { - font-size: x-small; - vertical-align: bottom; -} - -#links a { - border-width: thin; - border-style: dotted; - border-color: white; - /* margin: 0px 10px 0px 0px; */ - margin: 1px; - padding: 3px; - line-height: 230% -} - -#links a:hover { - color: black; - text-decoration: underline; -} - -#links h3 { - outline-width: thin; - border-style: solid; - padding: 2px; - margin: 3px 0px 3px 0px; -} - -/* menu */ - -#menu h3 { - text-align: center; -} - -/* text */ - -#text { - margin: 0px; - padding: 5px 5px 0px 5px; - float: left; -} - -#text h3 { - border-width: thin; - border-style: solid; - padding: 2px; - margin: 3px 0px 3px 0px; -} - -#text li { - margin: 0px 0px 10px 0px; -} - -#text ul { - margin: 5px; - padding: 0px 0px 0px 20px; -} - -#leftcolumn { - float: left; - width: 300px; - margin: 0px 10px 0px 0px; - padding: 0px; -} - -#rightcolumn { - float: right; - width: 210px; - margin: 0px; - padding: 0px; -} - -/* vspacer */ - -.vspacer { - height: 10px; -} - -.silver { - border-width: thin; - border-color: black; - border-style: solid; - background: #cccccc; -} - -a.code { - text-decoration: none; - font-weight: normal; - color: #4444ee -} - -a.codeRef { - font-weight: normal; - color: #4444ee -} - -div.fragment { - width: 98%; - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding-left: 4px; - margin: 4px; -} - -div.ah { - background-color: black; - font-weight: bold; color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -#text td { - width: auto; -} - -div.memdoc { - margin-top: 0px; - margin-bottom: 20px; - padding: 10px 10px 10px 40px; -} - -div.memproto { - border: thin solid black; - background-color: #f2f2ff; - width: 100%; - margin-top: 20px; - padding-top: 10px; - padding-bottom: 10px; -} - -td.paramtype { - color: #602020; -} - -table.memname { - font-weight: bold; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold -} - -div.groupText { - margin-left: 16px; - font-style: italic; - font-size: smaller -} - -body { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} - -td.indexkey { - background-color: #eeeeff; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -td.indexvalue { - background-color: #eeeeff; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -tr.memlist { - background-color: #f0f0f0; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -.mdTable { - border: 1px solid #868686; - background-color: #f2f2ff; -} - -.mdRow { - padding: 8px 20px; -} - -.mdescLeft { - font-size: smaller; - font-family: Arial, Helvetica, sans-serif; - background-color: #FAFAFA; - padding-left: 8px; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} - -.mdescRight { - font-size: smaller; - font-family: Arial, Helvetica, sans-serif; - font-style: italic; - background-color: #FAFAFA; - padding-left: 4px; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; - padding-bottom: 0px; - padding-right: 8px; -} - -.memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 12px; -} - -.memItemRight { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 13px; -} - -.search { - color: #0000ee; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #eeeeff; -} - -td.tiny { - font-size: 75%; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/doc/taglib.png b/src/plugins/taglib_plugin/taglib-1.11/doc/taglib.png deleted file mode 100755 index 2791cc887..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/doc/taglib.png and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/examples/CMakeLists.txt deleted file mode 100755 index f991739dc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/../bindings/c/ -) - -if(NOT BUILD_SHARED_LIBS) - add_definitions(-DTAGLIB_STATIC) -endif() - -########### next target ############### - -add_executable(tagreader tagreader.cpp) -target_link_libraries(tagreader tag) - -########### next target ############### - -add_executable(tagreader_c tagreader_c.c) -target_link_libraries(tagreader_c tag_c) - -########### next target ############### - -add_executable(tagwriter tagwriter.cpp) -target_link_libraries(tagwriter tag) - -########### next target ############### - -add_executable(framelist framelist.cpp) -target_link_libraries(framelist tag) - -########### next target ############### - -add_executable(strip-id3v1 strip-id3v1.cpp) -target_link_libraries(strip-id3v1 tag) - diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/framelist.cpp b/src/plugins/taglib_plugin/taglib-1.11/examples/framelist.cpp deleted file mode 100755 index 44914cc96..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/framelist.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#include - -#include - -#include -#include -#include -#include - -#include - -#include - -using namespace std; -using namespace TagLib; - -int main(int argc, char *argv[]) -{ - // process the command line args - - - for(int i = 1; i < argc; i++) { - - cout << "******************** \"" << argv[i] << "\"********************" << endl; - - MPEG::File f(argv[i]); - - ID3v2::Tag *id3v2tag = f.ID3v2Tag(); - - if(id3v2tag) { - - cout << "ID3v2." - << id3v2tag->header()->majorVersion() - << "." - << id3v2tag->header()->revisionNumber() - << ", " - << id3v2tag->header()->tagSize() - << " bytes in tag" - << endl; - - ID3v2::FrameList::ConstIterator it = id3v2tag->frameList().begin(); - for(; it != id3v2tag->frameList().end(); it++) { - cout << (*it)->frameID(); - - if(ID3v2::CommentsFrame *comment = dynamic_cast(*it)) - if(!comment->description().isEmpty()) - cout << " [" << comment->description() << "]"; - - cout << " - \"" << (*it)->toString() << "\"" << endl; - } - } - else - cout << "file does not have a valid id3v2 tag" << endl; - - cout << endl << "ID3v1" << endl; - - ID3v1::Tag *id3v1tag = f.ID3v1Tag(); - - if(id3v1tag) { - cout << "title - \"" << id3v1tag->title() << "\"" << endl; - cout << "artist - \"" << id3v1tag->artist() << "\"" << endl; - cout << "album - \"" << id3v1tag->album() << "\"" << endl; - cout << "year - \"" << id3v1tag->year() << "\"" << endl; - cout << "comment - \"" << id3v1tag->comment() << "\"" << endl; - cout << "track - \"" << id3v1tag->track() << "\"" << endl; - cout << "genre - \"" << id3v1tag->genre() << "\"" << endl; - } - else - cout << "file does not have a valid id3v1 tag" << endl; - - APE::Tag *ape = f.APETag(); - - cout << endl << "APE" << endl; - - if(ape) { - for(APE::ItemListMap::ConstIterator it = ape->itemListMap().begin(); - it != ape->itemListMap().end(); ++it) - { - if((*it).second.type() != APE::Item::Binary) - cout << (*it).first << " - \"" << (*it).second.toString() << "\"" << endl; - else - cout << (*it).first << " - Binary data (" << (*it).second.binaryData().size() << " bytes)" << endl; - } - } - else - cout << "file does not have a valid APE tag" << endl; - - cout << endl; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/strip-id3v1.cpp b/src/plugins/taglib_plugin/taglib-1.11/examples/strip-id3v1.cpp deleted file mode 100755 index ab36d7117..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/strip-id3v1.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -using namespace TagLib; - -int main(int argc, char *argv[]) -{ - for(int i = 1; i < argc; i++) { - - std::cout << "******************** Stripping ID3v1 Tag From: \"" << argv[i] << "\"********************" << std::endl; - - MPEG::File f(argv[i]); - f.strip(MPEG::File::ID3v1); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader.cpp b/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader.cpp deleted file mode 100755 index ac81be628..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include -#include -#include - -using namespace std; - -int main(int argc, char *argv[]) -{ - for(int i = 1; i < argc; i++) { - - cout << "******************** \"" << argv[i] << "\" ********************" << endl; - - TagLib::FileRef f(argv[i]); - - if(!f.isNull() && f.tag()) { - - TagLib::Tag *tag = f.tag(); - - cout << "-- TAG (basic) --" << endl; - cout << "title - \"" << tag->title() << "\"" << endl; - cout << "artist - \"" << tag->artist() << "\"" << endl; - cout << "album - \"" << tag->album() << "\"" << endl; - cout << "year - \"" << tag->year() << "\"" << endl; - cout << "comment - \"" << tag->comment() << "\"" << endl; - cout << "track - \"" << tag->track() << "\"" << endl; - cout << "genre - \"" << tag->genre() << "\"" << endl; - - TagLib::PropertyMap tags = f.file()->properties(); - - unsigned int longest = 0; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - if (i->first.size() > longest) { - longest = i->first.size(); - } - } - - cout << "-- TAG (properties) --" << endl; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) { - cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl; - } - } - - } - - if(!f.isNull() && f.audioProperties()) { - - TagLib::AudioProperties *properties = f.audioProperties(); - - int seconds = properties->length() % 60; - int minutes = (properties->length() - seconds) / 60; - - cout << "-- AUDIO --" << endl; - cout << "bitrate - " << properties->bitrate() << endl; - cout << "sample rate - " << properties->sampleRate() << endl; - cout << "channels - " << properties->channels() << endl; - cout << "length - " << minutes << ":" << setfill('0') << setw(2) << seconds << endl; - } - } - return 0; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader_c.c b/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader_c.c deleted file mode 100755 index 043699264..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/tagreader_c.c +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2003 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include - -#ifndef FALSE -#define FALSE 0 -#endif - -int main(int argc, char *argv[]) -{ - int i; - int seconds; - int minutes; - TagLib_File *file; - TagLib_Tag *tag; - const TagLib_AudioProperties *properties; - - taglib_set_strings_unicode(FALSE); - - for(i = 1; i < argc; i++) { - printf("******************** \"%s\" ********************\n", argv[i]); - - file = taglib_file_new(argv[i]); - - if(file == NULL) - break; - - tag = taglib_file_tag(file); - properties = taglib_file_audioproperties(file); - - if(tag != NULL) { - printf("-- TAG --\n"); - printf("title - \"%s\"\n", taglib_tag_title(tag)); - printf("artist - \"%s\"\n", taglib_tag_artist(tag)); - printf("album - \"%s\"\n", taglib_tag_album(tag)); - printf("year - \"%i\"\n", taglib_tag_year(tag)); - printf("comment - \"%s\"\n", taglib_tag_comment(tag)); - printf("track - \"%i\"\n", taglib_tag_track(tag)); - printf("genre - \"%s\"\n", taglib_tag_genre(tag)); - } - - if(properties != NULL) { - seconds = taglib_audioproperties_length(properties) % 60; - minutes = (taglib_audioproperties_length(properties) - seconds) / 60; - - printf("-- AUDIO --\n"); - printf("bitrate - %i\n", taglib_audioproperties_bitrate(properties)); - printf("sample rate - %i\n", taglib_audioproperties_samplerate(properties)); - printf("channels - %i\n", taglib_audioproperties_channels(properties)); - printf("length - %i:%02i\n", minutes, seconds); - } - - taglib_tag_free_strings(); - taglib_file_free(file); - } - - return 0; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/examples/tagwriter.cpp b/src/plugins/taglib_plugin/taglib-1.11/examples/tagwriter.cpp deleted file mode 100755 index ed8b0d7ab..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/examples/tagwriter.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (C) 2004 Scott Wheeler - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace std; - -bool isArgument(const char *s) -{ - return strlen(s) == 2 && s[0] == '-'; -} - -bool isFile(const char *s) -{ - struct stat st; -#ifdef _WIN32 - return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG)); -#else - return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG | S_IFLNK)); -#endif -} - -void usage() -{ - cout << endl; - cout << "Usage: tagwriter " << endl; - cout << endl; - cout << "Where the valid fields are:" << endl; - cout << " -t " << endl; - cout << " -a <artist>" << endl; - cout << " -A <album>" << endl; - cout << " -c <comment>" << endl; - cout << " -g <genre>" << endl; - cout << " -y <year>" << endl; - cout << " -T <track>" << endl; - cout << " -R <tagname> <tagvalue>" << endl; - cout << " -I <tagname> <tagvalue>" << endl; - cout << " -D <tagname>" << endl; - cout << endl; - - exit(1); -} - -void checkForRejectedProperties(const TagLib::PropertyMap &tags) -{ // stolen from tagreader.cpp - if(tags.size() > 0) { - unsigned int longest = 0; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - if(i->first.size() > longest) { - longest = i->first.size(); - } - } - cout << "-- rejected TAGs (properties) --" << endl; - for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { - for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) { - cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl; - } - } - } -} - -int main(int argc, char *argv[]) -{ - TagLib::List<TagLib::FileRef> fileList; - - while(argc > 0 && isFile(argv[argc - 1])) { - - TagLib::FileRef f(argv[argc - 1]); - - if(!f.isNull() && f.tag()) - fileList.append(f); - - argc--; - } - - if(fileList.isEmpty()) - usage(); - - for(int i = 1; i < argc - 1; i += 2) { - - if(isArgument(argv[i]) && i + 1 < argc && !isArgument(argv[i + 1])) { - - char field = argv[i][1]; - TagLib::String value = argv[i + 1]; - - TagLib::List<TagLib::FileRef>::ConstIterator it; - for(it = fileList.begin(); it != fileList.end(); ++it) { - - TagLib::Tag *t = (*it).tag(); - - switch (field) { - case 't': - t->setTitle(value); - break; - case 'a': - t->setArtist(value); - break; - case 'A': - t->setAlbum(value); - break; - case 'c': - t->setComment(value); - break; - case 'g': - t->setGenre(value); - break; - case 'y': - t->setYear(value.toInt()); - break; - case 'T': - t->setTrack(value.toInt()); - break; - case 'R': - case 'I': - if(i + 2 < argc) { - TagLib::PropertyMap map = (*it).file()->properties (); - if(field == 'R') { - map.replace(value, TagLib::String(argv[i + 2])); - } - else { - map.insert(value, TagLib::String(argv[i + 2])); - } - ++i; - checkForRejectedProperties((*it).file()->setProperties(map)); - } - else { - usage(); - } - break; - case 'D': { - TagLib::PropertyMap map = (*it).file()->properties(); - map.erase(value); - checkForRejectedProperties((*it).file()->setProperties(map)); - break; - } - default: - usage(); - break; - } - } - } - else - usage(); - } - - TagLib::List<TagLib::FileRef>::ConstIterator it; - for(it = fileList.begin(); it != fileList.end(); ++it) - (*it).file()->save(); - - return 0; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmake b/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmake deleted file mode 100755 index 2a5c19f90..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmake +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh - -usage() -{ - echo "usage: $0 [OPTIONS]" -cat << EOH - -options: - [--libs] - [--cflags] - [--version] - [--prefix] -EOH - exit 1; -} - -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -flags="" - -if test $# -eq 0 ; then - usage -fi - -while test $# -gt 0 -do - case $1 in - --libs) - flags="$flags -L$libdir -ltag @ZLIB_LIBRARIES_FLAGS@" - ;; - --cflags) - flags="$flags -I$includedir/taglib" - ;; - --version) - echo @TAGLIB_LIB_VERSION_STRING@ - ;; - --prefix) - echo $prefix - ;; - *) - echo "$0: unknown option $1" - echo - usage - ;; - esac - shift -done - -if test -n "$flags" -then - echo $flags -fi diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmd.cmake b/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmd.cmake deleted file mode 100755 index bbf3cf845..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib-config.cmd.cmake +++ /dev/null @@ -1,36 +0,0 @@ -@echo off -goto beginning - * - * It is what it is, you can do with it as you please. - * - * Just don't blame me if it teaches your computer to smoke! - * - * -Enjoy - * fh :)_~ - * -:beginning -if /i "%1#" == "--libs#" goto doit -if /i "%1#" == "--cflags#" goto doit -if /i "%1#" == "--version#" goto doit -if /i "%1#" == "--prefix#" goto doit - -echo "usage: %0 [OPTIONS]" -echo [--libs] -echo [--cflags] -echo [--version] -echo [--prefix] -goto theend - - * - * NOTE: Windows does not assume libraries are prefixed with 'lib'. - * NOTE: If '-llibtag' is the last element, it is easily appended in the users installation/makefile process - * to allow for static, shared or debug builds. - * It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? -:doit -if /i "%1#" == "--libs#" echo -L${LIB_INSTALL_DIR} -llibtag -if /i "%1#" == "--cflags#" echo -I${INCLUDE_INSTALL_DIR}/taglib -if /i "%1#" == "--version#" echo ${TAGLIB_LIB_VERSION_STRING} -if /i "%1#" == "--prefix#" echo ${CMAKE_INSTALL_PREFIX} - -:theend - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib.pc.cmake b/src/plugins/taglib_plugin/taglib-1.11/taglib.pc.cmake deleted file mode 100755 index 9f56a3e66..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib.pc.cmake +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=@CMAKE_INSTALL_PREFIX@ -libdir=@LIB_INSTALL_DIR@ -includedir=@INCLUDE_INSTALL_DIR@ - -Name: TagLib -Description: Audio meta-data library -Requires: -Version: @TAGLIB_LIB_VERSION_STRING@ -Libs: -L${libdir} -ltag @ZLIB_LIBRARIES_FLAGS@ -Cflags: -I${includedir}/taglib diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/CMakeLists.txt deleted file mode 100755 index c8164ccbd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/CMakeLists.txt +++ /dev/null @@ -1,374 +0,0 @@ -set(CMAKE_INCLUDE_CURRENT_DIR ON) -include_directories( - ${CMAKE_CURRENT_SOURCE_DIR}/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/asf - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/flac - ${CMAKE_CURRENT_SOURCE_DIR}/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/ogg/opus - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/ape - ${CMAKE_CURRENT_SOURCE_DIR}/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/trueaudio - ${CMAKE_CURRENT_SOURCE_DIR}/riff - ${CMAKE_CURRENT_SOURCE_DIR}/riff/aiff - ${CMAKE_CURRENT_SOURCE_DIR}/riff/wav - ${CMAKE_CURRENT_SOURCE_DIR}/mod - ${CMAKE_CURRENT_SOURCE_DIR}/s3m - ${CMAKE_CURRENT_SOURCE_DIR}/it - ${CMAKE_CURRENT_SOURCE_DIR}/xm - ${CMAKE_CURRENT_SOURCE_DIR}/dsf - ${CMAKE_CURRENT_SOURCE_DIR}/dsdiff - ${taglib_SOURCE_DIR}/3rdparty -) - -if(ZLIB_FOUND) - include_directories(${ZLIB_INCLUDE_DIR}) -elseif(HAVE_ZLIB_SOURCE) - include_directories(${ZLIB_SOURCE}) -endif() - -set(tag_HDRS - tag.h - fileref.h - audioproperties.h - taglib_export.h - ${CMAKE_CURRENT_BINARY_DIR}/../taglib_config.h - toolkit/taglib.h - toolkit/tstring.h - toolkit/tlist.h - toolkit/tlist.tcc - toolkit/tstringlist.h - toolkit/tbytevector.h - toolkit/tbytevectorlist.h - toolkit/tbytevectorstream.h - toolkit/tiostream.h - toolkit/tfile.h - toolkit/tfilestream.h - toolkit/tmap.h - toolkit/tmap.tcc - toolkit/tpropertymap.h - toolkit/trefcounter.h - toolkit/tdebuglistener.h - mpeg/mpegfile.h - mpeg/mpegproperties.h - mpeg/mpegheader.h - mpeg/xingheader.h - mpeg/id3v1/id3v1tag.h - mpeg/id3v1/id3v1genres.h - mpeg/id3v2/id3v2.h - mpeg/id3v2/id3v2extendedheader.h - mpeg/id3v2/id3v2frame.h - mpeg/id3v2/id3v2header.h - mpeg/id3v2/id3v2synchdata.h - mpeg/id3v2/id3v2footer.h - mpeg/id3v2/id3v2framefactory.h - mpeg/id3v2/id3v2tag.h - mpeg/id3v2/frames/attachedpictureframe.h - mpeg/id3v2/frames/commentsframe.h - mpeg/id3v2/frames/eventtimingcodesframe.h - mpeg/id3v2/frames/generalencapsulatedobjectframe.h - mpeg/id3v2/frames/ownershipframe.h - mpeg/id3v2/frames/popularimeterframe.h - mpeg/id3v2/frames/privateframe.h - mpeg/id3v2/frames/relativevolumeframe.h - mpeg/id3v2/frames/synchronizedlyricsframe.h - mpeg/id3v2/frames/textidentificationframe.h - mpeg/id3v2/frames/uniquefileidentifierframe.h - mpeg/id3v2/frames/unknownframe.h - mpeg/id3v2/frames/unsynchronizedlyricsframe.h - mpeg/id3v2/frames/urllinkframe.h - mpeg/id3v2/frames/chapterframe.h - mpeg/id3v2/frames/tableofcontentsframe.h - mpeg/id3v2/frames/podcastframe.h - ogg/oggfile.h - ogg/oggpage.h - ogg/oggpageheader.h - ogg/xiphcomment.h - ogg/vorbis/vorbisfile.h - ogg/vorbis/vorbisproperties.h - ogg/flac/oggflacfile.h - ogg/speex/speexfile.h - ogg/speex/speexproperties.h - ogg/opus/opusfile.h - ogg/opus/opusproperties.h - flac/flacfile.h - flac/flacpicture.h - flac/flacproperties.h - flac/flacmetadatablock.h - ape/apefile.h - ape/apeproperties.h - ape/apetag.h - ape/apefooter.h - ape/apeitem.h - mpc/mpcfile.h - mpc/mpcproperties.h - wavpack/wavpackfile.h - wavpack/wavpackproperties.h - trueaudio/trueaudiofile.h - trueaudio/trueaudioproperties.h - riff/rifffile.h - riff/aiff/aifffile.h - riff/aiff/aiffproperties.h - riff/wav/wavfile.h - riff/wav/wavproperties.h - riff/wav/infotag.h - asf/asffile.h - asf/asfproperties.h - asf/asftag.h - asf/asfattribute.h - asf/asfpicture.h - mp4/mp4file.h - mp4/mp4atom.h - mp4/mp4tag.h - mp4/mp4item.h - mp4/mp4properties.h - mp4/mp4coverart.h - mod/modfilebase.h - mod/modfile.h - mod/modtag.h - mod/modproperties.h - it/itfile.h - it/itproperties.h - s3m/s3mfile.h - s3m/s3mproperties.h - xm/xmfile.h - xm/xmproperties.h -) - -set(mpeg_SRCS - mpeg/mpegfile.cpp - mpeg/mpegproperties.cpp - mpeg/mpegheader.cpp - mpeg/xingheader.cpp -) - -set(id3v1_SRCS - mpeg/id3v1/id3v1tag.cpp - mpeg/id3v1/id3v1genres.cpp -) - -set(id3v2_SRCS - mpeg/id3v2/id3v2framefactory.cpp - mpeg/id3v2/id3v2synchdata.cpp - mpeg/id3v2/id3v2tag.cpp - mpeg/id3v2/id3v2header.cpp - mpeg/id3v2/id3v2frame.cpp - mpeg/id3v2/id3v2footer.cpp - mpeg/id3v2/id3v2extendedheader.cpp - ) - -set(frames_SRCS - mpeg/id3v2/frames/attachedpictureframe.cpp - mpeg/id3v2/frames/commentsframe.cpp - mpeg/id3v2/frames/eventtimingcodesframe.cpp - mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp - mpeg/id3v2/frames/ownershipframe.cpp - mpeg/id3v2/frames/popularimeterframe.cpp - mpeg/id3v2/frames/privateframe.cpp - mpeg/id3v2/frames/relativevolumeframe.cpp - mpeg/id3v2/frames/synchronizedlyricsframe.cpp - mpeg/id3v2/frames/textidentificationframe.cpp - mpeg/id3v2/frames/uniquefileidentifierframe.cpp - mpeg/id3v2/frames/unknownframe.cpp - mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp - mpeg/id3v2/frames/urllinkframe.cpp - mpeg/id3v2/frames/chapterframe.cpp - mpeg/id3v2/frames/tableofcontentsframe.cpp - mpeg/id3v2/frames/podcastframe.cpp -) - -set(ogg_SRCS - ogg/oggfile.cpp - ogg/oggpage.cpp - ogg/oggpageheader.cpp - ogg/xiphcomment.cpp -) - -set(vorbis_SRCS - ogg/vorbis/vorbisfile.cpp - ogg/vorbis/vorbisproperties.cpp -) - -set(flacs_SRCS - flac/flacfile.cpp - flac/flacpicture.cpp - flac/flacproperties.cpp - flac/flacmetadatablock.cpp - flac/flacunknownmetadatablock.cpp -) - -set(oggflacs_SRCS - ogg/flac/oggflacfile.cpp -) - -set(mpc_SRCS - mpc/mpcfile.cpp - mpc/mpcproperties.cpp -) - -set(mp4_SRCS - mp4/mp4file.cpp - mp4/mp4atom.cpp - mp4/mp4tag.cpp - mp4/mp4item.cpp - mp4/mp4properties.cpp - mp4/mp4coverart.cpp -) - -set(ape_SRCS - ape/apetag.cpp - ape/apefooter.cpp - ape/apeitem.cpp - ape/apefile.cpp - ape/apeproperties.cpp -) - -set(wavpack_SRCS - wavpack/wavpackfile.cpp - wavpack/wavpackproperties.cpp -) - -set(speex_SRCS - ogg/speex/speexfile.cpp - ogg/speex/speexproperties.cpp -) - -set(opus_SRCS - ogg/opus/opusfile.cpp - ogg/opus/opusproperties.cpp -) - -set(trueaudio_SRCS - trueaudio/trueaudiofile.cpp - trueaudio/trueaudioproperties.cpp -) - -set(asf_SRCS - asf/asftag.cpp - asf/asffile.cpp - asf/asfproperties.cpp - asf/asfattribute.cpp - asf/asfpicture.cpp -) - -set(riff_SRCS - riff/rifffile.cpp -) - -set(aiff_SRCS - riff/aiff/aifffile.cpp - riff/aiff/aiffproperties.cpp -) - -set(wav_SRCS - riff/wav/wavfile.cpp - riff/wav/wavproperties.cpp - riff/wav/infotag.cpp -) - -set(mod_SRCS - mod/modfilebase.cpp - mod/modfile.cpp - mod/modtag.cpp - mod/modproperties.cpp -) - -set(s3m_SRCS - s3m/s3mfile.cpp - s3m/s3mproperties.cpp -) - -set(it_SRCS - it/itfile.cpp - it/itproperties.cpp -) - -set(xm_SRCS - xm/xmfile.cpp - xm/xmproperties.cpp -) - -set(toolkit_SRCS - toolkit/tstring.cpp - toolkit/tstringlist.cpp - toolkit/tbytevector.cpp - toolkit/tbytevectorlist.cpp - toolkit/tbytevectorstream.cpp - toolkit/tiostream.cpp - toolkit/tfile.cpp - toolkit/tfilestream.cpp - toolkit/tdebug.cpp - toolkit/tpropertymap.cpp - toolkit/trefcounter.cpp - toolkit/tdebuglistener.cpp - toolkit/tzlib.cpp -) - -if(HAVE_ZLIB_SOURCE) - set(zlib_SRCS - ${ZLIB_SOURCE}/adler32.c - ${ZLIB_SOURCE}/crc32.c - ${ZLIB_SOURCE}/inffast.c - ${ZLIB_SOURCE}/inflate.c - ${ZLIB_SOURCE}/inftrees.c - ${ZLIB_SOURCE}/zutil.c - ) -endif() - -set(tag_LIB_SRCS - ${mpeg_SRCS} ${id3v1_SRCS} ${id3v2_SRCS} ${frames_SRCS} ${ogg_SRCS} - ${vorbis_SRCS} ${oggflacs_SRCS} ${mpc_SRCS} ${ape_SRCS} ${toolkit_SRCS} ${flacs_SRCS} - ${wavpack_SRCS} ${speex_SRCS} ${trueaudio_SRCS} ${riff_SRCS} ${aiff_SRCS} ${wav_SRCS} - ${asf_SRCS} ${mp4_SRCS} ${mod_SRCS} ${s3m_SRCS} ${it_SRCS} ${xm_SRCS} ${opus_SRCS} - ${zlib_SRCS} - tag.cpp - tagunion.cpp - fileref.cpp - audioproperties.cpp - tagutils.cpp -) - -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -add_library(tag ${tag_LIB_SRCS} ${tag_HDRS}) - -if(HAVE_ZLIB AND NOT HAVE_ZLIB_SOURCE) - target_link_libraries(tag ${ZLIB_LIBRARIES}) -endif() - -set_target_properties(tag PROPERTIES - VERSION ${TAGLIB_SOVERSION_MAJOR}.${TAGLIB_SOVERSION_MINOR}.${TAGLIB_SOVERSION_PATCH} - SOVERSION ${TAGLIB_SOVERSION_MAJOR} - INSTALL_NAME_DIR ${LIB_INSTALL_DIR} - DEFINE_SYMBOL MAKE_TAGLIB_LIB - LINK_INTERFACE_LIBRARIES "" - PUBLIC_HEADER "${tag_HDRS}" -) -if(VISIBILITY_HIDDEN) - set_target_properties(tag PROPERTIES C_VISIBILITY_PRESET hidden) -endif() - -if(BUILD_FRAMEWORK) - unset(INSTALL_NAME_DIR) - set_target_properties(tag PROPERTIES - FRAMEWORK TRUE - MACOSX_RPATH 1 - VERSION "A" - SOVERSION "A" - ) -endif() - -install(TARGETS tag - FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} - LIBRARY DESTINATION ${LIB_INSTALL_DIR} - RUNTIME DESTINATION ${BIN_INSTALL_DIR} - ARCHIVE DESTINATION ${LIB_INSTALL_DIR} - PUBLIC_HEADER DESTINATION ${INCLUDE_INSTALL_DIR}/taglib -) diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/ape-tag-format.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/ape-tag-format.txt deleted file mode 100755 index 21ff1c861..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/ape-tag-format.txt +++ /dev/null @@ -1,170 +0,0 @@ -================================================================================ -= APE Tag Specification, Version 2.000 -================================================================================ - -Original Content (C) 2004, Frank Klemm <frank.klemm@elster.offl.uni-jena.de> -Formatting / Editing (C) 2004, Scott Wheeler <wheeler@kde.org> - -================================================================================ -= Contents -================================================================================ - -1 - APE Tag General Structure -2 - APE Tag Header / Footer Format -3 - APE Tag Flags -4 - APE Tag Item Format -5 - APE Tag Item Supported Keys -6 - APE Tag Item Content -7 - Data Types -7.1 - Data Types / UTF-8 -7.2 - Data Types / Dates -7.3 - Data Types / Timestamps - -================================================================================ -= 1 - APE Tag General Structure -================================================================================ - -Member of Basic Components of SV8 Stream Note: - -It is strongly recommended that the data size be stored in the tags. The size -should normally be in the roughly one kilobyte, never more than 8 kilobytes. - -Larger data should be stored externally using link entries. Linked data is much -easier to process by normal programs, so for instance JPEG data should not be -included inside the audio file. - -APE Tag Version 2.000 (with header, recommended): - -/================================\ -| APE Tag Header | 32 bytes | -|-------------------|------------| -| APE Tag Item 1 | > 10 bytes | -| APE Tag Item 2 | > 10 bytes | -| APE Tag Item n-1 | > 10 bytes | -| APE Tag Item n | > 10 bytes | -|-------------------|------------| -| APE Tag Footer | 32 bytes | -\================================/ - - -APE tag items should be sorted ascending by size. When streaming, parts of the -APE tag may be dropped to reduce the danger of drop outs between tracks. This -is not required, but is strongly recommended. It would be desirable for the i -tems to be sorted by importance / size, but this is not feasible. This -convention should only be broken when adding less important small items and it -is not desirable to rewrite the entire tag. An APE tag at the end of a file -(the recommended location) must have at least a footer; an APE tag at the -beginning of a file (strongly discouraged) must have at least a header. - -APE Tag Version 1.000 (without header, deprecated) - -/================================\ -| APE Tag Item 1 | > 10 bytes | -| APE Tag Item 2 | > 10 bytes | -| APE Tag Item n-1 | > 10 bytes | -| APE Tag Item n | > 10 bytes | -|-------------------|------------| -| APE Tag Footer | 32 bytes | -\================================/ - -================================================================================ -= 2 - APE Tag Header / Footer Format -================================================================================ - -Contains number, length and attributes of all tag items - -Header and Footer are different in 1 bit in the Tags Flags to distinguish -between them. - -Member of APE Tag 2.0 - -/===========================================================================\ -| Preamble | 8 bytes | { 'A', 'P', 'E', 'T', 'A', 'G', 'E', 'X' } | -|----------------|---------|------------------------------------------------| -| Version Number | 4 bytes | 1000 = Version 1.000, 2000 = Version 2.000 | -|----------------|---------|------------------------------------------------| -| Tag Size | 4 bytes | Tag size in bytes including footer and all tag | -| | | items excluding the header (for 1.000 | -| | | compatibility) | -|----------------|---------|------------------------------------------------| -| Item Count | 4 bytes | Number of items in the tag | -|----------------|---------|------------------------------------------------| -| Tag Flags | 4 bytes | Global flags | -|----------------|---------|------------------------------------------------| -| Reserved | 8 bytes | Must be zeroed | -\===========================================================================/ - -================================================================================ -= 3 - APE Tag Flags -================================================================================ - -The general flag structure for either items or headers / footers is the same. -Bits 31, 30 and 29 are specific to headers / footers, whereas 2 through 0 are -item specific. - -Note: APE Tags from Version 1.0 do not use any of the following. All flags in -that version are zeroed and ignored when reading. - -/=================================================================\ -| Contains Header | Bit 31 | 1 - has header | 0 - no header | -|-----------------|-------------|---------------------------------| -| Contains Footer | Bit 30 | 1 - has footer | 0 - no footer | -|-----------------|-------------|---------------------------------| -| Is Header | Bit 29 | 1 - is header | 0 - is footer | -|-----------------|-------------|---------------------------------| -| Undefined | Bits 28 - 3 | Undefined, must be zeroed | -|-----------------|-------------|---------------------------------| -| Encoding | Bits 2 - 1 | 00 - UTF-8 | -| | | 01 - Binary Data * | -| | | 10 - External Reference ** | -| | | 11 - Reserved | -|-----------------|-------------|---------------------------------| -| Read Only | Bit 0 | 1 - read only | 0 - read/write | -\=================================================================/ - - (*) Should be ignored by tools for editing text values -(**) Allowed external reference formats: - - http://host/directory/filename.ext - - ftp://host/directory/filename.ext - - filename.ext - - /directory/filename.ext - - DRIVE:/directory/filename.ext - - Note: External references are also UTF-8 encoded. - -================================================================================ -= 4 - APE Tag Item Format -================================================================================ - -APE Tag Items are stored as key-value pairs. APE Tags Item Key are case -sensitive, however it is illegal to use keys which only differ in case and -it is recommended that tag reading not be case sensitive. - -Every key can only occur (at most) once. It is not possible to repeat a key -to signify updated contents. - -Tags can be partially or completely repeated in the streaming format. This -makes it possible to display an artist and / or title if it was missed at the -beginning of the stream. It is recommended that the important information like -artist, album and title should occur approximately every 2 minutes in the -stream and again 5 to 10 seconds before the end. However, care should be tak -en not to replicate this information too often or during passages with high -bitrate demands to avoid unnecessary drop-outs. - -/==============================================================================\ -| Content Size | 4 bytes | Length of the value in bytes | -|----------------|---------------|---------------------------------------------| -| Flags | 4 bytes | Item flags | -|----------------|---------------|---------------------------------------------| -| Key | 2 - 255 bytes | Item key | -|----------------|---------------|---------------------------------------------| -| Key Terminator | 1 byte | Null byte that indicates the end of the key | -|----------------|---------------|---------------------------------------------| -| Value | variable | Content (formatted according to the flags) | -\==============================================================================/ - -================================================================================ - -Sections 5 - 7 haven't yet been converted from: - -http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefile.cpp deleted file mode 100755 index a10c1f646..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefile.cpp +++ /dev/null @@ -1,314 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - (original WavPack implementation) - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <id3v1tag.h> -#include <id3v2header.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "apefile.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { ApeAPEIndex = 0, ApeID3v1Index = 1 }; -} - -class APE::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - ID3v2Header(0), - ID3v2Location(-1), - ID3v2Size(0), - properties(0) {} - - ~FilePrivate() - { - delete ID3v2Header; - delete properties; - } - - long APELocation; - long APESize; - - long ID3v1Location; - - ID3v2::Header *ID3v2Header; - long ID3v2Location; - long ID3v2Size; - - TagUnion tag; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool APE::File::isSupported(IOStream *stream) -{ - // An APE file has an ID "MAC " somewhere. An ID3v2 tag may precede. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true); - return (buffer.find("MAC ") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -APE::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -APE::File::~File() -{ - delete d; -} - -TagLib::Tag *APE::File::tag() const -{ - return &d->tag; -} - -PropertyMap APE::File::properties() const -{ - return d->tag.properties(); -} - -void APE::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag.removeUnsupportedProperties(properties); -} - -PropertyMap APE::File::setProperties(const PropertyMap &properties) -{ - if(ID3v1Tag()) - ID3v1Tag()->setProperties(properties); - - return APETag(true)->setProperties(properties); -} - -APE::Properties *APE::File::audioProperties() const -{ - return d->properties; -} - -bool APE::File::save() -{ - if(readOnly()) { - debug("APE::File::save() -- File is read only."); - return false; - } - - // Update ID3v1 tag - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - if(d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - } - } - - // Update APE tag - - if(APETag() && !APETag()->isEmpty()) { - - // APE tag is not empty. Update the old one or create a new one. - - if(d->APELocation < 0) { - if(d->ID3v1Location >= 0) - d->APELocation = d->ID3v1Location; - else - d->APELocation = length(); - } - - const ByteVector data = APETag()->render(); - insert(data, d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); - - d->APESize = data.size(); - } - else { - - // APE tag is empty. Remove the old one. - - if(d->APELocation >= 0) { - removeBlock(d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->APESize; - - d->APELocation = -1; - d->APESize = 0; - } - } - - return true; -} - -ID3v1::Tag *APE::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(ApeID3v1Index, create); -} - -APE::Tag *APE::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(ApeAPEIndex, create); -} - -void APE::File::strip(int tags) -{ - if(tags & ID3v1) - d->tag.set(ApeID3v1Index, 0); - - if(tags & APE) - d->tag.set(ApeAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); -} - -bool APE::File::hasAPETag() const -{ - return (d->APELocation >= 0); -} - -bool APE::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void APE::File::read(bool readProperties) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = Utils::findID3v2(this); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location); - d->ID3v2Header = new ID3v2::Header(readBlock(ID3v2::Header::size())); - d->ID3v2Size = d->ID3v2Header->completeTagSize(); - } - - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(ApeID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - // Look for an APE tag - - d->APELocation = Utils::findAPE(this, d->ID3v1Location); - - if(d->APELocation >= 0) { - d->tag.set(ApeAPEIndex, new APE::Tag(this, d->APELocation)); - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; - } - - if(d->ID3v1Location < 0) - APETag(true); - - // Look for APE audio properties - - if(readProperties) { - - long streamLength; - - if(d->APELocation >= 0) - streamLength = d->APELocation; - else if(d->ID3v1Location >= 0) - streamLength = d->ID3v1Location; - else - streamLength = length(); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location + d->ID3v2Size); - streamLength -= (d->ID3v2Location + d->ID3v2Size); - } - else { - seek(0); - } - - d->properties = new Properties(this, streamLength); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefooter.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefooter.cpp deleted file mode 100755 index c5c99a5a4..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apefooter.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - (C) 2002 - 2008 by Scott Wheeler (id3v2header.cpp) - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> - -#include "apefooter.h" - -using namespace TagLib; -using namespace APE; - -class APE::Footer::FooterPrivate -{ -public: - FooterPrivate() : - version(0), - footerPresent(true), - headerPresent(false), - isHeader(false), - itemCount(0), - tagSize(0) {} - - unsigned int version; - - bool footerPresent; - bool headerPresent; - - bool isHeader; - - unsigned int itemCount; - unsigned int tagSize; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -unsigned int APE::Footer::size() -{ - return 32; -} - -ByteVector APE::Footer::fileIdentifier() -{ - return ByteVector("APETAGEX"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::Footer::Footer() : - d(new FooterPrivate()) -{ -} - -APE::Footer::Footer(const ByteVector &data) : - d(new FooterPrivate()) -{ - parse(data); -} - -APE::Footer::~Footer() -{ - delete d; -} - -unsigned int APE::Footer::version() const -{ - return d->version; -} - -bool APE::Footer::headerPresent() const -{ - return d->headerPresent; -} - -bool APE::Footer::footerPresent() const -{ - return d->footerPresent; -} - -bool APE::Footer::isHeader() const -{ - return d->isHeader; -} - -void APE::Footer::setHeaderPresent(bool b) const -{ - d->headerPresent = b; -} - -unsigned int APE::Footer::itemCount() const -{ - return d->itemCount; -} - -void APE::Footer::setItemCount(unsigned int s) -{ - d->itemCount = s; -} - -unsigned int APE::Footer::tagSize() const -{ - return d->tagSize; -} - -unsigned int APE::Footer::completeTagSize() const -{ - if(d->headerPresent) - return d->tagSize + size(); - else - return d->tagSize; -} - -void APE::Footer::setTagSize(unsigned int s) -{ - d->tagSize = s; -} - -void APE::Footer::setData(const ByteVector &data) -{ - parse(data); -} - -ByteVector APE::Footer::renderFooter() const -{ - return render(false); -} - -ByteVector APE::Footer::renderHeader() const -{ - if(!d->headerPresent) - return ByteVector(); - else - return render(true); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void APE::Footer::parse(const ByteVector &data) -{ - if(data.size() < size()) - return; - - // The first eight bytes, data[0..7], are the File Identifier, "APETAGEX". - - // Read the version number - - d->version = data.toUInt(8, false); - - // Read the tag size - - d->tagSize = data.toUInt(12, false); - - // Read the item count - - d->itemCount = data.toUInt(16, false); - - // Read the flags - - std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(data.toUInt(20, false))); - - d->headerPresent = flags[31]; - d->footerPresent = !flags[30]; - d->isHeader = flags[29]; - -} - -ByteVector APE::Footer::render(bool isHeader) const -{ - ByteVector v; - - // add the file identifier -- "APETAGEX" - - v.append(fileIdentifier()); - - // add the version number -- we always render a 2.000 tag regardless of what - // the tag originally was. - - v.append(ByteVector::fromUInt(2000, false)); - - // add the tag size - - v.append(ByteVector::fromUInt(d->tagSize, false)); - - // add the item count - - v.append(ByteVector::fromUInt(d->itemCount, false)); - - // render and add the flags - - std::bitset<32> flags; - - flags[31] = d->headerPresent; - flags[30] = false; // footer is always present - flags[29] = isHeader; - - v.append(ByteVector::fromUInt(flags.to_ulong(), false)); - - // add the reserved 64bit - - v.append(ByteVector::fromLongLong(0)); - - return v; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeitem.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeitem.cpp deleted file mode 100755 index 45f22da47..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeitem.cpp +++ /dev/null @@ -1,301 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tdebug.h> - -#include "apeitem.h" - -using namespace TagLib; -using namespace APE; - -class APE::Item::ItemPrivate -{ -public: - ItemPrivate() : - type(Text), - readOnly(false) {} - - Item::ItemTypes type; - String key; - ByteVector value; - StringList text; - bool readOnly; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::Item::Item() : - d(new ItemPrivate()) -{ -} - -APE::Item::Item(const String &key, const String &value) : - d(new ItemPrivate()) -{ - d->key = key; - d->text.append(value); -} - -APE::Item::Item(const String &key, const StringList &values) : - d(new ItemPrivate()) -{ - d->key = key; - d->text = values; -} - -APE::Item::Item(const String &key, const ByteVector &value, bool binary) : - d(new ItemPrivate()) -{ - d->key = key; - if(binary) { - d->type = Binary; - d->value = value; - } - else { - d->text.append(value); - } -} - -APE::Item::Item(const Item &item) : - d(new ItemPrivate(*item.d)) -{ -} - -APE::Item::~Item() -{ - delete d; -} - -Item &APE::Item::operator=(const Item &item) -{ - Item(item).swap(*this); - return *this; -} - -void APE::Item::swap(Item &item) -{ - using std::swap; - - swap(d, item.d); -} - -void APE::Item::setReadOnly(bool readOnly) -{ - d->readOnly = readOnly; -} - -bool APE::Item::isReadOnly() const -{ - return d->readOnly; -} - -void APE::Item::setType(APE::Item::ItemTypes val) -{ - d->type = val; -} - -APE::Item::ItemTypes APE::Item::type() const -{ - return d->type; -} - -String APE::Item::key() const -{ - return d->key; -} - -ByteVector APE::Item::binaryData() const -{ - return d->value; -} - -void APE::Item::setBinaryData(const ByteVector &value) -{ - d->type = Binary; - d->value = value; - d->text.clear(); -} - -ByteVector APE::Item::value() const -{ - // This seems incorrect as it won't be actually rendering the value to keep it - // up to date. - - return d->value; -} - -void APE::Item::setKey(const String &key) -{ - d->key = key; -} - -void APE::Item::setValue(const String &value) -{ - d->type = Text; - d->text = value; - d->value.clear(); -} - -void APE::Item::setValues(const StringList &value) -{ - d->type = Text; - d->text = value; - d->value.clear(); -} - -void APE::Item::appendValue(const String &value) -{ - d->type = Text; - d->text.append(value); - d->value.clear(); -} - -void APE::Item::appendValues(const StringList &values) -{ - d->type = Text; - d->text.append(values); - d->value.clear(); -} - -int APE::Item::size() const -{ - int result = 8 + d->key.size() + 1; - switch(d->type) { - case Text: - if(!d->text.isEmpty()) { - StringList::ConstIterator it = d->text.begin(); - - result += it->data(String::UTF8).size(); - it++; - for(; it != d->text.end(); ++it) - result += 1 + it->data(String::UTF8).size(); - } - break; - - case Binary: - case Locator: - result += d->value.size(); - break; - } - return result; -} - -StringList APE::Item::toStringList() const -{ - return d->text; -} - -StringList APE::Item::values() const -{ - return d->text; -} - -String APE::Item::toString() const -{ - if(d->type == Text && !isEmpty()) - return d->text.front(); - else - return String(); -} - -bool APE::Item::isEmpty() const -{ - switch(d->type) { - case Text: - if(d->text.isEmpty()) - return true; - if(d->text.size() == 1 && d->text.front().isEmpty()) - return true; - return false; - case Binary: - case Locator: - return d->value.isEmpty(); - default: - return false; - } -} - -void APE::Item::parse(const ByteVector &data) -{ - // 11 bytes is the minimum size for an APE item - - if(data.size() < 11) { - debug("APE::Item::parse() -- no data in item"); - return; - } - - const unsigned int valueLength = data.toUInt(0, false); - const unsigned int flags = data.toUInt(4, false); - - // An item key can contain ASCII characters from 0x20 up to 0x7E, not UTF-8. - // We assume that the validity of the given key has been checked. - - d->key = String(&data[8], String::Latin1); - - const ByteVector value = data.mid(8 + d->key.size() + 1, valueLength); - - setReadOnly(flags & 1); - setType(ItemTypes((flags >> 1) & 3)); - - if(Text == d->type) - d->text = StringList(ByteVectorList::split(value, '\0'), String::UTF8); - else - d->value = value; -} - -ByteVector APE::Item::render() const -{ - ByteVector data; - unsigned int flags = ((d->readOnly) ? 1 : 0) | (d->type << 1); - ByteVector value; - - if(isEmpty()) - return data; - - if(d->type == Text) { - StringList::ConstIterator it = d->text.begin(); - - value.append(it->data(String::UTF8)); - it++; - for(; it != d->text.end(); ++it) { - value.append('\0'); - value.append(it->data(String::UTF8)); - } - d->value = value; - } - else - value.append(d->value); - - data.append(ByteVector::fromUInt(value.size(), false)); - data.append(ByteVector::fromUInt(flags, false)); - data.append(d->key.data(String::Latin1)); - data.append(ByteVector('\0')); - data.append(value); - - return data; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.cpp deleted file mode 100755 index dee7e8c05..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apeproperties.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - (original WavPack implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> -#include "id3v2tag.h" -#include "apeproperties.h" -#include "apefile.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -class APE::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - version(0), - bitsPerSample(0), - sampleFrames(0) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int version; - int bitsPerSample; - unsigned int sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -APE::Properties::Properties(File *, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("APE::Properties::Properties() -- This constructor is no longer used."); -} - -APE::Properties::Properties(File *file, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file, streamLength); -} - -APE::Properties::~Properties() -{ - delete d; -} - -int APE::Properties::length() const -{ - return lengthInSeconds(); -} - -int APE::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int APE::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int APE::Properties::bitrate() const -{ - return d->bitrate; -} - -int APE::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int APE::Properties::channels() const -{ - return d->channels; -} - -int APE::Properties::version() const -{ - return d->version; -} - -int APE::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -unsigned int APE::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -namespace -{ - int headerVersion(const ByteVector &header) - { - if(header.size() < 6 || !header.startsWith("MAC ")) - return -1; - - return header.toUShort(4, false); - } -} - -void APE::Properties::read(File *file, long streamLength) -{ - // First, we assume that the file pointer is set at the first descriptor. - long offset = file->tell(); - int version = headerVersion(file->readBlock(6)); - - // Next, we look for the descriptor. - if(version < 0) { - offset = file->find("MAC ", offset); - file->seek(offset); - version = headerVersion(file->readBlock(6)); - } - - if(version < 0) { - debug("APE::Properties::read() -- APE descriptor not found"); - return; - } - - d->version = version; - - if(d->version >= 3980) - analyzeCurrent(file); - else - analyzeOld(file); - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } -} - -void APE::Properties::analyzeCurrent(File *file) -{ - // Read the descriptor - file->seek(2, File::Current); - const ByteVector descriptor = file->readBlock(44); - if(descriptor.size() < 44) { - debug("APE::Properties::analyzeCurrent() -- descriptor is too short."); - return; - } - - const unsigned int descriptorBytes = descriptor.toUInt(0, false); - - if((descriptorBytes - 52) > 0) - file->seek(descriptorBytes - 52, File::Current); - - // Read the header - const ByteVector header = file->readBlock(24); - if(header.size() < 24) { - debug("APE::Properties::analyzeCurrent() -- MAC header is too short."); - return; - } - - // Get the APE info - d->channels = header.toShort(18, false); - d->sampleRate = header.toUInt(20, false); - d->bitsPerSample = header.toShort(16, false); - - const unsigned int totalFrames = header.toUInt(12, false); - if(totalFrames == 0) - return; - - const unsigned int blocksPerFrame = header.toUInt(4, false); - const unsigned int finalFrameBlocks = header.toUInt(8, false); - d->sampleFrames = (totalFrames - 1) * blocksPerFrame + finalFrameBlocks; -} - -void APE::Properties::analyzeOld(File *file) -{ - const ByteVector header = file->readBlock(26); - if(header.size() < 26) { - debug("APE::Properties::analyzeOld() -- MAC header is too short."); - return; - } - - const unsigned int totalFrames = header.toUInt(18, false); - - // Fail on 0 length APE files (catches non-finalized APE files) - if(totalFrames == 0) - return; - - const short compressionLevel = header.toShort(0, false); - unsigned int blocksPerFrame; - if(d->version >= 3950) - blocksPerFrame = 73728 * 4; - else if(d->version >= 3900 || (d->version >= 3800 && compressionLevel == 4000)) - blocksPerFrame = 73728; - else - blocksPerFrame = 9216; - - // Get the APE info - d->channels = header.toShort(4, false); - d->sampleRate = header.toUInt(6, false); - - const unsigned int finalFrameBlocks = header.toUInt(22, false); - d->sampleFrames = (totalFrames - 1) * blocksPerFrame + finalFrameBlocks; - - // Get the bit depth from the RIFF-fmt chunk. - file->seek(16, File::Current); - const ByteVector fmt = file->readBlock(28); - if(fmt.size() < 28 || !fmt.startsWith("WAVEfmt ")) { - debug("APE::Properties::analyzeOld() -- fmt header is too short."); - return; - } - - d->bitsPerSample = fmt.toShort(26, false); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apetag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apetag.cpp deleted file mode 100755 index 79e1d5cc7..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ape/apetag.cpp +++ /dev/null @@ -1,437 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5130) -// Sun Studio finds multiple specializations of Map because -// it considers specializations with and without class types -// to be different; this define forces Map to use only the -// specialization with the class keyword. -#define WANT_CLASS_INSTANTIATION_OF_MAP (1) -#endif - -#include <tfile.h> -#include <tstring.h> -#include <tmap.h> -#include <tpropertymap.h> -#include <tdebug.h> -#include <tutils.h> - -#include "apetag.h" -#include "apefooter.h" -#include "apeitem.h" - -using namespace TagLib; -using namespace APE; - -namespace -{ - const unsigned int MinKeyLength = 2; - const unsigned int MaxKeyLength = 255; - - bool isKeyValid(const ByteVector &key) - { - const char *invalidKeys[] = { "ID3", "TAG", "OGGS", "MP+", 0 }; - - // only allow printable ASCII including space (32..126) - - for(ByteVector::ConstIterator it = key.begin(); it != key.end(); ++it) { - const int c = static_cast<unsigned char>(*it); - if(c < 32 || c > 126) - return false; - } - - const String upperKey = String(key).upper(); - for(size_t i = 0; invalidKeys[i] != 0; ++i) { - if(upperKey == invalidKeys[i]) - return false; - } - - return true; - } -} - -class APE::Tag::TagPrivate -{ -public: - TagPrivate() : - file(0), - footerLocation(0) {} - - File *file; - long footerLocation; - - Footer footer; - ItemListMap itemListMap; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -APE::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ -} - -APE::Tag::Tag(TagLib::File *file, long footerLocation) : - TagLib::Tag(), - d(new TagPrivate()) -{ - d->file = file; - d->footerLocation = footerLocation; - - read(); -} - -APE::Tag::~Tag() -{ - delete d; -} - -ByteVector APE::Tag::fileIdentifier() -{ - return ByteVector::fromCString("APETAGEX"); -} - -String APE::Tag::title() const -{ - if(d->itemListMap["TITLE"].isEmpty()) - return String(); - return d->itemListMap["TITLE"].values().toString(); -} - -String APE::Tag::artist() const -{ - if(d->itemListMap["ARTIST"].isEmpty()) - return String(); - return d->itemListMap["ARTIST"].values().toString(); -} - -String APE::Tag::album() const -{ - if(d->itemListMap["ALBUM"].isEmpty()) - return String(); - return d->itemListMap["ALBUM"].values().toString(); -} - -String APE::Tag::comment() const -{ - if(d->itemListMap["COMMENT"].isEmpty()) - return String(); - return d->itemListMap["COMMENT"].values().toString(); -} - -String APE::Tag::genre() const -{ - if(d->itemListMap["GENRE"].isEmpty()) - return String(); - return d->itemListMap["GENRE"].values().toString(); -} - -unsigned int APE::Tag::year() const -{ - if(d->itemListMap["YEAR"].isEmpty()) - return 0; - return d->itemListMap["YEAR"].toString().toInt(); -} - -unsigned int APE::Tag::track() const -{ - if(d->itemListMap["TRACK"].isEmpty()) - return 0; - return d->itemListMap["TRACK"].toString().toInt(); -} - -void APE::Tag::setTitle(const String &s) -{ - addValue("TITLE", s, true); -} - -void APE::Tag::setArtist(const String &s) -{ - addValue("ARTIST", s, true); -} - -void APE::Tag::setAlbum(const String &s) -{ - addValue("ALBUM", s, true); -} - -void APE::Tag::setComment(const String &s) -{ - addValue("COMMENT", s, true); -} - -void APE::Tag::setGenre(const String &s) -{ - addValue("GENRE", s, true); -} - -void APE::Tag::setYear(unsigned int i) -{ - if(i == 0) - removeItem("YEAR"); - else - addValue("YEAR", String::number(i), true); -} - -void APE::Tag::setTrack(unsigned int i) -{ - if(i == 0) - removeItem("TRACK"); - else - addValue("TRACK", String::number(i), true); -} - -namespace -{ - // conversions of tag keys between what we use in PropertyMap and what's usual - // for APE tags - // usual, APE - const char *keyConversions[][2] = {{"TRACKNUMBER", "TRACK" }, - {"DATE", "YEAR" }, - {"ALBUMARTIST", "ALBUM ARTIST"}, - {"DISCNUMBER", "DISC" }, - {"REMIXER", "MIXARTIST" }}; - const size_t keyConversionsSize = sizeof(keyConversions) / sizeof(keyConversions[0]); -} - -PropertyMap APE::Tag::properties() const -{ - PropertyMap properties; - ItemListMap::ConstIterator it = itemListMap().begin(); - for(; it != itemListMap().end(); ++it) { - String tagName = it->first.upper(); - // if the item is Binary or Locator, or if the key is an invalid string, - // add to unsupportedData - if(it->second.type() != Item::Text || tagName.isEmpty()) { - properties.unsupportedData().append(it->first); - } - else { - // Some tags need to be handled specially - for(size_t i = 0; i < keyConversionsSize; ++i) { - if(tagName == keyConversions[i][1]) - tagName = keyConversions[i][0]; - } - properties[tagName].append(it->second.toStringList()); - } - } - return properties; -} - -void APE::Tag::removeUnsupportedProperties(const StringList &properties) -{ - StringList::ConstIterator it = properties.begin(); - for(; it != properties.end(); ++it) - removeItem(*it); -} - -PropertyMap APE::Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); // make a local copy that can be modified - - // see comment in properties() - for(size_t i = 0; i < keyConversionsSize; ++i) - if(properties.contains(keyConversions[i][0])) { - properties.insert(keyConversions[i][1], properties[keyConversions[i][0]]); - properties.erase(keyConversions[i][0]); - } - - // first check if tags need to be removed completely - StringList toRemove; - ItemListMap::ConstIterator remIt = itemListMap().begin(); - for(; remIt != itemListMap().end(); ++remIt) { - String key = remIt->first.upper(); - // only remove if a) key is valid, b) type is text, c) key not contained in new properties - if(!key.isEmpty() && remIt->second.type() == APE::Item::Text && !properties.contains(key)) - toRemove.append(remIt->first); - } - - for(StringList::ConstIterator removeIt = toRemove.begin(); removeIt != toRemove.end(); removeIt++) - removeItem(*removeIt); - - // now sync in the "forward direction" - PropertyMap::ConstIterator it = properties.begin(); - PropertyMap invalid; - for(; it != properties.end(); ++it) { - const String &tagName = it->first; - if(!checkKey(tagName)) - invalid.insert(it->first, it->second); - else if(!(itemListMap().contains(tagName)) || !(itemListMap()[tagName].values() == it->second)) { - if(it->second.isEmpty()) - removeItem(tagName); - else { - StringList::ConstIterator valueIt = it->second.begin(); - addValue(tagName, *valueIt, true); - ++valueIt; - for(; valueIt != it->second.end(); ++valueIt) - addValue(tagName, *valueIt, false); - } - } - } - return invalid; -} - -bool APE::Tag::checkKey(const String &key) -{ - if(key.size() < MinKeyLength || key.size() > MaxKeyLength) - return false; - - return isKeyValid(key.data(String::UTF8)); -} - -APE::Footer *APE::Tag::footer() const -{ - return &d->footer; -} - -const APE::ItemListMap& APE::Tag::itemListMap() const -{ - return d->itemListMap; -} - -void APE::Tag::removeItem(const String &key) -{ - d->itemListMap.erase(key.upper()); -} - -void APE::Tag::addValue(const String &key, const String &value, bool replace) -{ - if(replace) - removeItem(key); - - if(value.isEmpty()) - return; - - // Text items may contain more than one value. - // Binary or locator items may have only one value, hence always replaced. - - ItemListMap::Iterator it = d->itemListMap.find(key.upper()); - - if(it != d->itemListMap.end() && it->second.type() == Item::Text) - it->second.appendValue(value); - else - setItem(key, Item(key, value)); -} - -void APE::Tag::setData(const String &key, const ByteVector &value) -{ - removeItem(key); - - if(value.isEmpty()) - return; - - setItem(key, Item(key, value, true)); -} - -void APE::Tag::setItem(const String &key, const Item &item) -{ - if(!checkKey(key)) { - debug("APE::Tag::setItem() - Couldn't set an item due to an invalid key."); - return; - } - - d->itemListMap[key.upper()] = item; -} - -bool APE::Tag::isEmpty() const -{ - return d->itemListMap.isEmpty(); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -void APE::Tag::read() -{ - if(d->file && d->file->isValid()) { - - d->file->seek(d->footerLocation); - d->footer.setData(d->file->readBlock(Footer::size())); - - if(d->footer.tagSize() <= Footer::size() || - d->footer.tagSize() > static_cast<unsigned long>(d->file->length())) - return; - - d->file->seek(d->footerLocation + Footer::size() - d->footer.tagSize()); - parse(d->file->readBlock(d->footer.tagSize() - Footer::size())); - } -} - -ByteVector APE::Tag::render() const -{ - ByteVector data; - unsigned int itemCount = 0; - - for(ItemListMap::ConstIterator it = d->itemListMap.begin(); it != d->itemListMap.end(); ++it) { - data.append(it->second.render()); - itemCount++; - } - - d->footer.setItemCount(itemCount); - d->footer.setTagSize(data.size() + Footer::size()); - d->footer.setHeaderPresent(true); - - return d->footer.renderHeader() + data + d->footer.renderFooter(); -} - -void APE::Tag::parse(const ByteVector &data) -{ - // 11 bytes is the minimum size for an APE item - - if(data.size() < 11) - return; - - unsigned int pos = 0; - - for(unsigned int i = 0; i < d->footer.itemCount() && pos <= data.size() - 11; i++) { - - const int nullPos = data.find('\0', pos + 8); - if(nullPos < 0) { - debug("APE::Tag::parse() - Couldn't find a key/value separator. Stopped parsing."); - return; - } - - const unsigned int keyLength = nullPos - pos - 8; - const unsigned int valLegnth = data.toUInt(pos, false); - - if(keyLength >= MinKeyLength - && keyLength <= MaxKeyLength - && isKeyValid(data.mid(pos + 8, keyLength))) - { - APE::Item item; - item.parse(data.mid(pos)); - - d->itemListMap.insert(item.key().upper(), item); - } - else { - debug("APE::Tag::parse() - Skipped an item due to an invalid key."); - } - - pos += keyLength + valLegnth + 9; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfattribute.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfattribute.cpp deleted file mode 100755 index 6faf7973b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfattribute.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include <trefcounter.h> - -#include "asfattribute.h" -#include "asffile.h" -#include "asfutils.h" - -using namespace TagLib; - -class ASF::Attribute::AttributePrivate : public RefCounter -{ -public: - AttributePrivate() : - pictureValue(ASF::Picture::fromInvalid()), - numericValue(0), - stream(0), - language(0) {} - AttributeTypes type; - String stringValue; - ByteVector byteVectorValue; - ASF::Picture pictureValue; - unsigned long long numericValue; - int stream; - int language; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Attribute::Attribute() : - d(new AttributePrivate()) -{ - d->type = UnicodeType; -} - -ASF::Attribute::Attribute(const ASF::Attribute &other) : - d(other.d) -{ - d->ref(); -} - -ASF::Attribute::Attribute(const String &value) : - d(new AttributePrivate()) -{ - d->type = UnicodeType; - d->stringValue = value; -} - -ASF::Attribute::Attribute(const ByteVector &value) : - d(new AttributePrivate()) -{ - d->type = BytesType; - d->byteVectorValue = value; -} - -ASF::Attribute::Attribute(const ASF::Picture &value) : - d(new AttributePrivate()) -{ - d->type = BytesType; - d->pictureValue = value; -} - -ASF::Attribute::Attribute(unsigned int value) : - d(new AttributePrivate()) -{ - d->type = DWordType; - d->numericValue = value; -} - -ASF::Attribute::Attribute(unsigned long long value) : - d(new AttributePrivate()) -{ - d->type = QWordType; - d->numericValue = value; -} - -ASF::Attribute::Attribute(unsigned short value) : - d(new AttributePrivate()) -{ - d->type = WordType; - d->numericValue = value; -} - -ASF::Attribute::Attribute(bool value) : - d(new AttributePrivate()) -{ - d->type = BoolType; - d->numericValue = value; -} - -ASF::Attribute &ASF::Attribute::operator=(const ASF::Attribute &other) -{ - Attribute(other).swap(*this); - return *this; -} - -void ASF::Attribute::swap(Attribute &other) -{ - using std::swap; - - swap(d, other.d); -} - -ASF::Attribute::~Attribute() -{ - if(d->deref()) - delete d; -} - -ASF::Attribute::AttributeTypes ASF::Attribute::type() const -{ - return d->type; -} - -String ASF::Attribute::toString() const -{ - return d->stringValue; -} - -ByteVector ASF::Attribute::toByteVector() const -{ - if(d->pictureValue.isValid()) - return d->pictureValue.render(); - return d->byteVectorValue; -} - -unsigned short ASF::Attribute::toBool() const -{ - return d->numericValue ? 1 : 0; -} - -unsigned short ASF::Attribute::toUShort() const -{ - return static_cast<unsigned short>(d->numericValue); -} - -unsigned int ASF::Attribute::toUInt() const -{ - return static_cast<unsigned int>(d->numericValue); -} - -unsigned long long ASF::Attribute::toULongLong() const -{ - return static_cast<unsigned long long>(d->numericValue); -} - -ASF::Picture ASF::Attribute::toPicture() const -{ - return d->pictureValue; -} - -String ASF::Attribute::parse(ASF::File &f, int kind) -{ - unsigned int size, nameLength; - String name; - d->pictureValue = Picture::fromInvalid(); - // extended content descriptor - if(kind == 0) { - nameLength = readWORD(&f); - name = readString(&f, nameLength); - d->type = ASF::Attribute::AttributeTypes(readWORD(&f)); - size = readWORD(&f); - } - // metadata & metadata library - else { - int temp = readWORD(&f); - // metadata library - if(kind == 2) { - d->language = temp; - } - d->stream = readWORD(&f); - nameLength = readWORD(&f); - d->type = ASF::Attribute::AttributeTypes(readWORD(&f)); - size = readDWORD(&f); - name = readString(&f, nameLength); - } - - if(kind != 2 && size > 65535) { - debug("ASF::Attribute::parse() -- Value larger than 64kB"); - } - - switch(d->type) { - case WordType: - d->numericValue = readWORD(&f); - break; - - case BoolType: - if(kind == 0) { - d->numericValue = (readDWORD(&f) != 0); - } - else { - d->numericValue = (readWORD(&f) != 0); - } - break; - - case DWordType: - d->numericValue = readDWORD(&f); - break; - - case QWordType: - d->numericValue = readQWORD(&f); - break; - - case UnicodeType: - d->stringValue = readString(&f, size); - break; - - case BytesType: - case GuidType: - d->byteVectorValue = f.readBlock(size); - break; - } - - if(d->type == BytesType && name == "WM/Picture") { - d->pictureValue.parse(d->byteVectorValue); - if(d->pictureValue.isValid()) { - d->byteVectorValue.clear(); - } - } - - return name; -} - -int ASF::Attribute::dataSize() const -{ - switch (d->type) { - case WordType: - return 2; - case BoolType: - return 4; - case DWordType: - return 4; - case QWordType: - return 5; - case UnicodeType: - return d->stringValue.size() * 2 + 2; - case BytesType: - if(d->pictureValue.isValid()) - return d->pictureValue.dataSize(); - case GuidType: - return d->byteVectorValue.size(); - } - return 0; -} - -ByteVector ASF::Attribute::render(const String &name, int kind) const -{ - ByteVector data; - - switch (d->type) { - case WordType: - data.append(ByteVector::fromShort(toUShort(), false)); - break; - - case BoolType: - if(kind == 0) { - data.append(ByteVector::fromUInt(toBool(), false)); - } - else { - data.append(ByteVector::fromShort(toBool(), false)); - } - break; - - case DWordType: - data.append(ByteVector::fromUInt(toUInt(), false)); - break; - - case QWordType: - data.append(ByteVector::fromLongLong(toULongLong(), false)); - break; - - case UnicodeType: - data.append(renderString(d->stringValue)); - break; - - case BytesType: - if(d->pictureValue.isValid()) { - data.append(d->pictureValue.render()); - break; - } - case GuidType: - data.append(d->byteVectorValue); - break; - } - - if(kind == 0) { - data = renderString(name, true) + - ByteVector::fromShort((int)d->type, false) + - ByteVector::fromShort(data.size(), false) + - data; - } - else { - ByteVector nameData = renderString(name); - data = ByteVector::fromShort(kind == 2 ? d->language : 0, false) + - ByteVector::fromShort(d->stream, false) + - ByteVector::fromShort(nameData.size(), false) + - ByteVector::fromShort((int)d->type, false) + - ByteVector::fromUInt(data.size(), false) + - nameData + - data; - } - - return data; -} - -int ASF::Attribute::language() const -{ - return d->language; -} - -void ASF::Attribute::setLanguage(int value) -{ - d->language = value; -} - -int ASF::Attribute::stream() const -{ - return d->stream; -} - -void ASF::Attribute::setStream(int value) -{ - d->stream = value; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asffile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asffile.cpp deleted file mode 100755 index fd754803d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asffile.cpp +++ /dev/null @@ -1,705 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tstring.h> -#include <tagutils.h> - -#include "asffile.h" -#include "asftag.h" -#include "asfproperties.h" -#include "asfutils.h" - -using namespace TagLib; - -class ASF::File::FilePrivate -{ -public: - class BaseObject; - class UnknownObject; - class FilePropertiesObject; - class StreamPropertiesObject; - class ContentDescriptionObject; - class ExtendedContentDescriptionObject; - class HeaderExtensionObject; - class CodecListObject; - class MetadataObject; - class MetadataLibraryObject; - - FilePrivate(): - headerSize(0), - tag(0), - properties(0), - contentDescriptionObject(0), - extendedContentDescriptionObject(0), - headerExtensionObject(0), - metadataObject(0), - metadataLibraryObject(0) - { - objects.setAutoDelete(true); - } - - ~FilePrivate() - { - delete tag; - delete properties; - } - - unsigned long long headerSize; - - ASF::Tag *tag; - ASF::Properties *properties; - - List<BaseObject *> objects; - - ContentDescriptionObject *contentDescriptionObject; - ExtendedContentDescriptionObject *extendedContentDescriptionObject; - HeaderExtensionObject *headerExtensionObject; - MetadataObject *metadataObject; - MetadataLibraryObject *metadataLibraryObject; -}; - -namespace -{ - const ByteVector headerGuid("\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); - const ByteVector filePropertiesGuid("\xA1\xDC\xAB\x8C\x47\xA9\xCF\x11\x8E\xE4\x00\xC0\x0C\x20\x53\x65", 16); - const ByteVector streamPropertiesGuid("\x91\x07\xDC\xB7\xB7\xA9\xCF\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65", 16); - const ByteVector contentDescriptionGuid("\x33\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); - const ByteVector extendedContentDescriptionGuid("\x40\xA4\xD0\xD2\x07\xE3\xD2\x11\x97\xF0\x00\xA0\xC9\x5E\xA8\x50", 16); - const ByteVector headerExtensionGuid("\xb5\x03\xbf_.\xa9\xcf\x11\x8e\xe3\x00\xc0\x0c Se", 16); - const ByteVector metadataGuid("\xEA\xCB\xF8\xC5\xAF[wH\204g\xAA\214D\xFAL\xCA", 16); - const ByteVector metadataLibraryGuid("\224\034#D\230\224\321I\241A\x1d\x13NEpT", 16); - const ByteVector codecListGuid("\x40\x52\xd1\x86\x1d\x31\xd0\x11\xa3\xa4\x00\xa0\xc9\x03\x48\xf6", 16); - const ByteVector contentEncryptionGuid("\xFB\xB3\x11\x22\x23\xBD\xD2\x11\xB4\xB7\x00\xA0\xC9\x55\xFC\x6E", 16); - const ByteVector extendedContentEncryptionGuid("\x14\xE6\x8A\x29\x22\x26 \x17\x4C\xB9\x35\xDA\xE0\x7E\xE9\x28\x9C", 16); - const ByteVector advancedContentEncryptionGuid("\xB6\x9B\x07\x7A\xA4\xDA\x12\x4E\xA5\xCA\x91\xD3\x8D\xC1\x1A\x8D", 16); -} - -class ASF::File::FilePrivate::BaseObject -{ -public: - ByteVector data; - virtual ~BaseObject() {} - virtual ByteVector guid() const = 0; - virtual void parse(ASF::File *file, unsigned int size); - virtual ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::UnknownObject : public ASF::File::FilePrivate::BaseObject -{ - ByteVector myGuid; -public: - UnknownObject(const ByteVector &guid); - ByteVector guid() const; -}; - -class ASF::File::FilePrivate::FilePropertiesObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); -}; - -class ASF::File::FilePrivate::StreamPropertiesObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); -}; - -class ASF::File::FilePrivate::ContentDescriptionObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::ExtendedContentDescriptionObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::MetadataObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::MetadataLibraryObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVectorList attributeData; - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::HeaderExtensionObject : public ASF::File::FilePrivate::BaseObject -{ -public: - List<ASF::File::FilePrivate::BaseObject *> objects; - HeaderExtensionObject(); - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - ByteVector render(ASF::File *file); -}; - -class ASF::File::FilePrivate::CodecListObject : public ASF::File::FilePrivate::BaseObject -{ -public: - ByteVector guid() const; - void parse(ASF::File *file, unsigned int size); - -private: - enum CodecType - { - Video = 0x0001, - Audio = 0x0002, - Unknown = 0xFFFF - }; -}; - -void ASF::File::FilePrivate::BaseObject::parse(ASF::File *file, unsigned int size) -{ - data.clear(); - if(size > 24 && size <= (unsigned int)(file->length())) - data = file->readBlock(size - 24); - else - data = ByteVector(); -} - -ByteVector ASF::File::FilePrivate::BaseObject::render(ASF::File * /*file*/) -{ - return guid() + ByteVector::fromLongLong(data.size() + 24, false) + data; -} - -ASF::File::FilePrivate::UnknownObject::UnknownObject(const ByteVector &guid) : myGuid(guid) -{ -} - -ByteVector ASF::File::FilePrivate::UnknownObject::guid() const -{ - return myGuid; -} - -ByteVector ASF::File::FilePrivate::FilePropertiesObject::guid() const -{ - return filePropertiesGuid; -} - -void ASF::File::FilePrivate::FilePropertiesObject::parse(ASF::File *file, unsigned int size) -{ - BaseObject::parse(file, size); - if(data.size() < 64) { - debug("ASF::File::FilePrivate::FilePropertiesObject::parse() -- data is too short."); - return; - } - - const long long duration = data.toLongLong(40, false); - const long long preroll = data.toLongLong(56, false); - file->d->properties->setLengthInMilliseconds(static_cast<int>(duration / 10000.0 - preroll + 0.5)); -} - -ByteVector ASF::File::FilePrivate::StreamPropertiesObject::guid() const -{ - return streamPropertiesGuid; -} - -void ASF::File::FilePrivate::StreamPropertiesObject::parse(ASF::File *file, unsigned int size) -{ - BaseObject::parse(file, size); - if(data.size() < 70) { - debug("ASF::File::FilePrivate::StreamPropertiesObject::parse() -- data is too short."); - return; - } - - file->d->properties->setCodec(data.toUShort(54, false)); - file->d->properties->setChannels(data.toUShort(56, false)); - file->d->properties->setSampleRate(data.toUInt(58, false)); - file->d->properties->setBitrate(static_cast<int>(data.toUInt(62, false) * 8.0 / 1000.0 + 0.5)); - file->d->properties->setBitsPerSample(data.toUShort(68, false)); -} - -ByteVector ASF::File::FilePrivate::ContentDescriptionObject::guid() const -{ - return contentDescriptionGuid; -} - -void ASF::File::FilePrivate::ContentDescriptionObject::parse(ASF::File *file, unsigned int /*size*/) -{ - const int titleLength = readWORD(file); - const int artistLength = readWORD(file); - const int copyrightLength = readWORD(file); - const int commentLength = readWORD(file); - const int ratingLength = readWORD(file); - file->d->tag->setTitle(readString(file,titleLength)); - file->d->tag->setArtist(readString(file,artistLength)); - file->d->tag->setCopyright(readString(file,copyrightLength)); - file->d->tag->setComment(readString(file,commentLength)); - file->d->tag->setRating(readString(file,ratingLength)); -} - -ByteVector ASF::File::FilePrivate::ContentDescriptionObject::render(ASF::File *file) -{ - const ByteVector v1 = renderString(file->d->tag->title()); - const ByteVector v2 = renderString(file->d->tag->artist()); - const ByteVector v3 = renderString(file->d->tag->copyright()); - const ByteVector v4 = renderString(file->d->tag->comment()); - const ByteVector v5 = renderString(file->d->tag->rating()); - data.clear(); - data.append(ByteVector::fromShort(v1.size(), false)); - data.append(ByteVector::fromShort(v2.size(), false)); - data.append(ByteVector::fromShort(v3.size(), false)); - data.append(ByteVector::fromShort(v4.size(), false)); - data.append(ByteVector::fromShort(v5.size(), false)); - data.append(v1); - data.append(v2); - data.append(v3); - data.append(v4); - data.append(v5); - return BaseObject::render(file); -} - -ByteVector ASF::File::FilePrivate::ExtendedContentDescriptionObject::guid() const -{ - return extendedContentDescriptionGuid; -} - -void ASF::File::FilePrivate::ExtendedContentDescriptionObject::parse(ASF::File *file, unsigned int /*size*/) -{ - int count = readWORD(file); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::FilePrivate::ExtendedContentDescriptionObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector("")); - return BaseObject::render(file); -} - -ByteVector ASF::File::FilePrivate::MetadataObject::guid() const -{ - return metadataGuid; -} - -void ASF::File::FilePrivate::MetadataObject::parse(ASF::File *file, unsigned int /*size*/) -{ - int count = readWORD(file); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file, 1); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::FilePrivate::MetadataObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector("")); - return BaseObject::render(file); -} - -ByteVector ASF::File::FilePrivate::MetadataLibraryObject::guid() const -{ - return metadataLibraryGuid; -} - -void ASF::File::FilePrivate::MetadataLibraryObject::parse(ASF::File *file, unsigned int /*size*/) -{ - int count = readWORD(file); - while(count--) { - ASF::Attribute attribute; - String name = attribute.parse(*file, 2); - file->d->tag->addAttribute(name, attribute); - } -} - -ByteVector ASF::File::FilePrivate::MetadataLibraryObject::render(ASF::File *file) -{ - data.clear(); - data.append(ByteVector::fromShort(attributeData.size(), false)); - data.append(attributeData.toByteVector("")); - return BaseObject::render(file); -} - -ASF::File::FilePrivate::HeaderExtensionObject::HeaderExtensionObject() -{ - objects.setAutoDelete(true); -} - -ByteVector ASF::File::FilePrivate::HeaderExtensionObject::guid() const -{ - return headerExtensionGuid; -} - -void ASF::File::FilePrivate::HeaderExtensionObject::parse(ASF::File *file, unsigned int /*size*/) -{ - file->seek(18, File::Current); - long long dataSize = readDWORD(file); - long long dataPos = 0; - while(dataPos < dataSize) { - ByteVector guid = file->readBlock(16); - if(guid.size() != 16) { - file->setValid(false); - break; - } - bool ok; - long long size = readQWORD(file, &ok); - if(!ok) { - file->setValid(false); - break; - } - BaseObject *obj; - if(guid == metadataGuid) { - file->d->metadataObject = new MetadataObject(); - obj = file->d->metadataObject; - } - else if(guid == metadataLibraryGuid) { - file->d->metadataLibraryObject = new MetadataLibraryObject(); - obj = file->d->metadataLibraryObject; - } - else { - obj = new UnknownObject(guid); - } - obj->parse(file, (unsigned int)size); - objects.append(obj); - dataPos += size; - } -} - -ByteVector ASF::File::FilePrivate::HeaderExtensionObject::render(ASF::File *file) -{ - data.clear(); - for(List<BaseObject *>::ConstIterator it = objects.begin(); it != objects.end(); ++it) { - data.append((*it)->render(file)); - } - data = ByteVector("\x11\xD2\xD3\xAB\xBA\xA9\xcf\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65\x06\x00", 18) + ByteVector::fromUInt(data.size(), false) + data; - return BaseObject::render(file); -} - -ByteVector ASF::File::FilePrivate::CodecListObject::guid() const -{ - return codecListGuid; -} - -void ASF::File::FilePrivate::CodecListObject::parse(ASF::File *file, unsigned int size) -{ - BaseObject::parse(file, size); - if(data.size() <= 20) { - debug("ASF::File::FilePrivate::CodecListObject::parse() -- data is too short."); - return; - } - - unsigned int pos = 16; - - const int count = data.toUInt(pos, false); - pos += 4; - - for(int i = 0; i < count; ++i) { - - if(pos >= data.size()) - break; - - const CodecType type = static_cast<CodecType>(data.toUShort(pos, false)); - pos += 2; - - int nameLength = data.toUShort(pos, false); - pos += 2; - - const unsigned int namePos = pos; - pos += nameLength * 2; - - const int descLength = data.toUShort(pos, false); - pos += 2; - - const unsigned int descPos = pos; - pos += descLength * 2; - - const int infoLength = data.toUShort(pos, false); - pos += 2 + infoLength * 2; - - if(type == CodecListObject::Audio) { - // First audio codec found. - - const String name(data.mid(namePos, nameLength * 2), String::UTF16LE); - file->d->properties->setCodecName(name.stripWhiteSpace()); - - const String desc(data.mid(descPos, descLength * 2), String::UTF16LE); - file->d->properties->setCodecDescription(desc.stripWhiteSpace()); - - break; - } - } -} - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool ASF::File::isSupported(IOStream *stream) -{ - // An ASF file has to start with the designated GUID. - - const ByteVector id = Utils::readHeader(stream, 16, false); - return (id == headerGuid); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::File::File(FileName file, bool, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(); -} - -ASF::File::File(IOStream *stream, bool, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(); -} - -ASF::File::~File() -{ - delete d; -} - -ASF::Tag *ASF::File::tag() const -{ - return d->tag; -} - -PropertyMap ASF::File::properties() const -{ - return d->tag->properties(); -} - -void ASF::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag->removeUnsupportedProperties(properties); -} - -PropertyMap ASF::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - -ASF::Properties *ASF::File::audioProperties() const -{ - return d->properties; -} - -bool ASF::File::save() -{ - if(readOnly()) { - debug("ASF::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("ASF::File::save() -- Trying to save invalid file."); - return false; - } - - if(!d->contentDescriptionObject) { - d->contentDescriptionObject = new FilePrivate::ContentDescriptionObject(); - d->objects.append(d->contentDescriptionObject); - } - if(!d->extendedContentDescriptionObject) { - d->extendedContentDescriptionObject = new FilePrivate::ExtendedContentDescriptionObject(); - d->objects.append(d->extendedContentDescriptionObject); - } - if(!d->headerExtensionObject) { - d->headerExtensionObject = new FilePrivate::HeaderExtensionObject(); - d->objects.append(d->headerExtensionObject); - } - if(!d->metadataObject) { - d->metadataObject = new FilePrivate::MetadataObject(); - d->headerExtensionObject->objects.append(d->metadataObject); - } - if(!d->metadataLibraryObject) { - d->metadataLibraryObject = new FilePrivate::MetadataLibraryObject(); - d->headerExtensionObject->objects.append(d->metadataLibraryObject); - } - - d->extendedContentDescriptionObject->attributeData.clear(); - d->metadataObject->attributeData.clear(); - d->metadataLibraryObject->attributeData.clear(); - - const AttributeListMap allAttributes = d->tag->attributeListMap(); - - for(AttributeListMap::ConstIterator it = allAttributes.begin(); it != allAttributes.end(); ++it) { - - const String &name = it->first; - const AttributeList &attributes = it->second; - - bool inExtendedContentDescriptionObject = false; - bool inMetadataObject = false; - - for(AttributeList::ConstIterator jt = attributes.begin(); jt != attributes.end(); ++jt) { - - const Attribute &attribute = *jt; - const bool largeValue = (attribute.dataSize() > 65535); - const bool guid = (attribute.type() == Attribute::GuidType); - - if(!inExtendedContentDescriptionObject && !guid && !largeValue && attribute.language() == 0 && attribute.stream() == 0) { - d->extendedContentDescriptionObject->attributeData.append(attribute.render(name)); - inExtendedContentDescriptionObject = true; - } - else if(!inMetadataObject && !guid && !largeValue && attribute.language() == 0 && attribute.stream() != 0) { - d->metadataObject->attributeData.append(attribute.render(name, 1)); - inMetadataObject = true; - } - else { - d->metadataLibraryObject->attributeData.append(attribute.render(name, 2)); - } - } - } - - ByteVector data; - for(List<FilePrivate::BaseObject *>::ConstIterator it = d->objects.begin(); it != d->objects.end(); ++it) { - data.append((*it)->render(this)); - } - - seek(16); - writeBlock(ByteVector::fromLongLong(data.size() + 30, false)); - writeBlock(ByteVector::fromUInt(d->objects.size(), false)); - writeBlock(ByteVector("\x01\x02", 2)); - - insert(data, 30, static_cast<unsigned long>(d->headerSize - 30)); - - d->headerSize = data.size() + 30; - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void ASF::File::read() -{ - if(!isValid()) - return; - - if(readBlock(16) != headerGuid) { - debug("ASF::File::read(): Not an ASF file."); - setValid(false); - return; - } - - d->tag = new ASF::Tag(); - d->properties = new ASF::Properties(); - - bool ok; - d->headerSize = readQWORD(this, &ok); - if(!ok) { - setValid(false); - return; - } - int numObjects = readDWORD(this, &ok); - if(!ok) { - setValid(false); - return; - } - seek(2, Current); - - FilePrivate::FilePropertiesObject *filePropertiesObject = 0; - FilePrivate::StreamPropertiesObject *streamPropertiesObject = 0; - for(int i = 0; i < numObjects; i++) { - const ByteVector guid = readBlock(16); - if(guid.size() != 16) { - setValid(false); - break; - } - long size = (long)readQWORD(this, &ok); - if(!ok) { - setValid(false); - break; - } - FilePrivate::BaseObject *obj; - if(guid == filePropertiesGuid) { - filePropertiesObject = new FilePrivate::FilePropertiesObject(); - obj = filePropertiesObject; - } - else if(guid == streamPropertiesGuid) { - streamPropertiesObject = new FilePrivate::StreamPropertiesObject(); - obj = streamPropertiesObject; - } - else if(guid == contentDescriptionGuid) { - d->contentDescriptionObject = new FilePrivate::ContentDescriptionObject(); - obj = d->contentDescriptionObject; - } - else if(guid == extendedContentDescriptionGuid) { - d->extendedContentDescriptionObject = new FilePrivate::ExtendedContentDescriptionObject(); - obj = d->extendedContentDescriptionObject; - } - else if(guid == headerExtensionGuid) { - d->headerExtensionObject = new FilePrivate::HeaderExtensionObject(); - obj = d->headerExtensionObject; - } - else if(guid == codecListGuid) { - obj = new FilePrivate::CodecListObject(); - } - else { - if(guid == contentEncryptionGuid || - guid == extendedContentEncryptionGuid || - guid == advancedContentEncryptionGuid) { - d->properties->setEncrypted(true); - } - obj = new FilePrivate::UnknownObject(guid); - } - obj->parse(this, size); - d->objects.append(obj); - } - - if(!filePropertiesObject || !streamPropertiesObject) { - debug("ASF::File::read(): Missing mandatory header objects."); - setValid(false); - return; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfpicture.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfpicture.cpp deleted file mode 100755 index 7039fb15f..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfpicture.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Anton Sergunov - email : setosha@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include <trefcounter.h> - -#include "asfattribute.h" -#include "asffile.h" -#include "asfpicture.h" -#include "asfutils.h" - -using namespace TagLib; - -class ASF::Picture::PicturePrivate : public RefCounter -{ -public: - bool valid; - Type type; - String mimeType; - String description; - ByteVector picture; -}; - -//////////////////////////////////////////////////////////////////////////////// -// Picture class members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Picture::Picture() : - d(new PicturePrivate()) -{ - d->valid = true; -} - -ASF::Picture::Picture(const Picture& other) : - d(other.d) -{ - d->ref(); -} - -ASF::Picture::~Picture() -{ - if(d->deref()) - delete d; -} - -bool ASF::Picture::isValid() const -{ - return d->valid; -} - -String ASF::Picture::mimeType() const -{ - return d->mimeType; -} - -void ASF::Picture::setMimeType(const String &value) -{ - d->mimeType = value; -} - -ASF::Picture::Type ASF::Picture::type() const -{ - return d->type; -} - -void ASF::Picture::setType(const ASF::Picture::Type& t) -{ - d->type = t; -} - -String ASF::Picture::description() const -{ - return d->description; -} - -void ASF::Picture::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector ASF::Picture::picture() const -{ - return d->picture; -} - -void ASF::Picture::setPicture(const ByteVector &p) -{ - d->picture = p; -} - -int ASF::Picture::dataSize() const -{ - return - 9 + (d->mimeType.length() + d->description.length()) * 2 + - d->picture.size(); -} - -ASF::Picture& ASF::Picture::operator=(const ASF::Picture& other) -{ - Picture(other).swap(*this); - return *this; -} - -void ASF::Picture::swap(Picture &other) -{ - using std::swap; - - swap(d, other.d); -} - -ByteVector ASF::Picture::render() const -{ - if(!isValid()) - return ByteVector(); - - return - ByteVector((char)d->type) + - ByteVector::fromUInt(d->picture.size(), false) + - renderString(d->mimeType) + - renderString(d->description) + - d->picture; -} - -void ASF::Picture::parse(const ByteVector& bytes) -{ - d->valid = false; - if(bytes.size() < 9) - return; - int pos = 0; - d->type = (Type)bytes[0]; ++pos; - const unsigned int dataLen = bytes.toUInt(pos, false); pos+=4; - - const ByteVector nullStringTerminator(2, 0); - - int endPos = bytes.find(nullStringTerminator, pos, 2); - if(endPos < 0) - return; - d->mimeType = String(bytes.mid(pos, endPos - pos), String::UTF16LE); - pos = endPos+2; - - endPos = bytes.find(nullStringTerminator, pos, 2); - if(endPos < 0) - return; - d->description = String(bytes.mid(pos, endPos - pos), String::UTF16LE); - pos = endPos+2; - - if(dataLen + pos != bytes.size()) - return; - - d->picture = bytes.mid(pos, dataLen); - d->valid = true; - return; -} - -ASF::Picture ASF::Picture::fromInvalid() -{ - Picture ret; - ret.d->valid = false; - return ret; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.cpp deleted file mode 100755 index a836da30b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfproperties.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include "asfproperties.h" - -using namespace TagLib; - -class ASF::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - codec(ASF::Properties::Unknown), - encrypted(false) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - ASF::Properties::Codec codec; - String codecName; - String codecDescription; - bool encrypted; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ASF::Properties::Properties() : - AudioProperties(AudioProperties::Average), - d(new PropertiesPrivate()) -{ -} - -ASF::Properties::~Properties() -{ - delete d; -} - -int ASF::Properties::length() const -{ - return lengthInSeconds(); -} - -int ASF::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int ASF::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int ASF::Properties::bitrate() const -{ - return d->bitrate; -} - -int ASF::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int ASF::Properties::channels() const -{ - return d->channels; -} - -int ASF::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -ASF::Properties::Codec ASF::Properties::codec() const -{ - return d->codec; -} - -String ASF::Properties::codecName() const -{ - return d->codecName; -} - -String ASF::Properties::codecDescription() const -{ - return d->codecDescription; -} - -bool ASF::Properties::isEncrypted() const -{ - return d->encrypted; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void ASF::Properties::setLength(int /*length*/) -{ - debug("ASF::Properties::setLength() -- This method is deprecated. Do not use."); -} - -void ASF::Properties::setLengthInMilliseconds(int value) -{ - d->length = value; -} - -void ASF::Properties::setBitrate(int value) -{ - d->bitrate = value; -} - -void ASF::Properties::setSampleRate(int value) -{ - d->sampleRate = value; -} - -void ASF::Properties::setChannels(int value) -{ - d->channels = value; -} - -void ASF::Properties::setBitsPerSample(int value) -{ - d->bitsPerSample = value; -} - -void ASF::Properties::setCodec(int value) -{ - switch(value) - { - case 0x0160: - d->codec = WMA1; - break; - case 0x0161: - d->codec = WMA2; - break; - case 0x0162: - d->codec = WMA9Pro; - break; - case 0x0163: - d->codec = WMA9Lossless; - break; - default: - d->codec = Unknown; - break; - } -} - -void ASF::Properties::setCodecName(const String &value) -{ - d->codecName = value; -} - -void ASF::Properties::setCodecDescription(const String &value) -{ - d->codecDescription = value; -} - -void ASF::Properties::setEncrypted(bool value) -{ - d->encrypted = value; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.cpp deleted file mode 100755 index 20a946f0a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asftag.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/************************************************************************** - copyright : (C) 2005-2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tpropertymap.h> -#include "asftag.h" - -using namespace TagLib; - -class ASF::Tag::TagPrivate -{ -public: - String title; - String artist; - String copyright; - String comment; - String rating; - AttributeListMap attributeListMap; -}; - -ASF::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ -} - -ASF::Tag::~Tag() -{ - delete d; -} - -String ASF::Tag::title() const -{ - return d->title; -} - -String ASF::Tag::artist() const -{ - return d->artist; -} - -String ASF::Tag::album() const -{ - if(d->attributeListMap.contains("WM/AlbumTitle")) - return d->attributeListMap["WM/AlbumTitle"][0].toString(); - return String(); -} - -String ASF::Tag::copyright() const -{ - return d->copyright; -} - -String ASF::Tag::comment() const -{ - return d->comment; -} - -String ASF::Tag::rating() const -{ - return d->rating; -} - -unsigned int ASF::Tag::year() const -{ - if(d->attributeListMap.contains("WM/Year")) - return d->attributeListMap["WM/Year"][0].toString().toInt(); - return 0; -} - -unsigned int ASF::Tag::track() const -{ - if(d->attributeListMap.contains("WM/TrackNumber")) { - const ASF::Attribute attr = d->attributeListMap["WM/TrackNumber"][0]; - if(attr.type() == ASF::Attribute::DWordType) - return attr.toUInt(); - else - return attr.toString().toInt(); - } - if(d->attributeListMap.contains("WM/Track")) - return d->attributeListMap["WM/Track"][0].toUInt(); - return 0; -} - -String ASF::Tag::genre() const -{ - if(d->attributeListMap.contains("WM/Genre")) - return d->attributeListMap["WM/Genre"][0].toString(); - return String(); -} - -void ASF::Tag::setTitle(const String &value) -{ - d->title = value; -} - -void ASF::Tag::setArtist(const String &value) -{ - d->artist = value; -} - -void ASF::Tag::setCopyright(const String &value) -{ - d->copyright = value; -} - -void ASF::Tag::setComment(const String &value) -{ - d->comment = value; -} - -void ASF::Tag::setRating(const String &value) -{ - d->rating = value; -} - -void ASF::Tag::setAlbum(const String &value) -{ - setAttribute("WM/AlbumTitle", value); -} - -void ASF::Tag::setGenre(const String &value) -{ - setAttribute("WM/Genre", value); -} - -void ASF::Tag::setYear(unsigned int value) -{ - setAttribute("WM/Year", String::number(value)); -} - -void ASF::Tag::setTrack(unsigned int value) -{ - setAttribute("WM/TrackNumber", String::number(value)); -} - -ASF::AttributeListMap& ASF::Tag::attributeListMap() -{ - return d->attributeListMap; -} - -const ASF::AttributeListMap &ASF::Tag::attributeListMap() const -{ - return d->attributeListMap; -} - -bool ASF::Tag::contains(const String &key) const -{ - return d->attributeListMap.contains(key); -} - -void ASF::Tag::removeItem(const String &key) -{ - d->attributeListMap.erase(key); -} - -ASF::AttributeList ASF::Tag::attribute(const String &name) const -{ - return d->attributeListMap[name]; -} - -void ASF::Tag::setAttribute(const String &name, const Attribute &attribute) -{ - AttributeList value; - value.append(attribute); - d->attributeListMap.insert(name, value); -} - -void ASF::Tag::setAttribute(const String &name, const AttributeList &values) -{ - d->attributeListMap.insert(name, values); -} - -void ASF::Tag::addAttribute(const String &name, const Attribute &attribute) -{ - if(d->attributeListMap.contains(name)) { - d->attributeListMap[name].append(attribute); - } - else { - setAttribute(name, attribute); - } -} - -bool ASF::Tag::isEmpty() const -{ - return TagLib::Tag::isEmpty() && - copyright().isEmpty() && - rating().isEmpty() && - d->attributeListMap.isEmpty(); -} - -namespace -{ - const char *keyTranslation[][2] = { - { "WM/AlbumTitle", "ALBUM" }, - { "WM/AlbumArtist", "ALBUMARTIST" }, - { "WM/Composer", "COMPOSER" }, - { "WM/Writer", "WRITER" }, - { "WM/Conductor", "CONDUCTOR" }, - { "WM/ModifiedBy", "REMIXER" }, - { "WM/Year", "DATE" }, - { "WM/OriginalReleaseYear", "ORIGINALDATE" }, - { "WM/Producer", "PRODUCER" }, - { "WM/ContentGroupDescription", "GROUPING" }, - { "WM/SubTitle", "SUBTITLE" }, - { "WM/SetSubTitle", "DISCSUBTITLE" }, - { "WM/TrackNumber", "TRACKNUMBER" }, - { "WM/PartOfSet", "DISCNUMBER" }, - { "WM/Genre", "GENRE" }, - { "WM/BeatsPerMinute", "BPM" }, - { "WM/Mood", "MOOD" }, - { "WM/ISRC", "ISRC" }, - { "WM/Lyrics", "LYRICS" }, - { "WM/Media", "MEDIA" }, - { "WM/Publisher", "LABEL" }, - { "WM/CatalogNo", "CATALOGNUMBER" }, - { "WM/Barcode", "BARCODE" }, - { "WM/EncodedBy", "ENCODEDBY" }, - { "WM/AlbumSortOrder", "ALBUMSORT" }, - { "WM/AlbumArtistSortOrder", "ALBUMARTISTSORT" }, - { "WM/ArtistSortOrder", "ARTISTSORT" }, - { "WM/TitleSortOrder", "TITLESORT" }, - { "WM/Script", "SCRIPT" }, - { "WM/Language", "LANGUAGE" }, - { "MusicBrainz/Track Id", "MUSICBRAINZ_TRACKID" }, - { "MusicBrainz/Artist Id", "MUSICBRAINZ_ARTISTID" }, - { "MusicBrainz/Album Id", "MUSICBRAINZ_ALBUMID" }, - { "MusicBrainz/Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" }, - { "MusicBrainz/Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" }, - { "MusicBrainz/Work Id", "MUSICBRAINZ_WORKID" }, - { "MusicIP/PUID", "MUSICIP_PUID" }, - { "Acoustid/Id", "ACOUSTID_ID" }, - { "Acoustid/Fingerprint", "ACOUSTID_FINGERPRINT" }, - }; - const size_t keyTranslationSize = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - - String translateKey(const String &key) - { - for(size_t i = 0; i < keyTranslationSize; ++i) { - if(key == keyTranslation[i][0]) - return keyTranslation[i][1]; - } - - return String(); - } -} - -PropertyMap ASF::Tag::properties() const -{ - PropertyMap props; - - if(!d->title.isEmpty()) { - props["TITLE"] = d->title; - } - if(!d->artist.isEmpty()) { - props["ARTIST"] = d->artist; - } - if(!d->copyright.isEmpty()) { - props["COPYRIGHT"] = d->copyright; - } - if(!d->comment.isEmpty()) { - props["COMMENT"] = d->comment; - } - - ASF::AttributeListMap::ConstIterator it = d->attributeListMap.begin(); - for(; it != d->attributeListMap.end(); ++it) { - const String key = translateKey(it->first); - if(!key.isEmpty()) { - AttributeList::ConstIterator it2 = it->second.begin(); - for(; it2 != it->second.end(); ++it2) { - if(key == "TRACKNUMBER") { - if(it2->type() == ASF::Attribute::DWordType) - props.insert(key, String::number(it2->toUInt())); - else - props.insert(key, it2->toString()); - } - else { - props.insert(key, it2->toString()); - } - } - } - else { - props.unsupportedData().append(it->first); - } - } - return props; -} - -void ASF::Tag::removeUnsupportedProperties(const StringList &props) -{ - StringList::ConstIterator it = props.begin(); - for(; it != props.end(); ++it) - d->attributeListMap.erase(*it); -} - -PropertyMap ASF::Tag::setProperties(const PropertyMap &props) -{ - static Map<String, String> reverseKeyMap; - if(reverseKeyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - reverseKeyMap[keyTranslation[i][1]] = keyTranslation[i][0]; - } - } - - PropertyMap origProps = properties(); - PropertyMap::ConstIterator it = origProps.begin(); - for(; it != origProps.end(); ++it) { - if(!props.contains(it->first) || props[it->first].isEmpty()) { - if(it->first == "TITLE") { - d->title.clear(); - } - else if(it->first == "ARTIST") { - d->artist.clear(); - } - else if(it->first == "COMMENT") { - d->comment.clear(); - } - else if(it->first == "COPYRIGHT") { - d->copyright.clear(); - } - else { - d->attributeListMap.erase(reverseKeyMap[it->first]); - } - } - } - - PropertyMap ignoredProps; - it = props.begin(); - for(; it != props.end(); ++it) { - if(reverseKeyMap.contains(it->first)) { - String name = reverseKeyMap[it->first]; - removeItem(name); - StringList::ConstIterator it2 = it->second.begin(); - for(; it2 != it->second.end(); ++it2) { - addAttribute(name, *it2); - } - } - else if(it->first == "TITLE") { - d->title = it->second.toString(); - } - else if(it->first == "ARTIST") { - d->artist = it->second.toString(); - } - else if(it->first == "COMMENT") { - d->comment = it->second.toString(); - } - else if(it->first == "COPYRIGHT") { - d->copyright = it->second.toString(); - } - else { - ignoredProps.insert(it->first, it->second); - } - } - - return ignoredProps; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfutils.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfutils.h deleted file mode 100755 index a8ecd70dc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/asf/asfutils.h +++ /dev/null @@ -1,104 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_ASFUTILS_H -#define TAGLIB_ASFUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -namespace TagLib -{ - namespace ASF - { - namespace - { - - inline unsigned short readWORD(File *file, bool *ok = 0) - { - const ByteVector v = file->readBlock(2); - if(v.size() != 2) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toUShort(false); - } - - inline unsigned int readDWORD(File *file, bool *ok = 0) - { - const ByteVector v = file->readBlock(4); - if(v.size() != 4) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toUInt(false); - } - - inline long long readQWORD(File *file, bool *ok = 0) - { - const ByteVector v = file->readBlock(8); - if(v.size() != 8) { - if(ok) *ok = false; - return 0; - } - if(ok) *ok = true; - return v.toLongLong(false); - } - - inline String readString(File *file, int length) - { - ByteVector data = file->readBlock(length); - unsigned int size = data.size(); - while (size >= 2) { - if(data[size - 1] != '\0' || data[size - 2] != '\0') { - break; - } - size -= 2; - } - if(size != data.size()) { - data.resize(size); - } - return String(data, String::UTF16LE); - } - - inline ByteVector renderString(const String &str, bool includeLength = false) - { - ByteVector data = str.data(String::UTF16LE) + ByteVector::fromShort(0, false); - if(includeLength) { - data = ByteVector::fromShort(data.size(), false) + data; - } - return data; - } - - } - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/audioproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/audioproperties.cpp deleted file mode 100755 index c29051a64..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/audioproperties.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> - -#include "aiffproperties.h" -#include "apeproperties.h" -#include "asfproperties.h" -#include "flacproperties.h" -#include "mp4properties.h" -#include "mpcproperties.h" -#include "mpegproperties.h" -#include "opusproperties.h" -#include "speexproperties.h" -#include "trueaudioproperties.h" -#include "vorbisproperties.h" -#include "wavproperties.h" -#include "wavpackproperties.h" - -#include "audioproperties.h" - -using namespace TagLib; - -// This macro is a workaround for the fact that we can't add virtual functions. -// Should be true virtual functions in taglib2. - -#define VIRTUAL_FUNCTION_WORKAROUND(function_name, default_value) \ - if(dynamic_cast<const APE::Properties*>(this)) \ - return dynamic_cast<const APE::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const ASF::Properties*>(this)) \ - return dynamic_cast<const ASF::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const FLAC::Properties*>(this)) \ - return dynamic_cast<const FLAC::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const MP4::Properties*>(this)) \ - return dynamic_cast<const MP4::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const MPC::Properties*>(this)) \ - return dynamic_cast<const MPC::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const MPEG::Properties*>(this)) \ - return dynamic_cast<const MPEG::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const Ogg::Opus::Properties*>(this)) \ - return dynamic_cast<const Ogg::Opus::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const Ogg::Speex::Properties*>(this)) \ - return dynamic_cast<const Ogg::Speex::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const TrueAudio::Properties*>(this)) \ - return dynamic_cast<const TrueAudio::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const RIFF::AIFF::Properties*>(this)) \ - return dynamic_cast<const RIFF::AIFF::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const RIFF::WAV::Properties*>(this)) \ - return dynamic_cast<const RIFF::WAV::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const Vorbis::Properties*>(this)) \ - return dynamic_cast<const Vorbis::Properties*>(this)->function_name(); \ - else if(dynamic_cast<const WavPack::Properties*>(this)) \ - return dynamic_cast<const WavPack::Properties*>(this)->function_name(); \ - else \ - return (default_value); - -class AudioProperties::AudioPropertiesPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -AudioProperties::~AudioProperties() -{ - -} - -int AudioProperties::lengthInSeconds() const -{ - VIRTUAL_FUNCTION_WORKAROUND(lengthInSeconds, 0) -} - -int AudioProperties::lengthInMilliseconds() const -{ - VIRTUAL_FUNCTION_WORKAROUND(lengthInMilliseconds, 0) -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -AudioProperties::AudioProperties(ReadStyle) : - d(0) -{ - -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.cpp deleted file mode 100755 index 935c371bd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/fileref.cpp +++ /dev/null @@ -1,474 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2010 by Alex Novichkov - email : novichko@atnet.ru - (added APE file support) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tfile.h> -#include <tfilestream.h> -#include <tstring.h> -#include <tdebug.h> -#include <trefcounter.h> - -#include "fileref.h" -#include "asffile.h" -#include "mpegfile.h" -#include "vorbisfile.h" -#include "flacfile.h" -#include "oggflacfile.h" -#include "mpcfile.h" -#include "mp4file.h" -#include "wavpackfile.h" -#include "speexfile.h" -#include "opusfile.h" -#include "trueaudiofile.h" -#include "aifffile.h" -#include "wavfile.h" -#include "apefile.h" -#include "modfile.h" -#include "s3mfile.h" -#include "itfile.h" -#include "xmfile.h" - -using namespace TagLib; - -namespace -{ - typedef List<const FileRef::FileTypeResolver *> ResolverList; - ResolverList fileTypeResolvers; - - // Detect the file type by user-defined resolvers. - - File *detectByResolvers(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) - { - ResolverList::ConstIterator it = fileTypeResolvers.begin(); - for(; it != fileTypeResolvers.end(); ++it) { - File *file = (*it)->createFile(fileName, readAudioProperties, audioPropertiesStyle); - if(file) - return file; - } - - return 0; - } - - // Detect the file type based on the file extension. - - File* detectByExtension(IOStream *stream, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) - { -#ifdef _WIN32 - const String s = stream->name().toString(); -#else - const String s(stream->name()); -#endif - - String ext; - const int pos = s.rfind("."); - if(pos != -1) - ext = s.substr(pos + 1).upper(); - - // If this list is updated, the method defaultFileExtensions() should also be - // updated. However at some point that list should be created at the same time - // that a default file type resolver is created. - - if(ext.isEmpty()) - return 0; - - // .oga can be any audio in the Ogg container. So leave it to content-based detection. - - if(ext == "MP3") - return new MPEG::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); - if(ext == "OGG") - return new Ogg::Vorbis::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "FLAC") - return new FLAC::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); - if(ext == "MPC") - return new MPC::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "WV") - return new WavPack::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "SPX") - return new Ogg::Speex::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "OPUS") - return new Ogg::Opus::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "TTA") - return new TrueAudio::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "M4A" || ext == "M4R" || ext == "M4B" || ext == "M4P" || ext == "MP4" || ext == "3G2" || ext == "M4V") - return new MP4::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "WMA" || ext == "ASF") - return new ASF::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "AIF" || ext == "AIFF" || ext == "AFC" || ext == "AIFC") - return new RIFF::AIFF::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "WAV") - return new RIFF::WAV::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "APE") - return new APE::File(stream, readAudioProperties, audioPropertiesStyle); - // module, nst and wow are possible but uncommon extensions - if(ext == "MOD" || ext == "MODULE" || ext == "NST" || ext == "WOW") - return new Mod::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "S3M") - return new S3M::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "IT") - return new IT::File(stream, readAudioProperties, audioPropertiesStyle); - if(ext == "XM") - return new XM::File(stream, readAudioProperties, audioPropertiesStyle); - - return 0; - } - - // Detect the file type based on the actual content of the stream. - - File *detectByContent(IOStream *stream, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) - { - File *file = 0; - - if(MPEG::File::isSupported(stream)) - file = new MPEG::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); - else if(Ogg::Vorbis::File::isSupported(stream)) - file = new Ogg::Vorbis::File(stream, readAudioProperties, audioPropertiesStyle); - else if(Ogg::FLAC::File::isSupported(stream)) - file = new Ogg::FLAC::File(stream, readAudioProperties, audioPropertiesStyle); - else if(FLAC::File::isSupported(stream)) - file = new FLAC::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); - else if(MPC::File::isSupported(stream)) - file = new MPC::File(stream, readAudioProperties, audioPropertiesStyle); - else if(WavPack::File::isSupported(stream)) - file = new WavPack::File(stream, readAudioProperties, audioPropertiesStyle); - else if(Ogg::Speex::File::isSupported(stream)) - file = new Ogg::Speex::File(stream, readAudioProperties, audioPropertiesStyle); - else if(Ogg::Opus::File::isSupported(stream)) - file = new Ogg::Opus::File(stream, readAudioProperties, audioPropertiesStyle); - else if(TrueAudio::File::isSupported(stream)) - file = new TrueAudio::File(stream, readAudioProperties, audioPropertiesStyle); - else if(MP4::File::isSupported(stream)) - file = new MP4::File(stream, readAudioProperties, audioPropertiesStyle); - else if(ASF::File::isSupported(stream)) - file = new ASF::File(stream, readAudioProperties, audioPropertiesStyle); - else if(RIFF::AIFF::File::isSupported(stream)) - file = new RIFF::AIFF::File(stream, readAudioProperties, audioPropertiesStyle); - else if(RIFF::WAV::File::isSupported(stream)) - file = new RIFF::WAV::File(stream, readAudioProperties, audioPropertiesStyle); - else if(APE::File::isSupported(stream)) - file = new APE::File(stream, readAudioProperties, audioPropertiesStyle); - - // isSupported() only does a quick check, so double check the file here. - - if(file) { - if(file->isValid()) - return file; - else - delete file; - } - - 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 -{ -public: - FileRefPrivate() : - RefCounter(), - file(0), - stream(0) {} - - ~FileRefPrivate() { - delete file; - delete stream; - } - - File *file; - IOStream *stream; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FileRef::FileRef() : - d(new FileRefPrivate()) -{ -} - -FileRef::FileRef(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) : - d(new FileRefPrivate()) -{ - parse(fileName, readAudioProperties, audioPropertiesStyle); -} - -FileRef::FileRef(IOStream* stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) : - d(new FileRefPrivate()) -{ - parse(stream, readAudioProperties, audioPropertiesStyle); -} - -FileRef::FileRef(File *file) : - d(new FileRefPrivate()) -{ - d->file = file; -} - -FileRef::FileRef(const FileRef &ref) : - d(ref.d) -{ - d->ref(); -} - -FileRef::~FileRef() -{ - if(d->deref()) - delete d; -} - -Tag *FileRef::tag() const -{ - if(isNull()) { - debug("FileRef::tag() - Called without a valid file."); - return 0; - } - return d->file->tag(); -} - -AudioProperties *FileRef::audioProperties() const -{ - if(isNull()) { - debug("FileRef::audioProperties() - Called without a valid file."); - return 0; - } - return d->file->audioProperties(); -} - -File *FileRef::file() const -{ - return d->file; -} - -bool FileRef::save() -{ - if(isNull()) { - debug("FileRef::save() - Called without a valid file."); - return false; - } - return d->file->save(); -} - -const FileRef::FileTypeResolver *FileRef::addFileTypeResolver(const FileRef::FileTypeResolver *resolver) // static -{ - fileTypeResolvers.prepend(resolver); - return resolver; -} - -StringList FileRef::defaultFileExtensions() -{ - StringList l; - - l.append("ogg"); - l.append("flac"); - l.append("oga"); - l.append("mp3"); - l.append("mpc"); - l.append("wv"); - l.append("spx"); - l.append("tta"); - l.append("m4a"); - l.append("m4r"); - l.append("m4b"); - l.append("m4p"); - l.append("3g2"); - l.append("mp4"); - l.append("m4v"); - l.append("wma"); - l.append("asf"); - l.append("aif"); - l.append("aiff"); - l.append("wav"); - l.append("ape"); - l.append("mod"); - l.append("module"); // alias for "mod" - l.append("nst"); // alias for "mod" - l.append("wow"); // alias for "mod" - l.append("s3m"); - l.append("it"); - l.append("xm"); - - return l; -} - -bool FileRef::isNull() const -{ - return (!d->file || !d->file->isValid()); -} - -FileRef &FileRef::operator=(const FileRef &ref) -{ - FileRef(ref).swap(*this); - return *this; -} - -void FileRef::swap(FileRef &ref) -{ - using std::swap; - - swap(d, ref.d); -} - -bool FileRef::operator==(const FileRef &ref) const -{ - return (ref.d->file == d->file); -} - -bool FileRef::operator!=(const FileRef &ref) const -{ - return (ref.d->file != d->file); -} - -File *FileRef::create(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) // static -{ - return createInternal(fileName, readAudioProperties, audioPropertiesStyle); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FileRef::parse(FileName fileName, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) -{ - // Try user-defined resolvers. - - d->file = detectByResolvers(fileName, readAudioProperties, audioPropertiesStyle); - if(d->file) - return; - - // Try to resolve file types based on the file extension. - - d->stream = new FileStream(fileName); - d->file = detectByExtension(d->stream, readAudioProperties, audioPropertiesStyle); - if(d->file) - return; - - // At last, try to resolve file types based on the actual content. - - d->file = detectByContent(d->stream, readAudioProperties, audioPropertiesStyle); - if(d->file) - return; - - // Stream have to be closed here if failed to resolve file types. - - delete d->stream; - d->stream = 0; -} - -void FileRef::parse(IOStream *stream, bool readAudioProperties, - AudioProperties::ReadStyle audioPropertiesStyle) -{ - // User-defined resolvers won't work with a stream. - - // Try to resolve file types based on the file extension. - - d->file = detectByExtension(stream, readAudioProperties, audioPropertiesStyle); - if(d->file) - return; - - // At last, try to resolve file types based on the actual content of the file. - - d->file = detectByContent(stream, readAudioProperties, audioPropertiesStyle); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.cpp deleted file mode 100755 index 7f4371943..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacfile.cpp +++ /dev/null @@ -1,575 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003-2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tlist.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include <id3v2header.h> -#include <id3v2tag.h> -#include <id3v1tag.h> -#include <xiphcomment.h> - -#include "flacpicture.h" -#include "flacfile.h" -#include "flacmetadatablock.h" -#include "flacunknownmetadatablock.h" - -using namespace TagLib; - -namespace -{ - typedef List<FLAC::MetadataBlock *> BlockList; - typedef BlockList::Iterator BlockIterator; - typedef BlockList::Iterator BlockConstIterator; - - enum { FlacXiphIndex = 0, FlacID3v2Index = 1, FlacID3v1Index = 2 }; - - const long MinPaddingLength = 4096; - const long MaxPaddingLegnth = 1024 * 1024; - - const char LastBlockFlag = '\x80'; -} - -class FLAC::File::FilePrivate -{ -public: - FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : - ID3v2FrameFactory(frameFactory), - ID3v2Location(-1), - ID3v2OriginalSize(0), - ID3v1Location(-1), - properties(0), - flacStart(0), - streamStart(0), - scanned(false) - { - blocks.setAutoDelete(true); - } - - ~FilePrivate() - { - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - long ID3v2Location; - long ID3v2OriginalSize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; - ByteVector xiphCommentData; - BlockList blocks; - - long flacStart; - long streamStart; - bool scanned; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool FLAC::File::isSupported(IOStream *stream) -{ - // A FLAC file has an ID "fLaC" somewhere. An ID3v2 tag may precede. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true); - return (buffer.find("fLaC") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FLAC::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -FLAC::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -FLAC::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -FLAC::File::~File() -{ - delete d; -} - -TagLib::Tag *FLAC::File::tag() const -{ - return &d->tag; -} - -PropertyMap FLAC::File::properties() const -{ - return d->tag.properties(); -} - -void FLAC::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag.removeUnsupportedProperties(unsupported); -} - -PropertyMap FLAC::File::setProperties(const PropertyMap &properties) -{ - return xiphComment(true)->setProperties(properties); -} - -FLAC::Properties *FLAC::File::audioProperties() const -{ - return d->properties; -} - -bool FLAC::File::save() -{ - if(readOnly()) { - debug("FLAC::File::save() - Cannot save to a read only file."); - return false; - } - - if(!isValid()) { - debug("FLAC::File::save() -- Trying to save invalid file."); - return false; - } - - // Create new vorbis comments - if(!hasXiphComment()) - Tag::duplicate(&d->tag, xiphComment(true), false); - - d->xiphCommentData = xiphComment()->render(false); - - // Replace metadata blocks - - for(BlockIterator it = d->blocks.begin(); it != d->blocks.end(); ++it) { - if((*it)->code() == MetadataBlock::VorbisComment) { - // Set the new Vorbis Comment block - delete *it; - d->blocks.erase(it); - break; - } - } - - d->blocks.append(new UnknownMetadataBlock(MetadataBlock::VorbisComment, d->xiphCommentData)); - - // Render data for the metadata blocks - - ByteVector data; - for(BlockConstIterator it = d->blocks.begin(); it != d->blocks.end(); ++it) { - ByteVector blockData = (*it)->render(); - ByteVector blockHeader = ByteVector::fromUInt(blockData.size()); - blockHeader[0] = (*it)->code(); - data.append(blockHeader); - data.append(blockData); - } - - // Compute the amount of padding, and append that to data. - - long originalLength = d->streamStart - d->flacStart; - long paddingLength = originalLength - data.size() - 4; - - if(paddingLength <= 0) { - paddingLength = MinPaddingLength; - } - else { - // Padding won't increase beyond 1% of the file size or 1MB. - - long threshold = length() / 100; - threshold = std::max(threshold, MinPaddingLength); - threshold = std::min(threshold, MaxPaddingLegnth); - - if(paddingLength > threshold) - paddingLength = MinPaddingLength; - } - - ByteVector paddingHeader = ByteVector::fromUInt(paddingLength); - paddingHeader[0] = static_cast<char>(MetadataBlock::Padding | LastBlockFlag); - data.append(paddingHeader); - data.resize(static_cast<unsigned int>(data.size() + paddingLength)); - - // Write the data to the file - - insert(data, d->flacStart, originalLength); - - d->streamStart += (static_cast<long>(data.size()) - originalLength); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - originalLength); - - // Update ID3 tags - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - - // ID3v2 tag is not empty. Update the old one or create a new one. - - if(d->ID3v2Location < 0) - d->ID3v2Location = 0; - - data = ID3v2Tag()->render(); - insert(data, d->ID3v2Location, d->ID3v2OriginalSize); - - d->flacStart += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - d->streamStart += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - - d->ID3v2OriginalSize = data.size(); - } - else { - - // ID3v2 tag is empty. Remove the old one. - - if(d->ID3v2Location >= 0) { - removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); - - d->flacStart -= d->ID3v2OriginalSize; - d->streamStart -= d->ID3v2OriginalSize; - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->ID3v2OriginalSize; - - d->ID3v2Location = -1; - d->ID3v2OriginalSize = 0; - } - } - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - if(d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - } - } - - return true; -} - -ID3v2::Tag *FLAC::File::ID3v2Tag(bool create) -{ - return d->tag.access<ID3v2::Tag>(FlacID3v2Index, create); -} - -ID3v1::Tag *FLAC::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(FlacID3v1Index, create); -} - -Ogg::XiphComment *FLAC::File::xiphComment(bool create) -{ - return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, create); -} - -void FLAC::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - -ByteVector FLAC::File::streamInfoData() -{ - debug("FLAC::File::streamInfoData() -- This function is obsolete. Returning an empty ByteVector."); - return ByteVector(); -} - -long FLAC::File::streamLength() -{ - debug("FLAC::File::streamLength() -- This function is obsolete. Returning zero."); - return 0; -} - -List<FLAC::Picture *> FLAC::File::pictureList() -{ - List<Picture *> pictures; - for(BlockConstIterator it = d->blocks.begin(); it != d->blocks.end(); ++it) { - Picture *picture = dynamic_cast<Picture *>(*it); - if(picture) { - pictures.append(picture); - } - } - return pictures; -} - -void FLAC::File::addPicture(Picture *picture) -{ - d->blocks.append(picture); -} - -void FLAC::File::removePicture(Picture *picture, bool del) -{ - BlockIterator it = d->blocks.find(picture); - if(it != d->blocks.end()) - d->blocks.erase(it); - - if(del) - delete picture; -} - -void FLAC::File::removePictures() -{ - for(BlockIterator it = d->blocks.begin(); it != d->blocks.end(); ) { - if(dynamic_cast<Picture *>(*it)) { - delete *it; - it = d->blocks.erase(it); - } - else { - ++it; - } - } -} - -void FLAC::File::strip(int tags) -{ - if(tags & ID3v1) - d->tag.set(FlacID3v1Index, 0); - - if(tags & ID3v2) - d->tag.set(FlacID3v2Index, 0); - - if(tags & XiphComment) { - xiphComment()->removeAllFields(); - xiphComment()->removeAllPictures(); - } -} - -bool FLAC::File::hasXiphComment() const -{ - return !d->xiphCommentData.isEmpty(); -} - -bool FLAC::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -bool FLAC::File::hasID3v2Tag() const -{ - return (d->ID3v2Location >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FLAC::File::read(bool readProperties) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = Utils::findID3v2(this); - - if(d->ID3v2Location >= 0) { - d->tag.set(FlacID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - } - - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(FlacID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - // Look for FLAC metadata, including vorbis comments - - scan(); - - if(!isValid()) - return; - - if(!d->xiphCommentData.isEmpty()) - d->tag.set(FlacXiphIndex, new Ogg::XiphComment(d->xiphCommentData)); - else - d->tag.set(FlacXiphIndex, new Ogg::XiphComment()); - - if(readProperties) { - - // First block should be the stream_info metadata - - const ByteVector infoData = d->blocks.front()->render(); - - long streamLength; - - if(d->ID3v1Location >= 0) - streamLength = d->ID3v1Location - d->streamStart; - else - streamLength = length() - d->streamStart; - - d->properties = new Properties(infoData, streamLength); - } -} - -void FLAC::File::scan() -{ - // Scan the metadata pages - - if(d->scanned) - return; - - if(!isValid()) - return; - - long nextBlockOffset; - - if(d->ID3v2Location >= 0) - nextBlockOffset = find("fLaC", d->ID3v2Location + d->ID3v2OriginalSize); - else - nextBlockOffset = find("fLaC"); - - if(nextBlockOffset < 0) { - debug("FLAC::File::scan() -- FLAC stream not found"); - setValid(false); - return; - } - - nextBlockOffset += 4; - d->flacStart = nextBlockOffset; - - while(true) { - - seek(nextBlockOffset); - const ByteVector header = readBlock(4); - - // Header format (from spec): - // <1> Last-metadata-block flag - // <7> BLOCK_TYPE - // 0 : STREAMINFO - // 1 : PADDING - // .. - // 4 : VORBIS_COMMENT - // .. - // 6 : PICTURE - // .. - // <24> Length of metadata to follow - - const char blockType = header[0] & ~LastBlockFlag; - const bool isLastBlock = (header[0] & LastBlockFlag) != 0; - const unsigned int blockLength = header.toUInt(1U, 3U); - - // First block should be the stream_info metadata - - if(d->blocks.isEmpty() && blockType != MetadataBlock::StreamInfo) { - debug("FLAC::File::scan() -- First block should be the stream_info metadata"); - setValid(false); - return; - } - - if(blockLength == 0 - && blockType != MetadataBlock::Padding && blockType != MetadataBlock::SeekTable) - { - debug("FLAC::File::scan() -- Zero-sized metadata block found"); - setValid(false); - return; - } - - const ByteVector data = readBlock(blockLength); - if(data.size() != blockLength) { - debug("FLAC::File::scan() -- Failed to read a metadata block"); - setValid(false); - return; - } - - MetadataBlock *block = 0; - - // Found the vorbis-comment - if(blockType == MetadataBlock::VorbisComment) { - if(d->xiphCommentData.isEmpty()) { - d->xiphCommentData = data; - block = new UnknownMetadataBlock(MetadataBlock::VorbisComment, data); - } - else { - debug("FLAC::File::scan() -- multiple Vorbis Comment blocks found, discarding"); - } - } - else if(blockType == MetadataBlock::Picture) { - FLAC::Picture *picture = new FLAC::Picture(); - if(picture->parse(data)) { - block = picture; - } - else { - debug("FLAC::File::scan() -- invalid picture found, discarding"); - delete picture; - } - } - else if(blockType == MetadataBlock::Padding) { - // Skip all padding blocks. - } - else { - block = new UnknownMetadataBlock(blockType, data); - } - - if(block) - d->blocks.append(block); - - nextBlockOffset += blockLength + 4; - - if(isLastBlock) - break; - } - - // End of metadata, now comes the datastream - - d->streamStart = nextBlockOffset; - - d->scanned = true; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacmetadatablock.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacmetadatablock.cpp deleted file mode 100755 index 17ab05f37..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacmetadatablock.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "flacmetadatablock.h" - -using namespace TagLib; - -class FLAC::MetadataBlock::MetadataBlockPrivate -{ -public: - MetadataBlockPrivate() {} - -}; - -FLAC::MetadataBlock::MetadataBlock() -{ - d = 0; -} - -FLAC::MetadataBlock::~MetadataBlock() -{ -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacpicture.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacpicture.cpp deleted file mode 100755 index ec07ad140..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacpicture.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "flacpicture.h" - -using namespace TagLib; - -class FLAC::Picture::PicturePrivate -{ -public: - PicturePrivate() : - type(FLAC::Picture::Other), - width(0), - height(0), - colorDepth(0), - numColors(0) - {} - - Type type; - String mimeType; - String description; - int width; - int height; - int colorDepth; - int numColors; - ByteVector data; -}; - -FLAC::Picture::Picture() : - d(new PicturePrivate()) -{ -} - -FLAC::Picture::Picture(const ByteVector &data) : - d(new PicturePrivate()) -{ - parse(data); -} - -FLAC::Picture::~Picture() -{ - delete d; -} - -int FLAC::Picture::code() const -{ - return FLAC::MetadataBlock::Picture; -} - -bool FLAC::Picture::parse(const ByteVector &data) -{ - if(data.size() < 32) { - debug("A picture block must contain at least 5 bytes."); - return false; - } - - unsigned int pos = 0; - d->type = FLAC::Picture::Type(data.toUInt(pos)); - pos += 4; - unsigned int mimeTypeLength = data.toUInt(pos); - pos += 4; - if(pos + mimeTypeLength + 24 > data.size()) { - debug("Invalid picture block."); - return false; - } - d->mimeType = String(data.mid(pos, mimeTypeLength), String::UTF8); - pos += mimeTypeLength; - unsigned int descriptionLength = data.toUInt(pos); - pos += 4; - if(pos + descriptionLength + 20 > data.size()) { - debug("Invalid picture block."); - return false; - } - d->description = String(data.mid(pos, descriptionLength), String::UTF8); - pos += descriptionLength; - d->width = data.toUInt(pos); - pos += 4; - d->height = data.toUInt(pos); - pos += 4; - d->colorDepth = data.toUInt(pos); - pos += 4; - d->numColors = data.toUInt(pos); - pos += 4; - unsigned int dataLength = data.toUInt(pos); - pos += 4; - if(pos + dataLength > data.size()) { - debug("Invalid picture block."); - return false; - } - d->data = data.mid(pos, dataLength); - - return true; -} - -ByteVector FLAC::Picture::render() const -{ - ByteVector result; - result.append(ByteVector::fromUInt(d->type)); - ByteVector mimeTypeData = d->mimeType.data(String::UTF8); - result.append(ByteVector::fromUInt(mimeTypeData.size())); - result.append(mimeTypeData); - ByteVector descriptionData = d->description.data(String::UTF8); - result.append(ByteVector::fromUInt(descriptionData.size())); - result.append(descriptionData); - result.append(ByteVector::fromUInt(d->width)); - result.append(ByteVector::fromUInt(d->height)); - result.append(ByteVector::fromUInt(d->colorDepth)); - result.append(ByteVector::fromUInt(d->numColors)); - result.append(ByteVector::fromUInt(d->data.size())); - result.append(d->data); - return result; -} - -FLAC::Picture::Type FLAC::Picture::type() const -{ - return d->type; -} - -void FLAC::Picture::setType(FLAC::Picture::Type type) -{ - d->type = type; -} - -String FLAC::Picture::mimeType() const -{ - return d->mimeType; -} - -void FLAC::Picture::setMimeType(const String &mimeType) -{ - d->mimeType = mimeType; -} - -String FLAC::Picture::description() const -{ - return d->description; -} - -void FLAC::Picture::setDescription(const String &description) -{ - d->description = description; -} - -int FLAC::Picture::width() const -{ - return d->width; -} - -void FLAC::Picture::setWidth(int width) -{ - d->width = width; -} - -int FLAC::Picture::height() const -{ - return d->height; -} - -void FLAC::Picture::setHeight(int height) -{ - d->height = height; -} - -int FLAC::Picture::colorDepth() const -{ - return d->colorDepth; -} - -void FLAC::Picture::setColorDepth(int colorDepth) -{ - d->colorDepth = colorDepth; -} - -int FLAC::Picture::numColors() const -{ - return d->numColors; -} - -void FLAC::Picture::setNumColors(int numColors) -{ - d->numColors = numColors; -} - -ByteVector FLAC::Picture::data() const -{ - return d->data; -} - -void FLAC::Picture::setData(const ByteVector &data) -{ - d->data = data; -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.cpp deleted file mode 100755 index b947f039b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacproperties.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include "flacproperties.h" -#include "flacfile.h" - -using namespace TagLib; - -class FLAC::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - bitsPerSample(0), - channels(0), - sampleFrames(0) {} - - int length; - int bitrate; - int sampleRate; - int bitsPerSample; - int channels; - unsigned long long sampleFrames; - ByteVector signature; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FLAC::Properties::Properties(ByteVector data, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(data, streamLength); -} - -FLAC::Properties::Properties(File *, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("FLAC::Properties::Properties() - This constructor is no longer used."); -} - -FLAC::Properties::~Properties() -{ - delete d; -} - -int FLAC::Properties::length() const -{ - return lengthInSeconds(); -} - -int FLAC::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int FLAC::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int FLAC::Properties::bitrate() const -{ - return d->bitrate; -} - -int FLAC::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int FLAC::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -int FLAC::Properties::sampleWidth() const -{ - return bitsPerSample(); -} - -int FLAC::Properties::channels() const -{ - return d->channels; -} - -unsigned long long FLAC::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -ByteVector FLAC::Properties::signature() const -{ - return d->signature; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void FLAC::Properties::read(const ByteVector &data, long streamLength) -{ - if(data.size() < 18) { - debug("FLAC::Properties::read() - FLAC properties must contain at least 18 bytes."); - return; - } - - unsigned int pos = 0; - - // Minimum block size (in samples) - pos += 2; - - // Maximum block size (in samples) - pos += 2; - - // Minimum frame size (in bytes) - pos += 3; - - // Maximum frame size (in bytes) - pos += 3; - - const unsigned int flags = data.toUInt(pos, true); - pos += 4; - - d->sampleRate = flags >> 12; - d->channels = ((flags >> 9) & 7) + 1; - d->bitsPerSample = ((flags >> 4) & 31) + 1; - - // The last 4 bits are the most significant 4 bits for the 36 bit - // stream length in samples. (Audio files measured in days) - - const unsigned long long hi = flags & 0xf; - const unsigned long long lo = data.toUInt(pos, true); - pos += 4; - - d->sampleFrames = (hi << 32) | lo; - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } - - if(data.size() >= pos + 16) - d->signature = data.mid(pos, 16); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.cpp deleted file mode 100755 index f9cf6e658..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include <tstring.h> -#include "flacunknownmetadatablock.h" - -using namespace TagLib; - -class FLAC::UnknownMetadataBlock::UnknownMetadataBlockPrivate -{ -public: - UnknownMetadataBlockPrivate() : code(0) {} - - int code; - ByteVector data; -}; - -FLAC::UnknownMetadataBlock::UnknownMetadataBlock(int code, const ByteVector &data) : - d(new UnknownMetadataBlockPrivate()) -{ - d->code = code; - d->data = data; -} - -FLAC::UnknownMetadataBlock::~UnknownMetadataBlock() -{ - delete d; -} - -int FLAC::UnknownMetadataBlock::code() const -{ - return d->code; -} - -void FLAC::UnknownMetadataBlock::setCode(int code) -{ - d->code = code; -} - -ByteVector FLAC::UnknownMetadataBlock::data() const -{ - return d->data; -} - -void FLAC::UnknownMetadataBlock::setData(const ByteVector &data) -{ - d->data = data; -} - -ByteVector FLAC::UnknownMetadataBlock::render() const -{ - return d->data; -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.h deleted file mode 100755 index 3030254e3..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/flac/flacunknownmetadatablock.h +++ /dev/null @@ -1,81 +0,0 @@ -/************************************************************************** - copyright : (C) 2010 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_FLACUNKNOWNMETADATABLOCK_H -#define TAGLIB_FLACUNKNOWNMETADATABLOCK_H - -#include "tlist.h" -#include "tbytevector.h" -#include "taglib_export.h" -#include "flacmetadatablock.h" - -namespace TagLib { - - namespace FLAC { - - class TAGLIB_EXPORT UnknownMetadataBlock : public MetadataBlock - { - public: - UnknownMetadataBlock(int blockType, const ByteVector &data); - ~UnknownMetadataBlock(); - - /*! - * Returns the FLAC metadata block type. - */ - int code() const; - - /*! - * Sets the FLAC metadata block type. - */ - void setCode(int code); - - /*! - * Returns the FLAC metadata block type. - */ - ByteVector data() const; - - /*! - * Sets the FLAC metadata block type. - */ - void setData(const ByteVector &data); - - /*! - * Render the content of the block. - */ - ByteVector render() const; - - private: - UnknownMetadataBlock(const MetadataBlock &item); - UnknownMetadataBlock &operator=(const MetadataBlock &item); - - class UnknownMetadataBlockPrivate; - UnknownMetadataBlockPrivate *d; - }; - - } - -} - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itfile.cpp deleted file mode 100755 index 3b35f0d8b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itfile.cpp +++ /dev/null @@ -1,335 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "tstringlist.h" -#include "itfile.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace IT; - -class IT::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : tag(), properties(propertiesStyle) - { - } - - Mod::Tag tag; - IT::Properties properties; -}; - -IT::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -IT::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -IT::File::~File() -{ - delete d; -} - -Mod::Tag *IT::File::tag() const -{ - return &d->tag; -} - -PropertyMap IT::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap IT::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -IT::Properties *IT::File::audioProperties() const -{ - return &d->properties; -} - -bool IT::File::save() -{ - if(readOnly()) - { - debug("IT::File::save() - Cannot save to a read only file."); - return false; - } - seek(4); - writeString(d->tag.title(), 25); - writeByte(0); - - seek(2, Current); - - unsigned short length = 0; - unsigned short instrumentCount = 0; - unsigned short sampleCount = 0; - - if(!readU16L(length) || !readU16L(instrumentCount) || !readU16L(sampleCount)) - return false; - - seek(15, Current); - - // write comment as instrument and sample names: - StringList lines = d->tag.comment().split("\n"); - for(unsigned short i = 0; i < instrumentCount; ++ i) { - seek(192L + length + ((long)i << 2)); - unsigned long instrumentOffset = 0; - if(!readU32L(instrumentOffset)) - return false; - - seek(instrumentOffset + 32); - - if(i < lines.size()) - writeString(lines[i], 25); - else - writeString(String(), 25); - writeByte(0); - } - - for(unsigned short i = 0; i < sampleCount; ++ i) { - seek(192L + length + ((long)instrumentCount << 2) + ((long)i << 2)); - unsigned long sampleOffset = 0; - if(!readU32L(sampleOffset)) - return false; - - seek(sampleOffset + 20); - - if((unsigned int)(i + instrumentCount) < lines.size()) - writeString(lines[i + instrumentCount], 25); - else - writeString(String(), 25); - writeByte(0); - } - - // write rest as message: - StringList messageLines; - for(unsigned int i = instrumentCount + sampleCount; i < lines.size(); ++ i) - messageLines.append(lines[i]); - ByteVector message = messageLines.toString("\r").data(String::Latin1); - - // it's actually not really stated if the message needs a - // terminating NUL but it does not hurt to add one: - if(message.size() > 7999) - message.resize(7999); - message.append((char)0); - - unsigned short special = 0; - unsigned short messageLength = 0; - unsigned long messageOffset = 0; - - seek(46); - if(!readU16L(special)) - return false; - - unsigned long fileSize = File::length(); - if(special & Properties::MessageAttached) { - seek(54); - if(!readU16L(messageLength) || !readU32L(messageOffset)) - return false; - - if(messageLength == 0) - messageOffset = fileSize; - } - else - { - messageOffset = fileSize; - seek(46); - writeU16L(special | 0x1); - } - - if(messageOffset + messageLength >= fileSize) { - // append new message - seek(54); - writeU16L(message.size()); - writeU32L(messageOffset); - seek(messageOffset); - writeBlock(message); - truncate(messageOffset + message.size()); - } - else { - // Only overwrite existing message. - // I'd need to parse (understand!) the whole file for more. - // Although I could just move the message to the end of file - // and let the existing one be, but that would waste space. - message.resize(messageLength, 0); - seek(messageOffset); - writeBlock(message); - } - return true; -} - -void IT::File::read(bool) -{ - if(!isOpen()) - return; - - seek(0); - READ_ASSERT(readBlock(4) == "IMPM"); - READ_STRING(d->tag.setTitle, 26); - - seek(2, Current); - - READ_U16L_AS(length); - READ_U16L_AS(instrumentCount); - READ_U16L_AS(sampleCount); - - d->properties.setInstrumentCount(instrumentCount); - d->properties.setSampleCount(sampleCount); - READ_U16L(d->properties.setPatternCount); - READ_U16L(d->properties.setVersion); - READ_U16L(d->properties.setCompatibleVersion); - READ_U16L(d->properties.setFlags); - READ_U16L_AS(special); - d->properties.setSpecial(special); - READ_BYTE(d->properties.setGlobalVolume); - READ_BYTE(d->properties.setMixVolume); - READ_BYTE(d->properties.setBpmSpeed); - READ_BYTE(d->properties.setTempo); - READ_BYTE(d->properties.setPanningSeparation); - READ_BYTE(d->properties.setPitchWheelDepth); - - // IT supports some kind of comment tag. Still, the - // sample/instrument names are abused as comments so - // I just add all together. - String message; - if(special & Properties::MessageAttached) { - READ_U16L_AS(messageLength); - READ_U32L_AS(messageOffset); - seek(messageOffset); - ByteVector messageBytes = readBlock(messageLength); - READ_ASSERT(messageBytes.size() == messageLength); - int index = messageBytes.find((char) 0); - if(index > -1) - messageBytes.resize(index, 0); - messageBytes.replace('\r', '\n'); - message = messageBytes; - } - - seek(64); - - ByteVector pannings = readBlock(64); - ByteVector volumes = readBlock(64); - READ_ASSERT(pannings.size() == 64 && volumes.size() == 64); - int channels = 0; - for(int i = 0; i < 64; ++ i) { - // Strictly speaking an IT file has always 64 channels, but - // I don't count disabled and muted channels. - // But this always gives 64 channels for all my files anyway. - // Strangely VLC does report other values. I wonder how VLC - // gets it's values. - if((unsigned char) pannings[i] < 128 && volumes[i] > 0) - ++channels; - } - d->properties.setChannels(channels); - - // real length might be shorter because of skips and terminator - unsigned short realLength = 0; - for(unsigned short i = 0; i < length; ++ i) { - READ_BYTE_AS(order); - if(order == 255) break; - if(order != 254) ++ realLength; - } - d->properties.setLengthInPatterns(realLength); - - StringList comment; - // Note: I found files that have nil characters somewhere - // in the instrument/sample names and more characters - // afterwards. The spec does not mention such a case. - // Currently I just discard anything after a nil, but - // e.g. VLC seems to interpret a nil as a space. I - // don't know what is the proper behaviour. - for(unsigned short i = 0; i < instrumentCount; ++ i) { - seek(192L + length + ((long)i << 2)); - READ_U32L_AS(instrumentOffset); - seek(instrumentOffset); - - ByteVector instrumentMagic = readBlock(4); - READ_ASSERT(instrumentMagic == "IMPI"); - - READ_STRING_AS(dosFileName, 13); - - seek(15, Current); - - READ_STRING_AS(instrumentName, 26); - comment.append(instrumentName); - } - - for(unsigned short i = 0; i < sampleCount; ++ i) { - seek(192L + length + ((long)instrumentCount << 2) + ((long)i << 2)); - READ_U32L_AS(sampleOffset); - - seek(sampleOffset); - - ByteVector sampleMagic = readBlock(4); - READ_ASSERT(sampleMagic == "IMPS"); - - READ_STRING_AS(dosFileName, 13); - READ_BYTE_AS(globalVolume); - READ_BYTE_AS(sampleFlags); - READ_BYTE_AS(sampleVolume); - READ_STRING_AS(sampleName, 26); - /* - READ_BYTE_AS(sampleCvt); - READ_BYTE_AS(samplePanning); - READ_U32L_AS(sampleLength); - READ_U32L_AS(loopStart); - READ_U32L_AS(loopStop); - READ_U32L_AS(c5speed); - READ_U32L_AS(sustainLoopStart); - READ_U32L_AS(sustainLoopEnd); - READ_U32L_AS(sampleDataOffset); - READ_BYTE_AS(vibratoSpeed); - READ_BYTE_AS(vibratoDepth); - READ_BYTE_AS(vibratoRate); - READ_BYTE_AS(vibratoType); - */ - - comment.append(sampleName); - } - - if(message.size() > 0) - comment.append(message); - d->tag.setComment(comment.toString("\n")); - d->tag.setTrackerName("Impulse Tracker"); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itproperties.cpp deleted file mode 100755 index c317b660e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/it/itproperties.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/*************************************************************************** - copyright :(C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "itproperties.h" - -using namespace TagLib; -using namespace IT; - -class IT::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - channels(0), - lengthInPatterns(0), - instrumentCount(0), - sampleCount(0), - patternCount(0), - version(0), - compatibleVersion(0), - flags(0), - special(0), - globalVolume(0), - mixVolume(0), - tempo(0), - bpmSpeed(0), - panningSeparation(0), - pitchWheelDepth(0) - { - } - - int channels; - unsigned short lengthInPatterns; - unsigned short instrumentCount; - unsigned short sampleCount; - unsigned short patternCount; - unsigned short version; - unsigned short compatibleVersion; - unsigned short flags; - unsigned short special; - unsigned char globalVolume; - unsigned char mixVolume; - unsigned char tempo; - unsigned char bpmSpeed; - unsigned char panningSeparation; - unsigned char pitchWheelDepth; -}; - -IT::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate()) -{ -} - -IT::Properties::~Properties() -{ - delete d; -} - -int IT::Properties::length() const -{ - return 0; -} - -int IT::Properties::lengthInSeconds() const -{ - return 0; -} - -int IT::Properties::lengthInMilliseconds() const -{ - return 0; -} - -int IT::Properties::bitrate() const -{ - return 0; -} - -int IT::Properties::sampleRate() const -{ - return 0; -} - -int IT::Properties::channels() const -{ - return d->channels; -} - -unsigned short IT::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -bool IT::Properties::stereo() const -{ - return d->flags & Stereo; -} - -unsigned short IT::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -unsigned short IT::Properties::sampleCount() const -{ - return d->sampleCount; -} - -unsigned short IT::Properties::patternCount() const -{ - return d->patternCount; -} - -unsigned short IT::Properties::version() const -{ - return d->version; -} - -unsigned short IT::Properties::compatibleVersion() const -{ - return d->compatibleVersion; -} - -unsigned short IT::Properties::flags() const -{ - return d->flags; -} - -unsigned short IT::Properties::special() const -{ - return d->special; -} - -unsigned char IT::Properties::globalVolume() const -{ - return d->globalVolume; -} - -unsigned char IT::Properties::mixVolume() const -{ - return d->mixVolume; -} - -unsigned char IT::Properties::tempo() const -{ - return d->tempo; -} - -unsigned char IT::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -unsigned char IT::Properties::panningSeparation() const -{ - return d->panningSeparation; -} - -unsigned char IT::Properties::pitchWheelDepth() const -{ - return d->pitchWheelDepth; -} - -void IT::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void IT::Properties::setLengthInPatterns(unsigned short lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void IT::Properties::setInstrumentCount(unsigned short instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void IT::Properties::setSampleCount(unsigned short sampleCount) -{ - d->sampleCount = sampleCount; -} - -void IT::Properties::setPatternCount(unsigned short patternCount) -{ - d->patternCount = patternCount; -} - -void IT::Properties::setFlags(unsigned short flags) -{ - d->flags = flags; -} - -void IT::Properties::setSpecial(unsigned short special) -{ - d->special = special; -} - -void IT::Properties::setCompatibleVersion(unsigned short compatibleVersion) -{ - d->compatibleVersion = compatibleVersion; -} - -void IT::Properties::setVersion(unsigned short version) -{ - d->version = version; -} - -void IT::Properties::setGlobalVolume(unsigned char globalVolume) -{ - d->globalVolume = globalVolume; -} - -void IT::Properties::setMixVolume(unsigned char mixVolume) -{ - d->mixVolume = mixVolume; -} - -void IT::Properties::setTempo(unsigned char tempo) -{ - d->tempo = tempo; -} - -void IT::Properties::setBpmSpeed(unsigned char bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} - -void IT::Properties::setPanningSeparation(unsigned char panningSeparation) -{ - d->panningSeparation = panningSeparation; -} - -void IT::Properties::setPitchWheelDepth(unsigned char pitchWheelDepth) -{ - d->pitchWheelDepth = pitchWheelDepth; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfile.cpp deleted file mode 100755 index 00d330ebd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfile.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "modfile.h" -#include "tstringlist.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : properties(propertiesStyle) - { - } - - Mod::Tag tag; - Mod::Properties properties; -}; - -Mod::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -Mod::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -Mod::File::~File() -{ - delete d; -} - -Mod::Tag *Mod::File::tag() const -{ - return &d->tag; -} - -Mod::Properties *Mod::File::audioProperties() const -{ - return &d->properties; -} - -PropertyMap Mod::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap Mod::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -bool Mod::File::save() -{ - if(readOnly()) { - debug("Mod::File::save() - Cannot save to a read only file."); - return false; - } - seek(0); - writeString(d->tag.title(), 20); - StringList lines = d->tag.comment().split("\n"); - unsigned int n = std::min(lines.size(), d->properties.instrumentCount()); - for(unsigned int i = 0; i < n; ++ i) { - writeString(lines[i], 22); - seek(8, Current); - } - - for(unsigned int i = n; i < d->properties.instrumentCount(); ++ i) { - writeString(String(), 22); - seek(8, Current); - } - return true; -} - -void Mod::File::read(bool) -{ - if(!isOpen()) - return; - - seek(1080); - ByteVector modId = readBlock(4); - READ_ASSERT(modId.size() == 4); - - int channels = 4; - unsigned int instruments = 31; - if(modId == "M.K." || modId == "M!K!" || modId == "M&K!" || modId == "N.T.") { - d->tag.setTrackerName("ProTracker"); - channels = 4; - } - else if(modId.startsWith("FLT") || modId.startsWith("TDZ")) { - d->tag.setTrackerName("StarTrekker"); - char digit = modId[3]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = digit - '0'; - } - else if(modId.endsWith("CHN")) { - d->tag.setTrackerName("StarTrekker"); - char digit = modId[0]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = digit - '0'; - } - else if(modId == "CD81" || modId == "OKTA") { - d->tag.setTrackerName("Atari Oktalyzer"); - channels = 8; - } - else if(modId.endsWith("CH") || modId.endsWith("CN")) { - d->tag.setTrackerName("TakeTracker"); - char digit = modId[0]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels = (digit - '0') * 10; - digit = modId[1]; - READ_ASSERT(digit >= '0' && digit <= '9'); - channels += digit - '0'; - } - else { - // Not sure if this is correct. I'd need a file - // created with NoiseTracker to check this. - d->tag.setTrackerName("NoiseTracker"); // probably - channels = 4; - instruments = 15; - } - d->properties.setChannels(channels); - d->properties.setInstrumentCount(instruments); - - seek(0); - READ_STRING(d->tag.setTitle, 20); - - StringList comment; - for(unsigned int i = 0; i < instruments; ++ i) { - READ_STRING_AS(instrumentName, 22); - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(sampleLength); - - READ_BYTE_AS(fineTuneByte); - int fineTune = fineTuneByte & 0xF; - // > 7 means negative value - if(fineTune > 7) fineTune -= 16; - - READ_BYTE_AS(volume); - if(volume > 64) volume = 64; - // volume in decibels: 20 * log10(volume / 64) - - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(repeatStart); - // value in words, * 2 (<< 1) for bytes: - READ_U16B_AS(repatLength); - - comment.append(instrumentName); - } - - READ_BYTE(d->properties.setLengthInPatterns); - - d->tag.setComment(comment.toString("\n")); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfilebase.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfilebase.cpp deleted file mode 100755 index 142f669ff..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfilebase.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "tdebug.h" -#include "modfilebase.h" - -using namespace TagLib; -using namespace Mod; - -Mod::FileBase::FileBase(FileName file) : TagLib::File(file) -{ -} - -Mod::FileBase::FileBase(IOStream *stream) : TagLib::File(stream) -{ -} - -void Mod::FileBase::writeString(const String &s, unsigned long size, char padding) -{ - ByteVector data(s.data(String::Latin1)); - data.resize(size, padding); - writeBlock(data); -} - -bool Mod::FileBase::readString(String &s, unsigned long size) -{ - ByteVector data(readBlock(size)); - if(data.size() < size) return false; - int index = data.find((char) 0); - if(index > -1) - { - data.resize(index); - } - data.replace('\xff', ' '); - - s = data; - return true; -} - -void Mod::FileBase::writeByte(unsigned char byte) -{ - ByteVector data(1, byte); - writeBlock(data); -} - -void Mod::FileBase::writeU16L(unsigned short number) -{ - writeBlock(ByteVector::fromShort(number, false)); -} - -void Mod::FileBase::writeU32L(unsigned long number) -{ - writeBlock(ByteVector::fromUInt(number, false)); -} - -void Mod::FileBase::writeU16B(unsigned short number) -{ - writeBlock(ByteVector::fromShort(number, true)); -} - -void Mod::FileBase::writeU32B(unsigned long number) -{ - writeBlock(ByteVector::fromUInt(number, true)); -} - -bool Mod::FileBase::readByte(unsigned char &byte) -{ - ByteVector data(readBlock(1)); - if(data.size() < 1) return false; - byte = data[0]; - return true; -} - -bool Mod::FileBase::readU16L(unsigned short &number) -{ - ByteVector data(readBlock(2)); - if(data.size() < 2) return false; - number = data.toUShort(false); - return true; -} - -bool Mod::FileBase::readU32L(unsigned long &number) { - ByteVector data(readBlock(4)); - if(data.size() < 4) return false; - number = data.toUInt(false); - return true; -} - -bool Mod::FileBase::readU16B(unsigned short &number) -{ - ByteVector data(readBlock(2)); - if(data.size() < 2) return false; - number = data.toUShort(true); - return true; -} - -bool Mod::FileBase::readU32B(unsigned long &number) { - ByteVector data(readBlock(4)); - if(data.size() < 4) return false; - number = data.toUInt(true); - return true; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfileprivate.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfileprivate.h deleted file mode 100755 index 781db74c9..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modfileprivate.h +++ /dev/null @@ -1,67 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * - * MA 02110-1301 USA * - ***************************************************************************/ - -#ifndef TAGLIB_MODFILEPRIVATE_H -#define TAGLIB_MODFILEPRIVATE_H - -// some helper-macros only used internally by (s3m|it|xm)file.cpp -#define READ_ASSERT(cond) \ - if(!(cond)) \ - { \ - setValid(false); \ - return; \ - } - -#define READ(setter,type,read) \ - { \ - type number; \ - READ_ASSERT(read(number)); \ - setter(number); \ - } - -#define READ_BYTE(setter) READ(setter,unsigned char,readByte) -#define READ_U16L(setter) READ(setter,unsigned short,readU16L) -#define READ_U32L(setter) READ(setter,unsigned long,readU32L) -#define READ_U16B(setter) READ(setter,unsigned short,readU16B) -#define READ_U32B(setter) READ(setter,unsigned long,readU32B) - -#define READ_STRING(setter,size) \ - { \ - String s; \ - READ_ASSERT(readString(s, size)); \ - setter(s); \ - } - -#define READ_AS(type,name,read) \ - type name = 0; \ - READ_ASSERT(read(name)); - -#define READ_BYTE_AS(name) READ_AS(unsigned char,name,readByte) -#define READ_U16L_AS(name) READ_AS(unsigned short,name,readU16L) -#define READ_U32L_AS(name) READ_AS(unsigned long,name,readU32L) -#define READ_U16B_AS(name) READ_AS(unsigned short,name,readU16B) -#define READ_U32B_AS(name) READ_AS(unsigned long,name,readU32B) - -#define READ_STRING_AS(name,size) \ - String name; \ - READ_ASSERT(readString(name, size)); - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modproperties.cpp deleted file mode 100755 index c6bf39475..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modproperties.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "modproperties.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - channels(0), - instrumentCount(0), - lengthInPatterns(0) - { - } - - int channels; - unsigned int instrumentCount; - unsigned char lengthInPatterns; -}; - -Mod::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate()) -{ -} - -Mod::Properties::~Properties() -{ - delete d; -} - -int Mod::Properties::length() const -{ - return 0; -} - -int Mod::Properties::lengthInSeconds() const -{ - return 0; -} - -int Mod::Properties::lengthInMilliseconds() const -{ - return 0; -} - -int Mod::Properties::bitrate() const -{ - return 0; -} - -int Mod::Properties::sampleRate() const -{ - return 0; -} - -int Mod::Properties::channels() const -{ - return d->channels; -} - -unsigned int Mod::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -unsigned char Mod::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -void Mod::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void Mod::Properties::setInstrumentCount(unsigned int instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void Mod::Properties::setLengthInPatterns(unsigned char lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modtag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modtag.cpp deleted file mode 100755 index 0e8d03719..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mod/modtag.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "modtag.h" -#include "tstringlist.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace Mod; - -class Mod::Tag::TagPrivate -{ -public: - TagPrivate() - { - } - - String title; - String comment; - String trackerName; -}; - -Mod::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ -} - -Mod::Tag::~Tag() -{ - delete d; -} - -String Mod::Tag::title() const -{ - return d->title; -} - -String Mod::Tag::artist() const -{ - return String(); -} - -String Mod::Tag::album() const -{ - return String(); -} - -String Mod::Tag::comment() const -{ - return d->comment; -} - -String Mod::Tag::genre() const -{ - return String(); -} - -unsigned int Mod::Tag::year() const -{ - return 0; -} - -unsigned int Mod::Tag::track() const -{ - return 0; -} - -String Mod::Tag::trackerName() const -{ - return d->trackerName; -} - -void Mod::Tag::setTitle(const String &title) -{ - d->title = title; -} - -void Mod::Tag::setArtist(const String &) -{ -} - -void Mod::Tag::setAlbum(const String &) -{ -} - -void Mod::Tag::setComment(const String &comment) -{ - d->comment = comment; -} - -void Mod::Tag::setGenre(const String &) -{ -} - -void Mod::Tag::setYear(unsigned int) -{ -} - -void Mod::Tag::setTrack(unsigned int) -{ -} - -void Mod::Tag::setTrackerName(const String &trackerName) -{ - d->trackerName = trackerName; -} - -PropertyMap Mod::Tag::properties() const -{ - PropertyMap properties; - properties["TITLE"] = d->title; - properties["COMMENT"] = d->comment; - if(!(d->trackerName.isEmpty())) - properties["TRACKERNAME"] = d->trackerName; - return properties; -} - -PropertyMap Mod::Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); - properties.removeEmpty(); - StringList oneValueSet; - if(properties.contains("TITLE")) { - d->title = properties["TITLE"].front(); - oneValueSet.append("TITLE"); - } else - d->title.clear(); - - if(properties.contains("COMMENT")) { - d->comment = properties["COMMENT"].front(); - oneValueSet.append("COMMENT"); - } else - d->comment.clear(); - - if(properties.contains("TRACKERNAME")) { - d->trackerName = properties["TRACKERNAME"].front(); - oneValueSet.append("TRACKERNAME"); - } else - d->trackerName.clear(); - - // for each tag that has been set above, remove the first entry in the corresponding - // value list. The others will be returned as unsupported by this format. - for(StringList::ConstIterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { - if(properties[*it].size() == 1) - properties.erase(*it); - else - properties[*it].erase( properties[*it].begin() ); - } - return properties; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.cpp deleted file mode 100755 index 20709212e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4atom.cpp +++ /dev/null @@ -1,197 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <climits> - -#include <tdebug.h> -#include <tstring.h> -#include "mp4atom.h" - -using namespace TagLib; - -const char *MP4::Atom::containers[11] = { - "moov", "udta", "mdia", "meta", "ilst", - "stbl", "minf", "moof", "traf", "trak", - "stsd" -}; - -MP4::Atom::Atom(File *file) -{ - children.setAutoDelete(true); - - offset = file->tell(); - ByteVector header = file->readBlock(8); - if(header.size() != 8) { - // The atom header must be 8 bytes long, otherwise there is either - // trailing garbage or the file is truncated - debug("MP4: Couldn't read 8 bytes of data for atom header"); - length = 0; - file->seek(0, File::End); - return; - } - - length = header.toUInt(); - - if(length == 0) { - // The last atom which extends to the end of the file. - length = file->length() - offset; - } - else if(length == 1) { - // The atom has a 64-bit length. - const long long longLength = file->readBlock(8).toLongLong(); - if(longLength <= LONG_MAX) { - // The actual length fits in long. That's always the case if long is 64-bit. - length = static_cast<long>(longLength); - } - else { - debug("MP4: 64-bit atoms are not supported"); - length = 0; - file->seek(0, File::End); - return; - } - } - - if(length < 8) { - debug("MP4: Invalid atom size"); - length = 0; - file->seek(0, File::End); - return; - } - - name = header.mid(4, 4); - - for(int i = 0; i < numContainers; i++) { - if(name == containers[i]) { - if(name == "meta") { - file->seek(4, File::Current); - } - else if(name == "stsd") { - file->seek(8, File::Current); - } - while(file->tell() < offset + length) { - MP4::Atom *child = new MP4::Atom(file); - children.append(child); - if(child->length == 0) - return; - } - return; - } - } - - file->seek(offset + length); -} - -MP4::Atom::~Atom() -{ -} - -MP4::Atom * -MP4::Atom::find(const char *name1, const char *name2, const char *name3, const char *name4) -{ - if(name1 == 0) { - return this; - } - for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { - if((*it)->name == name1) { - return (*it)->find(name2, name3, name4); - } - } - return 0; -} - -MP4::AtomList -MP4::Atom::findall(const char *name, bool recursive) -{ - MP4::AtomList result; - for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { - if((*it)->name == name) { - result.append(*it); - } - if(recursive) { - result.append((*it)->findall(name, recursive)); - } - } - return result; -} - -bool -MP4::Atom::path(MP4::AtomList &path, const char *name1, const char *name2, const char *name3) -{ - path.append(this); - if(name1 == 0) { - return true; - } - for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { - if((*it)->name == name1) { - return (*it)->path(path, name2, name3); - } - } - return false; -} - -MP4::Atoms::Atoms(File *file) -{ - atoms.setAutoDelete(true); - - file->seek(0, File::End); - long end = file->tell(); - file->seek(0); - while(file->tell() + 8 <= end) { - MP4::Atom *atom = new MP4::Atom(file); - atoms.append(atom); - if (atom->length == 0) - break; - } -} - -MP4::Atoms::~Atoms() -{ -} - -MP4::Atom * -MP4::Atoms::find(const char *name1, const char *name2, const char *name3, const char *name4) -{ - for(AtomList::ConstIterator it = atoms.begin(); it != atoms.end(); ++it) { - if((*it)->name == name1) { - return (*it)->find(name2, name3, name4); - } - } - return 0; -} - -MP4::AtomList -MP4::Atoms::path(const char *name1, const char *name2, const char *name3, const char *name4) -{ - MP4::AtomList path; - for(AtomList::ConstIterator it = atoms.begin(); it != atoms.end(); ++it) { - if((*it)->name == name1) { - if(!(*it)->path(path, name2, name3, name4)) { - path.clear(); - } - return path; - } - } - return path; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4coverart.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4coverart.cpp deleted file mode 100755 index 69c9e685e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4coverart.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************** - copyright : (C) 2009 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "mp4coverart.h" - -using namespace TagLib; - -class MP4::CoverArt::CoverArtPrivate : public RefCounter -{ -public: - CoverArtPrivate() : - RefCounter(), - format(MP4::CoverArt::JPEG) {} - - Format format; - ByteVector data; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MP4::CoverArt::CoverArt(Format format, const ByteVector &data) : - d(new CoverArtPrivate()) -{ - d->format = format; - d->data = data; -} - -MP4::CoverArt::CoverArt(const CoverArt &item) : - d(item.d) -{ - d->ref(); -} - -MP4::CoverArt & -MP4::CoverArt::operator=(const CoverArt &item) -{ - CoverArt(item).swap(*this); - return *this; -} - -void -MP4::CoverArt::swap(CoverArt &item) -{ - using std::swap; - - swap(d, item.d); -} - -MP4::CoverArt::~CoverArt() -{ - if(d->deref()) { - delete d; - } -} - -MP4::CoverArt::Format -MP4::CoverArt::format() const -{ - return d->format; -} - -ByteVector -MP4::CoverArt::data() const -{ - return d->data; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.cpp deleted file mode 100755 index 5ad8396de..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4file.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "mp4atom.h" -#include "mp4tag.h" -#include "mp4file.h" - -using namespace TagLib; - -namespace -{ - bool checkValid(const MP4::AtomList &list) - { - for(MP4::AtomList::ConstIterator it = list.begin(); it != list.end(); ++it) { - - if((*it)->length == 0) - return false; - - if(!checkValid((*it)->children)) - return false; - } - - return true; - } -} - -class MP4::File::FilePrivate -{ -public: - FilePrivate() : - tag(0), - atoms(0), - properties(0) {} - - ~FilePrivate() - { - delete atoms; - delete tag; - delete properties; - } - - MP4::Tag *tag; - MP4::Atoms *atoms; - MP4::Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool MP4::File::isSupported(IOStream *stream) -{ - // An MP4 file has to have an "ftyp" box first. - - const ByteVector id = Utils::readHeader(stream, 8, false); - return id.containsAt("ftyp", 4); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MP4::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -MP4::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -MP4::File::~File() -{ - delete d; -} - -MP4::Tag * -MP4::File::tag() const -{ - return d->tag; -} - -PropertyMap MP4::File::properties() const -{ - return d->tag->properties(); -} - -void MP4::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag->removeUnsupportedProperties(properties); -} - -PropertyMap MP4::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - -MP4::Properties * -MP4::File::audioProperties() const -{ - return d->properties; -} - -void -MP4::File::read(bool readProperties) -{ - if(!isValid()) - return; - - d->atoms = new Atoms(this); - if(!checkValid(d->atoms->atoms)) { - setValid(false); - return; - } - - // must have a moov atom, otherwise consider it invalid - if(!d->atoms->find("moov")) { - setValid(false); - return; - } - - d->tag = new Tag(this, d->atoms); - if(readProperties) { - d->properties = new Properties(this, d->atoms); - } -} - -bool -MP4::File::save() -{ - if(readOnly()) { - debug("MP4::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("MP4::File::save() -- Trying to save invalid file."); - return false; - } - - return d->tag->save(); -} - -bool -MP4::File::hasMP4Tag() const -{ - return (d->atoms->find("moov", "udta", "meta", "ilst") != 0); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4item.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4item.cpp deleted file mode 100755 index 787ed457c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4item.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <taglib.h> -#include <tdebug.h> -#include "trefcounter.h" -#include "mp4item.h" - -using namespace TagLib; - -class MP4::Item::ItemPrivate : public RefCounter -{ -public: - ItemPrivate() : - RefCounter(), - valid(true), - atomDataType(TypeUndefined) {} - - bool valid; - AtomDataType atomDataType; - union { - bool m_bool; - int m_int; - IntPair m_intPair; - unsigned char m_byte; - unsigned int m_uint; - long long m_longlong; - }; - StringList m_stringList; - ByteVectorList m_byteVectorList; - MP4::CoverArtList m_coverArtList; -}; - -MP4::Item::Item() : - d(new ItemPrivate()) -{ - d->valid = false; -} - -MP4::Item::Item(const Item &item) : - d(item.d) -{ - d->ref(); -} - -MP4::Item & -MP4::Item::operator=(const Item &item) -{ - Item(item).swap(*this); - return *this; -} - -void -MP4::Item::swap(Item &item) -{ - using std::swap; - - swap(d, item.d); -} - -MP4::Item::~Item() -{ - if(d->deref()) - delete d; -} - -MP4::Item::Item(bool value) : - d(new ItemPrivate()) -{ - d->m_bool = value; -} - -MP4::Item::Item(int value) : - d(new ItemPrivate()) -{ - d->m_int = value; -} - -MP4::Item::Item(unsigned char value) : - d(new ItemPrivate()) -{ - d->m_byte = value; -} - -MP4::Item::Item(unsigned int value) : - d(new ItemPrivate()) -{ - d->m_uint = value; -} - -MP4::Item::Item(long long value) : - d(new ItemPrivate()) -{ - d->m_longlong = value; -} - -MP4::Item::Item(int value1, int value2) : - d(new ItemPrivate()) -{ - d->m_intPair.first = value1; - d->m_intPair.second = value2; -} - -MP4::Item::Item(const ByteVectorList &value) : - d(new ItemPrivate()) -{ - d->m_byteVectorList = value; -} - -MP4::Item::Item(const StringList &value) : - d(new ItemPrivate()) -{ - d->m_stringList = value; -} - -MP4::Item::Item(const MP4::CoverArtList &value) : - d(new ItemPrivate()) -{ - d->m_coverArtList = value; -} - -void MP4::Item::setAtomDataType(MP4::AtomDataType type) -{ - d->atomDataType = type; -} - -MP4::AtomDataType MP4::Item::atomDataType() const -{ - return d->atomDataType; -} - -bool -MP4::Item::toBool() const -{ - return d->m_bool; -} - -int -MP4::Item::toInt() const -{ - return d->m_int; -} - -unsigned char -MP4::Item::toByte() const -{ - return d->m_byte; -} - -unsigned int -MP4::Item::toUInt() const -{ - return d->m_uint; -} - -long long -MP4::Item::toLongLong() const -{ - return d->m_longlong; -} - -MP4::Item::IntPair -MP4::Item::toIntPair() const -{ - return d->m_intPair; -} - -StringList -MP4::Item::toStringList() const -{ - return d->m_stringList; -} - -ByteVectorList -MP4::Item::toByteVectorList() const -{ - return d->m_byteVectorList; -} - -MP4::CoverArtList -MP4::Item::toCoverArtList() const -{ - return d->m_coverArtList; -} - -bool -MP4::Item::isValid() const -{ - return d->valid; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.cpp deleted file mode 100755 index faa43c270..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4properties.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/************************************************************************** - copyright : (C) 2007 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include "mp4file.h" -#include "mp4atom.h" -#include "mp4properties.h" - -using namespace TagLib; - -class MP4::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - encrypted(false), - codec(MP4::Properties::Unknown) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - bool encrypted; - Codec codec; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file, atoms); -} - -MP4::Properties::~Properties() -{ - delete d; -} - -int -MP4::Properties::channels() const -{ - return d->channels; -} - -int -MP4::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int -MP4::Properties::length() const -{ - return lengthInSeconds(); -} - -int -MP4::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int -MP4::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int -MP4::Properties::bitrate() const -{ - return d->bitrate; -} - -int -MP4::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -bool -MP4::Properties::isEncrypted() const -{ - return d->encrypted; -} - -MP4::Properties::Codec -MP4::Properties::codec() const -{ - return d->codec; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void -MP4::Properties::read(File *file, Atoms *atoms) -{ - MP4::Atom *moov = atoms->find("moov"); - if(!moov) { - debug("MP4: Atom 'moov' not found"); - return; - } - - MP4::Atom *trak = 0; - ByteVector data; - - const MP4::AtomList trakList = moov->findall("trak"); - for(MP4::AtomList::ConstIterator it = trakList.begin(); it != trakList.end(); ++it) { - trak = *it; - MP4::Atom *hdlr = trak->find("mdia", "hdlr"); - if(!hdlr) { - debug("MP4: Atom 'trak.mdia.hdlr' not found"); - return; - } - file->seek(hdlr->offset); - data = file->readBlock(hdlr->length); - if(data.containsAt("soun", 16)) { - break; - } - trak = 0; - } - if(!trak) { - debug("MP4: No audio tracks"); - return; - } - - MP4::Atom *mdhd = trak->find("mdia", "mdhd"); - if(!mdhd) { - debug("MP4: Atom 'trak.mdia.mdhd' not found"); - return; - } - - file->seek(mdhd->offset); - data = file->readBlock(mdhd->length); - - const unsigned int version = data[8]; - long long unit; - long long length; - if(version == 1) { - if(data.size() < 36 + 8) { - debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); - return; - } - unit = data.toUInt(28U); - length = data.toLongLong(32U); - } - else { - if(data.size() < 24 + 8) { - debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); - return; - } - unit = data.toUInt(20U); - length = data.toUInt(24U); - } - if(unit > 0 && length > 0) - d->length = static_cast<int>(length * 1000.0 / unit + 0.5); - - MP4::Atom *atom = trak->find("mdia", "minf", "stbl", "stsd"); - if(!atom) { - return; - } - - file->seek(atom->offset); - data = file->readBlock(atom->length); - if(data.containsAt("mp4a", 20)) { - d->codec = AAC; - d->channels = data.toShort(40U); - d->bitsPerSample = data.toShort(42U); - d->sampleRate = data.toUInt(46U); - if(data.containsAt("esds", 56) && data[64] == 0x03) { - unsigned int pos = 65; - if(data.containsAt("\x80\x80\x80", pos)) { - pos += 3; - } - pos += 4; - if(data[pos] == 0x04) { - pos += 1; - if(data.containsAt("\x80\x80\x80", pos)) { - pos += 3; - } - pos += 10; - d->bitrate = static_cast<int>((data.toUInt(pos) + 500) / 1000.0 + 0.5); - } - } - } - else if(data.containsAt("alac", 20)) { - if(atom->length == 88 && data.containsAt("alac", 56)) { - d->codec = ALAC; - d->bitsPerSample = data.at(69); - d->channels = data.at(73); - d->bitrate = static_cast<int>(data.toUInt(80U) / 1000.0 + 0.5); - d->sampleRate = data.toUInt(84U); - } - } - - MP4::Atom *drms = atom->find("drms"); - if(drms) { - d->encrypted = true; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.cpp deleted file mode 100755 index bc95ad109..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mp4/mp4tag.cpp +++ /dev/null @@ -1,1028 +0,0 @@ -/************************************************************************** - copyright : (C) 2007,2011 by Lukáš Lalinský - email : lalinsky@gmail.com - **************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> -#include <tpropertymap.h> -#include "mp4atom.h" -#include "mp4tag.h" -#include "id3v1genres.h" - -using namespace TagLib; - -class MP4::Tag::TagPrivate -{ -public: - TagPrivate() : - file(0), - atoms(0) {} - - TagLib::File *file; - Atoms *atoms; - ItemMap items; -}; - -MP4::Tag::Tag() : - d(new TagPrivate()) -{ -} - -MP4::Tag::Tag(TagLib::File *file, MP4::Atoms *atoms) : - d(new TagPrivate()) -{ - d->file = file; - d->atoms = atoms; - - MP4::Atom *ilst = atoms->find("moov", "udta", "meta", "ilst"); - if(!ilst) { - //debug("Atom moov.udta.meta.ilst not found."); - return; - } - - for(AtomList::ConstIterator it = ilst->children.begin(); it != ilst->children.end(); ++it) { - MP4::Atom *atom = *it; - file->seek(atom->offset + 8); - if(atom->name == "----") { - parseFreeForm(atom); - } - else if(atom->name == "trkn" || atom->name == "disk") { - parseIntPair(atom); - } - else if(atom->name == "cpil" || atom->name == "pgap" || atom->name == "pcst" || - atom->name == "hdvd" || atom->name == "shwm") { - parseBool(atom); - } - else if(atom->name == "tmpo" || atom->name == "\251mvi" || atom->name == "\251mvc") { - parseInt(atom); - } - else if(atom->name == "rate") { - AtomDataList data = parseData2(atom); - if(!data.isEmpty()) { - AtomData val = data[0]; - if (val.type == TypeUTF8) { - addItem(atom->name, StringList(String(val.data, String::UTF8))); - } else { - addItem(atom->name, (int)(val.data.toShort())); - } - } - } - else if(atom->name == "tvsn" || atom->name == "tves" || atom->name == "cnID" || - atom->name == "sfID" || atom->name == "atID" || atom->name == "geID" || - atom->name == "cmID") { - parseUInt(atom); - } - else if(atom->name == "plID") { - parseLongLong(atom); - } - else if(atom->name == "stik" || atom->name == "rtng" || atom->name == "akID") { - parseByte(atom); - } - else if(atom->name == "gnre") { - parseGnre(atom); - } - else if(atom->name == "covr") { - parseCovr(atom); - } - else if(atom->name == "purl" || atom->name == "egid") { - parseText(atom, -1); - } - else { - parseText(atom); - } - } -} - -MP4::Tag::~Tag() -{ - delete d; -} - -MP4::AtomDataList -MP4::Tag::parseData2(const MP4::Atom *atom, int expectedFlags, bool freeForm) -{ - AtomDataList result; - ByteVector data = d->file->readBlock(atom->length - 8); - int i = 0; - unsigned int pos = 0; - while(pos < data.size()) { - const int length = static_cast<int>(data.toUInt(pos)); - if(length < 12) { - debug("MP4: Too short atom"); - return result; - } - - const ByteVector name = data.mid(pos + 4, 4); - const int flags = static_cast<int>(data.toUInt(pos + 8)); - if(freeForm && i < 2) { - if(i == 0 && name != "mean") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"mean\""); - return result; - } - else if(i == 1 && name != "name") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"name\""); - return result; - } - result.append(AtomData(AtomDataType(flags), data.mid(pos + 12, length - 12))); - } - else { - if(name != "data") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); - return result; - } - if(expectedFlags == -1 || flags == expectedFlags) { - result.append(AtomData(AtomDataType(flags), data.mid(pos + 16, length - 16))); - } - } - pos += length; - i++; - } - return result; -} - -ByteVectorList -MP4::Tag::parseData(const MP4::Atom *atom, int expectedFlags, bool freeForm) -{ - AtomDataList data = parseData2(atom, expectedFlags, freeForm); - ByteVectorList result; - for(AtomDataList::ConstIterator it = data.begin(); it != data.end(); ++it) { - result.append(it->data); - } - return result; -} - -void -MP4::Tag::parseInt(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - addItem(atom->name, (int)data[0].toShort()); - } -} - -void -MP4::Tag::parseUInt(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - addItem(atom->name, data[0].toUInt()); - } -} - -void -MP4::Tag::parseLongLong(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - addItem(atom->name, data[0].toLongLong()); - } -} - -void -MP4::Tag::parseByte(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - addItem(atom->name, static_cast<unsigned char>(data[0].at(0))); - } -} - -void -MP4::Tag::parseGnre(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - int idx = (int)data[0].toShort(); - if(idx > 0) { - addItem("\251gen", StringList(ID3v1::genre(idx - 1))); - } - } -} - -void -MP4::Tag::parseIntPair(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - const int a = data[0].toShort(2U); - const int b = data[0].toShort(4U); - addItem(atom->name, MP4::Item(a, b)); - } -} - -void -MP4::Tag::parseBool(const MP4::Atom *atom) -{ - ByteVectorList data = parseData(atom); - if(!data.isEmpty()) { - bool value = data[0].size() ? data[0][0] != '\0' : false; - addItem(atom->name, value); - } -} - -void -MP4::Tag::parseText(const MP4::Atom *atom, int expectedFlags) -{ - ByteVectorList data = parseData(atom, expectedFlags); - if(!data.isEmpty()) { - StringList value; - for(ByteVectorList::ConstIterator it = data.begin(); it != data.end(); ++it) { - value.append(String(*it, String::UTF8)); - } - addItem(atom->name, value); - } -} - -void -MP4::Tag::parseFreeForm(const MP4::Atom *atom) -{ - AtomDataList data = parseData2(atom, -1, true); - if(data.size() > 2) { - AtomDataList::ConstIterator itBegin = data.begin(); - - String name = "----:"; - name += String((itBegin++)->data, String::UTF8); // data[0].data - name += ':'; - name += String((itBegin++)->data, String::UTF8); // data[1].data - - AtomDataType type = itBegin->type; // data[2].type - - for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { - if(it->type != type) { - debug("MP4: We currently don't support values with multiple types"); - break; - } - } - if(type == TypeUTF8) { - StringList value; - for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { - value.append(String(it->data, String::UTF8)); - } - Item item(value); - item.setAtomDataType(type); - addItem(name, item); - } - else { - ByteVectorList value; - for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { - value.append(it->data); - } - Item item(value); - item.setAtomDataType(type); - addItem(name, item); - } - } -} - -void -MP4::Tag::parseCovr(const MP4::Atom *atom) -{ - MP4::CoverArtList value; - ByteVector data = d->file->readBlock(atom->length - 8); - unsigned int pos = 0; - while(pos < data.size()) { - const int length = static_cast<int>(data.toUInt(pos)); - if(length < 12) { - debug("MP4: Too short atom"); - break;; - } - - const ByteVector name = data.mid(pos + 4, 4); - const int flags = static_cast<int>(data.toUInt(pos + 8)); - if(name != "data") { - debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); - break; - } - if(flags == TypeJPEG || flags == TypePNG || flags == TypeBMP || - flags == TypeGIF || flags == TypeImplicit) { - value.append(MP4::CoverArt(MP4::CoverArt::Format(flags), - data.mid(pos + 16, length - 16))); - } - else { - debug("MP4: Unknown covr format " + String::number(flags)); - } - pos += length; - } - if(!value.isEmpty()) - addItem(atom->name, value); -} - -ByteVector -MP4::Tag::padIlst(const ByteVector &data, int length) const -{ - if(length == -1) { - length = ((data.size() + 1023) & ~1023) - data.size(); - } - return renderAtom("free", ByteVector(length, '\1')); -} - -ByteVector -MP4::Tag::renderAtom(const ByteVector &name, const ByteVector &data) const -{ - return ByteVector::fromUInt(data.size() + 8) + name + data; -} - -ByteVector -MP4::Tag::renderData(const ByteVector &name, int flags, const ByteVectorList &data) const -{ - ByteVector result; - for(ByteVectorList::ConstIterator it = data.begin(); it != data.end(); ++it) { - result.append(renderAtom("data", ByteVector::fromUInt(flags) + ByteVector(4, '\0') + *it)); - } - return renderAtom(name, result); -} - -ByteVector -MP4::Tag::renderBool(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector(1, item.toBool() ? '\1' : '\0')); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderInt(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector::fromShort(item.toInt())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderUInt(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector::fromUInt(item.toUInt())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderLongLong(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector::fromLongLong(item.toLongLong())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderByte(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector(1, item.toByte())); - return renderData(name, TypeInteger, data); -} - -ByteVector -MP4::Tag::renderIntPair(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector(2, '\0') + - ByteVector::fromShort(item.toIntPair().first) + - ByteVector::fromShort(item.toIntPair().second) + - ByteVector(2, '\0')); - return renderData(name, TypeImplicit, data); -} - -ByteVector -MP4::Tag::renderIntPairNoTrailing(const ByteVector &name, const MP4::Item &item) const -{ - ByteVectorList data; - data.append(ByteVector(2, '\0') + - ByteVector::fromShort(item.toIntPair().first) + - ByteVector::fromShort(item.toIntPair().second)); - return renderData(name, TypeImplicit, data); -} - -ByteVector -MP4::Tag::renderText(const ByteVector &name, const MP4::Item &item, int flags) const -{ - ByteVectorList data; - StringList value = item.toStringList(); - for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { - data.append(it->data(String::UTF8)); - } - return renderData(name, flags, data); -} - -ByteVector -MP4::Tag::renderCovr(const ByteVector &name, const MP4::Item &item) const -{ - ByteVector data; - MP4::CoverArtList value = item.toCoverArtList(); - for(MP4::CoverArtList::ConstIterator it = value.begin(); it != value.end(); ++it) { - data.append(renderAtom("data", ByteVector::fromUInt(it->format()) + - ByteVector(4, '\0') + it->data())); - } - return renderAtom(name, data); -} - -ByteVector -MP4::Tag::renderFreeForm(const String &name, const MP4::Item &item) const -{ - StringList header = StringList::split(name, ":"); - if(header.size() != 3) { - debug("MP4: Invalid free-form item name \"" + name + "\""); - return ByteVector(); - } - ByteVector data; - data.append(renderAtom("mean", ByteVector::fromUInt(0) + header[1].data(String::UTF8))); - data.append(renderAtom("name", ByteVector::fromUInt(0) + header[2].data(String::UTF8))); - AtomDataType type = item.atomDataType(); - if(type == TypeUndefined) { - if(!item.toStringList().isEmpty()) { - type = TypeUTF8; - } - else { - type = TypeImplicit; - } - } - if(type == TypeUTF8) { - StringList value = item.toStringList(); - for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { - data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + it->data(String::UTF8))); - } - } - else { - ByteVectorList value = item.toByteVectorList(); - for(ByteVectorList::ConstIterator it = value.begin(); it != value.end(); ++it) { - data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + *it)); - } - } - return renderAtom("----", data); -} - -bool -MP4::Tag::save() -{ - ByteVector data; - for(MP4::ItemMap::ConstIterator it = d->items.begin(); it != d->items.end(); ++it) { - const String name = it->first; - if(name.startsWith("----")) { - data.append(renderFreeForm(name, it->second)); - } - else if(name == "trkn") { - data.append(renderIntPair(name.data(String::Latin1), it->second)); - } - else if(name == "disk") { - data.append(renderIntPairNoTrailing(name.data(String::Latin1), it->second)); - } - else if(name == "cpil" || name == "pgap" || name == "pcst" || name == "hdvd" || - name == "shwm") { - data.append(renderBool(name.data(String::Latin1), it->second)); - } - else if(name == "tmpo" || name == "\251mvi" || name == "\251mvc") { - data.append(renderInt(name.data(String::Latin1), it->second)); - } - else if (name == "rate") { - const MP4::Item& item = it->second; - StringList value = item.toStringList(); - if (value.isEmpty()) { - data.append(renderInt(name.data(String::Latin1), item)); - } - else { - data.append(renderText(name.data(String::Latin1), item)); - } - } - else if(name == "tvsn" || name == "tves" || name == "cnID" || - name == "sfID" || name == "atID" || name == "geID" || - name == "cmID") { - data.append(renderUInt(name.data(String::Latin1), it->second)); - } - else if(name == "plID") { - data.append(renderLongLong(name.data(String::Latin1), it->second)); - } - else if(name == "stik" || name == "rtng" || name == "akID") { - data.append(renderByte(name.data(String::Latin1), it->second)); - } - else if(name == "covr") { - data.append(renderCovr(name.data(String::Latin1), it->second)); - } - else if(name == "purl" || name == "egid") { - data.append(renderText(name.data(String::Latin1), it->second, TypeImplicit)); - } - else if(name.size() == 4){ - data.append(renderText(name.data(String::Latin1), it->second)); - } - else { - debug("MP4: Unknown item name \"" + name + "\""); - } - } - data = renderAtom("ilst", data); - - AtomList path = d->atoms->path("moov", "udta", "meta", "ilst"); - if(path.size() == 4) { - saveExisting(data, path); - } - else { - saveNew(data); - } - - return true; -} - -void -MP4::Tag::updateParents(const AtomList &path, long delta, int ignore) -{ - if(static_cast<int>(path.size()) <= ignore) - return; - - AtomList::ConstIterator itEnd = path.end(); - std::advance(itEnd, 0 - ignore); - - for(AtomList::ConstIterator it = path.begin(); it != itEnd; ++it) { - d->file->seek((*it)->offset); - long size = d->file->readBlock(4).toUInt(); - // 64-bit - if (size == 1) { - d->file->seek(4, File::Current); // Skip name - long long longSize = d->file->readBlock(8).toLongLong(); - // Seek the offset of the 64-bit size - d->file->seek((*it)->offset + 8); - d->file->writeBlock(ByteVector::fromLongLong(longSize + delta)); - } - // 32-bit - else { - d->file->seek((*it)->offset); - d->file->writeBlock(ByteVector::fromUInt(size + delta)); - } - } -} - -void -MP4::Tag::updateOffsets(long delta, long offset) -{ - MP4::Atom *moov = d->atoms->find("moov"); - if(moov) { - MP4::AtomList stco = moov->findall("stco", true); - for(MP4::AtomList::ConstIterator it = stco.begin(); it != stco.end(); ++it) { - MP4::Atom *atom = *it; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 12); - ByteVector data = d->file->readBlock(atom->length - 12); - unsigned int count = data.toUInt(); - d->file->seek(atom->offset + 16); - unsigned int pos = 4; - while(count--) { - long o = static_cast<long>(data.toUInt(pos)); - if(o > offset) { - o += delta; - } - d->file->writeBlock(ByteVector::fromUInt(o)); - pos += 4; - } - } - - MP4::AtomList co64 = moov->findall("co64", true); - for(MP4::AtomList::ConstIterator it = co64.begin(); it != co64.end(); ++it) { - MP4::Atom *atom = *it; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 12); - ByteVector data = d->file->readBlock(atom->length - 12); - unsigned int count = data.toUInt(); - d->file->seek(atom->offset + 16); - unsigned int pos = 4; - while(count--) { - long long o = data.toLongLong(pos); - if(o > offset) { - o += delta; - } - d->file->writeBlock(ByteVector::fromLongLong(o)); - pos += 8; - } - } - } - - MP4::Atom *moof = d->atoms->find("moof"); - if(moof) { - MP4::AtomList tfhd = moof->findall("tfhd", true); - for(MP4::AtomList::ConstIterator it = tfhd.begin(); it != tfhd.end(); ++it) { - MP4::Atom *atom = *it; - if(atom->offset > offset) { - atom->offset += delta; - } - d->file->seek(atom->offset + 9); - ByteVector data = d->file->readBlock(atom->length - 9); - const unsigned int flags = data.toUInt(0, 3, true); - if(flags & 1) { - long long o = data.toLongLong(7U); - if(o > offset) { - o += delta; - } - d->file->seek(atom->offset + 16); - d->file->writeBlock(ByteVector::fromLongLong(o)); - } - } - } -} - -void -MP4::Tag::saveNew(ByteVector data) -{ - data = renderAtom("meta", ByteVector(4, '\0') + - renderAtom("hdlr", ByteVector(8, '\0') + ByteVector("mdirappl") + - ByteVector(9, '\0')) + - data + padIlst(data)); - - AtomList path = d->atoms->path("moov", "udta"); - if(path.size() != 2) { - path = d->atoms->path("moov"); - data = renderAtom("udta", data); - } - - long offset = path.back()->offset + 8; - d->file->insert(data, offset, 0); - - updateParents(path, data.size()); - updateOffsets(data.size(), offset); - - // Insert the newly created atoms into the tree to keep it up-to-date. - - d->file->seek(offset); - path.back()->children.prepend(new Atom(d->file)); -} - -void -MP4::Tag::saveExisting(ByteVector data, const AtomList &path) -{ - AtomList::ConstIterator it = path.end(); - - MP4::Atom *ilst = *(--it); - long offset = ilst->offset; - long length = ilst->length; - - MP4::Atom *meta = *(--it); - AtomList::ConstIterator index = meta->children.find(ilst); - - // check if there is an atom before 'ilst', and possibly use it as padding - if(index != meta->children.begin()) { - AtomList::ConstIterator prevIndex = index; - prevIndex--; - MP4::Atom *prev = *prevIndex; - if(prev->name == "free") { - offset = prev->offset; - length += prev->length; - } - } - // check if there is an atom after 'ilst', and possibly use it as padding - AtomList::ConstIterator nextIndex = index; - nextIndex++; - if(nextIndex != meta->children.end()) { - MP4::Atom *next = *nextIndex; - if(next->name == "free") { - length += next->length; - } - } - - long delta = data.size() - length; - if(delta > 0 || (delta < 0 && delta > -8)) { - data.append(padIlst(data)); - delta = data.size() - length; - } - else if(delta < 0) { - data.append(padIlst(data, -delta - 8)); - delta = 0; - } - - d->file->insert(data, offset, length); - - if(delta) { - updateParents(path, delta, 1); - updateOffsets(delta, offset); - } -} - -String -MP4::Tag::title() const -{ - if(d->items.contains("\251nam")) - return d->items["\251nam"].toStringList().toString(", "); - return String(); -} - -String -MP4::Tag::artist() const -{ - if(d->items.contains("\251ART")) - return d->items["\251ART"].toStringList().toString(", "); - return String(); -} - -String -MP4::Tag::album() const -{ - if(d->items.contains("\251alb")) - return d->items["\251alb"].toStringList().toString(", "); - return String(); -} - -String -MP4::Tag::comment() const -{ - if(d->items.contains("\251cmt")) - return d->items["\251cmt"].toStringList().toString(", "); - return String(); -} - -String -MP4::Tag::genre() const -{ - if(d->items.contains("\251gen")) - return d->items["\251gen"].toStringList().toString(", "); - return String(); -} - -unsigned int -MP4::Tag::year() const -{ - if(d->items.contains("\251day")) - return d->items["\251day"].toStringList().toString().toInt(); - return 0; -} - -unsigned int -MP4::Tag::track() const -{ - if(d->items.contains("trkn")) - return d->items["trkn"].toIntPair().first; - return 0; -} - -void -MP4::Tag::setTitle(const String &value) -{ - d->items["\251nam"] = StringList(value); -} - -void -MP4::Tag::setArtist(const String &value) -{ - d->items["\251ART"] = StringList(value); -} - -void -MP4::Tag::setAlbum(const String &value) -{ - d->items["\251alb"] = StringList(value); -} - -void -MP4::Tag::setComment(const String &value) -{ - d->items["\251cmt"] = StringList(value); -} - -void -MP4::Tag::setGenre(const String &value) -{ - d->items["\251gen"] = StringList(value); -} - -void -MP4::Tag::setYear(unsigned int value) -{ - if (value == 0) { - d->items.erase("\251day"); - } - else { - d->items["\251day"] = StringList(String::number(value)); - } -} - -void -MP4::Tag::setTrack(unsigned int value) -{ - if (value == 0) { - d->items.erase("trkn"); - } - else { - d->items["trkn"] = MP4::Item(value, 0); - } -} - -bool MP4::Tag::isEmpty() const -{ - return d->items.isEmpty(); -} - -MP4::ItemMap &MP4::Tag::itemListMap() -{ - return d->items; -} - -const MP4::ItemMap &MP4::Tag::itemMap() const -{ - return d->items; -} - -MP4::Item MP4::Tag::item(const String &key) const -{ - return d->items[key]; -} - -void MP4::Tag::setItem(const String &key, const Item &value) -{ - d->items[key] = value; -} - -void MP4::Tag::removeItem(const String &key) -{ - d->items.erase(key); -} - -bool MP4::Tag::contains(const String &key) const -{ - return d->items.contains(key); -} - -namespace -{ - const char *keyTranslation[][2] = { - { "\251nam", "TITLE" }, - { "\251ART", "ARTIST" }, - { "\251alb", "ALBUM" }, - { "\251cmt", "COMMENT" }, - { "\251gen", "GENRE" }, - { "\251day", "DATE" }, - { "\251wrt", "COMPOSER" }, - { "\251grp", "GROUPING" }, - { "aART", "ALBUMARTIST" }, - { "trkn", "TRACKNUMBER" }, - { "disk", "DISCNUMBER" }, - { "cpil", "COMPILATION" }, - { "tmpo", "BPM" }, - { "cprt", "COPYRIGHT" }, - { "\251lyr", "LYRICS" }, - { "\251too", "ENCODEDBY" }, - { "soal", "ALBUMSORT" }, - { "soaa", "ALBUMARTISTSORT" }, - { "soar", "ARTISTSORT" }, - { "sonm", "TITLESORT" }, - { "soco", "COMPOSERSORT" }, - { "sosn", "SHOWSORT" }, - { "shwm", "SHOWWORKMOVEMENT" }, - { "\251wrk", "WORK" }, - { "\251mvn", "MOVEMENTNAME" }, - { "\251mvi", "MOVEMENTNUMBER" }, - { "\251mvc", "MOVEMENTCOUNT" }, - { "----:com.apple.iTunes:MusicBrainz Track Id", "MUSICBRAINZ_TRACKID" }, - { "----:com.apple.iTunes:MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID" }, - { "----:com.apple.iTunes:MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID" }, - { "----:com.apple.iTunes:MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID" }, - { "----:com.apple.iTunes:MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID" }, - { "----:com.apple.iTunes:MusicBrainz Work Id", "MUSICBRAINZ_WORKID" }, - { "----:com.apple.iTunes:ASIN", "ASIN" }, - { "----:com.apple.iTunes:LABEL", "LABEL" }, - { "----:com.apple.iTunes:LYRICIST", "LYRICIST" }, - { "----:com.apple.iTunes:CONDUCTOR", "CONDUCTOR" }, - { "----:com.apple.iTunes:REMIXER", "REMIXER" }, - { "----:com.apple.iTunes:ENGINEER", "ENGINEER" }, - { "----:com.apple.iTunes:PRODUCER", "PRODUCER" }, - { "----:com.apple.iTunes:DJMIXER", "DJMIXER" }, - { "----:com.apple.iTunes:MIXER", "MIXER" }, - { "----:com.apple.iTunes:SUBTITLE", "SUBTITLE" }, - { "----:com.apple.iTunes:DISCSUBTITLE", "DISCSUBTITLE" }, - { "----:com.apple.iTunes:MOOD", "MOOD" }, - { "----:com.apple.iTunes:ISRC", "ISRC" }, - { "----:com.apple.iTunes:CATALOGNUMBER", "CATALOGNUMBER" }, - { "----:com.apple.iTunes:BARCODE", "BARCODE" }, - { "----:com.apple.iTunes:SCRIPT", "SCRIPT" }, - { "----:com.apple.iTunes:LANGUAGE", "LANGUAGE" }, - { "----:com.apple.iTunes:LICENSE", "LICENSE" }, - { "----:com.apple.iTunes:MEDIA", "MEDIA" }, - }; - const size_t keyTranslationSize = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - - String translateKey(const String &key) - { - for(size_t i = 0; i < keyTranslationSize; ++i) { - if(key == keyTranslation[i][0]) - return keyTranslation[i][1]; - } - - return String(); - } -} - -PropertyMap MP4::Tag::properties() const -{ - PropertyMap props; - for(MP4::ItemMap::ConstIterator it = d->items.begin(); it != d->items.end(); ++it) { - const String key = translateKey(it->first); - if(!key.isEmpty()) { - if(key == "TRACKNUMBER" || key == "DISCNUMBER") { - MP4::Item::IntPair ip = it->second.toIntPair(); - String value = String::number(ip.first); - if(ip.second) { - value += "/" + String::number(ip.second); - } - props[key] = value; - } - else if(key == "BPM" || key == "MOVEMENTNUMBER" || key == "MOVEMENTCOUNT") { - props[key] = String::number(it->second.toInt()); - } - else if(key == "COMPILATION" || key == "SHOWWORKMOVEMENT") { - props[key] = String::number(it->second.toBool()); - } - else { - props[key] = it->second.toStringList(); - } - } - else { - props.unsupportedData().append(it->first); - } - } - return props; -} - -void MP4::Tag::removeUnsupportedProperties(const StringList &props) -{ - for(StringList::ConstIterator it = props.begin(); it != props.end(); ++it) - d->items.erase(*it); -} - -PropertyMap MP4::Tag::setProperties(const PropertyMap &props) -{ - static Map<String, String> reverseKeyMap; - if(reverseKeyMap.isEmpty()) { - int numKeys = sizeof(keyTranslation) / sizeof(keyTranslation[0]); - for(int i = 0; i < numKeys; i++) { - reverseKeyMap[keyTranslation[i][1]] = keyTranslation[i][0]; - } - } - - PropertyMap origProps = properties(); - for(PropertyMap::ConstIterator it = origProps.begin(); it != origProps.end(); ++it) { - if(!props.contains(it->first) || props[it->first].isEmpty()) { - d->items.erase(reverseKeyMap[it->first]); - } - } - - PropertyMap ignoredProps; - for(PropertyMap::ConstIterator it = props.begin(); it != props.end(); ++it) { - if(reverseKeyMap.contains(it->first)) { - String name = reverseKeyMap[it->first]; - if((it->first == "TRACKNUMBER" || it->first == "DISCNUMBER") && !it->second.isEmpty()) { - StringList parts = StringList::split(it->second.front(), "/"); - if(!parts.isEmpty()) { - int first = parts[0].toInt(); - int second = 0; - if(parts.size() > 1) { - second = parts[1].toInt(); - } - d->items[name] = MP4::Item(first, second); - } - } - else if((it->first == "BPM" || it->first == "MOVEMENTNUMBER" || it->first == "MOVEMENTCOUNT") && !it->second.isEmpty()) { - int value = it->second.front().toInt(); - d->items[name] = MP4::Item(value); - } - else if((it->first == "COMPILATION" || it->first == "SHOWWORKMOVEMENT") && !it->second.isEmpty()) { - bool value = (it->second.front().toInt() != 0); - d->items[name] = MP4::Item(value); - } - else { - d->items[name] = it->second; - } - } - else { - ignoredProps.insert(it->first, it->second); - } - } - - return ignoredProps; -} - -void MP4::Tag::addItem(const String &name, const Item &value) -{ - if(!d->items.contains(name)) { - d->items.insert(name, value); - } - else { - debug("MP4: Ignoring duplicate atom \"" + name + "\""); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.cpp deleted file mode 100755 index 0ffaf8933..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcfile.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tagunion.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "mpcfile.h" -#include "id3v1tag.h" -#include "id3v2header.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { MPCAPEIndex = 0, MPCID3v1Index = 1 }; -} - -class MPC::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - ID3v2Header(0), - ID3v2Location(-1), - ID3v2Size(0), - properties(0) {} - - ~FilePrivate() - { - delete ID3v2Header; - delete properties; - } - - long APELocation; - long APESize; - - long ID3v1Location; - - ID3v2::Header *ID3v2Header; - long ID3v2Location; - long ID3v2Size; - - TagUnion tag; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool MPC::File::isSupported(IOStream *stream) -{ - // A newer MPC file has to start with "MPCK" or "MP+", but older files don't - // have keys to do a quick check. - - const ByteVector id = Utils::readHeader(stream, 4, false); - return (id == "MPCK" || id.startsWith("MP+")); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPC::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -MPC::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -MPC::File::~File() -{ - delete d; -} - -TagLib::Tag *MPC::File::tag() const -{ - return &d->tag; -} - -PropertyMap MPC::File::properties() const -{ - return d->tag.properties(); -} - -void MPC::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag.removeUnsupportedProperties(properties); -} - -PropertyMap MPC::File::setProperties(const PropertyMap &properties) -{ - if(ID3v1Tag()) - ID3v1Tag()->setProperties(properties); - - return APETag(true)->setProperties(properties); -} - -MPC::Properties *MPC::File::audioProperties() const -{ - return d->properties; -} - -bool MPC::File::save() -{ - if(readOnly()) { - debug("MPC::File::save() -- File is read only."); - return false; - } - - // Possibly strip ID3v2 tag - - if(!d->ID3v2Header && d->ID3v2Location >= 0) { - removeBlock(d->ID3v2Location, d->ID3v2Size); - - if(d->APELocation >= 0) - d->APELocation -= d->ID3v2Size; - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->ID3v2Size; - - d->ID3v2Location = -1; - d->ID3v2Size = 0; - } - - // Update ID3v1 tag - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - if(d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - } - } - - // Update APE tag - - if(APETag() && !APETag()->isEmpty()) { - - // APE tag is not empty. Update the old one or create a new one. - - if(d->APELocation < 0) { - if(d->ID3v1Location >= 0) - d->APELocation = d->ID3v1Location; - else - d->APELocation = length(); - } - - const ByteVector data = APETag()->render(); - insert(data, d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); - - d->APESize = data.size(); - } - else { - - // APE tag is empty. Remove the old one. - - if(d->APELocation >= 0) { - removeBlock(d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->APESize; - - d->APELocation = -1; - d->APESize = 0; - } - } - - return true; -} - -ID3v1::Tag *MPC::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(MPCID3v1Index, create); -} - -APE::Tag *MPC::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(MPCAPEIndex, create); -} - -void MPC::File::strip(int tags) -{ - if(tags & ID3v1) - d->tag.set(MPCID3v1Index, 0); - - if(tags & APE) - d->tag.set(MPCAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); - - if(tags & ID3v2) { - delete d->ID3v2Header; - d->ID3v2Header = 0; - } -} - -void MPC::File::remove(int tags) -{ - strip(tags); -} - -bool MPC::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -bool MPC::File::hasAPETag() const -{ - return (d->APELocation >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPC::File::read(bool readProperties) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = Utils::findID3v2(this); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location); - d->ID3v2Header = new ID3v2::Header(readBlock(ID3v2::Header::size())); - d->ID3v2Size = d->ID3v2Header->completeTagSize(); - } - - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(MPCID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - // Look for an APE tag - - d->APELocation = Utils::findAPE(this, d->ID3v1Location); - - if(d->APELocation >= 0) { - d->tag.set(MPCAPEIndex, new APE::Tag(this, d->APELocation)); - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; - } - - if(d->ID3v1Location < 0) - APETag(true); - - // Look for MPC metadata - - if(readProperties) { - - long streamLength; - - if(d->APELocation >= 0) - streamLength = d->APELocation; - else if(d->ID3v1Location >= 0) - streamLength = d->ID3v1Location; - else - streamLength = length(); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location + d->ID3v2Size); - streamLength -= (d->ID3v2Location + d->ID3v2Size); - } - else { - seek(0); - } - - d->properties = new Properties(this, streamLength); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.cpp deleted file mode 100755 index 21de6d495..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpc/mpcproperties.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> -#include <math.h> - -#include "mpcproperties.h" -#include "mpcfile.h" - -using namespace TagLib; - -class MPC::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - version(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - totalFrames(0), - sampleFrames(0), - trackGain(0), - trackPeak(0), - albumGain(0), - albumPeak(0) {} - - int version; - int length; - int bitrate; - int sampleRate; - int channels; - unsigned int totalFrames; - unsigned int sampleFrames; - int trackGain; - int trackPeak; - int albumGain; - int albumPeak; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPC::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - readSV7(data, streamLength); -} - -MPC::Properties::Properties(File *file, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - ByteVector magic = file->readBlock(4); - if(magic == "MPCK") { - // Musepack version 8 - readSV8(file, streamLength); - } - else { - // Musepack version 7 or older, fixed size header - readSV7(magic + file->readBlock(MPC::HeaderSize - 4), streamLength); - } -} - -MPC::Properties::~Properties() -{ - delete d; -} - -int MPC::Properties::length() const -{ - return lengthInSeconds(); -} - -int MPC::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int MPC::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int MPC::Properties::bitrate() const -{ - return d->bitrate; -} - -int MPC::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int MPC::Properties::channels() const -{ - return d->channels; -} - -int MPC::Properties::mpcVersion() const -{ - return d->version; -} - -unsigned int MPC::Properties::totalFrames() const -{ - return d->totalFrames; -} - -unsigned int MPC::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -int MPC::Properties::trackGain() const -{ - return d->trackGain; -} - -int MPC::Properties::trackPeak() const -{ - return d->trackPeak; -} - -int MPC::Properties::albumGain() const -{ - return d->albumGain; -} - -int MPC::Properties::albumPeak() const -{ - return d->albumPeak; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -namespace -{ - unsigned long readSize(File *file, unsigned int &sizeLength, bool &eof) - { - sizeLength = 0; - eof = false; - - unsigned char tmp; - unsigned long size = 0; - - do { - const ByteVector b = file->readBlock(1); - if(b.isEmpty()) { - eof = true; - break; - } - - tmp = b[0]; - size = (size << 7) | (tmp & 0x7F); - sizeLength++; - } while((tmp & 0x80)); - return size; - } - - unsigned long readSize(const ByteVector &data, unsigned int &pos) - { - unsigned char tmp; - unsigned long size = 0; - - do { - tmp = data[pos++]; - size = (size << 7) | (tmp & 0x7F); - } while((tmp & 0x80) && (pos < data.size())); - return size; - } - - // This array looks weird, but the same as original MusePack code found at: - // https://www.musepack.net/index.php?pg=src - const unsigned short sftable [8] = { 44100, 48000, 37800, 32000, 0, 0, 0, 0 }; -} - -void MPC::Properties::readSV8(File *file, long streamLength) -{ - bool readSH = false, readRG = false; - - while(!readSH && !readRG) { - const ByteVector packetType = file->readBlock(2); - - unsigned int packetSizeLength; - bool eof; - const unsigned long packetSize = readSize(file, packetSizeLength, eof); - if(eof) { - debug("MPC::Properties::readSV8() - Reached to EOF."); - break; - } - - const unsigned long dataSize = packetSize - 2 - packetSizeLength; - - const ByteVector data = file->readBlock(dataSize); - if(data.size() != dataSize) { - debug("MPC::Properties::readSV8() - dataSize doesn't match the actual data size."); - break; - } - - if(packetType == "SH") { - // Stream Header - // http://trac.musepack.net/wiki/SV8Specification#StreamHeaderPacket - - if(dataSize <= 5) { - debug("MPC::Properties::readSV8() - \"SH\" packet is too short to parse."); - break; - } - - readSH = true; - - unsigned int pos = 4; - d->version = data[pos]; - pos += 1; - d->sampleFrames = readSize(data, pos); - if(pos > dataSize - 3) { - debug("MPC::Properties::readSV8() - \"SH\" packet is corrupt."); - break; - } - - const unsigned long begSilence = readSize(data, pos); - if(pos > dataSize - 2) { - debug("MPC::Properties::readSV8() - \"SH\" packet is corrupt."); - break; - } - - const unsigned short flags = data.toUShort(pos, true); - pos += 2; - - d->sampleRate = sftable[(flags >> 13) & 0x07]; - d->channels = ((flags >> 4) & 0x0F) + 1; - - const unsigned int frameCount = d->sampleFrames - begSilence; - if(frameCount > 0 && d->sampleRate > 0) { - const double length = frameCount * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } - } - else if (packetType == "RG") { - // Replay Gain - // http://trac.musepack.net/wiki/SV8Specification#ReplaygainPacket - - if(dataSize <= 9) { - debug("MPC::Properties::readSV8() - \"RG\" packet is too short to parse."); - break; - } - - readRG = true; - - const int replayGainVersion = data[0]; - if(replayGainVersion == 1) { - d->trackGain = data.toShort(1, true); - d->trackPeak = data.toShort(3, true); - d->albumGain = data.toShort(5, true); - d->albumPeak = data.toShort(7, true); - } - } - - else if(packetType == "SE") { - break; - } - - else { - file->seek(dataSize, File::Current); - } - } -} - -void MPC::Properties::readSV7(const ByteVector &data, long streamLength) -{ - if(data.startsWith("MP+")) { - d->version = data[3] & 15; - if(d->version < 7) - return; - - d->totalFrames = data.toUInt(4, false); - - const unsigned int flags = data.toUInt(8, false); - d->sampleRate = sftable[(flags >> 16) & 0x03]; - d->channels = 2; - - const unsigned int gapless = data.toUInt(5, false); - - d->trackGain = data.toShort(14, false); - d->trackPeak = data.toUShort(12, false); - d->albumGain = data.toShort(18, false); - d->albumPeak = data.toUShort(16, false); - - // convert gain info - if(d->trackGain != 0) { - int tmp = (int)((64.82 - (short)d->trackGain / 100.) * 256. + .5); - if(tmp >= (1 << 16) || tmp < 0) tmp = 0; - d->trackGain = tmp; - } - - if(d->albumGain != 0) { - int tmp = (int)((64.82 - d->albumGain / 100.) * 256. + .5); - if(tmp >= (1 << 16) || tmp < 0) tmp = 0; - d->albumGain = tmp; - } - - if (d->trackPeak != 0) - d->trackPeak = (int)(log10((double)d->trackPeak) * 20 * 256 + .5); - - if (d->albumPeak != 0) - d->albumPeak = (int)(log10((double)d->albumPeak) * 20 * 256 + .5); - - bool trueGapless = (gapless >> 31) & 0x0001; - if(trueGapless) { - unsigned int lastFrameSamples = (gapless >> 20) & 0x07FF; - d->sampleFrames = d->totalFrames * 1152 - lastFrameSamples; - } - else - d->sampleFrames = d->totalFrames * 1152 - 576; - } - else { - const unsigned int headerData = data.toUInt(0, false); - - d->bitrate = (headerData >> 23) & 0x01ff; - d->version = (headerData >> 11) & 0x03ff; - d->sampleRate = 44100; - d->channels = 2; - - if(d->version >= 5) - d->totalFrames = data.toUInt(4, false); - else - d->totalFrames = data.toUShort(6, false); - - d->sampleFrames = d->totalFrames * 1152 - 576; - } - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - - if(d->bitrate == 0) - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1genres.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1genres.cpp deleted file mode 100755 index 1c707c30c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1genres.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v1genres.h" - -using namespace TagLib; - -namespace -{ - const wchar_t *genres[] = { - L"Blues", - L"Classic Rock", - L"Country", - L"Dance", - L"Disco", - L"Funk", - L"Grunge", - L"Hip-Hop", - L"Jazz", - L"Metal", - L"New Age", - L"Oldies", - L"Other", - L"Pop", - L"R&B", - L"Rap", - L"Reggae", - L"Rock", - L"Techno", - L"Industrial", - L"Alternative", - L"Ska", - L"Death Metal", - L"Pranks", - L"Soundtrack", - L"Euro-Techno", - L"Ambient", - L"Trip-Hop", - L"Vocal", - L"Jazz+Funk", - L"Fusion", - L"Trance", - L"Classical", - L"Instrumental", - L"Acid", - L"House", - L"Game", - L"Sound Clip", - L"Gospel", - L"Noise", - L"Alternative Rock", - L"Bass", - L"Soul", - L"Punk", - L"Space", - L"Meditative", - L"Instrumental Pop", - L"Instrumental Rock", - L"Ethnic", - L"Gothic", - L"Darkwave", - L"Techno-Industrial", - L"Electronic", - L"Pop-Folk", - L"Eurodance", - L"Dream", - L"Southern Rock", - L"Comedy", - L"Cult", - L"Gangsta", - L"Top 40", - L"Christian Rap", - L"Pop/Funk", - L"Jungle", - L"Native American", - L"Cabaret", - L"New Wave", - L"Psychedelic", - L"Rave", - L"Showtunes", - L"Trailer", - L"Lo-Fi", - L"Tribal", - L"Acid Punk", - L"Acid Jazz", - L"Polka", - L"Retro", - L"Musical", - L"Rock & Roll", - L"Hard Rock", - L"Folk", - L"Folk/Rock", - L"National Folk", - L"Swing", - L"Fusion", - L"Bebob", - L"Latin", - L"Revival", - L"Celtic", - L"Bluegrass", - L"Avantgarde", - L"Gothic Rock", - L"Progressive Rock", - L"Psychedelic Rock", - L"Symphonic Rock", - L"Slow Rock", - L"Big Band", - L"Chorus", - L"Easy Listening", - L"Acoustic", - L"Humour", - L"Speech", - L"Chanson", - L"Opera", - L"Chamber Music", - L"Sonata", - L"Symphony", - L"Booty Bass", - L"Primus", - L"Porn Groove", - L"Satire", - L"Slow Jam", - L"Club", - L"Tango", - L"Samba", - L"Folklore", - L"Ballad", - L"Power Ballad", - L"Rhythmic Soul", - L"Freestyle", - L"Duet", - L"Punk Rock", - L"Drum Solo", - L"A Cappella", - L"Euro-House", - L"Dance Hall", - L"Goa", - L"Drum & Bass", - L"Club-House", - L"Hardcore", - L"Terror", - L"Indie", - L"BritPop", - L"Negerpunk", - L"Polsk Punk", - L"Beat", - L"Christian Gangsta Rap", - L"Heavy Metal", - L"Black Metal", - L"Crossover", - L"Contemporary Christian", - L"Christian Rock", - L"Merengue", - L"Salsa", - L"Thrash Metal", - L"Anime", - L"Jpop", - L"Synthpop", - L"Abstract", - L"Art Rock", - L"Baroque", - L"Bhangra", - L"Big Beat", - L"Breakbeat", - L"Chillout", - L"Downtempo", - L"Dub", - L"EBM", - L"Eclectic", - L"Electro", - L"Electroclash", - L"Emo", - L"Experimental", - L"Garage", - L"Global", - L"IDM", - L"Illbient", - L"Industro-Goth", - L"Jam Band", - L"Krautrock", - L"Leftfield", - L"Lounge", - L"Math Rock", - L"New Romantic", - L"Nu-Breakz", - L"Post-Punk", - L"Post-Rock", - L"Psytrance", - L"Shoegaze", - L"Space Rock", - L"Trop Rock", - L"World Music", - L"Neoclassical", - L"Audiobook", - L"Audio Theatre", - L"Neue Deutsche Welle", - L"Podcast", - L"Indie Rock", - L"G-Funk", - L"Dubstep", - L"Garage Rock", - L"Psybient" - }; - const int genresSize = sizeof(genres) / sizeof(genres[0]); -} - -StringList ID3v1::genreList() -{ - StringList l; - for(int i = 0; i < genresSize; i++) { - l.append(genres[i]); - } - - return l; -} - -ID3v1::GenreMap ID3v1::genreMap() -{ - GenreMap m; - for(int i = 0; i < genresSize; i++) { - m.insert(genres[i], i); - } - - return m; -} - -String ID3v1::genre(int i) -{ - if(i >= 0 && i < genresSize) - return String(genres[i]); // always make a copy - else - return String(); -} - -int ID3v1::genreIndex(const String &name) -{ - for(int i = 0; i < genresSize; ++i) { - if(name == genres[i]) - return i; - } - - return 255; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1tag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1tag.cpp deleted file mode 100755 index ca9304113..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v1/id3v1tag.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tfile.h> - -#include "id3v1tag.h" -#include "id3v1genres.h" - -using namespace TagLib; -using namespace ID3v1; - -namespace -{ - const ID3v1::StringHandler defaultStringHandler; - const ID3v1::StringHandler *stringHandler = &defaultStringHandler; -} - -class ID3v1::Tag::TagPrivate -{ -public: - TagPrivate() : - file(0), - tagOffset(0), - track(0), - genre(255) {} - - File *file; - long tagOffset; - - String title; - String artist; - String album; - String year; - String comment; - unsigned char track; - unsigned char genre; -}; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -StringHandler::StringHandler() -{ -} - -String ID3v1::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1).stripWhiteSpace(); -} - -ByteVector ID3v1::StringHandler::render(const String &s) const -{ - if(s.isLatin1()) - return s.data(String::Latin1); - else - return ByteVector(); -} - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -ID3v1::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ -} - -ID3v1::Tag::Tag(File *file, long tagOffset) : - TagLib::Tag(), - d(new TagPrivate()) -{ - d->file = file; - d->tagOffset = tagOffset; - - read(); -} - -ID3v1::Tag::~Tag() -{ - delete d; -} - -ByteVector ID3v1::Tag::render() const -{ - ByteVector data; - - data.append(fileIdentifier()); - data.append(stringHandler->render(d->title).resize(30)); - data.append(stringHandler->render(d->artist).resize(30)); - data.append(stringHandler->render(d->album).resize(30)); - data.append(stringHandler->render(d->year).resize(4)); - data.append(stringHandler->render(d->comment).resize(28)); - data.append(char(0)); - data.append(char(d->track)); - data.append(char(d->genre)); - - return data; -} - -ByteVector ID3v1::Tag::fileIdentifier() -{ - return ByteVector::fromCString("TAG"); -} - -String ID3v1::Tag::title() const -{ - return d->title; -} - -String ID3v1::Tag::artist() const -{ - return d->artist; -} - -String ID3v1::Tag::album() const -{ - return d->album; -} - -String ID3v1::Tag::comment() const -{ - return d->comment; -} - -String ID3v1::Tag::genre() const -{ - return ID3v1::genre(d->genre); -} - -unsigned int ID3v1::Tag::year() const -{ - return d->year.toInt(); -} - -unsigned int ID3v1::Tag::track() const -{ - return d->track; -} - -void ID3v1::Tag::setTitle(const String &s) -{ - d->title = s; -} - -void ID3v1::Tag::setArtist(const String &s) -{ - d->artist = s; -} - -void ID3v1::Tag::setAlbum(const String &s) -{ - d->album = s; -} - -void ID3v1::Tag::setComment(const String &s) -{ - d->comment = s; -} - -void ID3v1::Tag::setGenre(const String &s) -{ - d->genre = ID3v1::genreIndex(s); -} - -void ID3v1::Tag::setYear(unsigned int i) -{ - d->year = i > 0 ? String::number(i) : String(); -} - -void ID3v1::Tag::setTrack(unsigned int i) -{ - d->track = i < 256 ? i : 0; -} - -unsigned int ID3v1::Tag::genreNumber() const -{ - return d->genre; -} - -void ID3v1::Tag::setGenreNumber(unsigned int i) -{ - d->genre = i < 256 ? i : 255; -} - -void ID3v1::Tag::setStringHandler(const StringHandler *handler) -{ - if(handler) - stringHandler = handler; - else - stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected methods -//////////////////////////////////////////////////////////////////////////////// - -void ID3v1::Tag::read() -{ - if(d->file && d->file->isValid()) { - d->file->seek(d->tagOffset); - // read the tag -- always 128 bytes - const ByteVector data = d->file->readBlock(128); - - // some initial sanity checking - if(data.size() == 128 && data.startsWith("TAG")) - parse(data); - else - debug("ID3v1 tag is not valid or could not be read at the specified offset."); - } -} - -void ID3v1::Tag::parse(const ByteVector &data) -{ - int offset = 3; - - d->title = stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->artist = stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->album = stringHandler->parse(data.mid(offset, 30)); - offset += 30; - - d->year = stringHandler->parse(data.mid(offset, 4)); - offset += 4; - - // Check for ID3v1.1 -- Note that ID3v1 *does not* support "track zero" -- this - // is not a bug in TagLib. Since a zeroed byte is what we would expect to - // indicate the end of a C-String, specifically the comment string, a value of - // zero must be assumed to be just that. - - if(data[offset + 28] == 0 && data[offset + 29] != 0) { - // ID3v1.1 detected - - d->comment = stringHandler->parse(data.mid(offset, 28)); - d->track = static_cast<unsigned char>(data[offset + 29]); - } - else - d->comment = data.mid(offset, 30); - - offset += 30; - - d->genre = static_cast<unsigned char>(data[offset]); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp deleted file mode 100755 index 8e2630cef..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "attachedpictureframe.h" - -#include <tstringlist.h> -#include <tdebug.h> - -using namespace TagLib; -using namespace ID3v2; - -class AttachedPictureFrame::AttachedPictureFramePrivate -{ -public: - AttachedPictureFramePrivate() : textEncoding(String::Latin1), - type(AttachedPictureFrame::Other) {} - - String::Type textEncoding; - String mimeType; - AttachedPictureFrame::Type type; - String description; - ByteVector data; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -AttachedPictureFrame::AttachedPictureFrame() : - Frame("APIC"), - d(new AttachedPictureFramePrivate()) -{ -} - -AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data) : - Frame(data), - d(new AttachedPictureFramePrivate()) -{ - setData(data); -} - -AttachedPictureFrame::~AttachedPictureFrame() -{ - delete d; -} - -String AttachedPictureFrame::toString() const -{ - String s = "[" + d->mimeType + "]"; - return d->description.isEmpty() ? s : d->description + " " + s; -} - -String::Type AttachedPictureFrame::textEncoding() const -{ - return d->textEncoding; -} - -void AttachedPictureFrame::setTextEncoding(String::Type t) -{ - d->textEncoding = t; -} - -String AttachedPictureFrame::mimeType() const -{ - return d->mimeType; -} - -void AttachedPictureFrame::setMimeType(const String &m) -{ - d->mimeType = m; -} - -AttachedPictureFrame::Type AttachedPictureFrame::type() const -{ - return d->type; -} - -void AttachedPictureFrame::setType(Type t) -{ - d->type = t; -} - -String AttachedPictureFrame::description() const -{ - return d->description; -} - -void AttachedPictureFrame::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector AttachedPictureFrame::picture() const -{ - return d->data; -} - -void AttachedPictureFrame::setPicture(const ByteVector &p) -{ - d->data = p; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void AttachedPictureFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A picture frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - d->mimeType = readStringField(data, String::Latin1, &pos); - /* Now we need at least two more bytes available */ - if(static_cast<unsigned int>(pos) + 1 >= data.size()) { - debug("Truncated picture frame."); - return; - } - - d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++]; - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -ByteVector AttachedPictureFrame::renderFields() const -{ - ByteVector data; - - String::Type encoding = checkTextEncoding(d->description, d->textEncoding); - - data.append(char(encoding)); - data.append(d->mimeType.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(char(d->type)); - data.append(d->description.data(encoding)); - data.append(textDelimiter(encoding)); - data.append(d->data); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new AttachedPictureFramePrivate()) -{ - parseFields(fieldData(data)); -} - -//////////////////////////////////////////////////////////////////////////////// -// support for ID3v2.2 PIC frames -//////////////////////////////////////////////////////////////////////////////// - -void AttachedPictureFrameV22::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A picture frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - String fixedString = String(data.mid(pos, 3), String::Latin1); - pos += 3; - // convert fixed string image type to mime string - if (fixedString.upper() == "JPG") { - d->mimeType = "image/jpeg"; - } else if (fixedString.upper() == "PNG") { - d->mimeType = "image/png"; - } else { - debug("probably unsupported image type"); - d->mimeType = "image/" + fixedString; - } - - d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++]; - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -AttachedPictureFrameV22::AttachedPictureFrameV22(const ByteVector &data, Header *h) -{ - // set v2.2 header to make fieldData work correctly - setHeader(h, true); - - parseFields(fieldData(data)); - - // now set the v2.4 header - Frame::Header *newHeader = new Frame::Header("APIC"); - newHeader->setFrameSize(h->frameSize()); - setHeader(newHeader, true); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.cpp deleted file mode 100755 index 049f947d8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/chapterframe.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Lukas Krejci - email : krejclu6@fel.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tdebug.h> -#include <stdio.h> - -#include "chapterframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class ChapterFrame::ChapterFramePrivate -{ -public: - ChapterFramePrivate() : - tagHeader(0), - startTime(0), - endTime(0), - startOffset(0), - endOffset(0) - { - embeddedFrameList.setAutoDelete(true); - } - - const ID3v2::Header *tagHeader; - ByteVector elementID; - unsigned int startTime; - unsigned int endTime; - unsigned int startOffset; - unsigned int endOffset; - FrameListMap embeddedFrameListMap; - FrameList embeddedFrameList; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -ChapterFrame::ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data) : - ID3v2::Frame(data), - d(new ChapterFramePrivate()) -{ - d->tagHeader = tagHeader; - setData(data); -} - -ChapterFrame::ChapterFrame(const ByteVector &elementID, - unsigned int startTime, unsigned int endTime, - unsigned int startOffset, unsigned int endOffset, - const FrameList &embeddedFrames) : - ID3v2::Frame("CHAP"), - d(new ChapterFramePrivate()) -{ - // setElementID has a workaround for a previously silly API where you had to - // specifically include the null byte. - - setElementID(elementID); - - d->startTime = startTime; - d->endTime = endTime; - d->startOffset = startOffset; - d->endOffset = endOffset; - - for(FrameList::ConstIterator it = embeddedFrames.begin(); - it != embeddedFrames.end(); ++it) - addEmbeddedFrame(*it); -} - -ChapterFrame::~ChapterFrame() -{ - delete d; -} - -ByteVector ChapterFrame::elementID() const -{ - return d->elementID; -} - -unsigned int ChapterFrame::startTime() const -{ - return d->startTime; -} - -unsigned int ChapterFrame::endTime() const -{ - return d->endTime; -} - -unsigned int ChapterFrame::startOffset() const -{ - return d->startOffset; -} - -unsigned int ChapterFrame::endOffset() const -{ - return d->endOffset; -} - -void ChapterFrame::setElementID(const ByteVector &eID) -{ - d->elementID = eID; - - if(d->elementID.endsWith(char(0))) - d->elementID = d->elementID.mid(0, d->elementID.size() - 1); -} - -void ChapterFrame::setStartTime(const unsigned int &sT) -{ - d->startTime = sT; -} - -void ChapterFrame::setEndTime(const unsigned int &eT) -{ - d->endTime = eT; -} - -void ChapterFrame::setStartOffset(const unsigned int &sO) -{ - d->startOffset = sO; -} - -void ChapterFrame::setEndOffset(const unsigned int &eO) -{ - d->endOffset = eO; -} - -const FrameListMap &ChapterFrame::embeddedFrameListMap() const -{ - return d->embeddedFrameListMap; -} - -const FrameList &ChapterFrame::embeddedFrameList() const -{ - return d->embeddedFrameList; -} - -const FrameList &ChapterFrame::embeddedFrameList(const ByteVector &frameID) const -{ - return d->embeddedFrameListMap[frameID]; -} - -void ChapterFrame::addEmbeddedFrame(Frame *frame) -{ - d->embeddedFrameList.append(frame); - d->embeddedFrameListMap[frame->frameID()].append(frame); -} - -void ChapterFrame::removeEmbeddedFrame(Frame *frame, bool del) -{ - // remove the frame from the frame list - FrameList::Iterator it = d->embeddedFrameList.find(frame); - d->embeddedFrameList.erase(it); - - // ...and from the frame list map - it = d->embeddedFrameListMap[frame->frameID()].find(frame); - d->embeddedFrameListMap[frame->frameID()].erase(it); - - // ...and delete as desired - if(del) - delete frame; -} - -void ChapterFrame::removeEmbeddedFrames(const ByteVector &id) -{ - FrameList l = d->embeddedFrameListMap[id]; - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) - removeEmbeddedFrame(*it, true); -} - -String ChapterFrame::toString() const -{ - String s = String(d->elementID) + - ": start time: " + String::number(d->startTime) + - ", end time: " + String::number(d->endTime); - - if(d->startOffset != 0xFFFFFFFF) - s += ", start offset: " + String::number(d->startOffset); - - if(d->endOffset != 0xFFFFFFFF) - s += ", end offset: " + String::number(d->endOffset); - - if(!d->embeddedFrameList.isEmpty()) { - StringList frameIDs; - for(FrameList::ConstIterator it = d->embeddedFrameList.begin(); - it != d->embeddedFrameList.end(); ++it) - frameIDs.append((*it)->frameID()); - s += ", sub-frames: [ " + frameIDs.toString(", ") + " ]"; - } - - return s; -} - -PropertyMap ChapterFrame::asProperties() const -{ - PropertyMap map; - - map.unsupportedData().append(frameID() + String("/") + d->elementID); - - return map; -} - -ChapterFrame *ChapterFrame::findByElementID(const ID3v2::Tag *tag, const ByteVector &eID) // static -{ - ID3v2::FrameList comments = tag->frameList("CHAP"); - - for(ID3v2::FrameList::ConstIterator it = comments.begin(); - it != comments.end(); - ++it) - { - ChapterFrame *frame = dynamic_cast<ChapterFrame *>(*it); - if(frame && frame->elementID() == eID) - return frame; - } - - return 0; -} - -void ChapterFrame::parseFields(const ByteVector &data) -{ - unsigned int size = data.size(); - if(size < 18) { - debug("A CHAP frame must contain at least 18 bytes (1 byte element ID " - "terminated by null and 4x4 bytes for start and end time and offset)."); - return; - } - - int pos = 0; - unsigned int embPos = 0; - d->elementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); - d->startTime = data.toUInt(pos, true); - pos += 4; - d->endTime = data.toUInt(pos, true); - pos += 4; - d->startOffset = data.toUInt(pos, true); - pos += 4; - d->endOffset = data.toUInt(pos, true); - pos += 4; - size -= pos; - - // Embedded frames are optional - - if(size < header()->size()) - return; - - while(embPos < size - header()->size()) { - Frame *frame = FrameFactory::instance()->createFrame(data.mid(pos + embPos), d->tagHeader); - - if(!frame) - return; - - // Checks to make sure that frame parsed correctly. - if(frame->size() <= 0) { - delete frame; - return; - } - - embPos += frame->size() + header()->size(); - addEmbeddedFrame(frame); - } -} - -ByteVector ChapterFrame::renderFields() const -{ - ByteVector data; - - data.append(d->elementID); - data.append('\0'); - data.append(ByteVector::fromUInt(d->startTime, true)); - data.append(ByteVector::fromUInt(d->endTime, true)); - data.append(ByteVector::fromUInt(d->startOffset, true)); - data.append(ByteVector::fromUInt(d->endOffset, true)); - FrameList l = d->embeddedFrameList; - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) - data.append((*it)->render()); - - return data; -} - -ChapterFrame::ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h) : - Frame(h), - d(new ChapterFramePrivate()) -{ - d->tagHeader = tagHeader; - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/commentsframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/commentsframe.cpp deleted file mode 100755 index 815e5e1a1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/commentsframe.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tstringlist.h> - -#include "commentsframe.h" -#include "tpropertymap.h" - -using namespace TagLib; -using namespace ID3v2; - -class CommentsFrame::CommentsFramePrivate -{ -public: - CommentsFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - ByteVector language; - String description; - String text; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -CommentsFrame::CommentsFrame(String::Type encoding) : - Frame("COMM"), - d(new CommentsFramePrivate()) -{ - d->textEncoding = encoding; -} - -CommentsFrame::CommentsFrame(const ByteVector &data) : - Frame(data), - d(new CommentsFramePrivate()) -{ - setData(data); -} - -CommentsFrame::~CommentsFrame() -{ - delete d; -} - -String CommentsFrame::toString() const -{ - return d->text; -} - -ByteVector CommentsFrame::language() const -{ - return d->language; -} - -String CommentsFrame::description() const -{ - return d->description; -} - -String CommentsFrame::text() const -{ - return d->text; -} - -void CommentsFrame::setLanguage(const ByteVector &languageEncoding) -{ - d->language = languageEncoding.mid(0, 3); -} - -void CommentsFrame::setDescription(const String &s) -{ - d->description = s; -} - -void CommentsFrame::setText(const String &s) -{ - d->text = s; -} - -String::Type CommentsFrame::textEncoding() const -{ - return d->textEncoding; -} - -void CommentsFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -PropertyMap CommentsFrame::asProperties() const -{ - String key = description().upper(); - PropertyMap map; - if(key.isEmpty() || key == "COMMENT") - map.insert("COMMENT", text()); - else - map.insert("COMMENT:" + key, text()); - return map; -} - -CommentsFrame *CommentsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static -{ - ID3v2::FrameList comments = tag->frameList("COMM"); - - for(ID3v2::FrameList::ConstIterator it = comments.begin(); - it != comments.end(); - ++it) - { - CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); - if(frame && frame->description() == d) - return frame; - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void CommentsFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("A comment frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - d->language = data.mid(1, 3); - - int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); - - if(l.size() == 2) { - if(d->textEncoding == String::Latin1) { - d->description = Tag::latin1StringHandler()->parse(l.front()); - d->text = Tag::latin1StringHandler()->parse(l.back()); - } else { - d->description = String(l.front(), d->textEncoding); - d->text = String(l.back(), d->textEncoding); - } - } -} - -ByteVector CommentsFrame::renderFields() const -{ - ByteVector v; - - String::Type encoding = d->textEncoding; - - encoding = checkTextEncoding(d->description, encoding); - encoding = checkTextEncoding(d->text, encoding); - - v.append(char(encoding)); - v.append(d->language.size() == 3 ? d->language : "XXX"); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(d->text.data(encoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -CommentsFrame::CommentsFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new CommentsFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/eventtimingcodesframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/eventtimingcodesframe.cpp deleted file mode 100755 index 930318123..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/eventtimingcodesframe.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/*************************************************************************** - copyright : (C) 2014 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "eventtimingcodesframe.h" -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class EventTimingCodesFrame::EventTimingCodesFramePrivate -{ -public: - EventTimingCodesFramePrivate() : - timestampFormat(EventTimingCodesFrame::AbsoluteMilliseconds) {} - EventTimingCodesFrame::TimestampFormat timestampFormat; - EventTimingCodesFrame::SynchedEventList synchedEvents; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -EventTimingCodesFrame::EventTimingCodesFrame() : - Frame("ETCO"), - d(new EventTimingCodesFramePrivate()) -{ -} - -EventTimingCodesFrame::EventTimingCodesFrame(const ByteVector &data) : - Frame(data), - d(new EventTimingCodesFramePrivate()) -{ - setData(data); -} - -EventTimingCodesFrame::~EventTimingCodesFrame() -{ - delete d; -} - -String EventTimingCodesFrame::toString() const -{ - return String(); -} - -EventTimingCodesFrame::TimestampFormat -EventTimingCodesFrame::timestampFormat() const -{ - return d->timestampFormat; -} - -EventTimingCodesFrame::SynchedEventList -EventTimingCodesFrame::synchedEvents() const -{ - return d->synchedEvents; -} - -void EventTimingCodesFrame::setTimestampFormat( - EventTimingCodesFrame::TimestampFormat f) -{ - d->timestampFormat = f; -} - -void EventTimingCodesFrame::setSynchedEvents( - const EventTimingCodesFrame::SynchedEventList &e) -{ - d->synchedEvents = e; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void EventTimingCodesFrame::parseFields(const ByteVector &data) -{ - const int end = data.size(); - if(end < 1) { - debug("An event timing codes frame must contain at least 1 byte."); - return; - } - - d->timestampFormat = TimestampFormat(data[0]); - - int pos = 1; - d->synchedEvents.clear(); - while(pos + 4 < end) { - EventType type = static_cast<EventType>(static_cast<unsigned char>(data[pos++])); - unsigned int time = data.toUInt(pos, true); - pos += 4; - d->synchedEvents.append(SynchedEvent(time, type)); - } -} - -ByteVector EventTimingCodesFrame::renderFields() const -{ - ByteVector v; - - v.append(char(d->timestampFormat)); - for(SynchedEventList::ConstIterator it = d->synchedEvents.begin(); - it != d->synchedEvents.end(); - ++it) { - const SynchedEvent &entry = *it; - v.append(char(entry.type)); - v.append(ByteVector::fromUInt(entry.time)); - } - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -EventTimingCodesFrame::EventTimingCodesFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new EventTimingCodesFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp deleted file mode 100755 index c9b2f6dc4..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2006 by Aaron VonderHaar - email : avh4@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstringlist.h> - -#include "generalencapsulatedobjectframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate -{ -public: - GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {} - - String::Type textEncoding; - String mimeType; - String fileName; - String description; - ByteVector data; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : - Frame("GEOB"), - d(new GeneralEncapsulatedObjectFramePrivate()) -{ -} - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : - Frame(data), - d(new GeneralEncapsulatedObjectFramePrivate()) -{ - setData(data); -} - -GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame() -{ - delete d; -} - -String GeneralEncapsulatedObjectFrame::toString() const -{ - String text = "[" + d->mimeType + "]"; - - if(!d->fileName.isEmpty()) - text += " " + d->fileName; - - if(!d->description.isEmpty()) - text += " \"" + d->description + "\""; - - return text; -} - -String::Type GeneralEncapsulatedObjectFrame::textEncoding() const -{ - return d->textEncoding; -} - -void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -String GeneralEncapsulatedObjectFrame::mimeType() const -{ - return d->mimeType; -} - -void GeneralEncapsulatedObjectFrame::setMimeType(const String &type) -{ - d->mimeType = type; -} - -String GeneralEncapsulatedObjectFrame::fileName() const -{ - return d->fileName; -} - -void GeneralEncapsulatedObjectFrame::setFileName(const String &name) -{ - d->fileName = name; -} - -String GeneralEncapsulatedObjectFrame::description() const -{ - return d->description; -} - -void GeneralEncapsulatedObjectFrame::setDescription(const String &desc) -{ - d->description = desc; -} - -ByteVector GeneralEncapsulatedObjectFrame::object() const -{ - return d->data; -} - -void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data) -{ - d->data = data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 4) { - debug("An object frame must contain at least 4 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - - int pos = 1; - - d->mimeType = readStringField(data, String::Latin1, &pos); - d->fileName = readStringField(data, d->textEncoding, &pos); - d->description = readStringField(data, d->textEncoding, &pos); - - d->data = data.mid(pos); -} - -ByteVector GeneralEncapsulatedObjectFrame::renderFields() const -{ - StringList sl; - sl.append(d->fileName); - sl.append(d->description); - - const String::Type encoding = checkTextEncoding(sl, d->textEncoding); - - ByteVector data; - - data.append(char(encoding)); - data.append(d->mimeType.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(d->fileName.data(encoding)); - data.append(textDelimiter(encoding)); - data.append(d->description.data(encoding)); - data.append(textDelimiter(encoding)); - data.append(d->data); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new GeneralEncapsulatedObjectFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/ownershipframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/ownershipframe.cpp deleted file mode 100755 index 0b180dbf6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/ownershipframe.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Rupert Daniel - email : rupert@cancelmonday.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstringlist.h> -#include <id3v2tag.h> - -#include "ownershipframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class OwnershipFrame::OwnershipFramePrivate -{ -public: - String pricePaid; - String datePurchased; - String seller; - String::Type textEncoding; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -OwnershipFrame::OwnershipFrame(String::Type encoding) : - Frame("OWNE"), - d(new OwnershipFramePrivate()) -{ - d->textEncoding = encoding; -} - -OwnershipFrame::OwnershipFrame(const ByteVector &data) : - Frame(data), - d(new OwnershipFramePrivate()) -{ - setData(data); -} - -OwnershipFrame::~OwnershipFrame() -{ - delete d; -} - -String OwnershipFrame::toString() const -{ - return "pricePaid=" + d->pricePaid + " datePurchased=" + d->datePurchased + " seller=" + d->seller; -} - -String OwnershipFrame::pricePaid() const -{ - return d->pricePaid; -} - -void OwnershipFrame::setPricePaid(const String &s) -{ - d->pricePaid = s; -} - -String OwnershipFrame::datePurchased() const -{ - return d->datePurchased; -} - -void OwnershipFrame::setDatePurchased(const String &s) -{ - d->datePurchased = s; -} - -String OwnershipFrame::seller() const -{ - return d->seller; -} - -void OwnershipFrame::setSeller(const String &s) -{ - d->seller = s; -} - -String::Type OwnershipFrame::textEncoding() const -{ - return d->textEncoding; -} - -void OwnershipFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void OwnershipFrame::parseFields(const ByteVector &data) -{ - int pos = 0; - - // Get the text encoding - d->textEncoding = String::Type(data[0]); - pos += 1; - - // Read the price paid this is a null terminate string - d->pricePaid = readStringField(data, String::Latin1, &pos); - - // If we don't have at least 8 bytes left then don't parse the rest of the - // data - if(data.size() - pos < 8) { - return; - } - - // Read the date purchased YYYYMMDD - d->datePurchased = String(data.mid(pos, 8)); - pos += 8; - - // Read the seller - if(d->textEncoding == String::Latin1) - d->seller = Tag::latin1StringHandler()->parse(data.mid(pos)); - else - d->seller = String(data.mid(pos), d->textEncoding); -} - -ByteVector OwnershipFrame::renderFields() const -{ - StringList sl; - sl.append(d->seller); - - const String::Type encoding = checkTextEncoding(sl, d->textEncoding); - - ByteVector v; - - v.append(char(encoding)); - v.append(d->pricePaid.data(String::Latin1)); - v.append(textDelimiter(String::Latin1)); - v.append(d->datePurchased.data(String::Latin1)); - v.append(d->seller.data(encoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -OwnershipFrame::OwnershipFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new OwnershipFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.cpp deleted file mode 100755 index 7285b9689..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/podcastframe.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "podcastframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class PodcastFrame::PodcastFramePrivate -{ -public: - ByteVector fieldData; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -PodcastFrame::PodcastFrame() : - Frame("PCST"), - d(new PodcastFramePrivate()) -{ - d->fieldData = ByteVector(4, '\0'); -} - -PodcastFrame::~PodcastFrame() -{ - delete d; -} - -String PodcastFrame::toString() const -{ - return String(); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void PodcastFrame::parseFields(const ByteVector &data) -{ - d->fieldData = data; -} - -ByteVector PodcastFrame::renderFields() const -{ - return d->fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -PodcastFrame::PodcastFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new PodcastFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/popularimeterframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/popularimeterframe.cpp deleted file mode 100755 index 9106fabd5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/popularimeterframe.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> - -#include "popularimeterframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class PopularimeterFrame::PopularimeterFramePrivate -{ -public: - PopularimeterFramePrivate() : rating(0), counter(0) {} - String email; - int rating; - unsigned int counter; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -PopularimeterFrame::PopularimeterFrame() : - Frame("POPM"), - d(new PopularimeterFramePrivate()) -{ -} - -PopularimeterFrame::PopularimeterFrame(const ByteVector &data) : - Frame(data), - d(new PopularimeterFramePrivate()) -{ - setData(data); -} - -PopularimeterFrame::~PopularimeterFrame() -{ - delete d; -} - -String PopularimeterFrame::toString() const -{ - return d->email + " rating=" + String::number(d->rating) + " counter=" + String::number(d->counter); -} - -String PopularimeterFrame::email() const -{ - return d->email; -} - -void PopularimeterFrame::setEmail(const String &s) -{ - d->email = s; -} - -int PopularimeterFrame::rating() const -{ - return d->rating; -} - -void PopularimeterFrame::setRating(int s) -{ - d->rating = s; -} - -unsigned int PopularimeterFrame::counter() const -{ - return d->counter; -} - -void PopularimeterFrame::setCounter(unsigned int s) -{ - d->counter = s; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void PopularimeterFrame::parseFields(const ByteVector &data) -{ - int pos = 0, size = int(data.size()); - - d->email = readStringField(data, String::Latin1, &pos); - - d->rating = 0; - d->counter = 0; - if(pos < size) { - d->rating = (unsigned char)(data[pos++]); - if(pos < size) { - d->counter = data.toUInt(static_cast<unsigned int>(pos)); - } - } -} - -ByteVector PopularimeterFrame::renderFields() const -{ - ByteVector data; - - data.append(d->email.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - data.append(char(d->rating)); - data.append(ByteVector::fromUInt(d->counter)); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -PopularimeterFrame::PopularimeterFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new PopularimeterFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/privateframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/privateframe.cpp deleted file mode 100755 index be80c4df8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/privateframe.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Serkan Kalyoncu - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org -***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> - -#include "privateframe.h" - -using namespace TagLib; -using namespace ID3v2; - - -class PrivateFrame::PrivateFramePrivate -{ -public: - ByteVector data; - String owner; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -PrivateFrame::PrivateFrame() : - Frame("PRIV"), - d(new PrivateFramePrivate()) -{ -} - -PrivateFrame::PrivateFrame(const ByteVector &data) : - Frame(data), - d(new PrivateFramePrivate()) -{ - setData(data); -} - -PrivateFrame::~PrivateFrame() -{ - delete d; -} - -String PrivateFrame::toString() const -{ - return d->owner; -} - -String PrivateFrame::owner() const -{ - return d->owner; -} - -ByteVector PrivateFrame::data() const -{ - return d->data; -} - -void PrivateFrame::setOwner(const String &s) -{ - d->owner = s; -} - -void PrivateFrame::setData(const ByteVector & data) -{ - d->data = data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void PrivateFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 2) { - debug("A private frame must contain at least 2 bytes."); - return; - } - - // Owner identifier is assumed to be Latin1 - - const int byteAlign = 1; - const int endOfOwner = data.find(textDelimiter(String::Latin1), 0, byteAlign); - - d->owner = String(data.mid(0, endOfOwner)); - d->data = data.mid(endOfOwner + 1); -} - -ByteVector PrivateFrame::renderFields() const -{ - ByteVector v; - - v.append(d->owner.data(String::Latin1)); - v.append(textDelimiter(String::Latin1)); - v.append(d->data); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -PrivateFrame::PrivateFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new PrivateFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp deleted file mode 100755 index 3398ada82..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tmap.h> - -#include "relativevolumeframe.h" - -using namespace TagLib; -using namespace ID3v2; - -struct ChannelData -{ - ChannelData() : channelType(RelativeVolumeFrame::Other), volumeAdjustment(0) {} - - RelativeVolumeFrame::ChannelType channelType; - short volumeAdjustment; - RelativeVolumeFrame::PeakVolume peakVolume; -}; - -class RelativeVolumeFrame::RelativeVolumeFramePrivate -{ -public: - String identification; - Map<ChannelType, ChannelData> channels; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RelativeVolumeFrame::RelativeVolumeFrame() : - Frame("RVA2"), - d(new RelativeVolumeFramePrivate()) -{ -} - -RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data) : - Frame(data), - d(new RelativeVolumeFramePrivate()) -{ - setData(data); -} - -RelativeVolumeFrame::~RelativeVolumeFrame() -{ - delete d; -} - -String RelativeVolumeFrame::toString() const -{ - return d->identification; -} - -List<RelativeVolumeFrame::ChannelType> RelativeVolumeFrame::channels() const -{ - List<ChannelType> l; - - Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); - for(; it != d->channels.end(); ++it) - l.append((*it).first); - - return l; -} - -// deprecated - -RelativeVolumeFrame::ChannelType RelativeVolumeFrame::channelType() const -{ - return MasterVolume; -} - -// deprecated - -void RelativeVolumeFrame::setChannelType(ChannelType) -{ - -} - -short RelativeVolumeFrame::volumeAdjustmentIndex(ChannelType type) const -{ - return d->channels.contains(type) ? d->channels[type].volumeAdjustment : 0; -} - -short RelativeVolumeFrame::volumeAdjustmentIndex() const -{ - return volumeAdjustmentIndex(MasterVolume); -} - -void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index, ChannelType type) -{ - d->channels[type].volumeAdjustment = index; -} - -void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index) -{ - setVolumeAdjustmentIndex(index, MasterVolume); -} - -float RelativeVolumeFrame::volumeAdjustment(ChannelType type) const -{ - return d->channels.contains(type) ? float(d->channels[type].volumeAdjustment) / float(512) : 0; -} - -float RelativeVolumeFrame::volumeAdjustment() const -{ - return volumeAdjustment(MasterVolume); -} - -void RelativeVolumeFrame::setVolumeAdjustment(float adjustment, ChannelType type) -{ - d->channels[type].volumeAdjustment = short(adjustment * float(512)); -} - -void RelativeVolumeFrame::setVolumeAdjustment(float adjustment) -{ - setVolumeAdjustment(adjustment, MasterVolume); -} - -RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume(ChannelType type) const -{ - return d->channels.contains(type) ? d->channels[type].peakVolume : PeakVolume(); -} - -RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume() const -{ - return peakVolume(MasterVolume); -} - -void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak, ChannelType type) -{ - d->channels[type].peakVolume = peak; -} - -void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak) -{ - setPeakVolume(peak, MasterVolume); -} - -String RelativeVolumeFrame::identification() const -{ - return d->identification; -} - -void RelativeVolumeFrame::setIdentification(const String &s) -{ - d->identification = s; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void RelativeVolumeFrame::parseFields(const ByteVector &data) -{ - int pos = 0; - d->identification = readStringField(data, String::Latin1, &pos); - - // Each channel is at least 4 bytes. - - while(pos <= (int)data.size() - 4) { - - ChannelType type = ChannelType(data[pos]); - pos += 1; - - ChannelData &channel = d->channels[type]; - - channel.volumeAdjustment = data.toShort(static_cast<unsigned int>(pos)); - pos += 2; - - channel.peakVolume.bitsRepresentingPeak = data[pos]; - pos += 1; - - const int bytes = (channel.peakVolume.bitsRepresentingPeak + 7) / 8; - channel.peakVolume.peakVolume = data.mid(pos, bytes); - pos += bytes; - } -} - -ByteVector RelativeVolumeFrame::renderFields() const -{ - ByteVector data; - - data.append(d->identification.data(String::Latin1)); - data.append(textDelimiter(String::Latin1)); - - Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); - - for(; it != d->channels.end(); ++it) { - ChannelType type = (*it).first; - const ChannelData &channel = (*it).second; - - data.append(char(type)); - data.append(ByteVector::fromShort(channel.volumeAdjustment)); - data.append(char(channel.peakVolume.bitsRepresentingPeak)); - data.append(channel.peakVolume.peakVolume); - } - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new RelativeVolumeFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.cpp deleted file mode 100755 index 6a62bb495..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/*************************************************************************** - copyright : (C) 2014 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "synchronizedlyricsframe.h" -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class SynchronizedLyricsFrame::SynchronizedLyricsFramePrivate -{ -public: - SynchronizedLyricsFramePrivate() : - textEncoding(String::Latin1), - timestampFormat(SynchronizedLyricsFrame::AbsoluteMilliseconds), - type(SynchronizedLyricsFrame::Lyrics) {} - String::Type textEncoding; - ByteVector language; - SynchronizedLyricsFrame::TimestampFormat timestampFormat; - SynchronizedLyricsFrame::Type type; - String description; - SynchronizedLyricsFrame::SynchedTextList synchedText; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -SynchronizedLyricsFrame::SynchronizedLyricsFrame(String::Type encoding) : - Frame("SYLT"), - d(new SynchronizedLyricsFramePrivate()) -{ - d->textEncoding = encoding; -} - -SynchronizedLyricsFrame::SynchronizedLyricsFrame(const ByteVector &data) : - Frame(data), - d(new SynchronizedLyricsFramePrivate()) -{ - setData(data); -} - -SynchronizedLyricsFrame::~SynchronizedLyricsFrame() -{ - delete d; -} - -String SynchronizedLyricsFrame::toString() const -{ - return d->description; -} - -String::Type SynchronizedLyricsFrame::textEncoding() const -{ - return d->textEncoding; -} - -ByteVector SynchronizedLyricsFrame::language() const -{ - return d->language; -} - -SynchronizedLyricsFrame::TimestampFormat -SynchronizedLyricsFrame::timestampFormat() const -{ - return d->timestampFormat; -} - -SynchronizedLyricsFrame::Type SynchronizedLyricsFrame::type() const -{ - return d->type; -} - -String SynchronizedLyricsFrame::description() const -{ - return d->description; -} - -SynchronizedLyricsFrame::SynchedTextList -SynchronizedLyricsFrame::synchedText() const -{ - return d->synchedText; -} - -void SynchronizedLyricsFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -void SynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding) -{ - d->language = languageEncoding.mid(0, 3); -} - -void SynchronizedLyricsFrame::setTimestampFormat(SynchronizedLyricsFrame::TimestampFormat f) -{ - d->timestampFormat = f; -} - -void SynchronizedLyricsFrame::setType(SynchronizedLyricsFrame::Type t) -{ - d->type = t; -} - -void SynchronizedLyricsFrame::setDescription(const String &s) -{ - d->description = s; -} - -void SynchronizedLyricsFrame::setSynchedText( - const SynchronizedLyricsFrame::SynchedTextList &t) -{ - d->synchedText = t; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void SynchronizedLyricsFrame::parseFields(const ByteVector &data) -{ - const int end = data.size(); - if(end < 7) { - debug("A synchronized lyrics frame must contain at least 7 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - d->language = data.mid(1, 3); - d->timestampFormat = TimestampFormat(data[4]); - d->type = Type(data[5]); - - int pos = 6; - - d->description = readStringField(data, d->textEncoding, &pos); - if(pos == 6) - return; - - /* - * If UTF16 strings are found in SYLT frames, a BOM may only be - * present in the first string (content descriptor), and the strings of - * the synchronized text have no BOM. Here the BOM is read from - * the first string to have a specific encoding with endianness for the - * case of strings without BOM so that readStringField() will work. - */ - String::Type encWithEndianness = d->textEncoding; - if(d->textEncoding == String::UTF16) { - unsigned short bom = data.toUShort(6, true); - if(bom == 0xfffe) { - encWithEndianness = String::UTF16LE; - } else if(bom == 0xfeff) { - encWithEndianness = String::UTF16BE; - } - } - - d->synchedText.clear(); - while(pos < end) { - String::Type enc = d->textEncoding; - // If a UTF16 string has no BOM, use the encoding found above. - if(enc == String::UTF16 && pos + 1 < end) { - unsigned short bom = data.toUShort(pos, true); - if(bom != 0xfffe && bom != 0xfeff) { - enc = encWithEndianness; - } - } - String text = readStringField(data, enc, &pos); - if(pos + 4 > end) - return; - - unsigned int time = data.toUInt(pos, true); - pos += 4; - - d->synchedText.append(SynchedText(time, text)); - } -} - -ByteVector SynchronizedLyricsFrame::renderFields() const -{ - ByteVector v; - - String::Type encoding = d->textEncoding; - - encoding = checkTextEncoding(d->description, encoding); - for(SynchedTextList::ConstIterator it = d->synchedText.begin(); - it != d->synchedText.end(); - ++it) { - encoding = checkTextEncoding(it->text, encoding); - } - - v.append(char(encoding)); - v.append(d->language.size() == 3 ? d->language : "XXX"); - v.append(char(d->timestampFormat)); - v.append(char(d->type)); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - for(SynchedTextList::ConstIterator it = d->synchedText.begin(); - it != d->synchedText.end(); - ++it) { - const SynchedText &entry = *it; - v.append(entry.text.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(ByteVector::fromUInt(entry.time)); - } - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -SynchronizedLyricsFrame::SynchronizedLyricsFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new SynchronizedLyricsFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp deleted file mode 100755 index 937cb4d24..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp +++ /dev/null @@ -1,356 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Lukas Krejci - email : krejclu6@fel.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tdebug.h> - -#include "tableofcontentsframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class TableOfContentsFrame::TableOfContentsFramePrivate -{ -public: - TableOfContentsFramePrivate() : - tagHeader(0), - isTopLevel(false), - isOrdered(false) - { - embeddedFrameList.setAutoDelete(true); - } - - const ID3v2::Header *tagHeader; - ByteVector elementID; - bool isTopLevel; - bool isOrdered; - ByteVectorList childElements; - FrameListMap embeddedFrameListMap; - FrameList embeddedFrameList; -}; - -namespace { - - // These functions are needed to try to aim for backward compatibility with - // an API that previously (unreasonably) required null bytes to be appended - // at the end of identifiers explicitly by the API user. - - // BIC: remove these - - ByteVector &strip(ByteVector &b) - { - if(b.endsWith('\0')) - b.resize(b.size() - 1); - return b; - } - - ByteVectorList &strip(ByteVectorList &l) - { - for(ByteVectorList::Iterator it = l.begin(); it != l.end(); ++it) - { - strip(*it); - } - return l; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -TableOfContentsFrame::TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data) : - ID3v2::Frame(data), - d(new TableOfContentsFramePrivate()) -{ - d->tagHeader = tagHeader; - setData(data); -} - -TableOfContentsFrame::TableOfContentsFrame(const ByteVector &elementID, - const ByteVectorList &children, - const FrameList &embeddedFrames) : - ID3v2::Frame("CTOC"), - d(new TableOfContentsFramePrivate()) -{ - d->elementID = elementID; - strip(d->elementID); - d->childElements = children; - - for(FrameList::ConstIterator it = embeddedFrames.begin(); it != embeddedFrames.end(); ++it) - addEmbeddedFrame(*it); -} - -TableOfContentsFrame::~TableOfContentsFrame() -{ - delete d; -} - -ByteVector TableOfContentsFrame::elementID() const -{ - return d->elementID; -} - -bool TableOfContentsFrame::isTopLevel() const -{ - return d->isTopLevel; -} - -bool TableOfContentsFrame::isOrdered() const -{ - return d->isOrdered; -} - -unsigned int TableOfContentsFrame::entryCount() const -{ - return d->childElements.size(); -} - -ByteVectorList TableOfContentsFrame::childElements() const -{ - return d->childElements; -} - -void TableOfContentsFrame::setElementID(const ByteVector &eID) -{ - d->elementID = eID; - strip(d->elementID); -} - -void TableOfContentsFrame::setIsTopLevel(const bool &t) -{ - d->isTopLevel = t; -} - -void TableOfContentsFrame::setIsOrdered(const bool &o) -{ - d->isOrdered = o; -} - -void TableOfContentsFrame::setChildElements(const ByteVectorList &l) -{ - d->childElements = l; - strip(d->childElements); -} - -void TableOfContentsFrame::addChildElement(const ByteVector &cE) -{ - d->childElements.append(cE); - strip(d->childElements); -} - -void TableOfContentsFrame::removeChildElement(const ByteVector &cE) -{ - ByteVectorList::Iterator it = d->childElements.find(cE); - - if(it == d->childElements.end()) - it = d->childElements.find(cE + ByteVector("\0")); - - d->childElements.erase(it); -} - -const FrameListMap &TableOfContentsFrame::embeddedFrameListMap() const -{ - return d->embeddedFrameListMap; -} - -const FrameList &TableOfContentsFrame::embeddedFrameList() const -{ - return d->embeddedFrameList; -} - -const FrameList &TableOfContentsFrame::embeddedFrameList(const ByteVector &frameID) const -{ - return d->embeddedFrameListMap[frameID]; -} - -void TableOfContentsFrame::addEmbeddedFrame(Frame *frame) -{ - d->embeddedFrameList.append(frame); - d->embeddedFrameListMap[frame->frameID()].append(frame); -} - -void TableOfContentsFrame::removeEmbeddedFrame(Frame *frame, bool del) -{ - // remove the frame from the frame list - FrameList::Iterator it = d->embeddedFrameList.find(frame); - d->embeddedFrameList.erase(it); - - // ...and from the frame list map - it = d->embeddedFrameListMap[frame->frameID()].find(frame); - d->embeddedFrameListMap[frame->frameID()].erase(it); - - // ...and delete as desired - if(del) - delete frame; -} - -void TableOfContentsFrame::removeEmbeddedFrames(const ByteVector &id) -{ - FrameList l = d->embeddedFrameListMap[id]; - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) - removeEmbeddedFrame(*it, true); -} - -String TableOfContentsFrame::toString() const -{ - String s = String(d->elementID) + - ": top level: " + (d->isTopLevel ? "true" : "false") + - ", ordered: " + (d->isOrdered ? "true" : "false"); - - if(!d->childElements.isEmpty()) { - s+= ", chapters: [ " + String(d->childElements.toByteVector(", ")) + " ]"; - } - - if(!d->embeddedFrameList.isEmpty()) { - StringList frameIDs; - for(FrameList::ConstIterator it = d->embeddedFrameList.begin(); - it != d->embeddedFrameList.end(); ++it) - frameIDs.append((*it)->frameID()); - s += ", sub-frames: [ " + frameIDs.toString(", ") + " ]"; - } - - return s; -} - -PropertyMap TableOfContentsFrame::asProperties() const -{ - PropertyMap map; - - map.unsupportedData().append(frameID() + String("/") + d->elementID); - - return map; -} - -TableOfContentsFrame *TableOfContentsFrame::findByElementID(const ID3v2::Tag *tag, - const ByteVector &eID) // static -{ - ID3v2::FrameList tablesOfContents = tag->frameList("CTOC"); - - for(ID3v2::FrameList::ConstIterator it = tablesOfContents.begin(); - it != tablesOfContents.end(); - ++it) - { - TableOfContentsFrame *frame = dynamic_cast<TableOfContentsFrame *>(*it); - if(frame && frame->elementID() == eID) - return frame; - } - - return 0; -} - -TableOfContentsFrame *TableOfContentsFrame::findTopLevel(const ID3v2::Tag *tag) // static -{ - ID3v2::FrameList tablesOfContents = tag->frameList("CTOC"); - - for(ID3v2::FrameList::ConstIterator it = tablesOfContents.begin(); - it != tablesOfContents.end(); - ++it) - { - TableOfContentsFrame *frame = dynamic_cast<TableOfContentsFrame *>(*it); - if(frame && frame->isTopLevel() == true) - return frame; - } - - return 0; -} - -void TableOfContentsFrame::parseFields(const ByteVector &data) -{ - unsigned int size = data.size(); - if(size < 6) { - debug("A CTOC frame must contain at least 6 bytes (1 byte element ID terminated by " - "null, 1 byte flags, 1 byte entry count and 1 byte child element ID terminated " - "by null."); - return; - } - - int pos = 0; - unsigned int embPos = 0; - d->elementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); - d->isTopLevel = (data.at(pos) & 2) != 0; - d->isOrdered = (data.at(pos++) & 1) != 0; - unsigned int entryCount = static_cast<unsigned char>(data.at(pos++)); - for(unsigned int i = 0; i < entryCount; i++) { - ByteVector childElementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); - d->childElements.append(childElementID); - } - - size -= pos; - - if(size < header()->size()) - return; - - while(embPos < size - header()->size()) { - Frame *frame = FrameFactory::instance()->createFrame(data.mid(pos + embPos), d->tagHeader); - - if(!frame) - return; - - // Checks to make sure that frame parsed correctly. - if(frame->size() <= 0) { - delete frame; - return; - } - - embPos += frame->size() + header()->size(); - addEmbeddedFrame(frame); - } -} - -ByteVector TableOfContentsFrame::renderFields() const -{ - ByteVector data; - - data.append(d->elementID); - data.append('\0'); - char flags = 0; - if(d->isTopLevel) - flags += 2; - if(d->isOrdered) - flags += 1; - data.append(flags); - data.append((char)(entryCount())); - ByteVectorList::ConstIterator it = d->childElements.begin(); - while(it != d->childElements.end()) { - data.append(*it); - data.append('\0'); - it++; - } - FrameList l = d->embeddedFrameList; - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) - data.append((*it)->render()); - - return data; -} - -TableOfContentsFrame::TableOfContentsFrame(const ID3v2::Header *tagHeader, - const ByteVector &data, Header *h) : - Frame(h), - d(new TableOfContentsFramePrivate()) -{ - d->tagHeader = tagHeader; - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/textidentificationframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/textidentificationframe.cpp deleted file mode 100755 index 9b1eacd1a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/textidentificationframe.cpp +++ /dev/null @@ -1,434 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include "textidentificationframe.h" -#include "tpropertymap.h" -#include "id3v1genres.h" - -using namespace TagLib; -using namespace ID3v2; - -class TextIdentificationFrame::TextIdentificationFramePrivate -{ -public: - TextIdentificationFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - StringList fieldList; -}; - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame public members -//////////////////////////////////////////////////////////////////////////////// - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &type, String::Type encoding) : - Frame(type), - d(new TextIdentificationFramePrivate()) -{ - d->textEncoding = encoding; -} - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data) : - Frame(data), - d(new TextIdentificationFramePrivate()) -{ - setData(data); -} - -TextIdentificationFrame *TextIdentificationFrame::createTIPLFrame(const PropertyMap &properties) // static -{ - TextIdentificationFrame *frame = new TextIdentificationFrame("TIPL"); - StringList l; - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - l.append(it->first); - l.append(it->second.toString(",")); // comma-separated list of names - } - frame->setText(l); - return frame; -} - -TextIdentificationFrame *TextIdentificationFrame::createTMCLFrame(const PropertyMap &properties) // static -{ - TextIdentificationFrame *frame = new TextIdentificationFrame("TMCL"); - StringList l; - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - if(!it->first.startsWith(instrumentPrefix)) // should not happen - continue; - l.append(it->first.substr(instrumentPrefix.size())); - l.append(it->second.toString(",")); - } - frame->setText(l); - return frame; -} - -TextIdentificationFrame::~TextIdentificationFrame() -{ - delete d; -} - -void TextIdentificationFrame::setText(const StringList &l) -{ - d->fieldList = l; -} - -void TextIdentificationFrame::setText(const String &s) -{ - d->fieldList = s; -} - -String TextIdentificationFrame::toString() const -{ - return d->fieldList.toString(); -} - -StringList TextIdentificationFrame::fieldList() const -{ - return d->fieldList; -} - -String::Type TextIdentificationFrame::textEncoding() const -{ - return d->textEncoding; -} - -void TextIdentificationFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -namespace -{ - // array of allowed TIPL prefixes and their corresponding key value - const char* involvedPeople[][2] = { - {"ARRANGER", "ARRANGER"}, - {"ENGINEER", "ENGINEER"}, - {"PRODUCER", "PRODUCER"}, - {"DJ-MIX", "DJMIXER"}, - {"MIX", "MIXER"}, - }; - const size_t involvedPeopleSize = sizeof(involvedPeople) / sizeof(involvedPeople[0]); -} - -const KeyConversionMap &TextIdentificationFrame::involvedPeopleMap() // static -{ - static KeyConversionMap m; - if(m.isEmpty()) { - for(size_t i = 0; i < involvedPeopleSize; ++i) - m.insert(involvedPeople[i][1], involvedPeople[i][0]); - } - return m; -} - -PropertyMap TextIdentificationFrame::asProperties() const -{ - if(frameID() == "TIPL") - return makeTIPLProperties(); - if(frameID() == "TMCL") - return makeTMCLProperties(); - PropertyMap map; - String tagName = frameIDToKey(frameID()); - if(tagName.isEmpty()) { - map.unsupportedData().append(frameID()); - return map; - } - StringList values = fieldList(); - if(tagName == "GENRE") { - // Special case: Support ID3v1-style genre numbers. They are not officially supported in - // ID3v2, however it seems that still a lot of programs use them. - for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { - bool ok = false; - int test = it->toInt(&ok); // test if the genre value is an integer - if(ok) - *it = ID3v1::genre(test); - } - } else if(tagName == "DATE") { - for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { - // ID3v2 specifies ISO8601 timestamps which contain a 'T' as separator between date and time. - // Since this is unusual in other formats, the T is removed. - int tpos = it->find("T"); - if(tpos != -1) - (*it)[tpos] = ' '; - } - } - PropertyMap ret; - ret.insert(tagName, values); - return ret; -} - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame protected members -//////////////////////////////////////////////////////////////////////////////// - -void TextIdentificationFrame::parseFields(const ByteVector &data) -{ - // Don't try to parse invalid frames - - if(data.size() < 2) - return; - - // read the string data type (the first byte of the field data) - - d->textEncoding = String::Type(data[0]); - - // split the byte array into chunks based on the string type (two byte delimiter - // for unicode encodings) - - int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - // build a small counter to strip nulls off the end of the field - - int dataLength = data.size() - 1; - - while(dataLength > 0 && data[dataLength] == 0) - dataLength--; - - while(dataLength % byteAlign != 0) - dataLength++; - - ByteVectorList l = ByteVectorList::split(data.mid(1, dataLength), textDelimiter(d->textEncoding), byteAlign); - - d->fieldList.clear(); - - // append those split values to the list and make sure that the new string's - // type is the same specified for this frame - - for(ByteVectorList::ConstIterator it = l.begin(); it != l.end(); it++) { - if(!(*it).isEmpty()) { - if(d->textEncoding == String::Latin1) - d->fieldList.append(Tag::latin1StringHandler()->parse(*it)); - else - d->fieldList.append(String(*it, d->textEncoding)); - } - } -} - -ByteVector TextIdentificationFrame::renderFields() const -{ - String::Type encoding = checkTextEncoding(d->fieldList, d->textEncoding); - - ByteVector v; - - v.append(char(encoding)); - - for(StringList::ConstIterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) { - - // Since the field list is null delimited, if this is not the first - // element in the list, append the appropriate delimiter for this - // encoding. - - if(it != d->fieldList.begin()) - v.append(textDelimiter(encoding)); - - v.append((*it).data(encoding)); - } - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// TextIdentificationFrame private members -//////////////////////////////////////////////////////////////////////////////// - -TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new TextIdentificationFramePrivate()) -{ - parseFields(fieldData(data)); -} - -PropertyMap TextIdentificationFrame::makeTIPLProperties() const -{ - PropertyMap map; - if(fieldList().size() % 2 != 0){ - // according to the ID3 spec, TIPL must contain an even number of entries - map.unsupportedData().append(frameID()); - return map; - } - StringList l = fieldList(); - for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - bool found = false; - for(size_t i = 0; i < involvedPeopleSize; ++i) - if(*it == involvedPeople[i][0]) { - map.insert(involvedPeople[i][1], (++it)->split(",")); - found = true; - break; - } - if(!found){ - // invalid involved role -> mark whole frame as unsupported in order to be consistent with writing - map.clear(); - map.unsupportedData().append(frameID()); - return map; - } - } - return map; -} - -PropertyMap TextIdentificationFrame::makeTMCLProperties() const -{ - PropertyMap map; - if(fieldList().size() % 2 != 0){ - // according to the ID3 spec, TMCL must contain an even number of entries - map.unsupportedData().append(frameID()); - return map; - } - StringList l = fieldList(); - for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { - String instrument = it->upper(); - if(instrument.isEmpty()) { - // instrument is not a valid key -> frame unsupported - map.clear(); - map.unsupportedData().append(frameID()); - return map; - } - map.insert(L"PERFORMER:" + instrument, (++it)->split(",")); - } - return map; -} - -//////////////////////////////////////////////////////////////////////////////// -// UserTextIdentificationFrame public members -//////////////////////////////////////////////////////////////////////////////// - -UserTextIdentificationFrame::UserTextIdentificationFrame(String::Type encoding) : - TextIdentificationFrame("TXXX", encoding), - d(0) -{ - StringList l; - l.append(String()); - l.append(String()); - setText(l); -} - - -UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data) : - TextIdentificationFrame(data) -{ - checkFields(); -} - -UserTextIdentificationFrame::UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding) : - TextIdentificationFrame("TXXX", encoding), - d(0) -{ - setDescription(description); - setText(values); -} - -String UserTextIdentificationFrame::toString() const -{ - // first entry is the description itself, drop from values list - StringList l = fieldList(); - for(StringList::Iterator it = l.begin(); it != l.end(); ++it) { - l.erase(it); - break; - } - return "[" + description() + "] " + l.toString(); -} - -String UserTextIdentificationFrame::description() const -{ - return !TextIdentificationFrame::fieldList().isEmpty() - ? TextIdentificationFrame::fieldList().front() - : String(); -} - -StringList UserTextIdentificationFrame::fieldList() const -{ - // TODO: remove this function - - return TextIdentificationFrame::fieldList(); -} - -void UserTextIdentificationFrame::setText(const String &text) -{ - if(description().isEmpty()) - setDescription(String()); - - TextIdentificationFrame::setText(StringList(description()).append(text)); -} - -void UserTextIdentificationFrame::setText(const StringList &fields) -{ - if(description().isEmpty()) - setDescription(String()); - - TextIdentificationFrame::setText(StringList(description()).append(fields)); -} - -void UserTextIdentificationFrame::setDescription(const String &s) -{ - StringList l = fieldList(); - - if(l.isEmpty()) - l.append(s); - else - l[0] = s; - - TextIdentificationFrame::setText(l); -} - -PropertyMap UserTextIdentificationFrame::asProperties() const -{ - PropertyMap map; - String tagName = txxxToKey(description()); - StringList v = fieldList(); - for(StringList::ConstIterator it = v.begin(); it != v.end(); ++it) - if(it != v.begin()) - map.insert(tagName, *it); - return map; -} - -UserTextIdentificationFrame *UserTextIdentificationFrame::find( - ID3v2::Tag *tag, const String &description) // static -{ - FrameList l = tag->frameList("TXXX"); - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { - UserTextIdentificationFrame *f = dynamic_cast<UserTextIdentificationFrame *>(*it); - if(f && f->description() == description) - return f; - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// UserTextIdentificationFrame private members -//////////////////////////////////////////////////////////////////////////////// - -UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data, Header *h) : - TextIdentificationFrame(data, h) -{ - checkFields(); -} - -void UserTextIdentificationFrame::checkFields() -{ - int fields = fieldList().size(); - - if(fields == 0) - setDescription(String()); - if(fields <= 1) - setText(String()); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp deleted file mode 100755 index fcb855b2e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <tdebug.h> - -#include "id3v2tag.h" -#include "uniquefileidentifierframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate -{ -public: - String owner; - ByteVector identifier; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) : - ID3v2::Frame(data), - d(new UniqueFileIdentifierFramePrivate()) -{ - setData(data); -} - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) : - ID3v2::Frame("UFID"), - d(new UniqueFileIdentifierFramePrivate()) -{ - d->owner = owner; - d->identifier = id; -} - -UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame() -{ - delete d; -} - -String UniqueFileIdentifierFrame::owner() const -{ - return d->owner; -} - -ByteVector UniqueFileIdentifierFrame::identifier() const -{ - return d->identifier; -} - -void UniqueFileIdentifierFrame::setOwner(const String &s) -{ - d->owner = s; -} - -void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v) -{ - d->identifier = v; -} - -String UniqueFileIdentifierFrame::toString() const -{ - return String(); -} - -PropertyMap UniqueFileIdentifierFrame::asProperties() const -{ - PropertyMap map; - if(d->owner == "http://musicbrainz.org") { - map.insert("MUSICBRAINZ_TRACKID", String(d->identifier)); - } - else { - map.unsupportedData().append(frameID() + String("/") + d->owner); - } - return map; -} - -UniqueFileIdentifierFrame *UniqueFileIdentifierFrame::findByOwner(const ID3v2::Tag *tag, const String &o) // static -{ - ID3v2::FrameList comments = tag->frameList("UFID"); - - for(ID3v2::FrameList::ConstIterator it = comments.begin(); - it != comments.end(); - ++it) - { - UniqueFileIdentifierFrame *frame = dynamic_cast<UniqueFileIdentifierFrame *>(*it); - if(frame && frame->owner() == o) - return frame; - } - - return 0; -} - -void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 1) { - debug("An UFID frame must contain at least 1 byte."); - return; - } - - int pos = 0; - d->owner = readStringField(data, String::Latin1, &pos); - d->identifier = data.mid(pos); -} - -ByteVector UniqueFileIdentifierFrame::renderFields() const -{ - ByteVector data; - - data.append(d->owner.data(String::Latin1)); - data.append(char(0)); - data.append(d->identifier); - - return data; -} - -UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new UniqueFileIdentifierFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unknownframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unknownframe.cpp deleted file mode 100755 index edb30084a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unknownframe.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class UnknownFrame::UnknownFramePrivate -{ -public: - ByteVector fieldData; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -UnknownFrame::UnknownFrame(const ByteVector &data) : - Frame(data), - d(new UnknownFramePrivate()) -{ - setData(data); -} - -UnknownFrame::~UnknownFrame() -{ - delete d; -} - -String UnknownFrame::toString() const -{ - return String(); -} - -ByteVector UnknownFrame::data() const -{ - return d->fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void UnknownFrame::parseFields(const ByteVector &data) -{ - d->fieldData = data; -} - -ByteVector UnknownFrame::renderFields() const -{ - return d->fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -UnknownFrame::UnknownFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new UnknownFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp deleted file mode 100755 index eafae171c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "unsynchronizedlyricsframe.h" -#include <tbytevectorlist.h> -#include <id3v2tag.h> -#include <tdebug.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class UnsynchronizedLyricsFrame::UnsynchronizedLyricsFramePrivate -{ -public: - UnsynchronizedLyricsFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - ByteVector language; - String description; - String text; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(String::Type encoding) : - Frame("USLT"), - d(new UnsynchronizedLyricsFramePrivate()) -{ - d->textEncoding = encoding; -} - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data) : - Frame(data), - d(new UnsynchronizedLyricsFramePrivate()) -{ - setData(data); -} - -UnsynchronizedLyricsFrame::~UnsynchronizedLyricsFrame() -{ - delete d; -} - -String UnsynchronizedLyricsFrame::toString() const -{ - return d->text; -} - -ByteVector UnsynchronizedLyricsFrame::language() const -{ - return d->language; -} - -String UnsynchronizedLyricsFrame::description() const -{ - return d->description; -} - -String UnsynchronizedLyricsFrame::text() const -{ - return d->text; -} - -void UnsynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding) -{ - d->language = languageEncoding.mid(0, 3); -} - -void UnsynchronizedLyricsFrame::setDescription(const String &s) -{ - d->description = s; -} - -void UnsynchronizedLyricsFrame::setText(const String &s) -{ - d->text = s; -} - - -String::Type UnsynchronizedLyricsFrame::textEncoding() const -{ - return d->textEncoding; -} - -void UnsynchronizedLyricsFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -PropertyMap UnsynchronizedLyricsFrame::asProperties() const -{ - PropertyMap map; - String key = description().upper(); - if(key.isEmpty() || key == "LYRICS") - map.insert("LYRICS", text()); - else - map.insert("LYRICS:" + key, text()); - return map; -} - -UnsynchronizedLyricsFrame *UnsynchronizedLyricsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static -{ - ID3v2::FrameList lyrics = tag->frameList("USLT"); - - for(ID3v2::FrameList::ConstIterator it = lyrics.begin(); it != lyrics.end(); ++it){ - UnsynchronizedLyricsFrame *frame = dynamic_cast<UnsynchronizedLyricsFrame *>(*it); - if(frame && frame->description() == d) - return frame; - } - return 0; -} -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void UnsynchronizedLyricsFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 5) { - debug("An unsynchronized lyrics frame must contain at least 5 bytes."); - return; - } - - d->textEncoding = String::Type(data[0]); - d->language = data.mid(1, 3); - - int byteAlign - = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; - - ByteVectorList l = - ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); - - if(l.size() == 2) { - if(d->textEncoding == String::Latin1) { - d->description = Tag::latin1StringHandler()->parse(l.front()); - d->text = Tag::latin1StringHandler()->parse(l.back()); - } else { - d->description = String(l.front(), d->textEncoding); - d->text = String(l.back(), d->textEncoding); - } - } -} - -ByteVector UnsynchronizedLyricsFrame::renderFields() const -{ - StringList sl; - sl.append(d->description); - sl.append(d->text); - - const String::Type encoding = checkTextEncoding(sl, d->textEncoding); - - ByteVector v; - - v.append(char(encoding)); - v.append(d->language.size() == 3 ? d->language : "XXX"); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(d->text.data(encoding)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new UnsynchronizedLyricsFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/urllinkframe.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/urllinkframe.cpp deleted file mode 100755 index 543b5184d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/frames/urllinkframe.cpp +++ /dev/null @@ -1,246 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - - copyright : (C) 2006 by Urs Fleisch - email : ufleisch@users.sourceforge.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "urllinkframe.h" -#include "id3v2tag.h" -#include <tdebug.h> -#include <tstringlist.h> -#include <tpropertymap.h> - -using namespace TagLib; -using namespace ID3v2; - -class UrlLinkFrame::UrlLinkFramePrivate -{ -public: - String url; -}; - -class UserUrlLinkFrame::UserUrlLinkFramePrivate -{ -public: - UserUrlLinkFramePrivate() : textEncoding(String::Latin1) {} - String::Type textEncoding; - String description; -}; - -//////////////////////////////////////////////////////////////////////////////// -// UrlLinkFrame public members -//////////////////////////////////////////////////////////////////////////////// - -UrlLinkFrame::UrlLinkFrame(const ByteVector &data) : - Frame(data), - d(new UrlLinkFramePrivate()) -{ - setData(data); -} - -UrlLinkFrame::~UrlLinkFrame() -{ - delete d; -} - -void UrlLinkFrame::setUrl(const String &s) -{ - d->url = s; -} - -String UrlLinkFrame::url() const -{ - return d->url; -} - -void UrlLinkFrame::setText(const String &s) -{ - setUrl(s); -} - -String UrlLinkFrame::toString() const -{ - return url(); -} - -PropertyMap UrlLinkFrame::asProperties() const -{ - String key = frameIDToKey(frameID()); - PropertyMap map; - if(key.isEmpty()) - // unknown W*** frame - this normally shouldn't happen - map.unsupportedData().append(frameID()); - else - map.insert(key, url()); - return map; -} - -//////////////////////////////////////////////////////////////////////////////// -// UrlLinkFrame protected members -//////////////////////////////////////////////////////////////////////////////// - -void UrlLinkFrame::parseFields(const ByteVector &data) -{ - d->url = String(data); -} - -ByteVector UrlLinkFrame::renderFields() const -{ - return d->url.data(String::Latin1); -} - -UrlLinkFrame::UrlLinkFrame(const ByteVector &data, Header *h) : - Frame(h), - d(new UrlLinkFramePrivate()) -{ - parseFields(fieldData(data)); -} - -//////////////////////////////////////////////////////////////////////////////// -// UserUrlLinkFrame public members -//////////////////////////////////////////////////////////////////////////////// - -UserUrlLinkFrame::UserUrlLinkFrame(String::Type encoding) : - UrlLinkFrame("WXXX"), - d(new UserUrlLinkFramePrivate()) -{ - d->textEncoding = encoding; -} - -UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data) : - UrlLinkFrame(data), - d(new UserUrlLinkFramePrivate()) -{ - setData(data); -} - -UserUrlLinkFrame::~UserUrlLinkFrame() -{ - delete d; -} - -String UserUrlLinkFrame::toString() const -{ - return "[" + description() + "] " + url(); -} - -String::Type UserUrlLinkFrame::textEncoding() const -{ - return d->textEncoding; -} - -void UserUrlLinkFrame::setTextEncoding(String::Type encoding) -{ - d->textEncoding = encoding; -} - -String UserUrlLinkFrame::description() const -{ - return d->description; -} - -void UserUrlLinkFrame::setDescription(const String &s) -{ - d->description = s; -} - -PropertyMap UserUrlLinkFrame::asProperties() const -{ - PropertyMap map; - String key = description().upper(); - if(key.isEmpty() || key == "URL") - map.insert("URL", url()); - else - map.insert("URL:" + key, url()); - return map; -} - -UserUrlLinkFrame *UserUrlLinkFrame::find(ID3v2::Tag *tag, const String &description) // static -{ - FrameList l = tag->frameList("WXXX"); - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { - UserUrlLinkFrame *f = dynamic_cast<UserUrlLinkFrame *>(*it); - if(f && f->description() == description) - return f; - } - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// UserUrlLinkFrame protected members -//////////////////////////////////////////////////////////////////////////////// - -void UserUrlLinkFrame::parseFields(const ByteVector &data) -{ - if(data.size() < 2) { - debug("A user URL link frame must contain at least 2 bytes."); - return; - } - - int pos = 0; - - d->textEncoding = String::Type(data[0]); - pos += 1; - - if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) { - int offset = data.find(textDelimiter(d->textEncoding), pos); - if(offset < pos) - return; - - d->description = String(data.mid(pos, offset - pos), d->textEncoding); - pos = offset + 1; - } - else { - int len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2); - if(len < 0) - return; - - d->description = String(data.mid(pos, len), d->textEncoding); - pos += len + 2; - } - - setUrl(String(data.mid(pos))); -} - -ByteVector UserUrlLinkFrame::renderFields() const -{ - ByteVector v; - - String::Type encoding = checkTextEncoding(d->description, d->textEncoding); - - v.append(char(encoding)); - v.append(d->description.data(encoding)); - v.append(textDelimiter(encoding)); - v.append(url().data(String::Latin1)); - - return v; -} - -UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data, Header *h) : - UrlLinkFrame(data, h), - d(new UserUrlLinkFramePrivate()) -{ - parseFields(fieldData(data)); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.2.0.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.2.0.txt deleted file mode 100755 index a69bddd32..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.2.0.txt +++ /dev/null @@ -1,1660 +0,0 @@ - -Informal standard M. Nilsson -Document: id3v2-00.txt 26th March 1998 - - - ID3 tag version 2 - -Status of this document - - This document is an Informal standard and is released so that - implementors could have a set standard before the formal standard is - set. The formal standard will use another version number if not - identical to what is described in this document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - The recent gain of popularity for MPEG layer III audio files on the - internet forced a standardised way of storing information about an - audio file within itself to determinate its origin and contents. - - Today the most accepted way to do this is with the so called ID3 tag, - which is simple but very limited and in some cases very unsuitable. - The ID3 tag has very limited space in every field, very limited - numbers of fields, not expandable or upgradeable and is placed at the - end of a the file, which is unsuitable for streaming audio. This draft - is an attempt to answer these issues with a new version of the ID3 - tag. - - -1. Table of contents - - 2. Conventions in this document - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 frames overview - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Text information frames - details - 4.2.2. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Involved people list - 4.5. Music CD Identifier - 4.6. Event timing codes - 4.7. MPEG location lookup table - 4.8. Synced tempo codes - 4.9. Unsychronised lyrics/text transcription - 4.10. Synchronised lyrics/text - 4.11. Comments - 4.12. Relative volume adjustment - 4.13. Equalisation - 4.14. Reverb - 4.15. Attached picture - 4.16. General encapsulated object - 4.17. Play counter - 4.18. Popularimeter - 4.19. Recommended buffer size - 4.20. Encrypted meta frame - 4.21. Audio encryption - 4.22. Linked information - 5. The 'unsynchronisation scheme' - 6. Copyright - 7. References - 8. Appendix - A. Appendix A - ID3-Tag Specification V1.1 - A.1. Overview - A.2. ID3v1 Implementation - A.3. Genre List - A.4. Track addition - ID3v1.1 - 9. Author's Address - - -2. Conventions in this document - - In the examples, text within "" is a text string exactly as it appears - in a file. Numbers preceded with $ are hexadecimal and numbers - preceded with % are binary. $xx is used to indicate a byte with - unknown content. %x is used to indicate a bit with unknown content. - The most significant bit (MSB) of a byte is called 'bit 7' and the - least significant bit (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters 0-9 only. - - -3. ID3v2 overview - - The two biggest design goals were to be able to implement ID3v2 - without disturbing old software too much and that ID3v2 should be - expandable. - - The first criterion is met by the simple fact that the MPEG [MPEG] - decoding software uses a syncsignal, embedded in the audiostream, to - 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid - syncsignal, no software will attempt to play the tag. If, for any - reason, coincidence make a syncsignal appear within the tag it will be - taken care of by the 'unsynchronisation scheme' described in section - 5. - - The second criterion has made a more noticeable impact on the design - of the ID3v2 tag. It is constructed as a container for several - information blocks, called frames, whose format need not be known to - the software that encounters them. At the start of every frame there - is an identifier that explains the frames's format and content, and a - size descriptor that allows software to skip unknown frames. - - If a total revision of the ID3v2 tag should be needed, there is a - version number and a size descriptor in the ID3v2 header. - - The ID3 tag described in this document is mainly targeted to files - encoded with MPEG-2 layer I, MPEG-2 layer II, MPEG-2 layer III and - MPEG-2.5, but may work with other types of encoded audio. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78). - - It is permitted to include padding after all the final frame (at the - end of the ID3 tag), making the size of all the frames together - smaller than the size given in the head of the tag. A possible purpose - of this padding is to allow for adding a few additional frames or - enlarge existing frames within the tag without having to rewrite the - entire file. The value of the padding bytes must be $00. - - -3.1. ID3v2 header - - The ID3v2 tag header, which should be the first information in the - file, is 10 bytes as follows: - - ID3/file identifier "ID3" - ID3 version $02 00 - ID3 flags %xx000000 - ID3 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3" to indicate that - this is an ID3 tag, directly followed by the two version bytes. The - first byte of ID3 version is it's major version, while the second byte - is its revision number. All revisions are backwards compatible while - major versions are not. If software with ID3v2 and below support - should encounter version three or higher it should simply ignore the - whole tag. Version and revision will never be $FF. - - The first bit (bit 7) in the 'ID3 flags' is indicating whether or not - unsynchronisation is used (see section 5 for details); a set bit - indicates usage. - - The second bit (bit 6) is indicating whether or not compression is - used; a set bit indicates usage. Since no compression scheme has been - decided yet, the ID3 decoder (for now) should just ignore the entire - tag if the compression bit is set. - - The ID3 tag size is encoded with four bytes where the first bit (bit - 7) is set to zero in every byte, making a total of 28 bits. The zeroed - bits are ignored, so a 257 bytes long tag is represented as $00 00 02 - 01. - - The ID3 tag size is the size of the complete tag after - unsychronisation, including padding, excluding the header (total tag - size - 10). The reason to use 28 bits (representing up to 256MB) for - size description is that we don't want to run out of space here. - - A ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. ID3v2 frames overview - - The headers of the frames are similar in their construction. They - consist of one three character identifier (capital A-Z and 0-9) and - one three byte size field, making a total of six bytes. The header is - excluded from the size. Identifiers beginning with "X", "Y" and "Z" - are for experimental use and free for everyone to use. Have in mind - that someone else might have used the same identifier as you. All - other identifiers are either used or reserved for future use. - - The three character frame identifier is followed by a three byte size - descriptor, making a total header size of six bytes in every frame. - The size is calculated as framesize excluding frame identifier and - size descriptor (frame size - 6). - - There is no fixed order of the frames' appearance in the tag, although - it is desired that the frames are arranged in order of significance - concerning the recognition of the file. An example of such order: - UFI, MCI, TT2 ... - - A tag must contain at least one frame. A frame must be at least 1 byte - big, excluding the 6-byte header. - - If nothing else is said a string is represented as ISO-8859-1 - [ISO-8859-1] characters in the range $20 - $FF. All unicode strings - [UNICODE] use 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). All - numeric strings are always encoded as ISO-8859-1. Terminated strings - are terminated with $00 if encoded with ISO-8859-1 and $00 00 if - encoded as unicode. If nothing else is said newline character is - forbidden. In ISO-8859-1 a new line is represented, when allowed, with - $0A only. Frames that allow different types of text encoding have a - text encoding description byte directly after the frame size. If - ISO-8859-1 is used this byte should be $00, if unicode is used it - should be $01. - - The three byte language field is used to describe the language of the - frame's content, according to ISO-639-2 [ISO-639-2]. - - All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3 standard. This - is reflected by the revision number in the header of the tag. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.19 BUF Recommended buffer size - - 4.17 CNT Play counter - 4.11 COM Comments - 4.21 CRA Audio encryption - 4.20 CRM Encrypted meta frame - - 4.6 ETC Event timing codes - 4.13 EQU Equalization - - 4.16 GEO General encapsulated object - - 4.4 IPL Involved people list - - 4.22 LNK Linked information - - 4.5 MCI Music CD Identifier - 4.7 MLL MPEG location lookup table - - 4.15 PIC Attached picture - 4.18 POP Popularimeter - - 4.14 REV Reverb - 4.12 RVA Relative volume adjustment - - 4.10 SLT Synchronized lyric/text - 4.8 STC Synced tempo codes - - 4.2.1 TAL Album/Movie/Show title - 4.2.1 TBP BPM (Beats Per Minute) - 4.2.1 TCM Composer - 4.2.1 TCO Content type - 4.2.1 TCR Copyright message - 4.2.1 TDA Date - 4.2.1 TDY Playlist delay - 4.2.1 TEN Encoded by - 4.2.1 TFT File type - 4.2.1 TIM Time - 4.2.1 TKE Initial key - 4.2.1 TLA Language(s) - 4.2.1 TLE Length - 4.2.1 TMT Media type - 4.2.1 TOA Original artist(s)/performer(s) - 4.2.1 TOF Original filename - 4.2.1 TOL Original Lyricist(s)/text writer(s) - 4.2.1 TOR Original release year - 4.2.1 TOT Original album/Movie/Show title - 4.2.1 TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group - 4.2.1 TP2 Band/Orchestra/Accompaniment - 4.2.1 TP3 Conductor/Performer refinement - 4.2.1 TP4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPA Part of a set - 4.2.1 TPB Publisher - 4.2.1 TRC ISRC (International Standard Recording Code) - 4.2.1 TRD Recording dates - 4.2.1 TRK Track number/Position in set - 4.2.1 TSI Size - 4.2.1 TSS Software/hardware and settings used for encoding - 4.2.1 TT1 Content group description - 4.2.1 TT2 Title/Songname/Content description - 4.2.1 TT3 Subtitle/Description refinement - 4.2.1 TXT Lyricist/text writer - 4.2.2 TXX User defined text information frame - 4.2.1 TYE Year - - 4.1 UFI Unique file identifier - 4.9 ULT Unsychronized lyric/text transcription - - 4.3.1 WAF Official audio file webpage - 4.3.1 WAR Official artist/performer webpage - 4.3.1 WAS Official audio source webpage - 4.3.1 WCM Commercial information - 4.3.1 WCP Copyright/Legal information - 4.3.1 WPB Publishers official webpage - 4.3.2 WXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database that may contain more information relevant to the content. - Since standardisation of such a database is beyond this document, all - frames begin with a null-terminated string with a URL [URL] containing - an email address, or a link to a location where an email address can - be found, that belongs to the organisation responsible for this - specific database implementation. Questions regarding the database - should be sent to the indicated email address. The URL should not be - used for the actual database queries. If a $00 is found directly after - the 'Frame size' the whole frame should be ignored, and preferably be - removed. The 'Owner identifier' is then followed by the actual - identifier, which may be up to 64 bytes. There may be more than one - "UFI" frame in a tag, but only one with the same 'Owner identifier'. - - Unique file identifier "UFI" - Frame size $xx xx xx - Owner identifier <textstring> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are the most important frames, containing - information like artist, album and more. There may only be one text - information frame of its kind in an tag. If the textstring is followed - by a termination ($00 (00)) all the following information should be - ignored and not be displayed. All the text information frames have the - following format: - - Text information identifier "T00" - "TZZ" , excluding "TXX", - described in 4.2.2. - Frame size $xx xx xx - Text encoding $xx - Information <textstring> - - -4.2.1. Text information frames - details - - TT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at wembley"). - - TP1 - The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is - used for the main artist(s). They are seperated with the "/" - character. - - TP2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TP3 - The 'Conductor' frame is used for the name of the conductor. - - TP4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TCM - The 'Composer(s)' frame is intended for the name of the composer(s). - They are seperated with the "/" character. - - TXT - The 'Lyricist(s)/text writer(s)' frame is intended for the writer(s) - of the text or lyrics in the recording. They are seperated with the - "/" character. - - TLA - The 'Language(s)' frame should contain the languages of the text or - lyrics in the audio file. The language is represented with three - characters according to ISO-639-2. If more than one language is used - in the text their language codes should follow according to their - usage. - - TCO - The content type, which previously (in ID3v1.1, see appendix A) was - stored as a one byte numeric value only, is now a numeric string. You - may use one or several of the types as ID3v1.1 did or, since the - category list would be impossible to maintain with accurate and up to - date categories, define your own. - References to the ID3v1 genres can be made by, as first byte, enter - "(" followed by a number from the genres list (section A.3.) and - ended with a ")" character. This is optionally followed by a - refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be - made in the same frame, e.g. "(51)(39)". If the refinement should - begin with a "(" character it should be replaced with "((", e.g. "((I - can figure out any genre)" or "(55)((I think...)". The following new - content types is defined in ID3v2 and is implemented in the same way - as the numerig content types, e.g. "(RX)". - - RX Remix - CR Cover - - TAL - The 'Album/Movie/Show title' frame is intended for the title of the - recording(/source of sound) which the audio in the file is taken from. - - TPA - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TAL" frame is divided into several mediums, e.g. a - double CD. The value may be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TRK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This may be extended with a "/" character and a numeric - string containing the total numer of tracks/elements on the original - recording. E.g. "4/9". - - TRC - The 'ISRC' frame should contian the International Standard Recording - Code [ISRC]. - - TYE - The 'Year' frame is a numeric string with a year of the recording. - This frames is always four characters long (until the year 10000). - - TDA - The 'Date' frame is a numeric string in the DDMM format containing - the date for the recording. This field is always four characters - long. - - TIM - The 'Time' frame is a numeric string in the HHMM format containing - the time for the recording. This field is always four characters - long. - - TRD - The 'Recording dates' frame is a intended to be used as complement to - the "TYE", "TDA" and "TIM" frames. E.g. "4th-7th June, 12th June" in - combination with the "TYE" frame. - - TMT - The 'Media type' frame describes from which media the sound - originated. This may be a textstring or a reference to the predefined - media types found in the list below. References are made within "(" - and ")" and are optionally followed by a text refinement, e.g. "(MC) - with four channels". If a text refinement should begin with a "(" - character it should be replaced with "((" in the same way as in the - "TCO" frame. Predefined refinements is appended after the media type, - e.g. "(CD/S)" or "(VID/PAL/VHS)". - - DIG Other digital media - /A Analog transfer from media - - ANA Other analog media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analog transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - /A Analog transfer from media - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analog transfer from media - - DAT DAT - /A Analog transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, nonlinear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analog transfer from media - - DVD DVD - /A Analog transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TFT - The 'File type' frame indicates which type of audio this tag defines. - The following type and refinements are defined: - - MPG MPEG Audio - /1 MPEG 2 layer I - /2 MPEG 2 layer II - /3 MPEG 2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - - but other types may be used, not for these types though. This is used - in a similar way to the predefined types in the "TMT" frame, but - without parenthesis. If this frame is not present audio type is - assumed to be "MPG". - - TBP - BPM is short for beats per minute, and is easily computed by - dividing the number of beats in a musical piece with its length. To - get a more accurate result, do the BPM calculation on the main-part - only. To acquire best result measure the time between each beat and - calculate individual BPM for each beat and use the median value as - result. BPM is an integer and represented as a numerical string. - - TCR - The 'Copyright message' frame, which must begin with a year and a - space character (making five characters), is intended for the - copyright holder of the original sound, not the audio file itself. The - absence of this frame means only that the copyright information is - unavailable or has been removed, and must not be interpreted to mean - that the sound is public domain. Every time this field is displayed - the field must be preceded with "Copyright " (C) " ", where (C) is one - character showing a C in a circle. - - TPB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TEN - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - TSS - The 'Software/hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TOF - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TLE - The 'Length' frame contains the length of the audiofile in - milliseconds, represented as a numeric string. - - TSI - The 'Size' frame contains the size of the audiofile in bytes - excluding the tag, represented as a numeric string. - - TDY - The 'Playlist delay' defines the numbers of milliseconds of silence - between every song in a playlist. The player should use the "ETC" - frame, if present, to skip initial silence and silence at the end of - the audio to match the 'Playlist delay' time. The time is represented - as a numeric string. - - TKE - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m". Example "Cbm". Off key is represented with an "o" - only. - - TOT - The 'Original album/Movie/Show title' frame is intended for the title - of the original recording(/source of sound), if for example the music - in the file should be a cover of a previously released song. - - TOA - The 'Original artist(s)/performer(s)' frame is intended for the - performer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The - performers are seperated with the "/" character. - - TOL - The 'Original Lyricist(s)/text writer(s)' frame is intended for the - text writer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The text - writers are seperated with the "/" character. - - TOR - The 'Original release year' frame is intended for the year when the - original recording, if for example the music in the file should be a - cover of a previously released song, was released. The field is - formatted as in the "TDY" frame. - - -4.2.2. User defined text information frame - - This frame is intended for one-string text information concerning the - audiofile in a similar way to the other "T"xx frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXX" frame in each tag, but only one with the same description. - - User defined... "TXX" - Frame size $xx xx xx - Text encoding $xx - Description <textstring> $00 (00) - Value <textstring> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - textstring is followed by a termination ($00 (00)) all the following - information should be ignored and not be displayed. All URL link - frames have the following format: - - URL link frame "W00" - "WZZ" , excluding "WXX" - (described in 4.3.2.) - Frame size $xx xx xx - URL <textstring> - - -4.3.1. URL link frames - details - - WAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WAR" frame - in a tag if the audio contains more than one performer. - - WAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WCM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCM" frame in a tag. - - WCP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is described. - - WPB - The 'Publishers official webpage' frame is a URL pointing at the - official wepage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audiofile in - a similar way to the other "W"xx frames. The frame body consists of a - description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXX" frame in each tag, but - only one with the same description. - - User defined... "WXX" - Frame size $xx xx xx - Text encoding $xx - Description <textstring> $00 (00) - URL <textstring> - - -4.4. Involved people list - - Since there might be a lot of people contributing to an audio file in - various ways, such as musicians and technicians, the 'Text - information frames' are often insufficient to list everyone involved - in a project. The 'Involved people list' is a frame containing the - names of those involved, and how they were involved. The body simply - contains a terminated string with the involvement directly followed by - a terminated string with the involvee followed by a new involvement - and so on. There may only be one "IPL" frame in each tag. - - Involved people list "IPL" - Frame size $xx xx xx - Text encoding $xx - People list strings <textstrings> - - -4.5. Music CD Identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD making a - maximum of 804 bytes. This frame requires a present and valid "TRK" - frame. There may only be one "MCI" frame in each tag. - - Music CD identifier "MCI" - Frame size $xx xx xx - CD TOC <binary data> - - -4.6. Event timing codes - - This frame allows synchronisation with key events in a song or sound. - The head is: - - Event timing codes "ETC" - Frame size $xx xx xx - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events should be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 mainpart start - $04 outro start - $05 outro end - $06 verse begins - $07 refrain begins - $08 interlude - $09 theme start - $0A variation - $0B key change - $0C time change - $0D unwanted noise (Snap, Crackle & Pop) - - $0E-$DF reserved for future use - - $E0-$EF not predefined sync 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - The 'Not predefined sync's ($E0-EF) are for user events. You might - want to synchronise your music to something, like setting of an - explosion on-stage, turning on your screensaver etc. - - There may only be one "ETC" frame in each tag. - - -4.7. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with timecodes in different locations in the file - might be useful. The ID3 frame includes references that the software - can use to calculate positions in the file. After the frame header is - a descriptor of how much the 'frame counter' should increase for every - reference. If this value is two then the first reference points out - the second frame, the 2nd reference the 4th frame, the 3rd reference - the 6th frame etc. In a similar way the 'bytes between reference' and - 'milliseconds between reference' points out bytes and milliseconds - respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only be - one "MLL" frame in each tag. - - Location lookup table "MLL" - ID3 frame size $xx xx xx - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.8. Synced tempo codes - - For a more accurate description of the tempo of a musical piece this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more tempo - codes. Each tempo code consists of one tempo part and one time part. - The tempo is in BPM described with one or two bytes. If the first byte - has the value $FF, one more byte follows, which is added to the first - giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is - used to describe a beat-free time period, which is not the same as a - music-free time period. $01 is used to indicate one single beat-stroke - followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the tempo - in the music changes, a tempo descriptor may indicate this for the - player. All tempo descriptors should be sorted in chronological order. - The first beat-stroke in a time-period is at the same time as the beat - description occurs. There may only be one "STC" frame in each tag. - - Synced tempo codes "STC" - Frame size $xx xx xx - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - -4.9. Unsychronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. Maximum length for the descriptor is 64 - bytes. There may be more than one lyrics/text frame in each tag, but - only one with the same language and content descriptor. - - Unsynced lyrics/text "ULT" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Content descriptor <textstring> $00 (00) - Lyrics/text <textstring> - - -4.10. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the audio. - It might also be used to describing events e.g. occurring on a stage - or on the screen in sync with the audio. The header includes a content - descriptor, represented with as terminated textstring. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - Synced lyrics/text "SLT" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <textstring> $00 (00) - - - Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 - is sync identifier. - $01 Unicode [UNICODE] character set is used => $00 00 is - sync identifier. - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - - Time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps should - be sorted in chronological order. The sync can be considered as a - validator of the subsequent string. - - Newline characters are allowed in all "SLT" frames and should be used - after every entry (name, event etc.) in a frame with the content type - $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "ULT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SLT" frame in each tag, but only one with - the same language and content descriptor. - - -4.11. Comments - - This frame replaces the old 30-character comment field in ID3v1. It - consists of a frame head followed by encoding, language and content - descriptors and is ended with the actual comment as a text string. - Newline characters are allowed in the comment text string. There may - be more than one comment frame in each tag, but only one with the same - language and content descriptor. - - Comment "COM" - Frame size $xx xx xx - Text encoding $xx - Language $xx xx xx - Short content description <textstring> $00 (00) - The actual text <textstring> - - -4.12. Relative volume adjustment - - This is a more subjective function than the previous ones. It allows - the user to say how much he wants to increase/decrease the volume on - each channel while the file is played. The purpose is to be able to - align all files to a reference volume, so that you don't have to - change the volume constantly. This frame may also be used to balance - adjust the audio. If the volume peak levels are known then this could - be described with the 'Peak volume right' and 'Peak volume left' - field. If Peakvolume is not known these fields could be left zeroed - or completely omitted. There may only be one "RVA" frame in each - tag. - - Relative volume adjustment "RVA" - Frame size $xx xx xx - Increment/decrement %000000xx - Bits used for volume descr. $xx - Relative volume change, right $xx xx (xx ...) - Relative volume change, left $xx xx (xx ...) - Peak volume right $xx xx (xx ...) - Peak volume left $xx xx (xx ...) - - In the increment/decrement field bit 0 is used to indicate the right - channel and bit 1 is used to indicate the left channel. 1 is - increment and 0 is decrement. - - The 'bits used for volume description' field is normally $10 (16 bits) - for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not - be $00. The volume is always represented with whole bytes, padded in - the beginning (highest bits) when 'bits used for volume description' - is not a multiple of eight. - - -4.13. Equalisation - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may only - be one "EQU" frame in each tag. - - Equalisation "EQU" - Frame size $xx xx xx - Adjustment bits $xx - - The 'adjustment bits' field defines the number of bits used for - representation of the adjustment. This is normally $10 (16 bits) for - MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be - $00. - - This is followed by 2 bytes + ('adjustment bits' rounded up to the - nearest byte) for every equalisation band in the following format, - giving a frequency range of 0 - 32767Hz: - - Increment/decrement %x (MSB of the Frequency) - Frequency (lower 15 bits) - Adjustment $xx (xx ...) - - The increment/decrement bit is 1 for increment and 0 for decrement. - The equalisation bands should be ordered increasingly with reference - to frequency. All frequencies don't have to be declared. Adjustments - with the value $00 should be omitted. A frequency should only be - described once in the frame. - - -4.14. Reverb - - Yet another subjective one. You may here adjust echoes of different - kinds. Reverb left/right is the delay between every bounce in ms. - Reverb bounces left/right is the number of bounces that should be - made. $FF equals an infinite number of bounces. Feedback is the amount - of volume that should be returned to the next echo bounce. $00 is 0%, - $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, yet 50% on the second and so on. Left - to left means the sound from the left bounce to be played in the left - speaker, while left to right means sound from the left bounce to be - played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. Setting - both premix to $FF would result in a mono output (if the reverb is - applied symmetric). There may only be one "REV" frame in each tag. - - Reverb settings "REV" - Frame size $00 00 0C - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.15. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is preferably "PNG" [PNG] or "JPG" [JFIF]. Description - is a short description of the picture, represented as a terminated - textstring. The description has a maximum length of 64 characters, - but may be empty. There may be several pictures attached to one file, - each in their individual "PIC" frame, but only one with the same - content descriptor. There may only be one picture with the picture - type declared as picture type $01 and $02 respectively. There is a - possibility to put only a link to the image file by using the 'image - format' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used restrictively since - there is the risk of separation of files. - - Attached picture "PIC" - Frame size $xx xx xx - Text encoding $xx - Image format $xx xx xx - Picture type $xx - Description <textstring> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. lable side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.16. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] and 'Filename' - for the encapsulated object, both represented as terminated strings - encoded with ISO 8859-1 [ISO-8859-1]. The filename is case sensitive. - Then follows a content description as terminated string, encoded as - 'Encoding'. The last thing in the frame is the actual object. The - first two strings may be omitted, leaving only their terminations. - MIME type is always an ISO-8859-1 text string. There may be more than - one "GEO" frame in each tag, but only one with the same content - descriptor. - - General encapsulated object "GEO" - Frame size $xx xx xx - Text encoding $xx - MIME type <textstring> $00 - Filename <textstring> $00 (00) - Content description <textstring> $00 (00) - Encapsulated object <binary data> - - -4.17. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "CNT" frame in each tag. When the counter - reaches all one's, one byte is inserted in front of the counter thus - making the counter eight bits bigger. The counter must be at least - 32-bits long to begin with. - - Play counter "CNT" - Frame size $xx xx xx - Counter $xx xx xx xx (xx ...) - - -4.18. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audiofiles more often than others or it - could be used to profile a persons taste and find other 'good' files - by comparing people's profiles. The frame is very simple. It contains - the email address to the user, one rating byte and a four byte play - counter, intended to be increased with one for every time the file is - played. The email is a terminated string. The rating is 1-255 where - 1 is worst and 255 is best. 0 is unknown. If no personal counter is - wanted it may be omitted. When the counter reaches all one's, one - byte is inserted in front of the counter thus making the counter - eight bits bigger in the same away as the play counter ("CNT"). - There may be more than one "POP" frame in each tag, but only one with - the same email address. - - Popularimeter "POP" - Frame size $xx xx xx - Email to user <textstring> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.19. Recommended buffer size - - Sometimes the server from which a audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audiostream. - In such case the tag should reside between two MPEG [MPEG] frames, if - the audio is MPEG encoded. If the position of the next tag is known, - 'offset to next tag' may be used. The offset is calculated from the - end of tag in which this frame resides to the first byte of the header - in the next. This field may be omitted. Embedded tags is currently not - recommended since this could render unpredictable behaviour from - present software/hardware. The 'Buffer size' should be kept to a - minimum. There may only be one "BUF" frame in each tag. - - Recommended buffer size "BUF" - Frame size $xx xx xx - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.20. Encrypted meta frame - - This frame contains one or more encrypted frames. This enables - protection of copyrighted information such as pictures and text, that - people might want to pay extra for. Since standardisation of such an - encryption scheme is beyond this document, all "CRM" frames begin with - a terminated string with a URL [URL] containing an email address, or a - link to a location where an email adress can be found, that belongs to - the organisation responsible for this specific encrypted meta frame. - - Questions regarding the encrypted frame should be sent to the - indicated email address. If a $00 is found directly after the 'Frame - size', the whole frame should be ignored, and preferably be removed. - The 'Owner identifier' is then followed by a short content description - and explanation as to why it's encrypted. After the - 'content/explanation' description, the actual encrypted block follows. - - When an ID3v2 decoder encounters a "CRM" frame, it should send the - datablock to the 'plugin' with the corresponding 'owner identifier' - and expect to receive either a datablock with one or several ID3v2 - frames after each other or an error. There may be more than one "CRM" - frames in a tag, but only one with the same 'owner identifier'. - - Encrypted meta frame "CRM" - Frame size $xx xx xx - Owner identifier <textstring> $00 (00) - Content/explanation <textstring> $00 (00) - Encrypted datablock <binary data> - - -4.21. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encrypion scheme is beyond this - document, all "CRA" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audiofile indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should be - left zeroed. After the 'preview length' field follows optionally a - datablock required for decryption of the audio. There may be more than - one "CRA" frames in a tag, but only one with the same 'Owner - identifier'. - - Audio encryption "CRA" - Frame size $xx xx xx - Owner identifier <textstring> $00 (00) - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.22. Linked information - - To keep space waste as low as possible this frame may be used to link - information from another ID3v2 tag that might reside in another audio - file or alone in a binary file. It is recommended that this method is - only used when the files are stored on a CD-ROM or other circumstances - when the risk of file seperation is low. The frame contains a frame - identifier, which is the frame that should be linked into this tag, a - URL [URL] field, where a reference to the file where the frame is - given, and additional ID data, if needed. Data should be retrieved - from the first tag found in the file to which this link points. There - may be more than one "LNK" frame in a tag, but only one with the same - contents. A linked frame is to be considered as part of the tag and - has the same restrictions as if it was a physical part of the tag - (i.e. only one "REV" frame allowed, whether it's linked or not). - - Linked information "LNK" - Frame size $xx xx xx - Frame identifier $xx xx xx - URL <textstring> $00 (00) - Additional ID data <textstring(s)> - - Frames that may be linked and need no additional data are "IPL", - "MCI", "ETC", "LLT", "STC", "RVA", "EQU", "REV", "BUF", the text - information frames and the URL link frames. - - The "TXX", "PIC", "GEO", "CRM" and "CRA" frames may be linked with the - content descriptor as additional ID data. - - The "COM", "SLT" and "ULT" frames may be linked with three bytes of - language descriptor directly followed by a content descriptor as - additional ID data. - - -5. The 'unsynchronisation scheme' - - The only purpose of the 'unsychronisation scheme' is to make the ID3v2 - tag as compatible as possible with existing software. There is no use - in 'unsynchronising' tags if the file is only to be processed by new - software. Unsynchronisation may only be made with MPEG 2 layer I, II - and III and MPEG 2.5 files. - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of a correct sync that should be altered by ID3 encoders is as - follows: - - %11111111 111xxxxx - - And should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they won't be affected by the decoding process. Therefore - all the $FF 00 combinations have to be replaced with the $FF 00 00 - combination during the unsynchonisation. - - To indicate usage of the unsynchronisation, the first bit in 'ID3 - flags' should be set. This bit should only be set if the tag - contained a, now corrected, false synchronisation. The bit should - only be clear if the tag does not contain any false synchronisations. - - Do bear in mind, that if a compression scheme is used by the encoder, - the unsyncronisation scheme should be applied *afterwards*. When - decoding a compressed, 'unsyncronised' file, the 'unsyncronisation - scheme' should be parsed first, compression afterwards. - - -6. Copyright - - Copyright (C) Martin Nilsson 1998. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE - INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -7. References - - [CDDB] Compact Disc Data Base - - <url:http://www.cddb.com> - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [UNICODE] ISO/IEC 10646-1:1993. - Universal Multiple-Octet Coded Character Set (UCS), Part 1: - Architecture and Basic Multilingual Plane. Technical committee - / subcommittee: JTC 1 / SC 2 - - <url:http://www.unicode.org> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - -8. Appendix - - -A. Appendix A - ID3-Tag Specification V1.1 - - ID3-Tag Specification V1.1 (12 dec 1997) by Michael Mutschler - <amiga2@info2.rus.uni-stuttgart.de>, edited for space and clarity - reasons. - - -A.1. Overview - - The ID3-Tag is an information field for MPEG Layer 3 audio files. - Since a standalone MP3 doesn't provide a method of storing other - information than those directly needed for replay reasons, the - ID3-tag was invented by Eric Kemp in 1996. - - A revision from ID3v1 to ID3v1.1 was made by Michael Mutschler to - support track number information is described in A.4. - - -A.2. ID3v1 Implementation - - The Information is stored in the last 128 bytes of an MP3. The Tag - has got the following fields, and the offsets given here, are from - 0-127. - - Field Length Offsets - Tag 3 0-2 - Songname 30 3-32 - Artist 30 33-62 - Album 30 63-92 - Year 4 93-96 - Comment 30 97-126 - Genre 1 127 - - - The string-fields contain ASCII-data, coded in ISO-Latin 1 codepage. - Strings which are smaller than the field length are padded with zero- - bytes. - - Tag: The tag is valid if this field contains the string "TAG". This - has to be uppercase! - - Songname: This field contains the title of the MP3 (string as - above). - - Artist: This field contains the artist of the MP3 (string as above). - - Album: this field contains the album where the MP3 comes from - (string as above). - - Year: this field contains the year when this song has originally - been released (string as above). - - Comment: this field contains a comment for the MP3 (string as - above). Revision to this field has been made in ID3v1.1. See - A.4. - - Genre: this byte contains the offset of a genre in a predefined - list the byte is treated as an unsigned byte. The offset is - starting from 0. See A.3. - - -A.3. Genre List - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - The following genres are Winamp extensions - - 80.Folk - 81.Folk-Rock - 82.National Folk - 83.Swing - 84.Fast Fusion - 85.Bebob - 86.Latin - 87.Revival - 88.Celtic - 89.Bluegrass - 90.Avantgarde - 91.Gothic Rock - 92.Progressive Rock - 93.Psychedelic Rock - 94.Symphonic Rock - 95.Slow Rock - 96.Big Band - 97.Chorus - 98.Easy Listening - 99.Acoustic - 100.Humour - 101.Speech - 102.Chanson - 103.Opera - 104.Chamber Music - 105.Sonata - 106.Symphony - 107.Booty Bass - 108.Primus - 109.Porn Groove - 110.Satire - 111.Slow Jam - 112.Club - 113.Tango - 114.Samba - 115.Folklore - 116.Ballad - 117.Power Ballad - 118.Rhythmic Soul - 119.Freestyle - 120.Duet - 121.Punk Rock - 122.Drum Solo - 123.A capella - 124.Euro-House - 125.Dance Hall - - -A.4. Track addition - ID3v1.1 - - In ID3v1.1, Michael Mutschler revised the specification of the - comment field in order to implement the track number. The new format - of the comment field is a 28 character string followed by a mandatory - null ($00) character and the original album tracknumber stored as an - unsigned byte-size integer. In such cases where the 29th byte is not - the null character or when the 30th is a null character, the - tracknumber is to be considered undefined. - - -9. Author's Address - - Martin Nilsson - Rydsvägen 246 C. 30 - S-584 34 Linköping - Sweden - - Email: nilsson@id3.org - - Co-authors: - - Johan Sundström Email: johan@id3.org - - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.3.0.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.3.0.txt deleted file mode 100755 index b4ed763ee..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.3.0.txt +++ /dev/null @@ -1,2022 +0,0 @@ -Informal standard M. Nilsson -Document: id3v2.3.0.txt 3rd February 1999 - - - ID3 tag version 2.3.0 - -Status of this document - - This document is an informal standard and replaces the ID3v2.2.0 - standard [ID3v2]. The informal standard is released so that - implementors could have a set standard before a formal standard is - set. The formal standard will use another version or revision number - if not identical to what is described in this document. The contents - in this document may change for clarifications but never for added or - altered functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the ID3v2.3.0, which is a more developed - version of the ID3v2 informal standard [ID3v2] (version 2.2.0), - evolved from the ID3 tagging system. The ID3v2 offers a flexible way - of storing information about an audio file within itself to determine - its origin and contents. The information may be technical - information, such as equalisation curves, as well as related meta - information, such as title, performer, copyright etc. - - -1. Table of contents - - 2. Conventions in this document - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 extended header - 3.3. ID3v2 frames overview - 3.3.1. Frame header flags - 3.3.2. Default flags - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Text information frames - details - 4.2.2. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Involved people list - 4.5. Music CD Identifier - 4.6. Event timing codes - 4.7. MPEG location lookup table - 4.8. Synced tempo codes - 4.9. Unsychronised lyrics/text transcription - 4.10. Synchronised lyrics/text - 4.11. Comments - 4.12. Relative volume adjustment - 4.13. Equalisation - 4.14. Reverb - 4.15. Attached picture - 4.16. General encapsulated object - 4.17. Play counter - 4.18. Popularimeter - 4.19. Recommended buffer size - 4.20. Audio encryption - 4.21. Linked information - 4.22. Position synchronisation frame - 4.23. Terms of use - 4.24. Ownership frame - 4.25. Commercial frame - 4.26. Encryption method registration - 4.27. Group identification registration - 4.28. Private frame - 5. The 'unsynchronisation scheme' - 6. Copyright - 7. References - 8. Appendix - A. Appendix A - Genre List from ID3v1 - 9. Author's Address - - -2. Conventions in this document - - In the examples, text within "" is a text string exactly as it - appears in a file. Numbers preceded with $ are hexadecimal and - numbers preceded with % are binary. $xx is used to indicate a byte - with unknown content. %x is used to indicate a bit with unknown - content. The most significant bit (MSB) of a byte is called 'bit 7' - and the least significant bit (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters 0-9 only. - - -3. ID3v2 overview - - The two biggest design goals were to be able to implement ID3v2 - without disturbing old software too much and that ID3v2 should be - as flexible and expandable as possible. - - The first criterion is met by the simple fact that the MPEG [MPEG] - decoding software uses a syncsignal, embedded in the audiostream, to - 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid - syncsignal, no software will attempt to play the tag. If, for any - reason, coincidence make a syncsignal appear within the tag it will - be taken care of by the 'unsynchronisation scheme' described in - section 5. - - The second criterion has made a more noticeable impact on the design - of the ID3v2 tag. It is constructed as a container for several - information blocks, called frames, whose format need not be known to - the software that encounters them. At the start of every frame there - is an identifier that explains the frames' format and content, and a - size descriptor that allows software to skip unknown frames. - - If a total revision of the ID3v2 tag should be needed, there is a - version number and a size descriptor in the ID3v2 header. - - The ID3 tag described in this document is mainly targeted at files - encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III - and MPEG-2.5, but may work with other types of encoded audio. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78). - - It is permitted to include padding after all the final frame (at the - end of the ID3 tag), making the size of all the frames together - smaller than the size given in the head of the tag. A possible - purpose of this padding is to allow for adding a few additional - frames or enlarge existing frames within the tag without having to - rewrite the entire file. The value of the padding bytes must be $00. - - -3.1. ID3v2 header - - The ID3v2 tag header, which should be the first information in the - file, is 10 bytes as follows: - - ID3v2/file identifier "ID3" - ID3v2 version $03 00 - ID3v2 flags %abc00000 - ID3v2 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3" to indicate that - this is an ID3v2 tag, directly followed by the two version bytes. The - first byte of ID3v2 version is it's major version, while the second - byte is its revision number. In this case this is ID3v2.3.0. All - revisions are backwards compatible while major versions are not. If - software with ID3v2.2.0 and below support should encounter version - three or higher it should simply ignore the whole tag. Version and - revision will never be $FF. - - The version is followed by one the ID3v2 flags field, of which - currently only three flags are used. - - - a - Unsynchronisation - - Bit 7 in the 'ID3v2 flags' indicates whether or not - unsynchronisation is used (see section 5 for details); a set bit - indicates usage. - - - b - Extended header - - The second bit (bit 6) indicates whether or not the header is - followed by an extended header. The extended header is described in - section 3.2. - - - c - Experimental indicator - - The third bit (bit 5) should be used as an 'experimental - indicator'. This flag should always be set when the tag is in an - experimental stage. - - All the other flags should be cleared. If one of these undefined - flags are set that might mean that the tag is not readable for a - parser that does not know the flags function. - - The ID3v2 tag size is encoded with four bytes where the most - significant bit (bit 7) is set to zero in every byte, making a total - of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is - represented as $00 00 02 01. - - The ID3v2 tag size is the size of the complete tag after - unsychronisation, including padding, excluding the header but not - excluding the extended header (total tag size - 10). Only 28 bits - (representing up to 256MB) are used in the size description to avoid - the introducuction of 'false syncsignals'. - - An ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. ID3v2 extended header - - The extended header contains information that is not vital to the - correct parsing of the tag information, hence the extended header is - optional. - - Extended header size $xx xx xx xx - Extended Flags $xx xx - Size of padding $xx xx xx xx - - Where the 'Extended header size', currently 6 or 10 bytes, excludes - itself. The 'Size of padding' is simply the total tag size excluding - the frames and the headers, in other words the padding. The extended - header is considered separate from the header proper, and as such is - subject to unsynchronisation. - - The extended flags are a secondary flag set which describes further - attributes of the tag. These attributes are currently defined as - follows - - %x0000000 00000000 - - - x - CRC data present - - If this flag is set four bytes of CRC-32 data is appended to the - extended header. The CRC should be calculated before - unsynchronisation on the data between the extended header and the - padding, i.e. the frames and only the frames. - - Total frame CRC $xx xx xx xx - - -3.3. ID3v2 frame overview - - As the tag consists of a tag header and a tag body with one or more - frames, all the frames consists of a frame header followed by one or - more fields containing the actual information. The layout of the - frame header: - - Frame ID $xx xx xx xx (four characters) - Size $xx xx xx xx - Flags $xx xx - - The frame ID made out of the characters capital A-Z and 0-9. - Identifiers beginning with "X", "Y" and "Z" are for experimental use - and free for everyone to use, without the need to set the - experimental bit in the tag header. Have in mind that someone else - might have used the same identifier as you. All other identifiers are - either used or reserved for future use. - - The frame ID is followed by a size descriptor, making a total header - size of ten bytes in every frame. The size is calculated as frame - size excluding frame header (frame size - 10). - - In the frame header the size descriptor is followed by two flags - bytes. These flags are described in section 3.3.1. - - There is no fixed order of the frames' appearance in the tag, - although it is desired that the frames are arranged in order of - significance concerning the recognition of the file. An example of - such order: UFID, TIT2, MCDI, TRCK ... - - A tag must contain at least one frame. A frame must be at least 1 - byte big, excluding the header. - - If nothing else is said a string is represented as ISO-8859-1 - [ISO-8859-1] characters in the range $20 - $FF. Such strings are - represented as <text string>, or <full text string> if newlines are - allowed, in the frame descriptions. All Unicode strings [UNICODE] use - 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings - must begin with the Unicode BOM ($FF FE or $FE FF) to identify the - byte order. - - All numeric strings and URLs [URL] are always encoded as ISO-8859-1. - Terminated strings are terminated with $00 if encoded with ISO-8859-1 - and $00 00 if encoded as unicode. If nothing else is said newline - character is forbidden. In ISO-8859-1 a new line is represented, when - allowed, with $0A only. Frames that allow different types of text - encoding have a text encoding description byte directly after the - frame size. If ISO-8859-1 is used this byte should be $00, if Unicode - is used it should be $01. Strings dependent on encoding is - represented as <text string according to encoding>, or <full text - string according to encoding> if newlines are allowed. Any empty - Unicode strings which are NULL-terminated may have the Unicode BOM - followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). - - The three byte language field is used to describe the language of the - frame's content, according to ISO-639-2 [ISO-639-2]. - - All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3v2 standard. This - is reflected by the revision number in the header of the tag. - - -3.3.1. Frame header flags - - In the frame header the size descriptor is followed by two flags - bytes. All unused flags must be cleared. The first byte is for - 'status messages' and the second byte is for encoding purposes. If an - unknown flag is set in the first byte the frame may not be changed - without the bit cleared. If an unknown flag is set in the second byte - it is likely to not be readable. The flags field is defined as - follows. - - %abc00000 %ijk00000 - - - a - Tag alter preservation - - This flag tells the software what to do with this frame if it is - unknown and the tag is altered in any way. This applies to all - kinds of alterations, including adding more padding and reordering - the frames. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - b - File alter preservation - - This flag tells the software what to do with this frame if it is - unknown and the file, excluding the tag, is altered. This does not - apply when the audio is completely replaced with other audio data. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - c - Read only - - This flag, if set, tells the software that the contents of this - frame is intended to be read only. Changing the contents might - break something, e.g. a signature. If the contents are changed, - without knowledge in why the frame was flagged read only and - without taking the proper means to compensate, e.g. recalculating - the signature, the bit should be cleared. - - - i - Compression - - This flag indicates whether or not the frame is compressed. - - 0 Frame is not compressed. - 1 Frame is compressed using zlib [zlib] with 4 bytes for - 'decompressed size' appended to the frame header. - - - j - Encryption - - This flag indicates wether or not the frame is enrypted. If set - one byte indicating with which method it was encrypted will be - appended to the frame header. See section 4.26. for more - information about encryption method registration. - - 0 Frame is not encrypted. - 1 Frame is encrypted. - - - k - Grouping identity - - This flag indicates whether or not this frame belongs in a group - with other frames. If set a group identifier byte is added to the - frame header. Every frame with the same group identifier belongs - to the same group. - - 0 Frame does not contain group information - 1 Frame contains group information - - - Some flags indicates that the frame header is extended with - additional information. This information will be added to the frame - header in the same order as the flags indicating the additions. I.e. - the four bytes of decompressed size will preceed the encryption - method byte. These additions to the frame header, while not included - in the frame header size but are included in the 'frame size' field, - are not subject to encryption or compression. - - -3.3.2. Default flags - - The default settings for the frames described in this document can be - divided into the following classes. The flags may be set differently - if found more suitable by the software. - - 1. Discarded if tag is altered, discarded if file is altered. - - None. - - 2. Discarded if tag is altered, preserved if file is altered. - - None. - - 3. Preserved if tag is altered, discarded if file is altered. - - AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN, TSIZ - - 4. Preserved if tag is altered, preserved if file is altered. - - The rest of the frames. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.21 AENC Audio encryption - 4.15 APIC Attached picture - - 4.11 COMM Comments - 4.25 COMR Commercial frame - - 4.26 ENCR Encryption method registration - 4.13 EQUA Equalization - 4.6 ETCO Event timing codes - - 4.16 GEOB General encapsulated object - 4.27 GRID Group identification registration - - 4.4 IPLS Involved people list - - 4.21 LINK Linked information - - 4.5 MCDI Music CD identifier - 4.7 MLLT MPEG location lookup table - - 4.24 OWNE Ownership frame - - 4.28. PRIV Private frame - 4.17 PCNT Play counter - 4.18 POPM Popularimeter - 4.22 POSS Position synchronisation frame - - 4.19 RBUF Recommended buffer size - 4.12 RVAD Relative volume adjustment - 4.14 RVRB Reverb - - 4.10 SYLT Synchronized lyric/text - 4.8 SYTC Synchronized tempo codes - - 4.2.1 TALB Album/Movie/Show title - 4.2.1 TBPM BPM (beats per minute) - 4.2.1 TCOM Composer - 4.2.1 TCON Content type - 4.2.1 TCOP Copyright message - 4.2.1 TDAT Date - 4.2.1 TDLY Playlist delay - 4.2.1 TENC Encoded by - 4.2.1 TEXT Lyricist/Text writer - 4.2.1 TFLT File type - 4.2.1 TIME Time - 4.2.1 TIT1 Content group description - 4.2.1 TIT2 Title/songname/content description - 4.2.1 TIT3 Subtitle/Description refinement - 4.2.1 TKEY Initial key - 4.2.1 TLAN Language(s) - 4.2.1 TLEN Length - 4.2.1 TMED Media type - 4.2.1 TOAL Original album/movie/show title - 4.2.1 TOFN Original filename - 4.2.1 TOLY Original lyricist(s)/text writer(s) - 4.2.1 TOPE Original artist(s)/performer(s) - 4.2.1 TORY Original release year - 4.2.1 TOWN File owner/licensee - 4.2.1 TPE1 Lead performer(s)/Soloist(s) - 4.2.1 TPE2 Band/orchestra/accompaniment - 4.2.1 TPE3 Conductor/performer refinement - 4.2.1 TPE4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPOS Part of a set - 4.2.1 TPUB Publisher - 4.2.1 TRCK Track number/Position in set - 4.2.1 TRDA Recording dates - 4.2.1 TRSN Internet radio station name - 4.2.1 TRSO Internet radio station owner - 4.2.1 TSIZ Size - 4.2.1 TSRC ISRC (international standard recording code) - 4.2.1 TSSE Software/Hardware and settings used for encoding - 4.2.1 TYER Year - 4.2.2 TXXX User defined text information frame - - 4.1 UFID Unique file identifier - 4.23 USER Terms of use - 4.9 USLT Unsychronized lyric/text transcription - - 4.3.1 WCOM Commercial information - 4.3.1 WCOP Copyright/Legal information - 4.3.1 WOAF Official audio file webpage - 4.3.1 WOAR Official artist/performer webpage - 4.3.1 WOAS Official audio source webpage - 4.3.1 WORS Official internet radio station homepage - 4.3.1 WPAY Payment - 4.3.1 WPUB Publishers official webpage - 4.3.2 WXXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database that may contain more information relevant to the content. - Since standardisation of such a database is beyond this document, all - frames begin with a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific database implementation. Questions regarding the - database should be sent to the indicated email address. The URL - should not be used for the actual database queries. The string - "<a href="http://www.id3.org/dummy/ufid.html">http://www.id3.org/dummy/ufid.html</a>" should be used for tests. - Software that isn't told otherwise may safely remove such frames. The - 'Owner identifier' must be non-empty (more than just a termination). - The 'Owner identifier' is then followed by the actual identifier, - which may be up to 64 bytes. There may be more than one "UFID" frame - in a tag, but only one with the same 'Owner identifier'. - - <Header for 'Unique file identifier', ID: "UFID"> - Owner identifier <text string> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are the most important frames, containing - information like artist, album and more. There may only be one text - information frame of its kind in an tag. If the textstring is - followed by a termination ($00 (00)) all the following information - should be ignored and not be displayed. All text frame identifiers - begin with "T". Only text frame identifiers begin with "T", with the - exception of the "TXXX" frame. All the text information frames have - the following format: - - <Header for 'Text information frame', ID: "T000" - "TZZZ", - excluding "TXXX" described in 4.2.2.> - Text encoding $xx - Information <text string according to encoding> - - -4.2.1. Text information frames - details - - TALB - The 'Album/Movie/Show title' frame is intended for the title of the - recording(/source of sound) which the audio in the file is taken - from. - - TBPM - The 'BPM' frame contains the number of beats per minute in the - mainpart of the audio. The BPM is an integer and represented as a - numerical string. - - TCOM - The 'Composer(s)' frame is intended for the name of the composer(s). - They are seperated with the "/" character. - - TCON - The 'Content type', which previously was stored as a one byte numeric - value only, is now a numeric string. You may use one or several of - the types as ID3v1.1 did or, since the category list would be - impossible to maintain with accurate and up to date categories, - define your own. - - References to the ID3v1 genres can be made by, as first byte, enter - "(" followed by a number from the genres list (appendix A.) and - ended with a ")" character. This is optionally followed by a - refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be - made in the same frame, e.g. "(51)(39)". If the refinement should - begin with a "(" character it should be replaced with "((", e.g. "((I - can figure out any genre)" or "(55)((I think...)". The following new - content types is defined in ID3v2 and is implemented in the same way - as the numerig content types, e.g. "(RX)". - - RX Remix - CR Cover - - TCOP - The 'Copyright message' frame, which must begin with a year and a - space character (making five characters), is intended for the - copyright holder of the original sound, not the audio file itself. - The absence of this frame means only that the copyright information - is unavailable or has been removed, and must not be interpreted to - mean that the sound is public domain. Every time this field is - displayed the field must be preceded with "Copyright " (C) " ", where - (C) is one character showing a C in a circle. - - TDAT - The 'Date' frame is a numeric string in the DDMM format containing - the date for the recording. This field is always four characters - long. - - TDLY - The 'Playlist delay' defines the numbers of milliseconds of silence - between every song in a playlist. The player should use the "ETC" - frame, if present, to skip initial silence and silence at the end of - the audio to match the 'Playlist delay' time. The time is represented - as a numeric string. - - TENC - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - TEXT - The 'Lyricist(s)/Text writer(s)' frame is intended for the writer(s) - of the text or lyrics in the recording. They are seperated with the - "/" character. - - TFLT - The 'File type' frame indicates which type of audio this tag defines. - The following type and refinements are defined: - - MPG MPEG Audio - /1 MPEG 1/2 layer I - /2 MPEG 1/2 layer II - /3 MPEG 1/2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - VQF Transform-domain Weighted Interleave Vector Quantization - PCM Pulse Code Modulated audio - - but other types may be used, not for these types though. This is used - in a similar way to the predefined types in the "TMED" frame, but - without parentheses. If this frame is not present audio type is - assumed to be "MPG". - - TIME - The 'Time' frame is a numeric string in the HHMM format containing - the time for the recording. This field is always four characters - long. - - TIT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TIT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TIT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at Wembley"). - - TKEY - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m". Example "Cbm". Off key is represented with an "o" - only. - - TLAN - The 'Language(s)' frame should contain the languages of the text or - lyrics spoken or sung in the audio. The language is represented with - three characters according to ISO-639-2. If more than one language is - used in the text their language codes should follow according to - their usage. - - TLEN - The 'Length' frame contains the length of the audiofile in - milliseconds, represented as a numeric string. - - TMED - The 'Media type' frame describes from which media the sound - originated. This may be a text string or a reference to the - predefined media types found in the list below. References are made - within "(" and ")" and are optionally followed by a text refinement, - e.g. "(MC) with four channels". If a text refinement should begin - with a "(" character it should be replaced with "((" in the same way - as in the "TCO" frame. Predefined refinements is appended after the - media type, e.g. "(CD/A)" or "(VID/PAL/VHS)". - - DIG Other digital media - /A Analog transfer from media - - ANA Other analog media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analog transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - /A Analog transfer from media - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analog transfer from media - - DAT DAT - /A Analog transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, nonlinear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analog transfer from media - - DVD DVD - /A Analog transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TOAL - The 'Original album/movie/show title' frame is intended for the title - of the original recording (or source of sound), if for example the - music in the file should be a cover of a previously released song. - - TOFN - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TOLY - The 'Original lyricist(s)/text writer(s)' frame is intended for the - text writer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The text - writers are seperated with the "/" character. - - TOPE - The 'Original artist(s)/performer(s)' frame is intended for the - performer(s) of the original recording, if for example the music in - the file should be a cover of a previously released song. The - performers are seperated with the "/" character. - - TORY - The 'Original release year' frame is intended for the year when the - original recording, if for example the music in the file should be a - cover of a previously released song, was released. The field is - formatted as in the "TYER" frame. - - TOWN - The 'File owner/licensee' frame contains the name of the owner or - licensee of the file and it's contents. - - TPE1 - The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is - used for the main artist(s). They are seperated with the "/" - character. - - TPE2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TPE3 - The 'Conductor' frame is used for the name of the conductor. - - TPE4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TPOS - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TALB" frame is divided into several mediums, e.g. a - double CD. The value may be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TPUB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TRCK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This may be extended with a "/" character and a numeric - string containing the total numer of tracks/elements on the original - recording. E.g. "4/9". - - TRDA - The 'Recording dates' frame is a intended to be used as complement to - the "TYER", "TDAT" and "TIME" frames. E.g. "4th-7th June, 12th June" - in combination with the "TYER" frame. - - TRSN - The 'Internet radio station name' frame contains the name of the - internet radio station from which the audio is streamed. - - TRSO - The 'Internet radio station owner' frame contains the name of the - owner of the internet radio station from which the audio is - streamed. - - TSIZ - The 'Size' frame contains the size of the audiofile in bytes, - excluding the ID3v2 tag, represented as a numeric string. - - TSRC - The 'ISRC' frame should contain the International Standard Recording - Code [ISRC] (12 characters). - - TSSE - The 'Software/Hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TYER - The 'Year' frame is a numeric string with a year of the recording. - This frames is always four characters long (until the year 10000). - - -4.2.2. User defined text information frame - - This frame is intended for one-string text information concerning the - audiofile in a similar way to the other "T"-frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXXX" frame in each tag, but only one with the same description. - - <Header for 'User defined text information frame', ID: "TXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - Value <text string according to encoding> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - textstring is followed by a termination ($00 (00)) all the following - information should be ignored and not be displayed. All URL link - frame identifiers begins with "W". Only URL link frame identifiers - begins with "W". All URL link frames have the following format: - - <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" - described in 4.3.2.> - URL <text string> - - -4.3.1. URL link frames - details - - WCOM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCOM" frame in a tag, but not with the same content. - - WCOP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is - described. - - WOAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WOAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WOAR" frame - in a tag if the audio contains more than one performer, but not with - the same content. - - WOAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WORS - The 'Official internet radio station homepage' contains a URL - pointing at the homepage of the internet radio station. - - WPAY - The 'Payment' frame is a URL pointing at a webpage that will handle - the process of paying for this file. - - WPUB - The 'Publishers official webpage' frame is a URL pointing at the - official wepage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audiofile - in a similar way to the other "W"-frames. The frame body consists - of a description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, - but only one with the same description. - - <Header for 'User defined URL link frame', ID: "WXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - URL <text string> - - -4.4. Involved people list - - Since there might be a lot of people contributing to an audio file in - various ways, such as musicians and technicians, the 'Text - information frames' are often insufficient to list everyone involved - in a project. The 'Involved people list' is a frame containing the - names of those involved, and how they were involved. The body simply - contains a terminated string with the involvement directly followed - by a terminated string with the involvee followed by a new - involvement and so on. There may only be one "IPLS" frame in each - tag. - - <Header for 'Involved people list', ID: "IPLS"> - Text encoding $xx - People list strings <text strings according to encoding> - - -4.5. Music CD identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 - bytes for the 'lead out' making a maximum of 804 bytes. The offset to - the beginning of every track on the CD should be described with a - four bytes absolute CD-frame address per track, and not with absolute - time. This frame requires a present and valid "TRCK" frame, even if - the CD's only got one track. There may only be one "MCDI" frame in - each tag. - - <Header for 'Music CD identifier', ID: "MCDI"> - CD TOC <binary data> - - -4.6. Event timing codes - - This frame allows synchronisation with key events in a song or sound. - The header is: - - <Header for 'Event timing codes', ID: "ETCO"> - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events should be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 mainpart start - $04 outro start - $05 outro end - $06 verse start - $07 refrain start - $08 interlude start - $09 theme start - $0A variation start - $0B key change - $0C time change - $0D momentary unwanted noise (Snap, Crackle & Pop) - $0E sustained noise - $0F sustained noise end - $10 intro end - $11 mainpart end - $12 verse end - $13 refrain end - $14 theme end - - $15-$DF reserved for future use - - $E0-$EF not predefined sync 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - Terminating the start events such as "intro start" is not required. - The 'Not predefined sync's ($E0-EF) are for user events. You might - want to synchronise your music to something, like setting of an - explosion on-stage, turning on your screensaver etc. - - There may only be one "ETCO" frame in each tag. - - -4.7. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with timecodes in different locations in the file - might be useful. The ID3v2 frame includes references that the - software can use to calculate positions in the file. After the frame - header is a descriptor of how much the 'frame counter' should - increase for every reference. If this value is two then the first - reference points out the second frame, the 2nd reference the 4th - frame, the 3rd reference the 6th frame etc. In a similar way the - 'bytes between reference' and 'milliseconds between reference' points - out bytes and milliseconds respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only - be one "MLLT" frame in each tag. - - <Header for 'Location lookup table', ID: "MLLT"> - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.8. Synchronised tempo codes - - For a more accurate description of the tempo of a musical piece this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more - tempo codes. Each tempo code consists of one tempo part and one time - part. The tempo is in BPM described with one or two bytes. If the - first byte has the value $FF, one more byte follows, which is added - to the first giving a range from 2 - 510 BPM, since $00 and $01 is - reserved. $00 is used to describe a beat-free time period, which is - not the same as a music-free time period. $01 is used to indicate one - single beat-stroke followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the - tempo in the music changes, a tempo descriptor may indicate this for - the player. All tempo descriptors should be sorted in chronological - order. The first beat-stroke in a time-period is at the same time as - the beat description occurs. There may only be one "SYTC" frame in - each tag. - - <Header for 'Synchronised tempo codes', ID: "SYTC"> - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - -4.9. Unsychronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. There may be more than one 'Unsynchronised - lyrics/text transcription' frame in each tag, but only one with the - same language and content descriptor. - - <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> - Text encoding $xx - Language $xx xx xx - Content descriptor <text string according to encoding> $00 (00) - Lyrics/text <full text string according to encoding> - - -4.10. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the - audio. It might also be used to describing events e.g. occurring on a - stage or on the screen in sync with the audio. The header includes a - content descriptor, represented with as terminated textstring. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - <Header for 'Synchronised lyrics/text', ID: "SYLT"> - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <text string according to encoding> $00 (00) - - - Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 - is sync identifier. - $01 Unicode [UNICODE] character set is used => $00 00 is - sync identifier. - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - $06 is trivia/'pop up' information - - Time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Abolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps - should be sorted in chronological order. The sync can be considered - as a validator of the subsequent string. - - Newline ($0A) characters are allowed in all "SYLT" frames and should - be used after every entry (name, event etc.) in a frame with the - content type $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "USLT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SYLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SYLT" frame in each tag, but only one - with the same language and content descriptor. - - -4.11. Comments - - This frame is indended for any kind of full text information that - does not fit in any other frame. It consists of a frame header - followed by encoding, language and content descriptors and is ended - with the actual comment as a text string. Newline characters are - allowed in the comment text string. There may be more than one - comment frame in each tag, but only one with the same language and - content descriptor. - - <Header for 'Comment', ID: "COMM"> - Text encoding $xx - Language $xx xx xx - Short content descrip. <text string according to encoding> $00 (00) - The actual text <full text string according to encoding> - - -4.12. Relative volume adjustment - - This is a more subjective function than the previous ones. It allows - the user to say how much he wants to increase/decrease the volume on - each channel while the file is played. The purpose is to be able to - align all files to a reference volume, so that you don't have to - change the volume constantly. This frame may also be used to balance - adjust the audio. If the volume peak levels are known then this could - be described with the 'Peak volume right' and 'Peak volume left' - field. If Peakvolume is not known these fields could be left zeroed - or, if no other data follows, be completely omitted. There may only - be one "RVAD" frame in each tag. - - <Header for 'Relative volume adjustment', ID: "RVAD"> - Increment/decrement %00xxxxxx - Bits used for volume descr. $xx - Relative volume change, right $xx xx (xx ...) - Relative volume change, left $xx xx (xx ...) - Peak volume right $xx xx (xx ...) - Peak volume left $xx xx (xx ...) - - In the increment/decrement field bit 0 is used to indicate the right - channel and bit 1 is used to indicate the left channel. 1 is - increment and 0 is decrement. - - The 'bits used for volume description' field is normally $10 (16 - bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value - may not be $00. The volume is always represented with whole bytes, - padded in the beginning (highest bits) when 'bits used for volume - description' is not a multiple of eight. - - This datablock is then optionally followed by a volume definition for - the left and right back channels. If this information is appended to - the frame the first two channels will be treated as front channels. - In the increment/decrement field bit 2 is used to indicate the right - back channel and bit 3 for the left back channel. - - Relative volume change, right back $xx xx (xx ...) - Relative volume change, left back $xx xx (xx ...) - Peak volume right back $xx xx (xx ...) - Peak volume left back $xx xx (xx ...) - - If the center channel adjustment is present the following is appended - to the existing frame, after the left and right back channels. The - center channel is represented by bit 4 in the increase/decrease - field. - - Relative volume change, center $xx xx (xx ...) - Peak volume center $xx xx (xx ...) - - If the bass channel adjustment is present the following is appended - to the existing frame, after the center channel. The bass channel is - represented by bit 5 in the increase/decrease field. - - Relative volume change, bass $xx xx (xx ...) - Peak volume bass $xx xx (xx ...) - - -4.13. Equalisation - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may only - be one "EQUA" frame in each tag. - - <Header of 'Equalisation', ID: "EQUA"> - Adjustment bits $xx - - The 'adjustment bits' field defines the number of bits used for - representation of the adjustment. This is normally $10 (16 bits) for - MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be - $00. - - This is followed by 2 bytes + ('adjustment bits' rounded up to the - nearest byte) for every equalisation band in the following format, - giving a frequency range of 0 - 32767Hz: - - Increment/decrement %x (MSB of the Frequency) - Frequency (lower 15 bits) - Adjustment $xx (xx ...) - - The increment/decrement bit is 1 for increment and 0 for decrement. - The equalisation bands should be ordered increasingly with reference - to frequency. All frequencies don't have to be declared. The - equalisation curve in the reading software should be interpolated - between the values in this frame. Three equal adjustments for three - subsequent frequencies. A frequency should only be described once in - the frame. - - -4.14. Reverb - - Yet another subjective one. You may here adjust echoes of different - kinds. Reverb left/right is the delay between every bounce in ms. - Reverb bounces left/right is the number of bounces that should be - made. $FF equals an infinite number of bounces. Feedback is the - amount of volume that should be returned to the next echo bounce. $00 - is 0%, $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, 50% of that on the second and so on. - Left to left means the sound from the left bounce to be played in the - left speaker, while left to right means sound from the left bounce to - be played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. - Setting both premix to $FF would result in a mono output (if the - reverb is applied symmetric). There may only be one "RVRB" frame in - each tag. - - <Header for 'Reverb', ID: "RVRB"> - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.15. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is the MIME type and subtype [MIME] for the image. In - the event that the MIME media type name is omitted, "image/" will be - implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format - should be used when interoperability is wanted. Description is a - short description of the picture, represented as a terminated - textstring. The description has a maximum length of 64 characters, - but may be empty. There may be several pictures attached to one file, - each in their individual "APIC" frame, but only one with the same - content descriptor. There may only be one picture with the picture - type declared as picture type $01 and $02 respectively. There is the - possibility to put only a link to the image file by using the 'MIME - type' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used sparingly since there - is the risk of separation of files. - - <Header for 'Attached picture', ID: "APIC"> - Text encoding $xx - MIME type <text string> $00 - Picture type $xx - Description <text string according to encoding> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. lable side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.16. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as - as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The - filename is case sensitive and is encoded as 'Encoding'. Then follows - a content description as terminated string, encoded as 'Encoding'. - The last thing in the frame is the actual object. The first two - strings may be omitted, leaving only their terminations. MIME type is - always an ISO-8859-1 text string. There may be more than one "GEOB" - frame in each tag, but only one with the same content descriptor. - - <Header for 'General encapsulated object', ID: "GEOB"> - Text encoding $xx - MIME type <text string> $00 - Filename <text string according to encoding> $00 (00) - Content description <text string according to encóding> $00 (00) - Encapsulated object <binary data> - - -4.17. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "PCNT" frame in each tag. When the - counter reaches all one's, one byte is inserted in front of the - counter thus making the counter eight bits bigger. The counter must - be at least 32-bits long to begin with. - - <Header for 'Play counter', ID: "PCNT"> - Counter $xx xx xx xx (xx ...) - - -4.18. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audiofiles more often than others or it - could be used to profile a person's taste and find other 'good' files - by comparing people's profiles. The frame is very simple. It contains - the email address to the user, one rating byte and a four byte play - counter, intended to be increased with one for every time the file is - played. The email is a terminated string. The rating is 1-255 where - 1 is worst and 255 is best. 0 is unknown. If no personal counter is - wanted it may be omitted. When the counter reaches all one's, one - byte is inserted in front of the counter thus making the counter - eight bits bigger in the same away as the play counter ("PCNT"). - There may be more than one "POPM" frame in each tag, but only one - with the same email address. - - <Header for 'Popularimeter', ID: "POPM"> - Email to user <text string> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.19. Recommended buffer size - - Sometimes the server from which a audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audiostream. - In such case the tag should reside between two MPEG [MPEG] frames, if - the audio is MPEG encoded. If the position of the next tag is known, - 'offset to next tag' may be used. The offset is calculated from the - end of tag in which this frame resides to the first byte of the - header in the next. This field may be omitted. Embedded tags are - generally not recommended since this could render unpredictable - behaviour from present software/hardware. - - For applications like streaming audio it might be an idea to embed - tags into the audio stream though. If the clients connects to - individual connections like HTTP and there is a possibility to begin - every transmission with a tag, then this tag should include a - 'recommended buffer size' frame. If the client is connected to a - arbitrary point in the stream, such as radio or multicast, then the - 'recommended buffer size' frame should be included in every tag. - Every tag that is picked up after the initial/first tag is to be - considered as an update of the previous one. E.g. if there is a - "TIT2" frame in the first received tag and one in the second tag, - then the first should be 'replaced' with the second. - - The 'Buffer size' should be kept to a minimum. There may only be one - "RBUF" frame in each tag. - - <Header for 'Recommended buffer size', ID: "RBUF"> - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.20. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encrypion scheme is beyond this - document, all "AENC" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audiofile indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should - be left zeroed. After the 'preview length' field follows optionally a - datablock required for decryption of the audio. There may be more - than one "AENC" frames in a tag, but only one with the same 'Owner - identifier'. - - <Header for 'Audio encryption', ID: "AENC"> - Owner identifier <text string> $00 - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.21. Linked information - - To keep space waste as low as possible this frame may be used to link - information from another ID3v2 tag that might reside in another audio - file or alone in a binary file. It is recommended that this method is - only used when the files are stored on a CD-ROM or other - circumstances when the risk of file seperation is low. The frame - contains a frame identifier, which is the frame that should be linked - into this tag, a URL [URL] field, where a reference to the file where - the frame is given, and additional ID data, if needed. Data should be - retrieved from the first tag found in the file to which this link - points. There may be more than one "LINK" frame in a tag, but only - one with the same contents. A linked frame is to be considered as - part of the tag and has the same restrictions as if it was a physical - part of the tag (i.e. only one "RVRB" frame allowed, whether it's - linked or not). - - <Header for 'Linked information', ID: "LINK"> - Frame identifier $xx xx xx - URL <text string> $00 - ID and additional data <text string(s)> - - Frames that may be linked and need no additional data are "IPLS", - "MCID", "ETCO", "MLLT", "SYTC", "RVAD", "EQUA", "RVRB", "RBUF", the - text information frames and the URL link frames. - - The "TXXX", "APIC", "GEOB" and "AENC" frames may be linked with - the content descriptor as additional ID data. - - The "COMM", "SYLT" and "USLT" frames may be linked with three bytes - of language descriptor directly followed by a content descriptor as - additional ID data. - - -4.22. Position synchronisation frame - - This frame delivers information to the listener of how far into the - audio stream he picked up; in effect, it states the time offset of - the first frame in the stream. The frame layout is: - - <Head for 'Position synchronisation', ID: "POSS"> - Time stamp format $xx - Position $xx (xx ...) - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - and position is where in the audio the listener starts to receive, - i.e. the beginning of the next frame. If this frame is used in the - beginning of a file the value is always 0. There may only be one - "POSS" frame in each tag. - - -4.23. Terms of use frame - - This frame contains a brief description of the terms of use and - ownership of the file. More detailed information concerning the legal - terms might be available through the "WCOP" frame. Newlines are - allowed in the text. There may only be one "USER" frame in a tag. - - <Header for 'Terms of use frame', ID: "USER"> - Text encoding $xx - Language $xx xx xx - The actual text <text string according to encoding> - - -4.24. Ownership frame - - The ownership frame might be used as a reminder of a made transaction - or, if signed, as proof. Note that the "USER" and "TOWN" frames are - good to use in conjunction with this one. The frame begins, after the - frame ID, size and encoding fields, with a 'price payed' field. The - first three characters of this field contains the currency used for - the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic - currency code. Concatenated to this is the actual price payed, as a - numerical string using "." as the decimal separator. Next is an 8 - character date string (YYYYMMDD) followed by a string with the name - of the seller as the last field in the frame. There may only be one - "OWNE" frame in a tag. - - <Header for 'Ownership frame', ID: "OWNE"> - Text encoding $xx - Price payed <text string> $00 - Date of purch. <text string> - Seller <text string according to encoding> - - -4.25. Commercial frame - - This frame enables several competing offers in the same tag by - bundling all needed information. That makes this frame rather complex - but it's an easier solution than if one tries to achieve the same - result with several frames. The frame begins, after the frame ID, - size and encoding fields, with a price string field. A price is - constructed by one three character currency code, encoded according - to ISO 4217 [ISO-4217] alphabetic currency code, followed by a - numerical value where "." is used as decimal seperator. In the price - string several prices may be concatenated, seperated by a "/" - character, but there may only be one currency of each type. - - The price string is followed by an 8 character date string in the - format YYYYMMDD, describing for how long the price is valid. After - that is a contact URL, with which the user can contact the seller, - followed by a one byte 'received as' field. It describes how the - audio is delivered when bought according to the following list: - - $00 Other - $01 Standard CD album with other songs - $02 Compressed audio on CD - $03 File over the Internet - $04 Stream over the Internet - $05 As note sheets - $06 As note sheets in a book with other sheets - $07 Music on other media - $08 Non-musical merchandise - - Next follows a terminated string with the name of the seller followed - by a terminated string with a short description of the product. The - last thing is the ability to include a company logotype. The first of - them is the 'Picture MIME type' field containing information about - which picture format is used. In the event that the MIME media type - name is omitted, "image/" will be implied. Currently only "image/png" - and "image/jpeg" are allowed. This format string is followed by the - binary picture data. This two last fields may be omitted if no - picture is to attach. - - <Header for 'Commercial frame', ID: "COMR"> - Text encoding $xx - Price string <text string> $00 - Valid until <text string> - Contact URL <text string> $00 - Received as $xx - Name of seller <text string according to encoding> $00 (00) - Description <text string according to encoding> $00 (00) - Picture MIME type <string> $00 - Seller logo <binary data> - - -4.26. Encryption method registration - - To identify with which method a frame has been encrypted the - encryption method must be registered in the tag with this frame. The - 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific encryption method. Questions regarding the - encryption method should be sent to the indicated email address. The - 'Method symbol' contains a value that is associated with this method - throughout the whole tag. Values below $80 are reserved. The 'Method - symbol' may optionally be followed by encryption specific data. There - may be several "ENCR" frames in a tag but only one containing the - same symbol and only one containing the same owner identifier. The - method must be used somewhere in the tag. See section 3.3.1, flag j - for more information. - - <Header for 'Encryption method registration', ID: "ENCR"> - Owner identifier <text string> $00 - Method symbol $xx - Encryption data <binary data> - - -4.27. Group identification registration - - This frame enables grouping of otherwise unrelated frames. This can - be used when some frames are to be signed. To identify which frames - belongs to a set of frames a group identifier must be registered in - the tag with this frame. The 'Owner identifier' is a null-terminated - string with a URL [URL] containing an email address, or a link to a - location where an email address can be found, that belongs to the - organisation responsible for this grouping. Questions regarding the - grouping should be sent to the indicated email address. The 'Group - symbol' contains a value that associates the frame with this group - throughout the whole tag. Values below $80 are reserved. The 'Group - symbol' may optionally be followed by some group specific data, e.g. - a digital signature. There may be several "GRID" frames in a tag but - only one containing the same symbol and only one containing the same - owner identifier. The group symbol must be used somewhere in the tag. - See section 3.3.1, flag j for more information. - - <Header for 'Group ID registration', ID: "GRID"> - Owner identifier <text string> $00 - Group symbol $xx - Group dependent data <binary data> - - -4.28. Private frame - - This frame is used to contain information from a software producer - that its program uses and does not fit into the other frames. The - frame consists of an 'Owner identifier' string and the binary data. - The 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for the frame. Questions regarding the frame should be sent to the - indicated email address. The tag may contain more than one "PRIV" - frame but only with different contents. It is recommended to keep the - number of "PRIV" frames as low as possible. - - <Header for 'Private frame', ID: "PRIV"> - Owner identifier <text string> $00 - The private data <binary data> - - -5. The 'unsynchronisation scheme' - - The only purpose of the 'unsynchronisation scheme' is to make the - ID3v2 tag as compatible as possible with existing software. There is - no use in 'unsynchronising' tags if the file is only to be processed - by new software. Unsynchronisation may only be made with MPEG 2 layer - I, II and III and MPEG 2.5 files. - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of a correct sync that should be altered by ID3 encoders is as - follows: - - %11111111 111xxxxx - - And should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they won't be affected by the decoding process. Therefore - all the $FF 00 combinations have to be replaced with the $FF 00 00 - combination during the unsynchronisation. - - To indicate usage of the unsynchronisation, the first bit in 'ID3 - flags' should be set. This bit should only be set if the tag - contains a, now corrected, false synchronisation. The bit should - only be clear if the tag does not contain any false synchronisations. - - Do bear in mind, that if a compression scheme is used by the encoder, - the unsynchronisation scheme should be applied *afterwards*. When - decoding a compressed, 'unsynchronised' file, the 'unsynchronisation - scheme' should be parsed first, decompression afterwards. - - If the last byte in the tag is $FF, and there is a need to eliminate - false synchronisations in the tag, at least one byte of padding - should be added. - - -6. Copyright - - Copyright (C) Martin Nilsson 1998. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -7. References - - [CDDB] Compact Disc Data Base - - http://www.cddb.com - - [ID3v2] Martin Nilsson, "ID3v2 informal standard". - - http://www.id3lib.org/id3/id3v2-00.txt - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-4217] ISO 4217:1995. - Codes for the representation of currencies and funds. - Technical committee / subcommittee: TC 68 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - http://www.w3.org/Graphics/JPEG/jfif.txt">http://www.w3.org/Graphics/JPEG/jfif.txt - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - ftp://ftp.isi.edu/in-notes/rfc2045.txt">ftp://ftp.isi.edu/in-notes/rfc2045.txt - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - http://www.w3.org/TR/REC-png-multi.html - - [UNICODE] ISO/IEC 10646-1:1993. - Universal Multiple-Octet Coded Character Set (UCS), Part 1: - Architecture and Basic Multilingual Plane. - Technical committee / subcommittee: JTC 1 / SC 2 - - http://www.unicode.org/ - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - ftp://ftp.isi.edu/in-notes/rfc1738.txt - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB - Compressed - Data Format Specification version 3.3", RFC 1950, May 1996. - - ftp://ftp.isi.edu/in-notes/rfc1950.txt - - -8. Appendix - - -A. Appendix A - Genre List from ID3v1 - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - The following genres are Winamp extensions - - 80.Folk - 81.Folk-Rock - 82.National Folk - 83.Swing - 84.Fast Fusion - 85.Bebob - 86.Latin - 87.Revival - 88.Celtic - 89.Bluegrass - 90.Avantgarde - 91.Gothic Rock - 92.Progressive Rock - 93.Psychedelic Rock - 94.Symphonic Rock - 95.Slow Rock - 96.Big Band - 97.Chorus - 98.Easy Listening - 99.Acoustic - 100.Humour - 101.Speech - 102.Chanson - 103.Opera - 104.Chamber Music - 105.Sonata - 106.Symphony - 107.Booty Bass - 108.Primus - 109.Porn Groove - 110.Satire - 111.Slow Jam - 112.Club - 113.Tango - 114.Samba - 115.Folklore - 116.Ballad - 117.Power Ballad - 118.Rhythmic Soul - 119.Freestyle - 120.Duet - 121.Punk Rock - 122.Drum Solo - 123.Acapella - 124.Euro-House - 125.Dance Hall - - -9. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - S-584 34 Linköping - Sweden - - Email: nilsson@id3.org - - - Edited by - - Dirk Mahoney - 57 Pechey Street - Chermside Q - Australia 4032 - - Email: dirk@id3.org - - - Johan Sundström - Alsättersgatan 5 A. 34 - S-584 35 Linköping - Sweden - - Email: johan@id3.org diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-frames.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-frames.txt deleted file mode 100755 index 74a21bed3..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-frames.txt +++ /dev/null @@ -1,1734 +0,0 @@ -$Id$ - -Informal standard M. Nilsson -Document: id3v2.4.0-frames.txt 1st November 2000 - - - ID3 tag version 2.4.0 - Native Frames - -Status of this document - - This document is an informal standard and replaces the ID3v2.3.0 - standard [ID3v2]. A formal standard will use another revision number - even if the content is identical to document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the frames natively supported by ID3v2.4.0, - which is a revised version of the ID3v2 informal standard [ID3v2.3.0] - version 2.3.0. The ID3v2 offers a flexible way of storing audio meta - information within audio file itself. The information may be - technical information, such as equalisation curves, as well as title, - performer, copyright etc. - - ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order - to allow for implementations to be revised as easily as possible. - - -1. Table of contents - - 2. Conventions in this document - 3. Default flags - 4. Declared ID3v2 frames - 4.1. Unique file identifier - 4.2. Text information frames - 4.2.1. Identification frames - 4.2.2. Involved persons frames - 4.2.3. Derived and subjective properties frames - 4.2.4. Rights and license frames - 4.2.5. Other text frames - 4.2.6. User defined text information frame - 4.3. URL link frames - 4.3.1. URL link frames - details - 4.3.2. User defined URL link frame - 4.4. Music CD Identifier - 4.5. Event timing codes - 4.6. MPEG location lookup table - 4.7. Synced tempo codes - 4.8. Unsynchronised lyrics/text transcription - 4.9. Synchronised lyrics/text - 4.10. Comments - 4.11. Relative volume adjustment (2) - 4.12. Equalisation (2) - 4.13. Reverb - 4.14. Attached picture - 4.15. General encapsulated object - 4.16. Play counter - 4.17. Popularimeter - 4.18. Recommended buffer size - 4.19. Audio encryption - 4.20. Linked information - 4.21. Position synchronisation frame - 4.22. Terms of use - 4.23. Ownership frame - 4.24. Commercial frame - 4.25. Encryption method registration - 4.26. Group identification registration - 4.27. Private frame - 4.28. Signature frame - 4.29. Seek frame - 4.30. Audio seek point index - 5. Copyright - 6. References - 7. Appendix - A. Appendix A - Genre List from ID3v1 - 8. Author's Address - - -2. Conventions in this document - - Text within "" is a text string exactly as it appears in a tag. - Numbers preceded with $ are hexadecimal and numbers preceded with % - are binary. $xx is used to indicate a byte with unknown content. %x - is used to indicate a bit with unknown content. The most significant - bit (MSB) of a byte is called 'bit 7' and the least significant bit - (LSB) is called 'bit 0'. - - A tag is the whole tag described the ID3v2 main structure document - [ID3v2-strct]. A frame is a block of information in the tag. The tag - consists of a header, frames and optional padding. A field is a piece - of information; one value, a string etc. A numeric string is a string - that consists of the characters "0123456789" only. - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in RFC 2119 [KEYWORDS]. - - -3. Default flags - - The default settings for the frames described in this document can be - divided into the following classes. The flags may be set differently - if found more suitable by the software. - - 1. Discarded if tag is altered, discarded if file is altered. - - None. - - 2. Discarded if tag is altered, preserved if file is altered. - - None. - - 3. Preserved if tag is altered, discarded if file is altered. - - ASPI, AENC, ETCO, EQU2, MLLT, POSS, SEEK, SYLT, SYTC, RVA2, TENC, - TLEN - - 4. Preserved if tag is altered, preserved if file is altered. - - The rest of the frames. - - -4. Declared ID3v2 frames - - The following frames are declared in this draft. - - 4.19 AENC Audio encryption - 4.14 APIC Attached picture - 4.30 ASPI Audio seek point index - - 4.10 COMM Comments - 4.24 COMR Commercial frame - - 4.25 ENCR Encryption method registration - 4.12 EQU2 Equalisation (2) - 4.5 ETCO Event timing codes - - 4.15 GEOB General encapsulated object - 4.26 GRID Group identification registration - - 4.20 LINK Linked information - - 4.4 MCDI Music CD identifier - 4.6 MLLT MPEG location lookup table - - 4.23 OWNE Ownership frame - - 4.27 PRIV Private frame - 4.16 PCNT Play counter - 4.17 POPM Popularimeter - 4.21 POSS Position synchronisation frame - - 4.18 RBUF Recommended buffer size - 4.11 RVA2 Relative volume adjustment (2) - 4.13 RVRB Reverb - - 4.29 SEEK Seek frame - 4.28 SIGN Signature frame - 4.9 SYLT Synchronised lyric/text - 4.7 SYTC Synchronised tempo codes - - 4.2.1 TALB Album/Movie/Show title - 4.2.3 TBPM BPM (beats per minute) - 4.2.2 TCOM Composer - 4.2.3 TCON Content type - 4.2.4 TCOP Copyright message - 4.2.5 TDEN Encoding time - 4.2.5 TDLY Playlist delay - 4.2.5 TDOR Original release time - 4.2.5 TDRC Recording time - 4.2.5 TDRL Release time - 4.2.5 TDTG Tagging time - 4.2.2 TENC Encoded by - 4.2.2 TEXT Lyricist/Text writer - 4.2.3 TFLT File type - 4.2.2 TIPL Involved people list - 4.2.1 TIT1 Content group description - 4.2.1 TIT2 Title/songname/content description - 4.2.1 TIT3 Subtitle/Description refinement - 4.2.3 TKEY Initial key - 4.2.3 TLAN Language(s) - 4.2.3 TLEN Length - 4.2.2 TMCL Musician credits list - 4.2.3 TMED Media type - 4.2.3 TMOO Mood - 4.2.1 TOAL Original album/movie/show title - 4.2.5 TOFN Original filename - 4.2.2 TOLY Original lyricist(s)/text writer(s) - 4.2.2 TOPE Original artist(s)/performer(s) - 4.2.4 TOWN File owner/licensee - 4.2.2 TPE1 Lead performer(s)/Soloist(s) - 4.2.2 TPE2 Band/orchestra/accompaniment - 4.2.2 TPE3 Conductor/performer refinement - 4.2.2 TPE4 Interpreted, remixed, or otherwise modified by - 4.2.1 TPOS Part of a set - 4.2.4 TPRO Produced notice - 4.2.4 TPUB Publisher - 4.2.1 TRCK Track number/Position in set - 4.2.4 TRSN Internet radio station name - 4.2.4 TRSO Internet radio station owner - 4.2.5 TSOA Album sort order - 4.2.5 TSOP Performer sort order - 4.2.5 TSOT Title sort order - 4.2.1 TSRC ISRC (international standard recording code) - 4.2.5 TSSE Software/Hardware and settings used for encoding - 4.2.1 TSST Set subtitle - 4.2.2 TXXX User defined text information frame - - 4.1 UFID Unique file identifier - 4.22 USER Terms of use - 4.8 USLT Unsynchronised lyric/text transcription - - 4.3.1 WCOM Commercial information - 4.3.1 WCOP Copyright/Legal information - 4.3.1 WOAF Official audio file webpage - 4.3.1 WOAR Official artist/performer webpage - 4.3.1 WOAS Official audio source webpage - 4.3.1 WORS Official Internet radio station homepage - 4.3.1 WPAY Payment - 4.3.1 WPUB Publishers official webpage - 4.3.2 WXXX User defined URL link frame - - -4.1. Unique file identifier - - This frame's purpose is to be able to identify the audio file in a - database, that may provide more information relevant to the content. - Since standardisation of such a database is beyond this document, all - UFID frames begin with an 'owner identifier' field. It is a null- - terminated string with a URL [URL] containing an email address, or a - link to a location where an email address can be found, that belongs - to the organisation responsible for this specific database - implementation. Questions regarding the database should be sent to - the indicated email address. The URL should not be used for the - actual database queries. The string - "http://www.id3.org/dummy/ufid.html" should be used for tests. The - 'Owner identifier' must be non-empty (more than just a termination). - The 'Owner identifier' is then followed by the actual identifier, - which may be up to 64 bytes. There may be more than one "UFID" frame - in a tag, but only one with the same 'Owner identifier'. - - <Header for 'Unique file identifier', ID: "UFID"> - Owner identifier <text string> $00 - Identifier <up to 64 bytes binary data> - - -4.2. Text information frames - - The text information frames are often the most important frames, - containing information like artist, album and more. There may only be - one text information frame of its kind in an tag. All text - information frames supports multiple strings, stored as a null - separated list, where null is reperesented by the termination code - for the charater encoding. All text frame identifiers begin with "T". - Only text frame identifiers begin with "T", with the exception of the - "TXXX" frame. All the text information frames have the following - format: - - <Header for 'Text information frame', ID: "T000" - "TZZZ", - excluding "TXXX" described in 4.2.6.> - Text encoding $xx - Information <text string(s) according to encoding> - - -4.2.1. Identification frames - - TIT1 - The 'Content group description' frame is used if the sound belongs to - a larger category of sounds/music. For example, classical music is - often sorted in different musical sections (e.g. "Piano Concerto", - "Weather - Hurricane"). - - TIT2 - The 'Title/Songname/Content description' frame is the actual name of - the piece (e.g. "Adagio", "Hurricane Donna"). - - TIT3 - The 'Subtitle/Description refinement' frame is used for information - directly related to the contents title (e.g. "Op. 16" or "Performed - live at Wembley"). - - TALB - The 'Album/Movie/Show title' frame is intended for the title of the - recording (or source of sound) from which the audio in the file is - taken. - - TOAL - The 'Original album/movie/show title' frame is intended for the title - of the original recording (or source of sound), if for example the - music in the file should be a cover of a previously released song. - - TRCK - The 'Track number/Position in set' frame is a numeric string - containing the order number of the audio-file on its original - recording. This MAY be extended with a "/" character and a numeric - string containing the total number of tracks/elements on the original - recording. E.g. "4/9". - - TPOS - The 'Part of a set' frame is a numeric string that describes which - part of a set the audio came from. This frame is used if the source - described in the "TALB" frame is divided into several mediums, e.g. a - double CD. The value MAY be extended with a "/" character and a - numeric string containing the total number of parts in the set. E.g. - "1/2". - - TSST - The 'Set subtitle' frame is intended for the subtitle of the part of - a set this track belongs to. - - TSRC - The 'ISRC' frame should contain the International Standard Recording - Code [ISRC] (12 characters). - - -4.2.2. Involved persons frames - - TPE1 - The 'Lead artist/Lead performer/Soloist/Performing group' is - used for the main artist. - - TPE2 - The 'Band/Orchestra/Accompaniment' frame is used for additional - information about the performers in the recording. - - TPE3 - The 'Conductor' frame is used for the name of the conductor. - - TPE4 - The 'Interpreted, remixed, or otherwise modified by' frame contains - more information about the people behind a remix and similar - interpretations of another existing piece. - - TOPE - The 'Original artist/performer' frame is intended for the performer - of the original recording, if for example the music in the file - should be a cover of a previously released song. - - TEXT - The 'Lyricist/Text writer' frame is intended for the writer of the - text or lyrics in the recording. - - TOLY - The 'Original lyricist/text writer' frame is intended for the - text writer of the original recording, if for example the music in - the file should be a cover of a previously released song. - - TCOM - The 'Composer' frame is intended for the name of the composer. - - TMCL - The 'Musician credits list' is intended as a mapping between - instruments and the musician that played it. Every odd field is an - instrument and every even is an artist or a comma delimited list of - artists. - - TIPL - The 'Involved people list' is very similar to the musician credits - list, but maps between functions, like producer, and names. - - TENC - The 'Encoded by' frame contains the name of the person or - organisation that encoded the audio file. This field may contain a - copyright message, if the audio file also is copyrighted by the - encoder. - - -4.2.3. Derived and subjective properties frames - - TBPM - The 'BPM' frame contains the number of beats per minute in the - main part of the audio. The BPM is an integer and represented as a - numerical string. - - TLEN - The 'Length' frame contains the length of the audio file in - milliseconds, represented as a numeric string. - - TKEY - The 'Initial key' frame contains the musical key in which the sound - starts. It is represented as a string with a maximum length of three - characters. The ground keys are represented with "A","B","C","D","E", - "F" and "G" and halfkeys represented with "b" and "#". Minor is - represented as "m", e.g. "Dbm" $00. Off key is represented with an - "o" only. - - TLAN - The 'Language' frame should contain the languages of the text or - lyrics spoken or sung in the audio. The language is represented with - three characters according to ISO-639-2 [ISO-639-2]. If more than one - language is used in the text their language codes should follow - according to the amount of their usage, e.g. "eng" $00 "sve" $00. - - TCON - The 'Content type', which ID3v1 was stored as a one byte numeric - value only, is now a string. You may use one or several of the ID3v1 - types as numerical strings, or, since the category list would be - impossible to maintain with accurate and up to date categories, - define your own. Example: "21" $00 "Eurodisco" $00 - - You may also use any of the following keywords: - - RX Remix - CR Cover - - TFLT - The 'File type' frame indicates which type of audio this tag defines. - The following types and refinements are defined: - - MIME MIME type follows - MPG MPEG Audio - /1 MPEG 1/2 layer I - /2 MPEG 1/2 layer II - /3 MPEG 1/2 layer III - /2.5 MPEG 2.5 - /AAC Advanced audio compression - VQF Transform-domain Weighted Interleave Vector Quantisation - PCM Pulse Code Modulated audio - - but other types may be used, but not for these types though. This is - used in a similar way to the predefined types in the "TMED" frame, - but without parentheses. If this frame is not present audio type is - assumed to be "MPG". - - TMED - The 'Media type' frame describes from which media the sound - originated. This may be a text string or a reference to the - predefined media types found in the list below. Example: - "VID/PAL/VHS" $00. - - DIG Other digital media - /A Analogue transfer from media - - ANA Other analogue media - /WAC Wax cylinder - /8CA 8-track tape cassette - - CD CD - /A Analogue transfer from media - /DD DDD - /AD ADD - /AA AAD - - LD Laserdisc - - TT Turntable records - /33 33.33 rpm - /45 45 rpm - /71 71.29 rpm - /76 76.59 rpm - /78 78.26 rpm - /80 80 rpm - - MD MiniDisc - /A Analogue transfer from media - - DAT DAT - /A Analogue transfer from media - /1 standard, 48 kHz/16 bits, linear - /2 mode 2, 32 kHz/16 bits, linear - /3 mode 3, 32 kHz/12 bits, non-linear, low speed - /4 mode 4, 32 kHz/12 bits, 4 channels - /5 mode 5, 44.1 kHz/16 bits, linear - /6 mode 6, 44.1 kHz/16 bits, 'wide track' play - - DCC DCC - /A Analogue transfer from media - - DVD DVD - /A Analogue transfer from media - - TV Television - /PAL PAL - /NTSC NTSC - /SECAM SECAM - - VID Video - /PAL PAL - /NTSC NTSC - /SECAM SECAM - /VHS VHS - /SVHS S-VHS - /BETA BETAMAX - - RAD Radio - /FM FM - /AM AM - /LW LW - /MW MW - - TEL Telephone - /I ISDN - - MC MC (normal cassette) - /4 4.75 cm/s (normal speed for a two sided cassette) - /9 9.5 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - REE Reel - /9 9.5 cm/s - /19 19 cm/s - /38 38 cm/s - /76 76 cm/s - /I Type I cassette (ferric/normal) - /II Type II cassette (chrome) - /III Type III cassette (ferric chrome) - /IV Type IV cassette (metal) - - TMOO - The 'Mood' frame is intended to reflect the mood of the audio with a - few keywords, e.g. "Romantic" or "Sad". - - -4.2.4. Rights and license frames - - TCOP - The 'Copyright message' frame, in which the string must begin with a - year and a space character (making five characters), is intended for - the copyright holder of the original sound, not the audio file - itself. The absence of this frame means only that the copyright - information is unavailable or has been removed, and must not be - interpreted to mean that the audio is public domain. Every time this - field is displayed the field must be preceded with "Copyright " (C) " - ", where (C) is one character showing a C in a circle. - - TPRO - The 'Produced notice' frame, in which the string must begin with a - year and a space character (making five characters), is intended for - the production copyright holder of the original sound, not the audio - file itself. The absence of this frame means only that the production - copyright information is unavailable or has been removed, and must - not be interpreted to mean that the audio is public domain. Every - time this field is displayed the field must be preceded with - "Produced " (P) " ", where (P) is one character showing a P in a - circle. - - TPUB - The 'Publisher' frame simply contains the name of the label or - publisher. - - TOWN - The 'File owner/licensee' frame contains the name of the owner or - licensee of the file and it's contents. - - TRSN - The 'Internet radio station name' frame contains the name of the - internet radio station from which the audio is streamed. - - TRSO - The 'Internet radio station owner' frame contains the name of the - owner of the internet radio station from which the audio is - streamed. - -4.2.5. Other text frames - - TOFN - The 'Original filename' frame contains the preferred filename for the - file, since some media doesn't allow the desired length of the - filename. The filename is case sensitive and includes its suffix. - - TDLY - The 'Playlist delay' defines the numbers of milliseconds of silence - that should be inserted before this audio. The value zero indicates - that this is a part of a multifile audio track that should be played - continuously. - - TDEN - The 'Encoding time' frame contains a timestamp describing when the - audio was encoded. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDOR - The 'Original release time' frame contains a timestamp describing - when the original recording of the audio was released. Timestamp - format is described in the ID3v2 structure document [ID3v2-strct]. - - TDRC - The 'Recording time' frame contains a timestamp describing when the - audio was recorded. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDRL - The 'Release time' frame contains a timestamp describing when the - audio was first released. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TDTG - The 'Tagging time' frame contains a timestamp describing then the - audio was tagged. Timestamp format is described in the ID3v2 - structure document [ID3v2-strct]. - - TSSE - The 'Software/Hardware and settings used for encoding' frame - includes the used audio encoder and its settings when the file was - encoded. Hardware refers to hardware encoders, not the computer on - which a program was run. - - TSOA - The 'Album sort order' frame defines a string which should be used - instead of the album name (TALB) for sorting purposes. E.g. an album - named "A Soundtrack" might preferably be sorted as "Soundtrack". - - TSOP - The 'Performer sort order' frame defines a string which should be - used instead of the performer (TPE2) for sorting purposes. - - TSOT - The 'Title sort order' frame defines a string which should be used - instead of the title (TIT2) for sorting purposes. - - -4.2.6. User defined text information frame - - This frame is intended for one-string text information concerning the - audio file in a similar way to the other "T"-frames. The frame body - consists of a description of the string, represented as a terminated - string, followed by the actual string. There may be more than one - "TXXX" frame in each tag, but only one with the same description. - - <Header for 'User defined text information frame', ID: "TXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - Value <text string according to encoding> - - -4.3. URL link frames - - With these frames dynamic data such as webpages with touring - information, price information or plain ordinary news can be added to - the tag. There may only be one URL [URL] link frame of its kind in an - tag, except when stated otherwise in the frame description. If the - text string is followed by a string termination, all the following - information should be ignored and not be displayed. All URL link - frame identifiers begins with "W". Only URL link frame identifiers - begins with "W", except for "WXXX". All URL link frames have the - following format: - - <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" - described in 4.3.2.> - URL <text string> - - -4.3.1. URL link frames - details - - WCOM - The 'Commercial information' frame is a URL pointing at a webpage - with information such as where the album can be bought. There may be - more than one "WCOM" frame in a tag, but not with the same content. - - WCOP - The 'Copyright/Legal information' frame is a URL pointing at a - webpage where the terms of use and ownership of the file is - described. - - WOAF - The 'Official audio file webpage' frame is a URL pointing at a file - specific webpage. - - WOAR - The 'Official artist/performer webpage' frame is a URL pointing at - the artists official webpage. There may be more than one "WOAR" frame - in a tag if the audio contains more than one performer, but not with - the same content. - - WOAS - The 'Official audio source webpage' frame is a URL pointing at the - official webpage for the source of the audio file, e.g. a movie. - - WORS - The 'Official Internet radio station homepage' contains a URL - pointing at the homepage of the internet radio station. - - WPAY - The 'Payment' frame is a URL pointing at a webpage that will handle - the process of paying for this file. - - WPUB - The 'Publishers official webpage' frame is a URL pointing at the - official webpage for the publisher. - - -4.3.2. User defined URL link frame - - This frame is intended for URL [URL] links concerning the audio file - in a similar way to the other "W"-frames. The frame body consists - of a description of the string, represented as a terminated string, - followed by the actual URL. The URL is always encoded with ISO-8859-1 - [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, - but only one with the same description. - - <Header for 'User defined URL link frame', ID: "WXXX"> - Text encoding $xx - Description <text string according to encoding> $00 (00) - URL <text string> - - -4.4. Music CD identifier - - This frame is intended for music that comes from a CD, so that the CD - can be identified in databases such as the CDDB [CDDB]. The frame - consists of a binary dump of the Table Of Contents, TOC, from the CD, - which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 - bytes for the 'lead out', making a maximum of 804 bytes. The offset - to the beginning of every track on the CD should be described with a - four bytes absolute CD-frame address per track, and not with absolute - time. When this frame is used the presence of a valid "TRCK" frame is - REQUIRED, even if the CD's only got one track. It is recommended that - this frame is always added to tags originating from CDs. There may - only be one "MCDI" frame in each tag. - - <Header for 'Music CD identifier', ID: "MCDI"> - CD TOC <binary data> - - -4.5. Event timing codes - - This frame allows synchronisation with key events in the audio. The - header is: - - <Header for 'Event timing codes', ID: "ETCO"> - Time stamp format $xx - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - Followed by a list of key events in the following format: - - Type of event $xx - Time stamp $xx (xx ...) - - The 'Time stamp' is set to zero if directly at the beginning of the - sound or after the previous event. All events MUST be sorted in - chronological order. The type of event is as follows: - - $00 padding (has no meaning) - $01 end of initial silence - $02 intro start - $03 main part start - $04 outro start - $05 outro end - $06 verse start - $07 refrain start - $08 interlude start - $09 theme start - $0A variation start - $0B key change - $0C time change - $0D momentary unwanted noise (Snap, Crackle & Pop) - $0E sustained noise - $0F sustained noise end - $10 intro end - $11 main part end - $12 verse end - $13 refrain end - $14 theme end - $15 profanity - $16 profanity end - - $17-$DF reserved for future use - - $E0-$EF not predefined synch 0-F - - $F0-$FC reserved for future use - - $FD audio end (start of silence) - $FE audio file ends - $FF one more byte of events follows (all the following bytes with - the value $FF have the same function) - - Terminating the start events such as "intro start" is OPTIONAL. The - 'Not predefined synch's ($E0-EF) are for user events. You might want - to synchronise your music to something, like setting off an explosion - on-stage, activating a screensaver etc. - - There may only be one "ETCO" frame in each tag. - - -4.6. MPEG location lookup table - - To increase performance and accuracy of jumps within a MPEG [MPEG] - audio file, frames with time codes in different locations in the file - might be useful. This ID3v2 frame includes references that the - software can use to calculate positions in the file. After the frame - header follows a descriptor of how much the 'frame counter' should be - increased for every reference. If this value is two then the first - reference points out the second frame, the 2nd reference the 4th - frame, the 3rd reference the 6th frame etc. In a similar way the - 'bytes between reference' and 'milliseconds between reference' points - out bytes and milliseconds respectively. - - Each reference consists of two parts; a certain number of bits, as - defined in 'bits for bytes deviation', that describes the difference - between what is said in 'bytes between reference' and the reality and - a certain number of bits, as defined in 'bits for milliseconds - deviation', that describes the difference between what is said in - 'milliseconds between reference' and the reality. The number of bits - in every reference, i.e. 'bits for bytes deviation'+'bits for - milliseconds deviation', must be a multiple of four. There may only - be one "MLLT" frame in each tag. - - <Header for 'Location lookup table', ID: "MLLT"> - MPEG frames between reference $xx xx - Bytes between reference $xx xx xx - Milliseconds between reference $xx xx xx - Bits for bytes deviation $xx - Bits for milliseconds dev. $xx - - Then for every reference the following data is included; - - Deviation in bytes %xxx.... - Deviation in milliseconds %xxx.... - - -4.7. Synchronised tempo codes - - For a more accurate description of the tempo of a musical piece, this - frame might be used. After the header follows one byte describing - which time stamp format should be used. Then follows one or more - tempo codes. Each tempo code consists of one tempo part and one time - part. The tempo is in BPM described with one or two bytes. If the - first byte has the value $FF, one more byte follows, which is added - to the first giving a range from 2 - 510 BPM, since $00 and $01 is - reserved. $00 is used to describe a beat-free time period, which is - not the same as a music-free time period. $01 is used to indicate one - single beat-stroke followed by a beat-free period. - - The tempo descriptor is followed by a time stamp. Every time the - tempo in the music changes, a tempo descriptor may indicate this for - the player. All tempo descriptors MUST be sorted in chronological - order. The first beat-stroke in a time-period is at the same time as - the beat description occurs. There may only be one "SYTC" frame in - each tag. - - <Header for 'Synchronised tempo codes', ID: "SYTC"> - Time stamp format $xx - Tempo data <binary data> - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - -4.8. Unsynchronised lyrics/text transcription - - This frame contains the lyrics of the song or a text transcription of - other vocal activities. The head includes an encoding descriptor and - a content descriptor. The body consists of the actual text. The - 'Content descriptor' is a terminated string. If no descriptor is - entered, 'Content descriptor' is $00 (00) only. Newline characters - are allowed in the text. There may be more than one 'Unsynchronised - lyrics/text transcription' frame in each tag, but only one with the - same language and content descriptor. - - <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> - Text encoding $xx - Language $xx xx xx - Content descriptor <text string according to encoding> $00 (00) - Lyrics/text <full text string according to encoding> - - -4.9. Synchronised lyrics/text - - This is another way of incorporating the words, said or sung lyrics, - in the audio file as text, this time, however, in sync with the - audio. It might also be used to describing events e.g. occurring on a - stage or on the screen in sync with the audio. The header includes a - content descriptor, represented with as terminated text string. If no - descriptor is entered, 'Content descriptor' is $00 (00) only. - - <Header for 'Synchronised lyrics/text', ID: "SYLT"> - Text encoding $xx - Language $xx xx xx - Time stamp format $xx - Content type $xx - Content descriptor <text string according to encoding> $00 (00) - - Content type: $00 is other - $01 is lyrics - $02 is text transcription - $03 is movement/part name (e.g. "Adagio") - $04 is events (e.g. "Don Quijote enters the stage") - $05 is chord (e.g. "Bb F Fsus") - $06 is trivia/'pop up' information - $07 is URLs to webpages - $08 is URLs to images - - Time stamp format: - - $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - Absolute time means that every stamp contains the time from the - beginning of the file. - - The text that follows the frame header differs from that of the - unsynchronised lyrics/text transcription in one major way. Each - syllable (or whatever size of text is considered to be convenient by - the encoder) is a null terminated string followed by a time stamp - denoting where in the sound file it belongs. Each sync thus has the - following structure: - - Terminated text to be synced (typically a syllable) - Sync identifier (terminator to above string) $00 (00) - Time stamp $xx (xx ...) - - The 'time stamp' is set to zero or the whole sync is omitted if - located directly at the beginning of the sound. All time stamps - should be sorted in chronological order. The sync can be considered - as a validator of the subsequent string. - - Newline characters are allowed in all "SYLT" frames and MUST be used - after every entry (name, event etc.) in a frame with the content type - $03 - $04. - - A few considerations regarding whitespace characters: Whitespace - separating words should mark the beginning of a new word, thus - occurring in front of the first syllable of a new word. This is also - valid for new line characters. A syllable followed by a comma should - not be broken apart with a sync (both the syllable and the comma - should be before the sync). - - An example: The "USLT" passage - - "Strangers in the night" $0A "Exchanging glances" - - would be "SYLT" encoded as: - - "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx - " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx - xx "glan" $00 xx xx "ces" $00 xx xx - - There may be more than one "SYLT" frame in each tag, but only one - with the same language and content descriptor. - - -4.10. Comments - - This frame is intended for any kind of full text information that - does not fit in any other frame. It consists of a frame header - followed by encoding, language and content descriptors and is ended - with the actual comment as a text string. Newline characters are - allowed in the comment text string. There may be more than one - comment frame in each tag, but only one with the same language and - content descriptor. - - <Header for 'Comment', ID: "COMM"> - Text encoding $xx - Language $xx xx xx - Short content descrip. <text string according to encoding> $00 (00) - The actual text <full text string according to encoding> - - -4.11. Relative volume adjustment (2) - - This is a more subjective frame than the previous ones. It allows the - user to say how much he wants to increase/decrease the volume on each - channel when the file is played. The purpose is to be able to align - all files to a reference volume, so that you don't have to change the - volume constantly. This frame may also be used to balance adjust the - audio. The volume adjustment is encoded as a fixed point decibel - value, 16 bit signed integer representing (adjustment*512), giving - +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as - $04 00 and -2 dB is $FC 00. There may be more than one "RVA2" frame - in each tag, but only one with the same identification string. - - <Header for 'Relative volume adjustment (2)', ID: "RVA2"> - Identification <text string> $00 - - The 'identification' string is used to identify the situation and/or - device where this adjustment should apply. The following is then - repeated for every channel - - Type of channel $xx - Volume adjustment $xx xx - Bits representing peak $xx - Peak volume $xx (xx ...) - - - Type of channel: $00 Other - $01 Master volume - $02 Front right - $03 Front left - $04 Back right - $05 Back left - $06 Front centre - $07 Back centre - $08 Subwoofer - - Bits representing peak can be any number between 0 and 255. 0 means - that there is no peak volume field. The peak volume field is always - padded to whole bytes, setting the most significant bits to zero. - - -4.12. Equalisation (2) - - This is another subjective, alignment frame. It allows the user to - predefine an equalisation curve within the audio file. There may be - more than one "EQU2" frame in each tag, but only one with the same - identification string. - - <Header of 'Equalisation (2)', ID: "EQU2"> - Interpolation method $xx - Identification <text string> $00 - - The 'interpolation method' describes which method is preferred when - an interpolation between the adjustment point that follows. The - following methods are currently defined: - - $00 Band - No interpolation is made. A jump from one adjustment level to - another occurs in the middle between two adjustment points. - $01 Linear - Interpolation between adjustment points is linear. - - The 'identification' string is used to identify the situation and/or - device where this adjustment should apply. The following is then - repeated for every adjustment point - - Frequency $xx xx - Volume adjustment $xx xx - - The frequency is stored in units of 1/2 Hz, giving it a range from 0 - to 32767 Hz. - - The volume adjustment is encoded as a fixed point decibel value, 16 - bit signed integer representing (adjustment*512), giving +/- 64 dB - with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 - and -2 dB is $FC 00. - - Adjustment points should be ordered by frequency and one frequency - should only be described once in the frame. - - -4.13. Reverb - - Yet another subjective frame, with which you can adjust echoes of - different kinds. Reverb left/right is the delay between every bounce - in ms. Reverb bounces left/right is the number of bounces that should - be made. $FF equals an infinite number of bounces. Feedback is the - amount of volume that should be returned to the next echo bounce. $00 - is 0%, $FF is 100%. If this value were $7F, there would be 50% volume - reduction on the first bounce, 50% of that on the second and so on. - Left to left means the sound from the left bounce to be played in the - left speaker, while left to right means sound from the left bounce to - be played in the right speaker. - - 'Premix left to right' is the amount of left sound to be mixed in the - right before any reverb is applied, where $00 id 0% and $FF is 100%. - 'Premix right to left' does the same thing, but right to left. - Setting both premix to $FF would result in a mono output (if the - reverb is applied symmetric). There may only be one "RVRB" frame in - each tag. - - <Header for 'Reverb', ID: "RVRB"> - Reverb left (ms) $xx xx - Reverb right (ms) $xx xx - Reverb bounces, left $xx - Reverb bounces, right $xx - Reverb feedback, left to left $xx - Reverb feedback, left to right $xx - Reverb feedback, right to right $xx - Reverb feedback, right to left $xx - Premix left to right $xx - Premix right to left $xx - - -4.14. Attached picture - - This frame contains a picture directly related to the audio file. - Image format is the MIME type and subtype [MIME] for the image. In - the event that the MIME media type name is omitted, "image/" will be - implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format - should be used when interoperability is wanted. Description is a - short description of the picture, represented as a terminated - text string. There may be several pictures attached to one file, each - in their individual "APIC" frame, but only one with the same content - descriptor. There may only be one picture with the picture type - declared as picture type $01 and $02 respectively. There is the - possibility to put only a link to the image file by using the 'MIME - type' "-->" and having a complete URL [URL] instead of picture data. - The use of linked files should however be used sparingly since there - is the risk of separation of files. - - <Header for 'Attached picture', ID: "APIC"> - Text encoding $xx - MIME type <text string> $00 - Picture type $xx - Description <text string according to encoding> $00 (00) - Picture data <binary data> - - - Picture type: $00 Other - $01 32x32 pixels 'file icon' (PNG only) - $02 Other file icon - $03 Cover (front) - $04 Cover (back) - $05 Leaflet page - $06 Media (e.g. label side of CD) - $07 Lead artist/lead performer/soloist - $08 Artist/performer - $09 Conductor - $0A Band/Orchestra - $0B Composer - $0C Lyricist/text writer - $0D Recording Location - $0E During recording - $0F During performance - $10 Movie/video screen capture - $11 A bright coloured fish - $12 Illustration - $13 Band/artist logotype - $14 Publisher/Studio logotype - - -4.15. General encapsulated object - - In this frame any type of file can be encapsulated. After the header, - 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as - as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The - filename is case sensitive and is encoded as 'Encoding'. Then follows - a content description as terminated string, encoded as 'Encoding'. - The last thing in the frame is the actual object. The first two - strings may be omitted, leaving only their terminations. MIME type is - always an ISO-8859-1 text string. There may be more than one "GEOB" - frame in each tag, but only one with the same content descriptor. - - <Header for 'General encapsulated object', ID: "GEOB"> - Text encoding $xx - MIME type <text string> $00 - Filename <text string according to encoding> $00 (00) - Content description <text string according to encoding> $00 (00) - Encapsulated object <binary data> - - -4.16. Play counter - - This is simply a counter of the number of times a file has been - played. The value is increased by one every time the file begins to - play. There may only be one "PCNT" frame in each tag. When the - counter reaches all one's, one byte is inserted in front of the - counter thus making the counter eight bits bigger. The counter must - be at least 32-bits long to begin with. - - <Header for 'Play counter', ID: "PCNT"> - Counter $xx xx xx xx (xx ...) - - -4.17. Popularimeter - - The purpose of this frame is to specify how good an audio file is. - Many interesting applications could be found to this frame such as a - playlist that features better audio files more often than others or - it could be used to profile a person's taste and find other 'good' - files by comparing people's profiles. The frame contains the email - address to the user, one rating byte and a four byte play counter, - intended to be increased with one for every time the file is played. - The email is a terminated string. The rating is 1-255 where 1 is - worst and 255 is best. 0 is unknown. If no personal counter is wanted - it may be omitted. When the counter reaches all one's, one byte is - inserted in front of the counter thus making the counter eight bits - bigger in the same away as the play counter ("PCNT"). There may be - more than one "POPM" frame in each tag, but only one with the same - email address. - - <Header for 'Popularimeter', ID: "POPM"> - Email to user <text string> $00 - Rating $xx - Counter $xx xx xx xx (xx ...) - - -4.18. Recommended buffer size - - Sometimes the server from which an audio file is streamed is aware of - transmission or coding problems resulting in interruptions in the - audio stream. In these cases, the size of the buffer can be - recommended by the server using this frame. If the 'embedded info - flag' is true (1) then this indicates that an ID3 tag with the - maximum size described in 'Buffer size' may occur in the audio - stream. In such case the tag should reside between two MPEG [MPEG] - frames, if the audio is MPEG encoded. If the position of the next tag - is known, 'offset to next tag' may be used. The offset is calculated - from the end of tag in which this frame resides to the first byte of - the header in the next. This field may be omitted. Embedded tags are - generally not recommended since this could render unpredictable - behaviour from present software/hardware. - - For applications like streaming audio it might be an idea to embed - tags into the audio stream though. If the clients connects to - individual connections like HTTP and there is a possibility to begin - every transmission with a tag, then this tag should include a - 'recommended buffer size' frame. If the client is connected to a - arbitrary point in the stream, such as radio or multicast, then the - 'recommended buffer size' frame SHOULD be included in every tag. - - The 'Buffer size' should be kept to a minimum. There may only be one - "RBUF" frame in each tag. - - <Header for 'Recommended buffer size', ID: "RBUF"> - Buffer size $xx xx xx - Embedded info flag %0000000x - Offset to next tag $xx xx xx xx - - -4.19. Audio encryption - - This frame indicates if the actual audio stream is encrypted, and by - whom. Since standardisation of such encryption scheme is beyond this - document, all "AENC" frames begin with a terminated string with a - URL containing an email address, or a link to a location where an - email address can be found, that belongs to the organisation - responsible for this specific encrypted audio file. Questions - regarding the encrypted audio should be sent to the email address - specified. If a $00 is found directly after the 'Frame size' and the - audio file indeed is encrypted, the whole file may be considered - useless. - - After the 'Owner identifier', a pointer to an unencrypted part of the - audio can be specified. The 'Preview start' and 'Preview length' is - described in frames. If no part is unencrypted, these fields should - be left zeroed. After the 'preview length' field follows optionally a - data block required for decryption of the audio. There may be more - than one "AENC" frames in a tag, but only one with the same 'Owner - identifier'. - - <Header for 'Audio encryption', ID: "AENC"> - Owner identifier <text string> $00 - Preview start $xx xx - Preview length $xx xx - Encryption info <binary data> - - -4.20. Linked information - - To keep information duplication as low as possible this frame may be - used to link information from another ID3v2 tag that might reside in - another audio file or alone in a binary file. It is RECOMMENDED that - this method is only used when the files are stored on a CD-ROM or - other circumstances when the risk of file separation is low. The - frame contains a frame identifier, which is the frame that should be - linked into this tag, a URL [URL] field, where a reference to the - file where the frame is given, and additional ID data, if needed. - Data should be retrieved from the first tag found in the file to - which this link points. There may be more than one "LINK" frame in a - tag, but only one with the same contents. A linked frame is to be - considered as part of the tag and has the same restrictions as if it - was a physical part of the tag (i.e. only one "RVRB" frame allowed, - whether it's linked or not). - - <Header for 'Linked information', ID: "LINK"> - Frame identifier $xx xx xx xx - URL <text string> $00 - ID and additional data <text string(s)> - - Frames that may be linked and need no additional data are "ASPI", - "ETCO", "EQU2", "MCID", "MLLT", "OWNE", "RVA2", "RVRB", "SYTC", the - text information frames and the URL link frames. - - The "AENC", "APIC", "GEOB" and "TXXX" frames may be linked with - the content descriptor as additional ID data. - - The "USER" frame may be linked with the language field as additional - ID data. - - The "PRIV" frame may be linked with the owner identifier as - additional ID data. - - The "COMM", "SYLT" and "USLT" frames may be linked with three bytes - of language descriptor directly followed by a content descriptor as - additional ID data. - - -4.21. Position synchronisation frame - - This frame delivers information to the listener of how far into the - audio stream he picked up; in effect, it states the time offset from - the first frame in the stream. The frame layout is: - - <Head for 'Position synchronisation', ID: "POSS"> - Time stamp format $xx - Position $xx (xx ...) - - Where time stamp format is: - - $01 Absolute time, 32 bit sized, using MPEG frames as unit - $02 Absolute time, 32 bit sized, using milliseconds as unit - - and position is where in the audio the listener starts to receive, - i.e. the beginning of the next frame. If this frame is used in the - beginning of a file the value is always 0. There may only be one - "POSS" frame in each tag. - - -4.22. Terms of use frame - - This frame contains a brief description of the terms of use and - ownership of the file. More detailed information concerning the legal - terms might be available through the "WCOP" frame. Newlines are - allowed in the text. There may be more than one 'Terms of use' frame - in a tag, but only one with the same 'Language'. - - <Header for 'Terms of use frame', ID: "USER"> - Text encoding $xx - Language $xx xx xx - The actual text <text string according to encoding> - - -4.23. Ownership frame - - The ownership frame might be used as a reminder of a made transaction - or, if signed, as proof. Note that the "USER" and "TOWN" frames are - good to use in conjunction with this one. The frame begins, after the - frame ID, size and encoding fields, with a 'price paid' field. The - first three characters of this field contains the currency used for - the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic - currency code. Concatenated to this is the actual price paid, as a - numerical string using "." as the decimal separator. Next is an 8 - character date string (YYYYMMDD) followed by a string with the name - of the seller as the last field in the frame. There may only be one - "OWNE" frame in a tag. - - <Header for 'Ownership frame', ID: "OWNE"> - Text encoding $xx - Price paid <text string> $00 - Date of purch. <text string> - Seller <text string according to encoding> - - -4.24. Commercial frame - - This frame enables several competing offers in the same tag by - bundling all needed information. That makes this frame rather complex - but it's an easier solution than if one tries to achieve the same - result with several frames. The frame begins, after the frame ID, - size and encoding fields, with a price string field. A price is - constructed by one three character currency code, encoded according - to ISO 4217 [ISO-4217] alphabetic currency code, followed by a - numerical value where "." is used as decimal separator. In the price - string several prices may be concatenated, separated by a "/" - character, but there may only be one currency of each type. - - The price string is followed by an 8 character date string in the - format YYYYMMDD, describing for how long the price is valid. After - that is a contact URL, with which the user can contact the seller, - followed by a one byte 'received as' field. It describes how the - audio is delivered when bought according to the following list: - - $00 Other - $01 Standard CD album with other songs - $02 Compressed audio on CD - $03 File over the Internet - $04 Stream over the Internet - $05 As note sheets - $06 As note sheets in a book with other sheets - $07 Music on other media - $08 Non-musical merchandise - - Next follows a terminated string with the name of the seller followed - by a terminated string with a short description of the product. The - last thing is the ability to include a company logotype. The first of - them is the 'Picture MIME type' field containing information about - which picture format is used. In the event that the MIME media type - name is omitted, "image/" will be implied. Currently only "image/png" - and "image/jpeg" are allowed. This format string is followed by the - binary picture data. This two last fields may be omitted if no - picture is attached. There may be more than one 'commercial frame' in - a tag, but no two may be identical. - - <Header for 'Commercial frame', ID: "COMR"> - Text encoding $xx - Price string <text string> $00 - Valid until <text string> - Contact URL <text string> $00 - Received as $xx - Name of seller <text string according to encoding> $00 (00) - Description <text string according to encoding> $00 (00) - Picture MIME type <string> $00 - Seller logo <binary data> - - -4.25. Encryption method registration - - To identify with which method a frame has been encrypted the - encryption method must be registered in the tag with this frame. The - 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for this specific encryption method. Questions regarding the - encryption method should be sent to the indicated email address. The - 'Method symbol' contains a value that is associated with this method - throughout the whole tag, in the range $80-F0. All other values are - reserved. The 'Method symbol' may optionally be followed by - encryption specific data. There may be several "ENCR" frames in a tag - but only one containing the same symbol and only one containing the - same owner identifier. The method must be used somewhere in the tag. - See the description of the frame encryption flag in the ID3v2 - structure document [ID3v2-strct] for more information. - - <Header for 'Encryption method registration', ID: "ENCR"> - Owner identifier <text string> $00 - Method symbol $xx - Encryption data <binary data> - - -4.26. Group identification registration - - This frame enables grouping of otherwise unrelated frames. This can - be used when some frames are to be signed. To identify which frames - belongs to a set of frames a group identifier must be registered in - the tag with this frame. The 'Owner identifier' is a null-terminated - string with a URL [URL] containing an email address, or a link to a - location where an email address can be found, that belongs to the - organisation responsible for this grouping. Questions regarding the - grouping should be sent to the indicated email address. The 'Group - symbol' contains a value that associates the frame with this group - throughout the whole tag, in the range $80-F0. All other values are - reserved. The 'Group symbol' may optionally be followed by some group - specific data, e.g. a digital signature. There may be several "GRID" - frames in a tag but only one containing the same symbol and only one - containing the same owner identifier. The group symbol must be used - somewhere in the tag. See the description of the frame grouping flag - in the ID3v2 structure document [ID3v2-strct] for more information. - - <Header for 'Group ID registration', ID: "GRID"> - Owner identifier <text string> $00 - Group symbol $xx - Group dependent data <binary data> - - -4.27. Private frame - - This frame is used to contain information from a software producer - that its program uses and does not fit into the other frames. The - frame consists of an 'Owner identifier' string and the binary data. - The 'Owner identifier' is a null-terminated string with a URL [URL] - containing an email address, or a link to a location where an email - address can be found, that belongs to the organisation responsible - for the frame. Questions regarding the frame should be sent to the - indicated email address. The tag may contain more than one "PRIV" - frame but only with different contents. - - <Header for 'Private frame', ID: "PRIV"> - Owner identifier <text string> $00 - The private data <binary data> - - -4.28. Signature frame - - This frame enables a group of frames, grouped with the 'Group - identification registration', to be signed. Although signatures can - reside inside the registration frame, it might be desired to store - the signature elsewhere, e.g. in watermarks. There may be more than - one 'signature frame' in a tag, but no two may be identical. - - <Header for 'Signature frame', ID: "SIGN"> - Group symbol $xx - Signature <binary data> - - -4.29. Seek frame - - This frame indicates where other tags in a file/stream can be found. - The 'minimum offset to next tag' is calculated from the end of this - tag to the beginning of the next. There may only be one 'seek frame' - in a tag. - - <Header for 'Seek frame', ID: "SEEK"> - Minimum offset to next tag $xx xx xx xx - - -4.30. Audio seek point index - - Audio files with variable bit rates are intrinsically difficult to - deal with in the case of seeking within the file. The ASPI frame - makes seeking easier by providing a list a seek points within the - audio file. The seek points are a fractional offset within the audio - data, providing a starting point from which to find an appropriate - point to start decoding. The presence of an ASPI frame requires the - existence of a TLEN frame, indicating the duration of the file in - milliseconds. There may only be one 'audio seek point index' frame in - a tag. - - <Header for 'Seek Point Index', ID: "ASPI"> - Indexed data start (S) $xx xx xx xx - Indexed data length (L) $xx xx xx xx - Number of index points (N) $xx xx - Bits per index point (b) $xx - - Then for every index point the following data is included; - - Fraction at index (Fi) $xx (xx) - - 'Indexed data start' is a byte offset from the beginning of the file. - 'Indexed data length' is the byte length of the audio data being - indexed. 'Number of index points' is the number of index points, as - the name implies. The recommended number is 100. 'Bits per index - point' is 8 or 16, depending on the chosen precision. 8 bits works - well for short files (less than 5 minutes of audio), while 16 bits is - advantageous for long files. 'Fraction at index' is the numerator of - the fraction representing a relative position in the data. The - denominator is 2 to the power of b. - - Here are the algorithms to be used in the calculation. The known data - must be the offset of the start of the indexed data (S), the offset - of the end of the indexed data (E), the number of index points (N), - the offset at index i (Oi). We calculate the fraction at index i - (Fi). - - Oi is the offset of the frame whose start is soonest after the point - for which the time offset is (i/N * duration). - - The frame data should be calculated as follows: - - Fi = Oi/L * 2^b (rounded down to the nearest integer) - - Offset calculation should be calculated as follows from data in the - frame: - - Oi = (Fi/2^b)*L (rounded up to the nearest integer) - - -5. Copyright - - Copyright (C) Martin Nilsson 2000. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -6. References - - [CDDB] Compact Disc Data Base - - <url:http://www.cddb.com> - - [ID3v2.3.0] Martin Nilsson, "ID3v2 informal standard". - - <url:http://www.id3.org/id3v2.3.0.txt> - - [ID3v2-strct] Martin Nilsson, - "ID3 tag version 2.4.0 - Main Structure" - - <url:http//www.id3.org/id3v2.4.0-structure.txt> - - [ISO-639-2] ISO/FDIS 639-2. - Codes for the representation of names of languages, Part 2: Alpha-3 - code. Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-4217] ISO 4217:1995. - Codes for the representation of currencies and funds. - Technical committee / subcommittee: TC 68 - - [ISO-8859-1] ISO/IEC DIS 8859-1. - 8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 - - [ISRC] ISO 3901:1986 - International Standard Recording Code (ISRC). - Technical committee / subcommittee: TC 46 / SC 9 - - [JFIF] JPEG File Interchange Format, version 1.02 - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate - Requirement Levels', RFC 2119, March 1997. - - <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> - - [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail - Extensions (MIME) Part One: Format of Internet Message Bodies", - RFC 2045, November 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> - - [MPEG] ISO/IEC 11172-3:1993. - Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - Generic coding of moving pictures and associated audio information, - Part 3: Audio. - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995) - - - [PNG] Portable Network Graphics, version 1.0 - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource - Locators (URL).", RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB - Compressed - Data Format Specification version 3.3", RFC 1950, May 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> - - -7. Appendix - - -A. Appendix A - Genre List from ID3v1 - - The following genres is defined in ID3v1 - - 0.Blues - 1.Classic Rock - 2.Country - 3.Dance - 4.Disco - 5.Funk - 6.Grunge - 7.Hip-Hop - 8.Jazz - 9.Metal - 10.New Age - 11.Oldies - 12.Other - 13.Pop - 14.R&B - 15.Rap - 16.Reggae - 17.Rock - 18.Techno - 19.Industrial - 20.Alternative - 21.Ska - 22.Death Metal - 23.Pranks - 24.Soundtrack - 25.Euro-Techno - 26.Ambient - 27.Trip-Hop - 28.Vocal - 29.Jazz+Funk - 30.Fusion - 31.Trance - 32.Classical - 33.Instrumental - 34.Acid - 35.House - 36.Game - 37.Sound Clip - 38.Gospel - 39.Noise - 40.AlternRock - 41.Bass - 42.Soul - 43.Punk - 44.Space - 45.Meditative - 46.Instrumental Pop - 47.Instrumental Rock - 48.Ethnic - 49.Gothic - 50.Darkwave - 51.Techno-Industrial - 52.Electronic - 53.Pop-Folk - 54.Eurodance - 55.Dream - 56.Southern Rock - 57.Comedy - 58.Cult - 59.Gangsta - 60.Top 40 - 61.Christian Rap - 62.Pop/Funk - 63.Jungle - 64.Native American - 65.Cabaret - 66.New Wave - 67.Psychadelic - 68.Rave - 69.Showtunes - 70.Trailer - 71.Lo-Fi - 72.Tribal - 73.Acid Punk - 74.Acid Jazz - 75.Polka - 76.Retro - 77.Musical - 78.Rock & Roll - 79.Hard Rock - - -8. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - SE-584 34 Linköping - Sweden - - Email: nilsson@id3.org diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-structure.txt b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-structure.txt deleted file mode 100755 index 5fa156a0a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2.4.0-structure.txt +++ /dev/null @@ -1,733 +0,0 @@ - -Informal standard M. Nilsson -Document: id3v2.4.0-structure.txt 16 September 2001 - - - ID3 tag version 2.4.0 - Main Structure - -Status of this document - - This document is an informal standard and replaces the ID3v2.3.0 - standard [ID3v2]. A formal standard will use another revision number - even if the content is identical to document. The contents in this - document may change for clarifications but never for added or altered - functionallity. - - Distribution of this document is unlimited. - - -Abstract - - This document describes the main structure of ID3v2.4.0, which is a - revised version of the ID3v2 informal standard [ID3v2] version - 2.3.0. The ID3v2 offers a flexible way of storing audio meta - information within the audio file itself. The information may be - technical information, such as equalisation curves, as well as - title, performer, copyright etc. - - ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order - to allow for implementations to be revised as easily as possible. - - -1. Table of contents - - Status of this document - Abstract - 1. Table of contents - 2. Conventions in this document - 2. Standard overview - 3. ID3v2 overview - 3.1. ID3v2 header - 3.2. ID3v2 extended header - 3.3. Padding - 3.4. ID3v2 footer - 4. ID3v2 frames overview - 4.1. Frame header flags - 4.1.1. Frame status flags - 4.1.2. Frame format flags - 5. Tag location - 6. Unsynchronisation - 6.1. The unsynchronisation scheme - 6.2. Synchsafe integers - 7. Copyright - 8. References - 9. Author's Address - - -2. Conventions in this document - - Text within "" is a text string exactly as it appears in a tag. - Numbers preceded with $ are hexadecimal and numbers preceded with % - are binary. $xx is used to indicate a byte with unknown content. %x - is used to indicate a bit with unknown content. The most significant - bit (MSB) of a byte is called 'bit 7' and the least significant bit - (LSB) is called 'bit 0'. - - A tag is the whole tag described in this document. A frame is a block - of information in the tag. The tag consists of a header, frames and - optional padding. A field is a piece of information; one value, a - string etc. A numeric string is a string that consists of the - characters "0123456789" only. - - The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", - "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this - document are to be interpreted as described in RFC 2119 [KEYWORDS]. - - -3. ID3v2 overview - - ID3v2 is a general tagging format for audio, which makes it possible - to store meta data about the audio inside the audio file itself. The - ID3 tag described in this document is mainly targeted at files - encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III - and MPEG-2.5, but may work with other types of encoded audio or as a - stand alone format for audio meta data. - - ID3v2 is designed to be as flexible and expandable as possible to - meet new meta information needs that might arise. To achieve that - ID3v2 is constructed as a container for several information blocks, - called frames, whose format need not be known to the software that - encounters them. At the start of every frame is an unique and - predefined identifier, a size descriptor that allows software to skip - unknown frames and a flags field. The flags describes encoding - details and if the frame should remain in the tag, should it be - unknown to the software, if the file is altered. - - The bitorder in ID3v2 is most significant bit first (MSB). The - byteorder in multibyte numbers is most significant byte first (e.g. - $12345678 would be encoded $12 34 56 78), also known as big endian - and network byte order. - - Overall tag structure: - - +-----------------------------+ - | Header (10 bytes) | - +-----------------------------+ - | Extended Header | - | (variable length, OPTIONAL) | - +-----------------------------+ - | Frames (variable length) | - +-----------------------------+ - | Padding | - | (variable length, OPTIONAL) | - +-----------------------------+ - | Footer (10 bytes, OPTIONAL) | - +-----------------------------+ - - In general, padding and footer are mutually exclusive. See details in - sections 3.3, 3.4 and 5. - - -3.1. ID3v2 header - - The first part of the ID3v2 tag is the 10 byte tag header, laid out - as follows: - - ID3v2/file identifier "ID3" - ID3v2 version $04 00 - ID3v2 flags %abcd0000 - ID3v2 size 4 * %0xxxxxxx - - The first three bytes of the tag are always "ID3", to indicate that - this is an ID3v2 tag, directly followed by the two version bytes. The - first byte of ID3v2 version is its major version, while the second - byte is its revision number. In this case this is ID3v2.4.0. All - revisions are backwards compatible while major versions are not. If - software with ID3v2.4.0 and below support should encounter version - five or higher it should simply ignore the whole tag. Version or - revision will never be $FF. - - The version is followed by the ID3v2 flags field, of which currently - four flags are used. - - - a - Unsynchronisation - - Bit 7 in the 'ID3v2 flags' indicates whether or not - unsynchronisation is applied on all frames (see section 6.1 for - details); a set bit indicates usage. - - - b - Extended header - - The second bit (bit 6) indicates whether or not the header is - followed by an extended header. The extended header is described in - section 3.2. A set bit indicates the presence of an extended - header. - - - c - Experimental indicator - - The third bit (bit 5) is used as an 'experimental indicator'. This - flag SHALL always be set when the tag is in an experimental stage. - - - d - Footer present - - Bit 4 indicates that a footer (section 3.4) is present at the very - end of the tag. A set bit indicates the presence of a footer. - - - All the other flags MUST be cleared. If one of these undefined flags - are set, the tag might not be readable for a parser that does not - know the flags function. - - The ID3v2 tag size is stored as a 32 bit synchsafe integer (section - 6.2), making a total of 28 effective bits (representing up to 256MB). - - The ID3v2 tag size is the sum of the byte length of the extended - header, the padding and the frames after unsynchronisation. If a - footer is present this equals to ('total size' - 20) bytes, otherwise - ('total size' - 10) bytes. - - An ID3v2 tag can be detected with the following pattern: - $49 44 33 yy yy xx zz zz zz zz - Where yy is less than $FF, xx is the 'flags' byte and zz is less than - $80. - - -3.2. Extended header - - The extended header contains information that can provide further - insight in the structure of the tag, but is not vital to the correct - parsing of the tag information; hence the extended header is - optional. - - Extended header size 4 * %0xxxxxxx - Number of flag bytes $01 - Extended Flags $xx - - Where the 'Extended header size' is the size of the whole extended - header, stored as a 32 bit synchsafe integer. An extended header can - thus never have a size of fewer than six bytes. - - The extended flags field, with its size described by 'number of flag - bytes', is defined as: - - %0bcd0000 - - Each flag that is set in the extended header has data attached, which - comes in the order in which the flags are encountered (i.e. the data - for flag 'b' comes before the data for flag 'c'). Unset flags cannot - have any attached data. All unknown flags MUST be unset and their - corresponding data removed when a tag is modified. - - Every set flag's data starts with a length byte, which contains a - value between 0 and 127 ($00 - $7f), followed by data that has the - field length indicated by the length byte. If a flag has no attached - data, the value $00 is used as length byte. - - - b - Tag is an update - - If this flag is set, the present tag is an update of a tag found - earlier in the present file or stream. If frames defined as unique - are found in the present tag, they are to override any - corresponding ones found in the earlier tag. This flag has no - corresponding data. - - Flag data length $00 - - c - CRC data present - - If this flag is set, a CRC-32 [ISO-3309] data is included in the - extended header. The CRC is calculated on all the data between the - header and footer as indicated by the header's tag length field, - minus the extended header. Note that this includes the padding (if - there is any), but excludes the footer. The CRC-32 is stored as an - 35 bit synchsafe integer, leaving the upper four bits always - zeroed. - - Flag data length $05 - Total frame CRC 5 * %0xxxxxxx - - d - Tag restrictions - - For some applications it might be desired to restrict a tag in more - ways than imposed by the ID3v2 specification. Note that the - presence of these restrictions does not affect how the tag is - decoded, merely how it was restricted before encoding. If this flag - is set the tag is restricted as follows: - - Flag data length $01 - Restrictions %ppqrrstt - - p - Tag size restrictions - - 00 No more than 128 frames and 1 MB total tag size. - 01 No more than 64 frames and 128 KB total tag size. - 10 No more than 32 frames and 40 KB total tag size. - 11 No more than 32 frames and 4 KB total tag size. - - q - Text encoding restrictions - - 0 No restrictions - 1 Strings are only encoded with ISO-8859-1 [ISO-8859-1] or - UTF-8 [UTF-8]. - - r - Text fields size restrictions - - 00 No restrictions - 01 No string is longer than 1024 characters. - 10 No string is longer than 128 characters. - 11 No string is longer than 30 characters. - - Note that nothing is said about how many bytes is used to - represent those characters, since it is encoding dependent. If a - text frame consists of more than one string, the sum of the - strungs is restricted as stated. - - s - Image encoding restrictions - - 0 No restrictions - 1 Images are encoded only with PNG [PNG] or JPEG [JFIF]. - - t - Image size restrictions - - 00 No restrictions - 01 All images are 256x256 pixels or smaller. - 10 All images are 64x64 pixels or smaller. - 11 All images are exactly 64x64 pixels, unless required - otherwise. - - -3.3. Padding - - It is OPTIONAL to include padding after the final frame (at the end - of the ID3 tag), making the size of all the frames together smaller - than the size given in the tag header. A possible purpose of this - padding is to allow for adding a few additional frames or enlarge - existing frames within the tag without having to rewrite the entire - file. The value of the padding bytes must be $00. A tag MUST NOT have - any padding between the frames or between the tag header and the - frames. Furthermore it MUST NOT have any padding when a tag footer is - added to the tag. - - -3.4. ID3v2 footer - - To speed up the process of locating an ID3v2 tag when searching from - the end of a file, a footer can be added to the tag. It is REQUIRED - to add a footer to an appended tag, i.e. a tag located after all - audio data. The footer is a copy of the header, but with a different - identifier. - - ID3v2 identifier "3DI" - ID3v2 version $04 00 - ID3v2 flags %abcd0000 - ID3v2 size 4 * %0xxxxxxx - - -4. ID3v2 frame overview - - All ID3v2 frames consists of one frame header followed by one or more - fields containing the actual information. The header is always 10 - bytes and laid out as follows: - - Frame ID $xx xx xx xx (four characters) - Size 4 * %0xxxxxxx - Flags $xx xx - - The frame ID is made out of the characters capital A-Z and 0-9. - Identifiers beginning with "X", "Y" and "Z" are for experimental - frames and free for everyone to use, without the need to set the - experimental bit in the tag header. Bear in mind that someone else - might have used the same identifier as you. All other identifiers are - either used or reserved for future use. - - The frame ID is followed by a size descriptor containing the size of - the data in the final frame, after encryption, compression and - unsynchronisation. The size is excluding the frame header ('total - frame size' - 10 bytes) and stored as a 32 bit synchsafe integer. - - In the frame header the size descriptor is followed by two flag - bytes. These flags are described in section 4.1. - - There is no fixed order of the frames' appearance in the tag, - although it is desired that the frames are arranged in order of - significance concerning the recognition of the file. An example of - such order: UFID, TIT2, MCDI, TRCK ... - - A tag MUST contain at least one frame. A frame must be at least 1 - byte big, excluding the header. - - If nothing else is said, strings, including numeric strings and URLs - [URL], are represented as ISO-8859-1 [ISO-8859-1] characters in the - range $20 - $FF. Such strings are represented in frame descriptions - as <text string>, or <full text string> if newlines are allowed. If - nothing else is said newline character is forbidden. In ISO-8859-1 a - newline is represented, when allowed, with $0A only. - - Frames that allow different types of text encoding contains a text - encoding description byte. Possible encodings: - - $00 ISO-8859-1 [ISO-8859-1]. Terminated with $00. - $01 UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All - strings in the same frame SHALL have the same byteorder. - Terminated with $00 00. - $02 UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM. - Terminated with $00 00. - $03 UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00. - - Strings dependent on encoding are represented in frame descriptions - as <text string according to encoding>, or <full text string - according to encoding> if newlines are allowed. Any empty strings of - type $01 which are NULL-terminated may have the Unicode BOM followed - by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). - - The timestamp fields are based on a subset of ISO 8601. When being as - precise as possible the format of a time string is - yyyy-MM-ddTHH:mm:ss (year, "-", month, "-", day, "T", hour (out of - 24), ":", minutes, ":", seconds), but the precision may be reduced by - removing as many time indicators as wanted. Hence valid timestamps - are - yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm and - yyyy-MM-ddTHH:mm:ss. All time stamps are UTC. For durations, use - the slash character as described in 8601, and for multiple non- - contiguous dates, use multiple strings, if allowed by the frame - definition. - - The three byte language field, present in several frames, is used to - describe the language of the frame's content, according to ISO-639-2 - [ISO-639-2]. The language should be represented in lower case. If the - language is not known the string "XXX" should be used. - - All URLs [URL] MAY be relative, e.g. "picture.png", "../doc.txt". - - If a frame is longer than it should be, e.g. having more fields than - specified in this document, that indicates that additions to the - frame have been made in a later version of the ID3v2 standard. This - is reflected by the revision number in the header of the tag. - - -4.1. Frame header flags - - In the frame header the size descriptor is followed by two flag - bytes. All unused flags MUST be cleared. The first byte is for - 'status messages' and the second byte is a format description. If an - unknown flag is set in the first byte the frame MUST NOT be changed - without that bit cleared. If an unknown flag is set in the second - byte the frame is likely to not be readable. Some flags in the second - byte indicates that extra information is added to the header. These - fields of extra information is ordered as the flags that indicates - them. The flags field is defined as follows (l and o left out because - ther resemblence to one and zero): - - %0abc0000 %0h00kmnp - - Some frame format flags indicate that additional information fields - are added to the frame. This information is added after the frame - header and before the frame data in the same order as the flags that - indicates them. I.e. the four bytes of decompressed size will precede - the encryption method byte. These additions affects the 'frame size' - field, but are not subject to encryption or compression. - - The default status flags setting for a frame is, unless stated - otherwise, 'preserved if tag is altered' and 'preserved if file is - altered', i.e. %00000000. - - -4.1.1. Frame status flags - - a - Tag alter preservation - - This flag tells the tag parser what to do with this frame if it is - unknown and the tag is altered in any way. This applies to all - kinds of alterations, including adding more padding and reordering - the frames. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - b - File alter preservation - - This flag tells the tag parser what to do with this frame if it is - unknown and the file, excluding the tag, is altered. This does not - apply when the audio is completely replaced with other audio data. - - 0 Frame should be preserved. - 1 Frame should be discarded. - - - c - Read only - - This flag, if set, tells the software that the contents of this - frame are intended to be read only. Changing the contents might - break something, e.g. a signature. If the contents are changed, - without knowledge of why the frame was flagged read only and - without taking the proper means to compensate, e.g. recalculating - the signature, the bit MUST be cleared. - - -4.1.2. Frame format flags - - h - Grouping identity - - This flag indicates whether or not this frame belongs in a group - with other frames. If set, a group identifier byte is added to the - frame. Every frame with the same group identifier belongs to the - same group. - - 0 Frame does not contain group information - 1 Frame contains group information - - - k - Compression - - This flag indicates whether or not the frame is compressed. - A 'Data Length Indicator' byte MUST be included in the frame. - - 0 Frame is not compressed. - 1 Frame is compressed using zlib [zlib] deflate method. - If set, this requires the 'Data Length Indicator' bit - to be set as well. - - - m - Encryption - - This flag indicates whether or not the frame is encrypted. If set, - one byte indicating with which method it was encrypted will be - added to the frame. See description of the ENCR frame for more - information about encryption method registration. Encryption - should be done after compression. Whether or not setting this flag - requires the presence of a 'Data Length Indicator' depends on the - specific algorithm used. - - 0 Frame is not encrypted. - 1 Frame is encrypted. - - n - Unsynchronisation - - This flag indicates whether or not unsynchronisation was applied - to this frame. See section 6 for details on unsynchronisation. - If this flag is set all data from the end of this header to the - end of this frame has been unsynchronised. Although desirable, the - presence of a 'Data Length Indicator' is not made mandatory by - unsynchronisation. - - 0 Frame has not been unsynchronised. - 1 Frame has been unsyrchronised. - - p - Data length indicator - - This flag indicates that a data length indicator has been added to - the frame. The data length indicator is the value one would write - as the 'Frame length' if all of the frame format flags were - zeroed, represented as a 32 bit synchsafe integer. - - 0 There is no Data Length Indicator. - 1 A data length Indicator has been added to the frame. - - -5. Tag location - - The default location of an ID3v2 tag is prepended to the audio so - that players can benefit from the information when the data is - streamed. It is however possible to append the tag, or make a - prepend/append combination. When deciding upon where an unembedded - tag should be located, the following order of preference SHOULD be - considered. - - 1. Prepend the tag. - - 2. Prepend a tag with all vital information and add a second tag at - the end of the file, before tags from other tagging systems. The - first tag is required to have a SEEK frame. - - 3. Add a tag at the end of the file, before tags from other tagging - systems. - - In case 2 and 3 the tag can simply be appended if no other known tags - are present. The suggested method to find ID3v2 tags are: - - 1. Look for a prepended tag using the pattern found in section 3.1. - - 2. If a SEEK frame was found, use its values to guide further - searching. - - 3. Look for a tag footer, scanning from the back of the file. - - For every new tag that is found, the old tag should be discarded - unless the update flag in the extended header (section 3.2) is set. - - -6. Unsynchronisation - - The only purpose of unsynchronisation is to make the ID3v2 tag as - compatible as possible with existing software and hardware. There is - no use in 'unsynchronising' tags if the file is only to be processed - only by ID3v2 aware software and hardware. Unsynchronisation is only - useful with tags in MPEG 1/2 layer I, II and III, MPEG 2.5 and AAC - files. - - -6.1. The unsynchronisation scheme - - Whenever a false synchronisation is found within the tag, one zeroed - byte is inserted after the first false synchronisation byte. The - format of synchronisations that should be altered by ID3 encoders is - as follows: - - %11111111 111xxxxx - - and should be replaced with: - - %11111111 00000000 111xxxxx - - This has the side effect that all $FF 00 combinations have to be - altered, so they will not be affected by the decoding process. - Therefore all the $FF 00 combinations have to be replaced with the - $FF 00 00 combination during the unsynchronisation. - - To indicate usage of the unsynchronisation, the unsynchronisation - flag in the frame header should be set. This bit MUST be set if the - frame was altered by the unsynchronisation and SHOULD NOT be set if - unaltered. If all frames in the tag are unsynchronised the - unsynchronisation flag in the tag header SHOULD be set. It MUST NOT - be set if the tag has a frame which is not unsynchronised. - - Assume the first byte of the audio to be $FF. The special case when - the last byte of the last frame is $FF and no padding nor footer is - used will then introduce a false synchronisation. This can be solved - by adding a footer, adding padding or unsynchronising the frame and - add $00 to the end of the frame data, thus adding more byte to the - frame size than a normal unsynchronisation would. Although not - preferred, it is allowed to apply the last method on all frames - ending with $FF. - - It is preferred that the tag is either completely unsynchronised or - not unsynchronised at all. A completely unsynchronised tag has no - false synchonisations in it, as defined above, and does not end with - $FF. A completely non-unsynchronised tag contains no unsynchronised - frames, and thus the unsynchronisation flag in the header is cleared. - - Do bear in mind, that if compression or encryption is used, the - unsynchronisation scheme MUST be applied afterwards. When decoding an - unsynchronised frame, the unsynchronisation scheme MUST be reversed - first, encryption and decompression afterwards. - - -6.2. Synchsafe integers - - In some parts of the tag it is inconvenient to use the - unsychronisation scheme because the size of unsynchronised data is - not known in advance, which is particularly problematic with size - descriptors. The solution in ID3v2 is to use synchsafe integers, in - which there can never be any false synchs. Synchsafe integers are - integers that keep its highest bit (bit 7) zeroed, making seven bits - out of eight available. Thus a 32 bit synchsafe integer can store 28 - bits of information. - - Example: - - 255 (%11111111) encoded as a 16 bit synchsafe integer is 383 - (%00000001 01111111). - - -7. Copyright - - Copyright (C) Martin Nilsson 2000. All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that a reference to this document is included on all - such copies and derivative works. However, this document itself may - not be modified in any way and reissued as the original document. - - The limited permissions granted above are perpetual and will not be - revoked. - - This document and the information contained herein is provided on an - 'AS IS' basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF - THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED - WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - -8. References - - [ID3v2] Martin Nilsson, 'ID3v2 informal standard'. - - <url:http://www.id3.org/id3v2.3.0.txt> - - [ISO-639-2] ISO/FDIS 639-2. - 'Codes for the representation of names of languages, Part 2: Alpha-3 - code.' Technical committee / subcommittee: TC 37 / SC 2 - - [ISO-3309] ISO 3309 - 'Information Processing Systems--Data Communication High-Level Data - Link Control Procedure--Frame Structure', IS 3309, October 1984, 3rd - Edition. - - [ISO-8859-1] ISO/IEC DIS 8859-1. - '8-bit single-byte coded graphic character sets, Part 1: Latin - alphabet No. 1.' Technical committee / subcommittee: JTC 1 / SC 2 - - [JFIF] 'JPEG File Interchange Format, version 1.02' - - <url:http://www.w3.org/Graphics/JPEG/jfif.txt> - - [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate - Requirement Levels', RFC 2119, March 1997. - - <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> - - [MPEG] ISO/IEC 11172-3:1993. - 'Coding of moving pictures and associated audio for digital storage - media at up to about 1,5 Mbit/s, Part 3: Audio.' - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC 13818-3:1995 - 'Generic coding of moving pictures and associated audio information, - Part 3: Audio.' - Technical committee / subcommittee: JTC 1 / SC 29 - and - ISO/IEC DIS 13818-3 - 'Generic coding of moving pictures and associated audio information, - Part 3: Audio (Revision of ISO/IEC 13818-3:1995)' - - [PNG] 'Portable Network Graphics, version 1.0' - - <url:http://www.w3.org/TR/REC-png-multi.html> - - [UNICODE] The Unicode Consortium, - 'The Unicode Standard Version 3.0', ISBN 0-201-61633-5. - - <url:http://www.unicode.org/unicode/standard/versions/Unicode3.0.htm> - - [URL] T. Berners-Lee, L. Masinter & M. McCahill, 'Uniform Resource - Locators (URL)', RFC 1738, December 1994. - - <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> - - [UTF-8] F. Yergeau, 'UTF-8, a transformation format of ISO 10646', - RFC 2279, January 1998. - - <url:ftp://ftp.isi.edu/in-notes/rfc2279.txt> - - [UTF-16] F. Yergeau, 'UTF-16, an encoding of ISO 10646', RFC 2781, - February 2000. - - <url:ftp://ftp.isi.edu/in-notes/rfc2781.txt> - - [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, 'ZLIB - Compressed Data Format Specification version 3.3', RFC 1950, - May 1996. - - <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> - - -9. Author's Address - - Written by - - Martin Nilsson - Rydsvägen 246 C. 30 - SE-584 34 Linköping - Sweden - - Email: nilsson@id3.org - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2extendedheader.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2extendedheader.cpp deleted file mode 100755 index 86eeee280..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2extendedheader.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v2extendedheader.h" -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -class ExtendedHeader::ExtendedHeaderPrivate -{ -public: - ExtendedHeaderPrivate() : size(0) {} - - unsigned int size; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public methods -//////////////////////////////////////////////////////////////////////////////// - -ExtendedHeader::ExtendedHeader() : - d(new ExtendedHeaderPrivate()) -{ -} - -ExtendedHeader::~ExtendedHeader() -{ - delete d; -} - -unsigned int ExtendedHeader::size() const -{ - return d->size; -} - -void ExtendedHeader::setData(const ByteVector &data) -{ - parse(data); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ExtendedHeader::parse(const ByteVector &data) -{ - d->size = SynchData::toUInt(data.mid(0, 4)); // (structure 3.2 "Extended header size") -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2footer.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2footer.cpp deleted file mode 100755 index 3622724a8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2footer.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "id3v2footer.h" -#include "id3v2header.h" - -using namespace TagLib; -using namespace ID3v2; - -class Footer::FooterPrivate -{ -}; - -Footer::Footer() : - d(0) -{ -} - -Footer::~Footer() -{ -} - -unsigned int Footer::size() -{ - return 10; -} - -ByteVector Footer::render(const Header *header) const -{ - ByteVector headerData = header->render(); - headerData[0] = '3'; - headerData[1] = 'D'; - headerData[2] = 'I'; - return headerData; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.cpp deleted file mode 100755 index af4136af1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2frame.cpp +++ /dev/null @@ -1,826 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tdebug.h> -#include <tstringlist.h> -#include <tzlib.h> - -#include "id3v2tag.h" -#include "id3v2frame.h" -#include "id3v2synchdata.h" - -#include "tpropertymap.h" -#include "frames/textidentificationframe.h" -#include "frames/urllinkframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/commentsframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -class Frame::FramePrivate -{ -public: - FramePrivate() : - header(0) - {} - - ~FramePrivate() - { - delete header; - } - - Frame::Header *header; -}; - -namespace -{ - bool isValidFrameID(const ByteVector &frameID) - { - if(frameID.size() != 4) - return false; - - for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { - if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { - return false; - } - } - return true; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// static methods -//////////////////////////////////////////////////////////////////////////////// - -unsigned int Frame::headerSize() -{ - return Header::size(); -} - -unsigned int Frame::headerSize(unsigned int version) -{ - return Header::size(version); -} - -ByteVector Frame::textDelimiter(String::Type t) -{ - if(t == String::UTF16 || t == String::UTF16BE || t == String::UTF16LE) - return ByteVector(2, '\0'); - else - return ByteVector(1, '\0'); -} - -const String Frame::instrumentPrefix("PERFORMER:"); -const String Frame::commentPrefix("COMMENT:"); -const String Frame::lyricsPrefix("LYRICS:"); -const String Frame::urlPrefix("URL:"); - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Frame *Frame::createTextualFrame(const String &key, const StringList &values) //static -{ - // check if the key is contained in the key<=>frameID mapping - ByteVector frameID = keyToFrameID(key); - if(!frameID.isEmpty()) { - // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. - if(frameID[0] == 'T' || frameID == "WFED" || frameID == "MVNM" || frameID == "MVIN" || frameID == "GRP1"){ // text frame - TextIdentificationFrame *frame = new TextIdentificationFrame(frameID, String::UTF8); - frame->setText(values); - return frame; - } else if((frameID[0] == 'W') && (values.size() == 1)){ // URL frame (not WXXX); support only one value - UrlLinkFrame* frame = new UrlLinkFrame(frameID); - frame->setUrl(values.front()); - return frame; - } - } - if(key == "MUSICBRAINZ_TRACKID" && values.size() == 1) { - UniqueFileIdentifierFrame *frame = new UniqueFileIdentifierFrame("http://musicbrainz.org", values.front().data(String::UTF8)); - return frame; - } - // now we check if it's one of the "special" cases: - // -LYRICS: depending on the number of values, use USLT or TXXX (with description=LYRICS) - if((key == "LYRICS" || key.startsWith(lyricsPrefix)) && values.size() == 1){ - UnsynchronizedLyricsFrame *frame = new UnsynchronizedLyricsFrame(String::UTF8); - frame->setDescription(key == "LYRICS" ? key : key.substr(lyricsPrefix.size())); - frame->setText(values.front()); - return frame; - } - // -URL: depending on the number of values, use WXXX or TXXX (with description=URL) - if((key == "URL" || key.startsWith(urlPrefix)) && values.size() == 1){ - UserUrlLinkFrame *frame = new UserUrlLinkFrame(String::UTF8); - frame->setDescription(key == "URL" ? key : key.substr(urlPrefix.size())); - frame->setUrl(values.front()); - return frame; - } - // -COMMENT: depending on the number of values, use COMM or TXXX (with description=COMMENT) - if((key == "COMMENT" || key.startsWith(commentPrefix)) && values.size() == 1){ - CommentsFrame *frame = new CommentsFrame(String::UTF8); - if (key != "COMMENT"){ - frame->setDescription(key.substr(commentPrefix.size())); - } - frame->setText(values.front()); - return frame; - } - // if non of the above cases apply, we use a TXXX frame with the key as description - return new UserTextIdentificationFrame(keyToTXXX(key), values, String::UTF8); -} - -Frame::~Frame() -{ - delete d; -} - -ByteVector Frame::frameID() const -{ - if(d->header) - return d->header->frameID(); - else - return ByteVector(); -} - -unsigned int Frame::size() const -{ - if(d->header) - return d->header->frameSize(); - else - return 0; -} - -void Frame::setData(const ByteVector &data) -{ - parse(data); -} - -void Frame::setText(const String &) -{ - -} - -ByteVector Frame::render() const -{ - ByteVector fieldData = renderFields(); - d->header->setFrameSize(fieldData.size()); - ByteVector headerData = d->header->render(); - - return headerData + fieldData; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Frame::Frame(const ByteVector &data) : - d(new FramePrivate()) -{ - d->header = new Header(data); -} - -Frame::Frame(Header *h) : - d(new FramePrivate()) -{ - d->header = h; -} - -Frame::Header *Frame::header() const -{ - return d->header; -} - -void Frame::setHeader(Header *h, bool deleteCurrent) -{ - if(deleteCurrent) - delete d->header; - - d->header = h; -} - -void Frame::parse(const ByteVector &data) -{ - if(d->header) - d->header->setData(data); - else - d->header = new Header(data); - - parseFields(fieldData(data)); -} - -ByteVector Frame::fieldData(const ByteVector &frameData) const -{ - unsigned int headerSize = Header::size(d->header->version()); - - unsigned int frameDataOffset = headerSize; - unsigned int frameDataLength = size(); - - if(d->header->compression() || d->header->dataLengthIndicator()) { - frameDataLength = SynchData::toUInt(frameData.mid(headerSize, 4)); - frameDataOffset += 4; - } - - if(zlib::isAvailable() && d->header->compression() && !d->header->encryption()) { - if(frameData.size() <= frameDataOffset) { - debug("Compressed frame doesn't have enough data to decode"); - return ByteVector(); - } - - const ByteVector outData = zlib::decompress(frameData.mid(frameDataOffset)); - if(!outData.isEmpty() && frameDataLength != outData.size()) { - debug("frameDataLength does not match the data length returned by zlib"); - } - - return outData; - } - - return frameData.mid(frameDataOffset, frameDataLength); -} - -String Frame::readStringField(const ByteVector &data, String::Type encoding, int *position) -{ - int start = 0; - - if(!position) - position = &start; - - ByteVector delimiter = textDelimiter(encoding); - - int end = data.find(delimiter, *position, delimiter.size()); - - if(end < *position) - return String(); - - String str; - if(encoding == String::Latin1) - str = Tag::latin1StringHandler()->parse(data.mid(*position, end - *position)); - else - str = String(data.mid(*position, end - *position), encoding); - - *position = end + delimiter.size(); - - return str; -} - -String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding) // static -{ - return checkEncoding(fields, encoding, 4); -} - -String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding, unsigned int version) // static -{ - if((encoding == String::UTF8 || encoding == String::UTF16BE) && version != 4) - return String::UTF16; - - if(encoding != String::Latin1) - return encoding; - - for(StringList::ConstIterator it = fields.begin(); it != fields.end(); ++it) { - if(!(*it).isLatin1()) { - if(version == 4) { - debug("Frame::checkEncoding() -- Rendering using UTF8."); - return String::UTF8; - } - else { - debug("Frame::checkEncoding() -- Rendering using UTF16."); - return String::UTF16; - } - } - } - - return String::Latin1; -} - -String::Type Frame::checkTextEncoding(const StringList &fields, String::Type encoding) const -{ - return checkEncoding(fields, encoding, header()->version()); -} - -namespace -{ - const char *frameTranslation[][2] = { - // Text information frames - { "TALB", "ALBUM"}, - { "TBPM", "BPM" }, - { "TCOM", "COMPOSER" }, - { "TCON", "GENRE" }, - { "TCOP", "COPYRIGHT" }, - { "TDEN", "ENCODINGTIME" }, - { "TDLY", "PLAYLISTDELAY" }, - { "TDOR", "ORIGINALDATE" }, - { "TDRC", "DATE" }, - // { "TRDA", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TDAT", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TYER", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - // { "TIME", "DATE" }, // id3 v2.3, replaced by TDRC in v2.4 - { "TDRL", "RELEASEDATE" }, - { "TDTG", "TAGGINGDATE" }, - { "TENC", "ENCODEDBY" }, - { "TEXT", "LYRICIST" }, - { "TFLT", "FILETYPE" }, - //{ "TIPL", "INVOLVEDPEOPLE" }, handled separately - { "TIT1", "CONTENTGROUP" }, - { "TIT2", "TITLE"}, - { "TIT3", "SUBTITLE" }, - { "TKEY", "INITIALKEY" }, - { "TLAN", "LANGUAGE" }, - { "TLEN", "LENGTH" }, - //{ "TMCL", "MUSICIANCREDITS" }, handled separately - { "TMED", "MEDIA" }, - { "TMOO", "MOOD" }, - { "TOAL", "ORIGINALALBUM" }, - { "TOFN", "ORIGINALFILENAME" }, - { "TOLY", "ORIGINALLYRICIST" }, - { "TOPE", "ORIGINALARTIST" }, - { "TOWN", "OWNER" }, - { "TPE1", "ARTIST"}, - { "TPE2", "ALBUMARTIST" }, // id3's spec says 'PERFORMER', but most programs use 'ALBUMARTIST' - { "TPE3", "CONDUCTOR" }, - { "TPE4", "REMIXER" }, // could also be ARRANGER - { "TPOS", "DISCNUMBER" }, - { "TPRO", "PRODUCEDNOTICE" }, - { "TPUB", "LABEL" }, - { "TRCK", "TRACKNUMBER" }, - { "TRSN", "RADIOSTATION" }, - { "TRSO", "RADIOSTATIONOWNER" }, - { "TSOA", "ALBUMSORT" }, - { "TSOP", "ARTISTSORT" }, - { "TSOT", "TITLESORT" }, - { "TSO2", "ALBUMARTISTSORT" }, // non-standard, used by iTunes - { "TSRC", "ISRC" }, - { "TSSE", "ENCODING" }, - // URL frames - { "WCOP", "COPYRIGHTURL" }, - { "WOAF", "FILEWEBPAGE" }, - { "WOAR", "ARTISTWEBPAGE" }, - { "WOAS", "AUDIOSOURCEWEBPAGE" }, - { "WORS", "RADIOSTATIONWEBPAGE" }, - { "WPAY", "PAYMENTWEBPAGE" }, - { "WPUB", "PUBLISHERWEBPAGE" }, - //{ "WXXX", "URL"}, handled specially - // Other frames - { "COMM", "COMMENT" }, - //{ "USLT", "LYRICS" }, handled specially - // Apple iTunes proprietary frames - { "PCST", "PODCAST" }, - { "TCAT", "PODCASTCATEGORY" }, - { "TDES", "PODCASTDESC" }, - { "TGID", "PODCASTID" }, - { "WFED", "PODCASTURL" }, - { "MVNM", "MOVEMENTNAME" }, - { "MVIN", "MOVEMENTNUMBER" }, - { "GRP1", "GROUPING" }, - }; - const size_t frameTranslationSize = sizeof(frameTranslation) / sizeof(frameTranslation[0]); - - const char *txxxFrameTranslation[][2] = { - { "MUSICBRAINZ ALBUM ID", "MUSICBRAINZ_ALBUMID" }, - { "MUSICBRAINZ ARTIST ID", "MUSICBRAINZ_ARTISTID" }, - { "MUSICBRAINZ ALBUM ARTIST ID", "MUSICBRAINZ_ALBUMARTISTID" }, - { "MUSICBRAINZ RELEASE GROUP ID", "MUSICBRAINZ_RELEASEGROUPID" }, - { "MUSICBRAINZ WORK ID", "MUSICBRAINZ_WORKID" }, - { "ACOUSTID ID", "ACOUSTID_ID" }, - { "ACOUSTID FINGERPRINT", "ACOUSTID_FINGERPRINT" }, - { "MUSICIP PUID", "MUSICIP_PUID" }, - }; - const size_t txxxFrameTranslationSize = sizeof(txxxFrameTranslation) / sizeof(txxxFrameTranslation[0]); - - // list of deprecated frames and their successors - const char *deprecatedFrames[][2] = { - {"TRDA", "TDRC"}, // 2.3 -> 2.4 (http://en.wikipedia.org/wiki/ID3) - {"TDAT", "TDRC"}, // 2.3 -> 2.4 - {"TYER", "TDRC"}, // 2.3 -> 2.4 - {"TIME", "TDRC"}, // 2.3 -> 2.4 - }; - const size_t deprecatedFramesSize = sizeof(deprecatedFrames) / sizeof(deprecatedFrames[0]);; -} - -String Frame::frameIDToKey(const ByteVector &id) -{ - ByteVector id24 = id; - for(size_t i = 0; i < deprecatedFramesSize; ++i) { - if(id24 == deprecatedFrames[i][0]) { - id24 = deprecatedFrames[i][1]; - break; - } - } - for(size_t i = 0; i < frameTranslationSize; ++i) { - if(id24 == frameTranslation[i][0]) - return frameTranslation[i][1]; - } - return String(); -} - -ByteVector Frame::keyToFrameID(const String &s) -{ - const String key = s.upper(); - for(size_t i = 0; i < frameTranslationSize; ++i) { - if(key == frameTranslation[i][1]) - return frameTranslation[i][0]; - } - return ByteVector(); -} - -String Frame::txxxToKey(const String &description) -{ - const String d = description.upper(); - for(size_t i = 0; i < txxxFrameTranslationSize; ++i) { - if(d == txxxFrameTranslation[i][0]) - return txxxFrameTranslation[i][1]; - } - return d; -} - -String Frame::keyToTXXX(const String &s) -{ - const String key = s.upper(); - for(size_t i = 0; i < txxxFrameTranslationSize; ++i) { - if(key == txxxFrameTranslation[i][1]) - return txxxFrameTranslation[i][0]; - } - return s; -} - -PropertyMap Frame::asProperties() const -{ - if(dynamic_cast< const UnknownFrame *>(this)) { - PropertyMap m; - m.unsupportedData().append("UNKNOWN/" + frameID()); - return m; - } - const ByteVector &id = frameID(); - // workaround until this function is virtual - if(id == "TXXX") - return dynamic_cast< const UserTextIdentificationFrame* >(this)->asProperties(); - // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. - else if(id[0] == 'T' || id == "WFED" || id == "MVNM" || id == "MVIN" || id == "GRP1") - return dynamic_cast< const TextIdentificationFrame* >(this)->asProperties(); - else if(id == "WXXX") - return dynamic_cast< const UserUrlLinkFrame* >(this)->asProperties(); - else if(id[0] == 'W') - return dynamic_cast< const UrlLinkFrame* >(this)->asProperties(); - else if(id == "COMM") - return dynamic_cast< const CommentsFrame* >(this)->asProperties(); - else if(id == "USLT") - return dynamic_cast< const UnsynchronizedLyricsFrame* >(this)->asProperties(); - else if(id == "UFID") - return dynamic_cast< const UniqueFileIdentifierFrame* >(this)->asProperties(); - PropertyMap m; - m.unsupportedData().append(id); - return m; -} - -void Frame::splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, - PropertyMap &tiplProperties, PropertyMap &tmclProperties) -{ - singleFrameProperties.clear(); - tiplProperties.clear(); - tmclProperties.clear(); - for(PropertyMap::ConstIterator it = original.begin(); it != original.end(); ++it) { - if(TextIdentificationFrame::involvedPeopleMap().contains(it->first)) - tiplProperties.insert(it->first, it->second); - else if(it->first.startsWith(TextIdentificationFrame::instrumentPrefix)) - tmclProperties.insert(it->first, it->second); - else - singleFrameProperties.insert(it->first, it->second); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Frame::Header class -//////////////////////////////////////////////////////////////////////////////// - -class Frame::Header::HeaderPrivate -{ -public: - HeaderPrivate() : - frameSize(0), - version(4), - tagAlterPreservation(false), - fileAlterPreservation(false), - readOnly(false), - groupingIdentity(false), - compression(false), - encryption(false), - unsynchronisation(false), - dataLengthIndicator(false) - {} - - ByteVector frameID; - unsigned int frameSize; - unsigned int version; - - // flags - - bool tagAlterPreservation; - bool fileAlterPreservation; - bool readOnly; - bool groupingIdentity; - bool compression; - bool encryption; - bool unsynchronisation; - bool dataLengthIndicator; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members (Frame::Header) -//////////////////////////////////////////////////////////////////////////////// - -unsigned int Frame::Header::size() -{ - return size(4); -} - -unsigned int Frame::Header::size(unsigned int version) -{ - switch(version) { - case 0: - case 1: - case 2: - return 6; - case 3: - case 4: - default: - return 10; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// public members (Frame::Header) -//////////////////////////////////////////////////////////////////////////////// - -Frame::Header::Header(const ByteVector &data, bool synchSafeInts) : - d(new HeaderPrivate()) -{ - setData(data, synchSafeInts); -} - -Frame::Header::Header(const ByteVector &data, unsigned int version) : - d(new HeaderPrivate()) -{ - setData(data, version); -} - -Frame::Header::~Header() -{ - delete d; -} - -void Frame::Header::setData(const ByteVector &data, bool synchSafeInts) -{ - setData(data, static_cast<unsigned int>(synchSafeInts ? 4 : 3)); -} - -void Frame::Header::setData(const ByteVector &data, unsigned int version) -{ - d->version = version; - - switch(version) { - case 0: - case 1: - case 2: - { - // ID3v2.2 - - if(data.size() < 3) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first three bytes - - d->frameID = data.mid(0, 3); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 6) { - d->frameSize = 0; - return; - } - - d->frameSize = data.toUInt(3, 3, true); - - break; - } - case 3: - { - // ID3v2.3 - - if(data.size() < 4) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first four bytes - - d->frameID = data.mid(0, 4); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 10) { - d->frameSize = 0; - return; - } - - // Set the size -- the frame size is the four bytes starting at byte four in - // the frame header (structure 4) - - d->frameSize = data.toUInt(4U); - - { // read the first byte of flags - std::bitset<8> flags(data[8]); - d->tagAlterPreservation = flags[7]; // (structure 3.3.1.a) - d->fileAlterPreservation = flags[6]; // (structure 3.3.1.b) - d->readOnly = flags[5]; // (structure 3.3.1.c) - } - - { // read the second byte of flags - std::bitset<8> flags(data[9]); - d->compression = flags[7]; // (structure 3.3.1.i) - d->encryption = flags[6]; // (structure 3.3.1.j) - d->groupingIdentity = flags[5]; // (structure 3.3.1.k) - } - break; - } - case 4: - default: - { - // ID3v2.4 - - if(data.size() < 4) { - debug("You must at least specify a frame ID."); - return; - } - - // Set the frame ID -- the first four bytes - - d->frameID = data.mid(0, 4); - - // If the full header information was not passed in, do not continue to the - // steps to parse the frame size and flags. - - if(data.size() < 10) { - d->frameSize = 0; - return; - } - - // Set the size -- the frame size is the four bytes starting at byte four in - // the frame header (structure 4) - - d->frameSize = SynchData::toUInt(data.mid(4, 4)); -#ifndef NO_ITUNES_HACKS - // iTunes writes v2.4 tags with v2.3-like frame sizes - if(d->frameSize > 127) { - if(!isValidFrameID(data.mid(d->frameSize + 10, 4))) { - unsigned int uintSize = data.toUInt(4U); - if(isValidFrameID(data.mid(uintSize + 10, 4))) { - d->frameSize = uintSize; - } - } - } -#endif - - { // read the first byte of flags - std::bitset<8> flags(data[8]); - d->tagAlterPreservation = flags[6]; // (structure 4.1.1.a) - d->fileAlterPreservation = flags[5]; // (structure 4.1.1.b) - d->readOnly = flags[4]; // (structure 4.1.1.c) - } - - { // read the second byte of flags - std::bitset<8> flags(data[9]); - d->groupingIdentity = flags[6]; // (structure 4.1.2.h) - d->compression = flags[3]; // (structure 4.1.2.k) - d->encryption = flags[2]; // (structure 4.1.2.m) - d->unsynchronisation = flags[1]; // (structure 4.1.2.n) - d->dataLengthIndicator = flags[0]; // (structure 4.1.2.p) - } - break; - } - } -} - -ByteVector Frame::Header::frameID() const -{ - return d->frameID; -} - -void Frame::Header::setFrameID(const ByteVector &id) -{ - d->frameID = id.mid(0, 4); -} - -unsigned int Frame::Header::frameSize() const -{ - return d->frameSize; -} - -void Frame::Header::setFrameSize(unsigned int size) -{ - d->frameSize = size; -} - -unsigned int Frame::Header::version() const -{ - return d->version; -} - -void Frame::Header::setVersion(unsigned int version) -{ - d->version = version; -} - -bool Frame::Header::tagAlterPreservation() const -{ - return d->tagAlterPreservation; -} - -void Frame::Header::setTagAlterPreservation(bool preserve) -{ - d->tagAlterPreservation = preserve; -} - -bool Frame::Header::fileAlterPreservation() const -{ - return d->fileAlterPreservation; -} - -bool Frame::Header::readOnly() const -{ - return d->readOnly; -} - -bool Frame::Header::groupingIdentity() const -{ - return d->groupingIdentity; -} - -bool Frame::Header::compression() const -{ - return d->compression; -} - -bool Frame::Header::encryption() const -{ - return d->encryption; -} - -bool Frame::Header::unsycronisation() const -{ - return unsynchronisation(); -} - -bool Frame::Header::unsynchronisation() const -{ - return d->unsynchronisation; -} - -bool Frame::Header::dataLengthIndicator() const -{ - return d->dataLengthIndicator; -} - -ByteVector Frame::Header::render() const -{ - ByteVector flags(2, char(0)); // just blank for the moment - - ByteVector v = d->frameID + - (d->version == 3 - ? ByteVector::fromUInt(d->frameSize) - : SynchData::fromUInt(d->frameSize)) + - flags; - - return v; -} - -bool Frame::Header::frameAlterPreservation() const -{ - return fileAlterPreservation(); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.cpp deleted file mode 100755 index ad5983320..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2framefactory.cpp +++ /dev/null @@ -1,550 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tzlib.h> - -#include "id3v2framefactory.h" -#include "id3v2synchdata.h" -#include "id3v1genres.h" - -#include "frames/attachedpictureframe.h" -#include "frames/commentsframe.h" -#include "frames/relativevolumeframe.h" -#include "frames/textidentificationframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unknownframe.h" -#include "frames/generalencapsulatedobjectframe.h" -#include "frames/urllinkframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/popularimeterframe.h" -#include "frames/privateframe.h" -#include "frames/ownershipframe.h" -#include "frames/synchronizedlyricsframe.h" -#include "frames/eventtimingcodesframe.h" -#include "frames/chapterframe.h" -#include "frames/tableofcontentsframe.h" -#include "frames/podcastframe.h" - -using namespace TagLib; -using namespace ID3v2; - -namespace -{ - void updateGenre(TextIdentificationFrame *frame) - { - StringList fields = frame->fieldList(); - StringList newfields; - - for(StringList::ConstIterator it = fields.begin(); it != fields.end(); ++it) { - String s = *it; - int end = s.find(")"); - - if(s.startsWith("(") && end > 0) { - // "(12)Genre" - String text = s.substr(end + 1); - bool ok; - int number = s.substr(1, end - 1).toInt(&ok); - if(ok && number >= 0 && number <= 255 && !(ID3v1::genre(number) == text)) - newfields.append(s.substr(1, end - 1)); - if(!text.isEmpty()) - newfields.append(text); - } - else { - // "Genre" or "12" - newfields.append(s); - } - } - - if(newfields.isEmpty()) - fields.append(String()); - - frame->setText(newfields); - } -} - -class FrameFactory::FrameFactoryPrivate -{ -public: - FrameFactoryPrivate() : - defaultEncoding(String::Latin1), - useDefaultEncoding(false) {} - - String::Type defaultEncoding; - bool useDefaultEncoding; - - template <class T> void setTextEncoding(T *frame) - { - if(useDefaultEncoding) - frame->setTextEncoding(defaultEncoding); - } -}; - -FrameFactory FrameFactory::factory; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FrameFactory *FrameFactory::instance() -{ - return &factory; -} - -Frame *FrameFactory::createFrame(const ByteVector &data, bool synchSafeInts) const -{ - return createFrame(data, static_cast<unsigned int>(synchSafeInts ? 4 : 3)); -} - -Frame *FrameFactory::createFrame(const ByteVector &data, unsigned int version) const -{ - Header tagHeader; - tagHeader.setMajorVersion(version); - return createFrame(data, &tagHeader); -} - -Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader) const -{ - return createFrame(origData, const_cast<const Header *>(tagHeader)); -} - -Frame *FrameFactory::createFrame(const ByteVector &origData, const Header *tagHeader) const -{ - ByteVector data = origData; - unsigned int version = tagHeader->majorVersion(); - Frame::Header *header = new Frame::Header(data, version); - ByteVector frameID = header->frameID(); - - // A quick sanity check -- make sure that the frameID is 4 uppercase Latin1 - // characters. Also make sure that there is data in the frame. - - if(frameID.size() != (version < 3 ? 3 : 4) || - header->frameSize() <= static_cast<unsigned int>(header->dataLengthIndicator() ? 4 : 0) || - header->frameSize() > data.size()) - { - delete header; - return 0; - } - -#ifndef NO_ITUNES_HACKS - if(version == 3 && frameID.size() == 4 && frameID[3] == '\0') { - // iTunes v2.3 tags store v2.2 frames - convert now - frameID = frameID.mid(0, 3); - header->setFrameID(frameID); - header->setVersion(2); - updateFrame(header); - header->setVersion(3); - } -#endif - - for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { - if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { - delete header; - return 0; - } - } - - if(version > 3 && (tagHeader->unsynchronisation() || header->unsynchronisation())) { - // Data lengths are not part of the encoded data, but since they are synch-safe - // integers they will be never actually encoded. - ByteVector frameData = data.mid(Frame::Header::size(version), header->frameSize()); - frameData = SynchData::decode(frameData); - data = data.mid(0, Frame::Header::size(version)) + frameData; - } - - // TagLib doesn't mess with encrypted frames, so just treat them - // as unknown frames. - - if(!zlib::isAvailable() && header->compression()) { - debug("Compressed frames are currently not supported."); - return new UnknownFrame(data, header); - } - - if(header->encryption()) { - debug("Encrypted frames are currently not supported."); - return new UnknownFrame(data, header); - } - - if(!updateFrame(header)) { - header->setTagAlterPreservation(true); - return new UnknownFrame(data, header); - } - - // updateFrame() might have updated the frame ID. - - frameID = header->frameID(); - - // This is where things get necissarily nasty. Here we determine which - // Frame subclass (or if none is found simply an Frame) based - // on the frame ID. Since there are a lot of possibilities, that means - // a lot of if blocks. - - // Text Identification (frames 4.2) - - // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. - if(frameID.startsWith("T") || frameID == "WFED" || frameID == "MVNM" || frameID == "MVIN" || frameID == "GRP1") { - - TextIdentificationFrame *f = frameID != "TXXX" - ? new TextIdentificationFrame(data, header) - : new UserTextIdentificationFrame(data, header); - - d->setTextEncoding(f); - - if(frameID == "TCON") - updateGenre(f); - - return f; - } - - // Comments (frames 4.10) - - if(frameID == "COMM") { - CommentsFrame *f = new CommentsFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // Attached Picture (frames 4.14) - - if(frameID == "APIC") { - AttachedPictureFrame *f = new AttachedPictureFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // ID3v2.2 Attached Picture - - if(frameID == "PIC") { - AttachedPictureFrame *f = new AttachedPictureFrameV22(data, header); - d->setTextEncoding(f); - return f; - } - - // Relative Volume Adjustment (frames 4.11) - - if(frameID == "RVA2") - return new RelativeVolumeFrame(data, header); - - // Unique File Identifier (frames 4.1) - - if(frameID == "UFID") - return new UniqueFileIdentifierFrame(data, header); - - // General Encapsulated Object (frames 4.15) - - if(frameID == "GEOB") { - GeneralEncapsulatedObjectFrame *f = new GeneralEncapsulatedObjectFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // URL link (frames 4.3) - - if(frameID.startsWith("W")) { - if(frameID != "WXXX") { - return new UrlLinkFrame(data, header); - } - else { - UserUrlLinkFrame *f = new UserUrlLinkFrame(data, header); - d->setTextEncoding(f); - return f; - } - } - - // Unsynchronized lyric/text transcription (frames 4.8) - - if(frameID == "USLT") { - UnsynchronizedLyricsFrame *f = new UnsynchronizedLyricsFrame(data, header); - if(d->useDefaultEncoding) - f->setTextEncoding(d->defaultEncoding); - return f; - } - - // Synchronised lyrics/text (frames 4.9) - - if(frameID == "SYLT") { - SynchronizedLyricsFrame *f = new SynchronizedLyricsFrame(data, header); - if(d->useDefaultEncoding) - f->setTextEncoding(d->defaultEncoding); - return f; - } - - // Event timing codes (frames 4.5) - - if(frameID == "ETCO") - return new EventTimingCodesFrame(data, header); - - // Popularimeter (frames 4.17) - - if(frameID == "POPM") - return new PopularimeterFrame(data, header); - - // Private (frames 4.27) - - if(frameID == "PRIV") - return new PrivateFrame(data, header); - - // Ownership (frames 4.22) - - if(frameID == "OWNE") { - OwnershipFrame *f = new OwnershipFrame(data, header); - d->setTextEncoding(f); - return f; - } - - // Chapter (ID3v2 chapters 1.0) - - if(frameID == "CHAP") - return new ChapterFrame(tagHeader, data, header); - - // Table of contents (ID3v2 chapters 1.0) - - if(frameID == "CTOC") - return new TableOfContentsFrame(tagHeader, data, header); - - // Apple proprietary PCST (Podcast) - - if(frameID == "PCST") - return new PodcastFrame(data, header); - - return new UnknownFrame(data, header); -} - -void FrameFactory::rebuildAggregateFrames(ID3v2::Tag *tag) const -{ - if(tag->header()->majorVersion() < 4 && - tag->frameList("TDRC").size() == 1 && - tag->frameList("TDAT").size() == 1) - { - TextIdentificationFrame *tdrc = - dynamic_cast<TextIdentificationFrame *>(tag->frameList("TDRC").front()); - UnknownFrame *tdat = static_cast<UnknownFrame *>(tag->frameList("TDAT").front()); - - if(tdrc && - tdrc->fieldList().size() == 1 && - tdrc->fieldList().front().size() == 4 && - tdat->data().size() >= 5) - { - String date(tdat->data().mid(1), String::Type(tdat->data()[0])); - if(date.length() == 4) { - tdrc->setText(tdrc->toString() + '-' + date.substr(2, 2) + '-' + date.substr(0, 2)); - if(tag->frameList("TIME").size() == 1) { - UnknownFrame *timeframe = static_cast<UnknownFrame *>(tag->frameList("TIME").front()); - if(timeframe->data().size() >= 5) { - String time(timeframe->data().mid(1), String::Type(timeframe->data()[0])); - if(time.length() == 4) { - tdrc->setText(tdrc->toString() + 'T' + time.substr(0, 2) + ':' + time.substr(2, 2)); - } - } - } - } - } - } -} - -String::Type FrameFactory::defaultTextEncoding() const -{ - return d->defaultEncoding; -} - -void FrameFactory::setDefaultTextEncoding(String::Type encoding) -{ - d->useDefaultEncoding = true; - d->defaultEncoding = encoding; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -FrameFactory::FrameFactory() : - d(new FrameFactoryPrivate()) -{ -} - -FrameFactory::~FrameFactory() -{ - delete d; -} - -namespace -{ - // Frame conversion table ID3v2.2 -> 2.4 - const char *frameConversion2[][2] = { - { "BUF", "RBUF" }, - { "CNT", "PCNT" }, - { "COM", "COMM" }, - { "CRA", "AENC" }, - { "ETC", "ETCO" }, - { "GEO", "GEOB" }, - { "IPL", "TIPL" }, - { "MCI", "MCDI" }, - { "MLL", "MLLT" }, - { "POP", "POPM" }, - { "REV", "RVRB" }, - { "SLT", "SYLT" }, - { "STC", "SYTC" }, - { "TAL", "TALB" }, - { "TBP", "TBPM" }, - { "TCM", "TCOM" }, - { "TCO", "TCON" }, - { "TCP", "TCMP" }, - { "TCR", "TCOP" }, - { "TDY", "TDLY" }, - { "TEN", "TENC" }, - { "TFT", "TFLT" }, - { "TKE", "TKEY" }, - { "TLA", "TLAN" }, - { "TLE", "TLEN" }, - { "TMT", "TMED" }, - { "TOA", "TOAL" }, - { "TOF", "TOFN" }, - { "TOL", "TOLY" }, - { "TOR", "TDOR" }, - { "TOT", "TOAL" }, - { "TP1", "TPE1" }, - { "TP2", "TPE2" }, - { "TP3", "TPE3" }, - { "TP4", "TPE4" }, - { "TPA", "TPOS" }, - { "TPB", "TPUB" }, - { "TRC", "TSRC" }, - { "TRD", "TDRC" }, - { "TRK", "TRCK" }, - { "TS2", "TSO2" }, - { "TSA", "TSOA" }, - { "TSC", "TSOC" }, - { "TSP", "TSOP" }, - { "TSS", "TSSE" }, - { "TST", "TSOT" }, - { "TT1", "TIT1" }, - { "TT2", "TIT2" }, - { "TT3", "TIT3" }, - { "TXT", "TOLY" }, - { "TXX", "TXXX" }, - { "TYE", "TDRC" }, - { "UFI", "UFID" }, - { "ULT", "USLT" }, - { "WAF", "WOAF" }, - { "WAR", "WOAR" }, - { "WAS", "WOAS" }, - { "WCM", "WCOM" }, - { "WCP", "WCOP" }, - { "WPB", "WPUB" }, - { "WXX", "WXXX" }, - - // Apple iTunes nonstandard frames - { "PCS", "PCST" }, - { "TCT", "TCAT" }, - { "TDR", "TDRL" }, - { "TDS", "TDES" }, - { "TID", "TGID" }, - { "WFD", "WFED" }, - { "MVN", "MVNM" }, - { "MVI", "MVIN" }, - { "GP1", "GRP1" }, - }; - const size_t frameConversion2Size = sizeof(frameConversion2) / sizeof(frameConversion2[0]); - - // Frame conversion table ID3v2.3 -> 2.4 - const char *frameConversion3[][2] = { - { "TORY", "TDOR" }, - { "TYER", "TDRC" }, - { "IPLS", "TIPL" }, - }; - const size_t frameConversion3Size = sizeof(frameConversion3) / sizeof(frameConversion3[0]); -} - -bool FrameFactory::updateFrame(Frame::Header *header) const -{ - const ByteVector frameID = header->frameID(); - - switch(header->version()) { - - case 2: // ID3v2.2 - { - if(frameID == "CRM" || - frameID == "EQU" || - frameID == "LNK" || - frameID == "RVA" || - frameID == "TIM" || - frameID == "TSI" || - frameID == "TDA") - { - debug("ID3v2.4 no longer supports the frame type " + String(frameID) + - ". It will be discarded from the tag."); - return false; - } - - // ID3v2.2 only used 3 bytes for the frame ID, so we need to convert all of - // the frames to their 4 byte ID3v2.4 equivalent. - - for(size_t i = 0; i < frameConversion2Size; ++i) { - if(frameID == frameConversion2[i][0]) { - header->setFrameID(frameConversion2[i][1]); - break; - } - } - - break; - } - - case 3: // ID3v2.3 - { - if(frameID == "EQUA" || - frameID == "RVAD" || - frameID == "TIME" || - frameID == "TRDA" || - frameID == "TSIZ" || - frameID == "TDAT") - { - debug("ID3v2.4 no longer supports the frame type " + String(frameID) + - ". It will be discarded from the tag."); - return false; - } - - for(size_t i = 0; i < frameConversion3Size; ++i) { - if(frameID == frameConversion3[i][0]) { - header->setFrameID(frameConversion3[i][1]); - break; - } - } - - break; - } - - default: - - // This should catch a typo that existed in TagLib up to and including - // version 1.1 where TRDC was used for the year rather than TDRC. - - if(frameID == "TRDC") - header->setFrameID("TDRC"); - - break; - } - - return true; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2header.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2header.cpp deleted file mode 100755 index da4aba0a1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2header.cpp +++ /dev/null @@ -1,239 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> - -#include "id3v2header.h" -#include "id3v2footer.h" -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -class Header::HeaderPrivate -{ -public: - HeaderPrivate() : - majorVersion(4), - revisionNumber(0), - unsynchronisation(false), - extendedHeader(false), - experimentalIndicator(false), - footerPresent(false), - tagSize(0) {} - - unsigned int majorVersion; - unsigned int revisionNumber; - - bool unsynchronisation; - bool extendedHeader; - bool experimentalIndicator; - bool footerPresent; - - unsigned int tagSize; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -unsigned int Header::size() -{ - return 10; -} - -ByteVector Header::fileIdentifier() -{ - return ByteVector::fromCString("ID3"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Header::Header() : - d(new HeaderPrivate()) -{ -} - -Header::Header(const ByteVector &data) : - d(new HeaderPrivate()) -{ - parse(data); -} - -Header::~Header() -{ - delete d; -} - -unsigned int Header::majorVersion() const -{ - return d->majorVersion; -} - -void Header::setMajorVersion(unsigned int version) -{ - d->majorVersion = version; -} - -unsigned int Header::revisionNumber() const -{ - return d->revisionNumber; -} - -bool Header::unsynchronisation() const -{ - return d->unsynchronisation; -} - -bool Header::extendedHeader() const -{ - return d->extendedHeader; -} - -bool Header::experimentalIndicator() const -{ - return d->experimentalIndicator; -} - -bool Header::footerPresent() const -{ - return d->footerPresent; -} - -unsigned int Header::tagSize() const -{ - return d->tagSize; -} - -unsigned int Header::completeTagSize() const -{ - if(d->footerPresent) - return d->tagSize + size() + Footer::size(); - else - return d->tagSize + size(); -} - -void Header::setTagSize(unsigned int s) -{ - d->tagSize = s; -} - -void Header::setData(const ByteVector &data) -{ - parse(data); -} - -ByteVector Header::render() const -{ - ByteVector v; - - // add the file identifier -- "ID3" - v.append(fileIdentifier()); - - // add the version number -- we always render a 2.4.0 tag regardless of what - // the tag originally was. - - v.append(char(majorVersion())); - v.append(char(0)); - - // Currently we don't actually support writing extended headers, footers or - // unsynchronized tags, make sure that the flags are set accordingly. - - d->extendedHeader = false; - d->footerPresent = false; - d->unsynchronisation = false; - - // render and add the flags - std::bitset<8> flags; - - flags[7] = d->unsynchronisation; - flags[6] = d->extendedHeader; - flags[5] = d->experimentalIndicator; - flags[4] = d->footerPresent; - - v.append(char(flags.to_ulong())); - - // add the size - v.append(SynchData::fromUInt(d->tagSize)); - - return v; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void Header::parse(const ByteVector &data) -{ - if(data.size() < size()) - return; - - // do some sanity checking -- even in ID3v2.3.0 and less the tag size is a - // synch-safe integer, so all bytes must be less than 128. If this is not - // true then this is an invalid tag. - - // note that we're doing things a little out of order here -- the size is - // later in the bytestream than the version - - ByteVector sizeData = data.mid(6, 4); - - if(sizeData.size() != 4) { - d->tagSize = 0; - debug("TagLib::ID3v2::Header::parse() - The tag size as read was 0 bytes!"); - return; - } - - for(ByteVector::ConstIterator it = sizeData.begin(); it != sizeData.end(); it++) { - if(static_cast<unsigned char>(*it) >= 128) { - d->tagSize = 0; - debug("TagLib::ID3v2::Header::parse() - One of the size bytes in the id3v2 header was greater than the allowed 128."); - return; - } - } - - // The first three bytes, data[0..2], are the File Identifier, "ID3". (structure 3.1 "file identifier") - - // Read the version number from the fourth and fifth bytes. - d->majorVersion = data[3]; // (structure 3.1 "major version") - d->revisionNumber = data[4]; // (structure 3.1 "revision number") - - // Read the flags, the first four bits of the sixth byte. - std::bitset<8> flags(data[5]); - - d->unsynchronisation = flags[7]; // (structure 3.1.a) - d->extendedHeader = flags[6]; // (structure 3.1.b) - d->experimentalIndicator = flags[5]; // (structure 3.1.c) - d->footerPresent = flags[4]; // (structure 3.1.d) - - // Get the size from the remaining four bytes (read above) - - d->tagSize = SynchData::toUInt(sizeData); // (structure 3.1 "size") -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2synchdata.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2synchdata.cpp deleted file mode 100755 index 2aa999993..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2synchdata.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <iostream> - -#include "id3v2synchdata.h" - -using namespace TagLib; -using namespace ID3v2; - -unsigned int SynchData::toUInt(const ByteVector &data) -{ - unsigned int sum = 0; - bool notSynchSafe = false; - int last = data.size() > 4 ? 3 : data.size() - 1; - - for(int i = 0; i <= last; i++) { - if(data[i] & 0x80) { - notSynchSafe = true; - break; - } - - sum |= (data[i] & 0x7f) << ((last - i) * 7); - } - - if(notSynchSafe) { - // Invalid data; assume this was created by some buggy software that just - // put normal integers here rather than syncsafe ones, and try it that - // way. - if(data.size() >= 4) { - sum = data.toUInt(0, true); - } - else { - ByteVector tmp(data); - tmp.resize(4); - sum = tmp.toUInt(0, true); - } - } - - return sum; -} - -ByteVector SynchData::fromUInt(unsigned int value) -{ - ByteVector v(4, 0); - - for(int i = 0; i < 4; i++) - v[i] = static_cast<unsigned char>(value >> ((3 - i) * 7) & 0x7f); - - return v; -} - -ByteVector SynchData::decode(const ByteVector &data) -{ - // We have this optimized method instead of using ByteVector::replace(), - // since it makes a great difference when decoding huge unsynchronized frames. - - ByteVector result(data.size()); - - ByteVector::ConstIterator src = data.begin(); - ByteVector::Iterator dst = result.begin(); - - while(src < data.end() - 1) { - *dst++ = *src++; - - if(*(src - 1) == '\xff' && *src == '\x00') - src++; - } - - if(src < data.end()) - *dst++ = *src++; - - result.resize(static_cast<unsigned int>(dst - result.begin())); - - return result; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.cpp deleted file mode 100755 index ef4cef4bd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/id3v2/id3v2tag.cpp +++ /dev/null @@ -1,805 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> - -#include <tfile.h> -#include <tbytevector.h> -#include <tpropertymap.h> -#include <tdebug.h> - -#include "id3v2tag.h" -#include "id3v2header.h" -#include "id3v2extendedheader.h" -#include "id3v2footer.h" -#include "id3v2synchdata.h" -#include "id3v1genres.h" - -#include "frames/textidentificationframe.h" -#include "frames/commentsframe.h" -#include "frames/urllinkframe.h" -#include "frames/uniquefileidentifierframe.h" -#include "frames/unsynchronizedlyricsframe.h" -#include "frames/unknownframe.h" - -using namespace TagLib; -using namespace ID3v2; - -namespace -{ - const ID3v2::Latin1StringHandler defaultStringHandler; - const ID3v2::Latin1StringHandler *stringHandler = &defaultStringHandler; - - const long MinPaddingSize = 1024; - const long MaxPaddingSize = 1024 * 1024; -} - -class ID3v2::Tag::TagPrivate -{ -public: - TagPrivate() : - factory(0), - file(0), - tagOffset(0), - extendedHeader(0), - footer(0) - { - frameList.setAutoDelete(true); - } - - ~TagPrivate() - { - delete extendedHeader; - delete footer; - } - - const FrameFactory *factory; - - File *file; - long tagOffset; - - Header header; - ExtendedHeader *extendedHeader; - Footer *footer; - - FrameListMap frameListMap; - FrameList frameList; -}; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -Latin1StringHandler::Latin1StringHandler() -{ -} - -Latin1StringHandler::~Latin1StringHandler() -{ -} - -String Latin1StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::Latin1); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ID3v2::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ - d->factory = FrameFactory::instance(); -} - -ID3v2::Tag::Tag(File *file, long tagOffset, const FrameFactory *factory) : - TagLib::Tag(), - d(new TagPrivate()) -{ - d->factory = factory; - d->file = file; - d->tagOffset = tagOffset; - - read(); -} - -ID3v2::Tag::~Tag() -{ - delete d; -} - -String ID3v2::Tag::title() const -{ - if(!d->frameListMap["TIT2"].isEmpty()) - return d->frameListMap["TIT2"].front()->toString(); - return String(); -} - -String ID3v2::Tag::artist() const -{ - if(!d->frameListMap["TPE1"].isEmpty()) - return d->frameListMap["TPE1"].front()->toString(); - return String(); -} - -String ID3v2::Tag::album() const -{ - if(!d->frameListMap["TALB"].isEmpty()) - return d->frameListMap["TALB"].front()->toString(); - return String(); -} - -String ID3v2::Tag::comment() const -{ - const FrameList &comments = d->frameListMap["COMM"]; - - if(comments.isEmpty()) - return String(); - - for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) - { - CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); - - if(frame && frame->description().isEmpty()) - return (*it)->toString(); - } - - return comments.front()->toString(); -} - -String ID3v2::Tag::genre() const -{ - // TODO: In the next major version (TagLib 2.0) a list of multiple genres - // should be separated by " / " instead of " ". For the moment to keep - // the behavior the same as released versions it is being left with " ". - - if(d->frameListMap["TCON"].isEmpty() || - !dynamic_cast<TextIdentificationFrame *>(d->frameListMap["TCON"].front())) - { - return String(); - } - - // ID3v2.4 lists genres as the fields in its frames field list. If the field - // is simply a number it can be assumed that it is an ID3v1 genre number. - // Here was assume that if an ID3v1 string is present that it should be - // appended to the genre string. Multiple fields will be appended as the - // string is built. - - TextIdentificationFrame *f = static_cast<TextIdentificationFrame *>( - d->frameListMap["TCON"].front()); - - StringList fields = f->fieldList(); - - StringList genres; - - for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) { - - if((*it).isEmpty()) - continue; - - bool ok; - int number = (*it).toInt(&ok); - if(ok && number >= 0 && number <= 255) { - *it = ID3v1::genre(number); - } - - if(std::find(genres.begin(), genres.end(), *it) == genres.end()) - genres.append(*it); - } - - return genres.toString(); -} - -unsigned int ID3v2::Tag::year() const -{ - if(!d->frameListMap["TDRC"].isEmpty()) - return d->frameListMap["TDRC"].front()->toString().substr(0, 4).toInt(); - return 0; -} - -unsigned int ID3v2::Tag::track() const -{ - if(!d->frameListMap["TRCK"].isEmpty()) - return d->frameListMap["TRCK"].front()->toString().toInt(); - return 0; -} - -void ID3v2::Tag::setTitle(const String &s) -{ - setTextFrame("TIT2", s); -} - -void ID3v2::Tag::setArtist(const String &s) -{ - setTextFrame("TPE1", s); -} - -void ID3v2::Tag::setAlbum(const String &s) -{ - setTextFrame("TALB", s); -} - -void ID3v2::Tag::setComment(const String &s) -{ - if(s.isEmpty()) { - removeFrames("COMM"); - return; - } - - const FrameList &comments = d->frameListMap["COMM"]; - - if(!comments.isEmpty()) { - for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { - CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); - if(frame && frame->description().isEmpty()) { - (*it)->setText(s); - return; - } - } - - comments.front()->setText(s); - return; - } - - CommentsFrame *f = new CommentsFrame(d->factory->defaultTextEncoding()); - addFrame(f); - f->setText(s); -} - -void ID3v2::Tag::setGenre(const String &s) -{ - if(s.isEmpty()) { - removeFrames("TCON"); - return; - } - - // iTunes can't handle correctly encoded ID3v2.4 numerical genres. Just use - // strings until iTunes sucks less. - -#ifdef NO_ITUNES_HACKS - - int index = ID3v1::genreIndex(s); - - if(index != 255) - setTextFrame("TCON", String::number(index)); - else - setTextFrame("TCON", s); - -#else - - setTextFrame("TCON", s); - -#endif -} - -void ID3v2::Tag::setYear(unsigned int i) -{ - if(i == 0) { - removeFrames("TDRC"); - return; - } - setTextFrame("TDRC", String::number(i)); -} - -void ID3v2::Tag::setTrack(unsigned int i) -{ - if(i == 0) { - removeFrames("TRCK"); - return; - } - setTextFrame("TRCK", String::number(i)); -} - -bool ID3v2::Tag::isEmpty() const -{ - return d->frameList.isEmpty(); -} - -Header *ID3v2::Tag::header() const -{ - return &(d->header); -} - -ExtendedHeader *ID3v2::Tag::extendedHeader() const -{ - return d->extendedHeader; -} - -Footer *ID3v2::Tag::footer() const -{ - return d->footer; -} - -const FrameListMap &ID3v2::Tag::frameListMap() const -{ - return d->frameListMap; -} - -const FrameList &ID3v2::Tag::frameList() const -{ - return d->frameList; -} - -const FrameList &ID3v2::Tag::frameList(const ByteVector &frameID) const -{ - return d->frameListMap[frameID]; -} - -void ID3v2::Tag::addFrame(Frame *frame) -{ - d->frameList.append(frame); - d->frameListMap[frame->frameID()].append(frame); -} - -void ID3v2::Tag::removeFrame(Frame *frame, bool del) -{ - // remove the frame from the frame list - FrameList::Iterator it = d->frameList.find(frame); - d->frameList.erase(it); - - // ...and from the frame list map - it = d->frameListMap[frame->frameID()].find(frame); - d->frameListMap[frame->frameID()].erase(it); - - // ...and delete as desired - if(del) - delete frame; -} - -void ID3v2::Tag::removeFrames(const ByteVector &id) -{ - FrameList l = d->frameListMap[id]; - for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) - removeFrame(*it, true); -} - -PropertyMap ID3v2::Tag::properties() const -{ - PropertyMap properties; - for(FrameList::ConstIterator it = frameList().begin(); it != frameList().end(); ++it) { - PropertyMap props = (*it)->asProperties(); - properties.merge(props); - } - return properties; -} - -void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties) -{ - for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - if(it->startsWith("UNKNOWN/")) { - String frameID = it->substr(String("UNKNOWN/").size()); - if(frameID.size() != 4) - continue; // invalid specification - ByteVector id = frameID.data(String::Latin1); - // delete all unknown frames of given type - FrameList l = frameList(id); - for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++) - if (dynamic_cast<const UnknownFrame *>(*fit) != 0) - removeFrame(*fit); - } - else if(it->size() == 4){ - ByteVector id = it->data(String::Latin1); - removeFrames(id); - } - else { - ByteVector id = it->substr(0,4).data(String::Latin1); - if(it->size() <= 5) - continue; // invalid specification - String description = it->substr(5); - Frame *frame = 0; - if(id == "TXXX") - frame = UserTextIdentificationFrame::find(this, description); - else if(id == "WXXX") - frame = UserUrlLinkFrame::find(this, description); - else if(id == "COMM") - frame = CommentsFrame::findByDescription(this, description); - else if(id == "USLT") - frame = UnsynchronizedLyricsFrame::findByDescription(this, description); - else if(id == "UFID") - frame = UniqueFileIdentifierFrame::findByOwner(this, description); - if(frame) - removeFrame(frame); - } - } -} - -PropertyMap ID3v2::Tag::setProperties(const PropertyMap &origProps) -{ - FrameList framesToDelete; - // we split up the PropertyMap into the "normal" keys and the "complicated" ones, - // which are those according to TIPL or TMCL frames. - PropertyMap properties; - PropertyMap tiplProperties; - PropertyMap tmclProperties; - Frame::splitProperties(origProps, properties, tiplProperties, tmclProperties); - for(FrameListMap::ConstIterator it = frameListMap().begin(); it != frameListMap().end(); ++it){ - for(FrameList::ConstIterator lit = it->second.begin(); lit != it->second.end(); ++lit){ - PropertyMap frameProperties = (*lit)->asProperties(); - if(it->first == "TIPL") { - if (tiplProperties != frameProperties) - framesToDelete.append(*lit); - else - tiplProperties.erase(frameProperties); - } else if(it->first == "TMCL") { - if (tmclProperties != frameProperties) - framesToDelete.append(*lit); - else - tmclProperties.erase(frameProperties); - } else if(!properties.contains(frameProperties)) - framesToDelete.append(*lit); - else - properties.erase(frameProperties); - } - } - for(FrameList::ConstIterator it = framesToDelete.begin(); it != framesToDelete.end(); ++it) - removeFrame(*it); - - // now create remaining frames: - // start with the involved people list (TIPL) - if(!tiplProperties.isEmpty()) - addFrame(TextIdentificationFrame::createTIPLFrame(tiplProperties)); - // proceed with the musician credit list (TMCL) - if(!tmclProperties.isEmpty()) - addFrame(TextIdentificationFrame::createTMCLFrame(tmclProperties)); - // now create the "one key per frame" frames - for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it) - addFrame(Frame::createTextualFrame(it->first, it->second)); - return PropertyMap(); // ID3 implements the complete PropertyMap interface, so an empty map is returned -} - -ByteVector ID3v2::Tag::render() const -{ - return render(ID3v2::v4); -} - -void ID3v2::Tag::downgradeFrames(FrameList *frames, FrameList *newFrames) const -{ -#ifdef NO_ITUNES_HACKS - const char *unsupportedFrames[] = { - "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", - "TMOO", "TPRO", "TSOA", "TSOT", "TSST", "TSOP", 0 - }; -#else - // iTunes writes and reads TSOA, TSOT, TSOP to ID3v2.3. - const char *unsupportedFrames[] = { - "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", - "TMOO", "TPRO", "TSST", 0 - }; -#endif - ID3v2::TextIdentificationFrame *frameTDOR = 0; - ID3v2::TextIdentificationFrame *frameTDRC = 0; - ID3v2::TextIdentificationFrame *frameTIPL = 0; - ID3v2::TextIdentificationFrame *frameTMCL = 0; - for(FrameList::ConstIterator it = d->frameList.begin(); it != d->frameList.end(); it++) { - ID3v2::Frame *frame = *it; - ByteVector frameID = frame->header()->frameID(); - for(int i = 0; unsupportedFrames[i]; i++) { - if(frameID == unsupportedFrames[i]) { - debug("A frame that is not supported in ID3v2.3 \'" - + String(frameID) + "\' has been discarded"); - frame = 0; - break; - } - } - if(frame && frameID == "TDOR") { - frameTDOR = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TDRC") { - frameTDRC = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TIPL") { - frameTIPL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame && frameID == "TMCL") { - frameTMCL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); - frame = 0; - } - if(frame) { - frames->append(frame); - } - } - if(frameTDOR) { - String content = frameTDOR->toString(); - if(content.size() >= 4) { - ID3v2::TextIdentificationFrame *frameTORY = new ID3v2::TextIdentificationFrame("TORY", String::Latin1); - frameTORY->setText(content.substr(0, 4)); - frames->append(frameTORY); - newFrames->append(frameTORY); - } - } - if(frameTDRC) { - String content = frameTDRC->toString(); - if(content.size() >= 4) { - ID3v2::TextIdentificationFrame *frameTYER = new ID3v2::TextIdentificationFrame("TYER", String::Latin1); - frameTYER->setText(content.substr(0, 4)); - frames->append(frameTYER); - newFrames->append(frameTYER); - if(content.size() >= 10 && content[4] == '-' && content[7] == '-') { - ID3v2::TextIdentificationFrame *frameTDAT = new ID3v2::TextIdentificationFrame("TDAT", String::Latin1); - frameTDAT->setText(content.substr(8, 2) + content.substr(5, 2)); - frames->append(frameTDAT); - newFrames->append(frameTDAT); - if(content.size() >= 16 && content[10] == 'T' && content[13] == ':') { - ID3v2::TextIdentificationFrame *frameTIME = new ID3v2::TextIdentificationFrame("TIME", String::Latin1); - frameTIME->setText(content.substr(11, 2) + content.substr(14, 2)); - frames->append(frameTIME); - newFrames->append(frameTIME); - } - } - } - } - if(frameTIPL || frameTMCL) { - ID3v2::TextIdentificationFrame *frameIPLS = new ID3v2::TextIdentificationFrame("IPLS", String::Latin1); - StringList people; - if(frameTMCL) { - StringList v24People = frameTMCL->fieldList(); - for(unsigned int i = 0; i + 1 < v24People.size(); i += 2) { - people.append(v24People[i]); - people.append(v24People[i+1]); - } - } - if(frameTIPL) { - StringList v24People = frameTIPL->fieldList(); - for(unsigned int i = 0; i + 1 < v24People.size(); i += 2) { - people.append(v24People[i]); - people.append(v24People[i+1]); - } - } - frameIPLS->setText(people); - frames->append(frameIPLS); - newFrames->append(frameIPLS); - } -} - -ByteVector ID3v2::Tag::render(int version) const -{ - return render(version == 3 ? v3 : v4); -} - -ByteVector ID3v2::Tag::render(Version version) const -{ - // We need to render the "tag data" first so that we have to correct size to - // render in the tag's header. The "tag data" -- everything that is included - // in ID3v2::Header::tagSize() -- includes the extended header, frames and - // padding, but does not include the tag's header or footer. - - // TODO: Render the extended header. - - // Downgrade the frames that ID3v2.3 doesn't support. - - FrameList newFrames; - newFrames.setAutoDelete(true); - - FrameList frameList; - if(version == v4) { - frameList = d->frameList; - } - else { - downgradeFrames(&frameList, &newFrames); - } - - // Reserve a 10-byte blank space for an ID3v2 tag header. - - ByteVector tagData(Header::size(), '\0'); - - // Loop through the frames rendering them and adding them to the tagData. - - for(FrameList::ConstIterator it = frameList.begin(); it != frameList.end(); it++) { - (*it)->header()->setVersion(version == v3 ? 3 : 4); - if((*it)->header()->frameID().size() != 4) { - debug("An ID3v2 frame of unsupported or unknown type \'" - + String((*it)->header()->frameID()) + "\' has been discarded"); - continue; - } - if(!(*it)->header()->tagAlterPreservation()) { - const ByteVector frameData = (*it)->render(); - if(frameData.size() == Frame::headerSize((*it)->header()->version())) { - debug("An empty ID3v2 frame \'" - + String((*it)->header()->frameID()) + "\' has been discarded"); - continue; - } - tagData.append(frameData); - } - } - - // Compute the amount of padding, and append that to tagData. - - long originalSize = d->header.tagSize(); - long paddingSize = originalSize - (tagData.size() - Header::size()); - - if(paddingSize <= 0) { - paddingSize = MinPaddingSize; - } - else { - // Padding won't increase beyond 1% of the file size or 1MB. - - long threshold = d->file ? d->file->length() / 100 : 0; - threshold = std::max(threshold, MinPaddingSize); - threshold = std::min(threshold, MaxPaddingSize); - - if(paddingSize > threshold) - paddingSize = MinPaddingSize; - } - - tagData.resize(static_cast<unsigned int>(tagData.size() + paddingSize), '\0'); - - // Set the version and data size. - d->header.setMajorVersion(version); - d->header.setTagSize(tagData.size() - Header::size()); - - // TODO: This should eventually include d->footer->render(). - const ByteVector headerData = d->header.render(); - std::copy(headerData.begin(), headerData.end(), tagData.begin()); - - return tagData; -} - -Latin1StringHandler const *ID3v2::Tag::latin1StringHandler() -{ - return stringHandler; -} - -void ID3v2::Tag::setLatin1StringHandler(const Latin1StringHandler *handler) -{ - if(handler) - stringHandler = handler; - else - stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ID3v2::Tag::read() -{ - if(!d->file) - return; - - if(!d->file->isOpen()) - return; - - d->file->seek(d->tagOffset); - d->header.setData(d->file->readBlock(Header::size())); - - // If the tag size is 0, then this is an invalid tag (tags must contain at - // least one frame) - - if(d->header.tagSize() != 0) - parse(d->file->readBlock(d->header.tagSize())); - - // Look for duplicate ID3v2 tags and treat them as an extra blank of this one. - // It leads to overwriting them with zero when saving the tag. - - // This is a workaround for some faulty files that have duplicate ID3v2 tags. - // Unfortunately, TagLib itself may write such duplicate tags until v1.10. - - unsigned int extraSize = 0; - - while(true) { - - d->file->seek(d->tagOffset + d->header.completeTagSize() + extraSize); - - const ByteVector data = d->file->readBlock(Header::size()); - if(data.size() < Header::size() || !data.startsWith(Header::fileIdentifier())) - break; - - extraSize += Header(data).completeTagSize(); - } - - if(extraSize != 0) { - debug("ID3v2::Tag::read() - Duplicate ID3v2 tags found."); - d->header.setTagSize(d->header.tagSize() + extraSize); - } -} - -void ID3v2::Tag::parse(const ByteVector &origData) -{ - ByteVector data = origData; - - if(d->header.unsynchronisation() && d->header.majorVersion() <= 3) - data = SynchData::decode(data); - - unsigned int frameDataPosition = 0; - unsigned int frameDataLength = data.size(); - - // check for extended header - - if(d->header.extendedHeader()) { - if(!d->extendedHeader) - d->extendedHeader = new ExtendedHeader(); - d->extendedHeader->setData(data); - if(d->extendedHeader->size() <= data.size()) { - frameDataPosition += d->extendedHeader->size(); - frameDataLength -= d->extendedHeader->size(); - } - } - - // check for footer -- we don't actually need to parse it, as it *must* - // contain the same data as the header, but we do need to account for its - // size. - - if(d->header.footerPresent() && Footer::size() <= frameDataLength) - frameDataLength -= Footer::size(); - - // parse frames - - // Make sure that there is at least enough room in the remaining frame data for - // a frame header. - - while(frameDataPosition < frameDataLength - Frame::headerSize(d->header.majorVersion())) { - - // If the next data is position is 0, assume that we've hit the padding - // portion of the frame data. - - if(data.at(frameDataPosition) == 0) { - if(d->header.footerPresent()) { - debug("Padding *and* a footer found. This is not allowed by the spec."); - } - - break; - } - - Frame *frame = d->factory->createFrame(data.mid(frameDataPosition), - &d->header); - - if(!frame) - return; - - // Checks to make sure that frame parsed correctly. - - if(frame->size() <= 0) { - delete frame; - return; - } - - frameDataPosition += frame->size() + Frame::headerSize(d->header.majorVersion()); - addFrame(frame); - } - - d->factory->rebuildAggregateFrames(this); -} - -void ID3v2::Tag::setTextFrame(const ByteVector &id, const String &value) -{ - if(value.isEmpty()) { - removeFrames(id); - return; - } - - if(!d->frameListMap[id].isEmpty()) - d->frameListMap[id].front()->setText(value); - else { - const String::Type encoding = d->factory->defaultTextEncoding(); - TextIdentificationFrame *f = new TextIdentificationFrame(id, encoding); - addFrame(f); - f->setText(value); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.cpp deleted file mode 100755 index a2ce02a7c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegfile.cpp +++ /dev/null @@ -1,585 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tagunion.h> -#include <tagutils.h> -#include <id3v2tag.h> -#include <id3v2header.h> -#include <id3v1tag.h> -#include <apefooter.h> -#include <apetag.h> -#include <tdebug.h> - -#include "mpegfile.h" -#include "mpegheader.h" -#include "mpegutils.h" -#include "tpropertymap.h" - -using namespace TagLib; - -namespace -{ - enum { ID3v2Index = 0, APEIndex = 1, ID3v1Index = 2 }; -} - -class MPEG::File::FilePrivate -{ -public: - FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : - ID3v2FrameFactory(frameFactory), - ID3v2Location(-1), - ID3v2OriginalSize(0), - APELocation(-1), - APEOriginalSize(0), - ID3v1Location(-1), - properties(0) {} - - ~FilePrivate() - { - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - - long ID3v2Location; - long ID3v2OriginalSize; - - long APELocation; - long APEOriginalSize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -namespace -{ - // Dummy file class to make a stream work with MPEG::Header. - - class AdapterFile : public TagLib::File - { - public: - AdapterFile(IOStream *stream) : File(stream) {} - - Tag *tag() const { return 0; } - AudioProperties *audioProperties() const { return 0; } - bool save() { return false; } - }; -} - -bool MPEG::File::isSupported(IOStream *stream) -{ - if(!stream || !stream->isOpen()) - return false; - - // An MPEG file has MPEG frame headers. An ID3v2 tag may precede. - - // MPEG frame headers are really confusing with irrelevant binary data. - // So we check if a frame header is really valid. - - long headerOffset; - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true, &headerOffset); - - if(buffer.isEmpty()) - return false; - - const long originalPosition = stream->tell(); - AdapterFile file(stream); - - for(unsigned int i = 0; i < buffer.size() - 1; ++i) { - if(isFrameSync(buffer, i)) { - const Header header(&file, headerOffset + i, true); - if(header.isValid()) { - stream->seek(originalPosition); - return true; - } - } - } - - stream->seek(originalPosition); - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -MPEG::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -MPEG::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -MPEG::File::~File() -{ - delete d; -} - -TagLib::Tag *MPEG::File::tag() const -{ - return &d->tag; -} - -PropertyMap MPEG::File::properties() const -{ - return d->tag.properties(); -} - -void MPEG::File::removeUnsupportedProperties(const StringList &properties) -{ - d->tag.removeUnsupportedProperties(properties); -} - -PropertyMap MPEG::File::setProperties(const PropertyMap &properties) -{ - // update ID3v1 tag if it exists, but ignore the return value - - if(ID3v1Tag()) - ID3v1Tag()->setProperties(properties); - - return ID3v2Tag(true)->setProperties(properties); -} - -MPEG::Properties *MPEG::File::audioProperties() const -{ - return d->properties; -} - -bool MPEG::File::save() -{ - return save(AllTags); -} - -bool MPEG::File::save(int tags) -{ - return save(tags, StripOthers); -} - -bool MPEG::File::save(int tags, bool stripOthers) -{ - return save(tags, stripOthers ? StripOthers : StripNone, ID3v2::v4); -} - -bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version) -{ - return save(tags, - stripOthers ? StripOthers : StripNone, - id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4); -} - -bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags) -{ - return save(tags, - stripOthers ? StripOthers : StripNone, - id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4, - duplicateTags ? Duplicate : DoNotDuplicate); -} - -bool MPEG::File::save(int tags, StripTags strip, ID3v2::Version version, DuplicateTags duplicate) -{ - if(readOnly()) { - debug("MPEG::File::save() -- File is read only."); - return false; - } - - // Create the tags if we've been asked to. - - if(duplicate == Duplicate) { - - // Copy the values from the tag that does exist into the new tag, - // except if the existing tag is to be stripped. - - if((tags & ID3v2) && ID3v1Tag() && !(strip == StripOthers && !(tags & ID3v1))) - Tag::duplicate(ID3v1Tag(), ID3v2Tag(true), false); - - if((tags & ID3v1) && d->tag[ID3v2Index] && !(strip == StripOthers && !(tags & ID3v2))) - Tag::duplicate(ID3v2Tag(), ID3v1Tag(true), false); - } - - // Remove all the tags not going to be saved. - - if(strip == StripOthers) - File::strip(~tags, false); - - if(ID3v2 & tags) { - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - - // ID3v2 tag is not empty. Update the old one or create a new one. - - if(d->ID3v2Location < 0) - d->ID3v2Location = 0; - - const ByteVector data = ID3v2Tag()->render(version); - insert(data, d->ID3v2Location, d->ID3v2OriginalSize); - - if(d->APELocation >= 0) - d->APELocation += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - - d->ID3v2OriginalSize = data.size(); - } - else { - - // ID3v2 tag is empty. Remove the old one. - - File::strip(ID3v2, false); - } - } - - if(ID3v1 & tags) { - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - File::strip(ID3v1, false); - } - } - - if(APE & tags) { - - if(APETag() && !APETag()->isEmpty()) { - - // APE tag is not empty. Update the old one or create a new one. - - if(d->APELocation < 0) { - if(d->ID3v1Location >= 0) - d->APELocation = d->ID3v1Location; - else - d->APELocation = length(); - } - - const ByteVector data = APETag()->render(); - insert(data, d->APELocation, d->APEOriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->APEOriginalSize); - - d->APEOriginalSize = data.size(); - } - else { - - // APE tag is empty. Remove the old one. - - File::strip(APE, false); - } - } - - return true; -} - -ID3v2::Tag *MPEG::File::ID3v2Tag(bool create) -{ - return d->tag.access<ID3v2::Tag>(ID3v2Index, create); -} - -ID3v1::Tag *MPEG::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(ID3v1Index, create); -} - -APE::Tag *MPEG::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(APEIndex, create); -} - -bool MPEG::File::strip(int tags) -{ - return strip(tags, true); -} - -bool MPEG::File::strip(int tags, bool freeMemory) -{ - if(readOnly()) { - debug("MPEG::File::strip() - Cannot strip tags from a read only file."); - return false; - } - - if((tags & ID3v2) && d->ID3v2Location >= 0) { - removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); - - if(d->APELocation >= 0) - d->APELocation -= d->ID3v2OriginalSize; - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->ID3v2OriginalSize; - - d->ID3v2Location = -1; - d->ID3v2OriginalSize = 0; - - if(freeMemory) - d->tag.set(ID3v2Index, 0); - } - - if((tags & ID3v1) && d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - - d->ID3v1Location = -1; - - if(freeMemory) - d->tag.set(ID3v1Index, 0); - } - - if((tags & APE) && d->APELocation >= 0) { - removeBlock(d->APELocation, d->APEOriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->APEOriginalSize; - - d->APELocation = -1; - d->APEOriginalSize = 0; - - if(freeMemory) - d->tag.set(APEIndex, 0); - } - - return true; -} - -void MPEG::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - -long MPEG::File::nextFrameOffset(long position) -{ - ByteVector frameSyncBytes(2, '\0'); - - while(true) { - seek(position); - const ByteVector buffer = readBlock(bufferSize()); - if(buffer.isEmpty()) - return -1; - - for(unsigned int i = 0; i < buffer.size(); ++i) { - frameSyncBytes[0] = frameSyncBytes[1]; - frameSyncBytes[1] = buffer[i]; - if(isFrameSync(frameSyncBytes)) { - const Header header(this, position + i - 1, true); - if(header.isValid()) - return position + i - 1; - } - } - - position += bufferSize(); - } -} - -long MPEG::File::previousFrameOffset(long position) -{ - ByteVector frameSyncBytes(2, '\0'); - - while(position > 0) { - const long bufferLength = std::min<long>(position, bufferSize()); - position -= bufferLength; - - seek(position); - const ByteVector buffer = readBlock(bufferLength); - - for(int i = buffer.size() - 1; i >= 0; --i) { - frameSyncBytes[1] = frameSyncBytes[0]; - frameSyncBytes[0] = buffer[i]; - if(isFrameSync(frameSyncBytes)) { - const Header header(this, position + i, true); - if(header.isValid()) - return position + i + header.frameLength(); - } - } - } - - return -1; -} - -long MPEG::File::firstFrameOffset() -{ - long position = 0; - - if(hasID3v2Tag()) - position = d->ID3v2Location + ID3v2Tag()->header()->completeTagSize(); - - return nextFrameOffset(position); -} - -long MPEG::File::lastFrameOffset() -{ - long position; - - if(hasAPETag()) - position = d->APELocation - 1; - else if(hasID3v1Tag()) - position = d->ID3v1Location - 1; - else - position = length(); - - return previousFrameOffset(position); -} - -bool MPEG::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -bool MPEG::File::hasID3v2Tag() const -{ - return (d->ID3v2Location >= 0); -} - -bool MPEG::File::hasAPETag() const -{ - return (d->APELocation >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::File::read(bool readProperties) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = findID3v2(); - - if(d->ID3v2Location >= 0) { - d->tag.set(ID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - } - - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(ID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - // Look for an APE tag - - d->APELocation = Utils::findAPE(this, d->ID3v1Location); - - if(d->APELocation >= 0) { - d->tag.set(APEIndex, new APE::Tag(this, d->APELocation)); - d->APEOriginalSize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APE::Footer::size() - d->APEOriginalSize; - } - - if(readProperties) - d->properties = new Properties(this); - - // Make sure that we have our default tag types available. - - ID3v2Tag(true); - ID3v1Tag(true); -} - -long MPEG::File::findID3v2() -{ - if(!isValid()) - return -1; - - // An ID3v2 tag or MPEG frame is most likely be at the beginning of the file. - - const ByteVector headerID = ID3v2::Header::fileIdentifier(); - - seek(0); - if(readBlock(headerID.size()) == headerID) - return 0; - - const Header firstHeader(this, 0, true); - if(firstHeader.isValid()) - return -1; - - // Look for an ID3v2 tag until reaching the first valid MPEG frame. - - ByteVector frameSyncBytes(2, '\0'); - ByteVector tagHeaderBytes(3, '\0'); - long position = 0; - - while(true) { - seek(position); - const ByteVector buffer = readBlock(bufferSize()); - if(buffer.isEmpty()) - return -1; - - for(unsigned int i = 0; i < buffer.size(); ++i) { - frameSyncBytes[0] = frameSyncBytes[1]; - frameSyncBytes[1] = buffer[i]; - if(isFrameSync(frameSyncBytes)) { - const Header header(this, position + i - 1, true); - if(header.isValid()) - return -1; - } - - tagHeaderBytes[0] = tagHeaderBytes[1]; - tagHeaderBytes[1] = tagHeaderBytes[2]; - tagHeaderBytes[2] = buffer[i]; - if(tagHeaderBytes == headerID) - return position + i - 2; - } - - position += bufferSize(); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.cpp deleted file mode 100755 index 5a5015d61..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegheader.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tfile.h> -#include <tdebug.h> -#include <trefcounter.h> - -#include "mpegheader.h" -#include "mpegutils.h" - -using namespace TagLib; - -class MPEG::Header::HeaderPrivate : public RefCounter -{ -public: - HeaderPrivate() : - isValid(false), - version(Version1), - layer(0), - protectionEnabled(false), - bitrate(0), - sampleRate(0), - isPadded(false), - channelMode(Stereo), - isCopyrighted(false), - isOriginal(false), - frameLength(0), - samplesPerFrame(0) {} - - bool isValid; - Version version; - int layer; - bool protectionEnabled; - int bitrate; - int sampleRate; - bool isPadded; - ChannelMode channelMode; - bool isCopyrighted; - bool isOriginal; - int frameLength; - int samplesPerFrame; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::Header::Header(const ByteVector &data) : - d(new HeaderPrivate()) -{ - debug("MPEG::Header::Header() - This constructor is no longer used."); -} - -MPEG::Header::Header(File *file, long offset, bool checkLength) : - d(new HeaderPrivate()) -{ - parse(file, offset, checkLength); -} - -MPEG::Header::Header(const Header &h) : - d(h.d) -{ - d->ref(); -} - -MPEG::Header::~Header() -{ - if(d->deref()) - delete d; -} - -bool MPEG::Header::isValid() const -{ - return d->isValid; -} - -MPEG::Header::Version MPEG::Header::version() const -{ - return d->version; -} - -int MPEG::Header::layer() const -{ - return d->layer; -} - -bool MPEG::Header::protectionEnabled() const -{ - return d->protectionEnabled; -} - -int MPEG::Header::bitrate() const -{ - return d->bitrate; -} - -int MPEG::Header::sampleRate() const -{ - return d->sampleRate; -} - -bool MPEG::Header::isPadded() const -{ - return d->isPadded; -} - -MPEG::Header::ChannelMode MPEG::Header::channelMode() const -{ - return d->channelMode; -} - -bool MPEG::Header::isCopyrighted() const -{ - return d->isCopyrighted; -} - -bool MPEG::Header::isOriginal() const -{ - return d->isOriginal; -} - -int MPEG::Header::frameLength() const -{ - return d->frameLength; -} - -int MPEG::Header::samplesPerFrame() const -{ - return d->samplesPerFrame; -} - -MPEG::Header &MPEG::Header::operator=(const Header &h) -{ - if(&h == this) - return *this; - - if(d->deref()) - delete d; - - d = h.d; - d->ref(); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::Header::parse(File *file, long offset, bool checkLength) -{ - file->seek(offset); - const ByteVector data = file->readBlock(4); - - if(data.size() < 4) { - debug("MPEG::Header::parse() -- data is too short for an MPEG frame header."); - return; - } - - // Check for the MPEG synch bytes. - - if(!isFrameSync(data)) { - debug("MPEG::Header::parse() -- MPEG header did not match MPEG synch."); - return; - } - - // Set the MPEG version - - const int versionBits = (static_cast<unsigned char>(data[1]) >> 3) & 0x03; - - if(versionBits == 0) - d->version = Version2_5; - else if(versionBits == 2) - d->version = Version2; - else if(versionBits == 3) - d->version = Version1; - else - return; - - // Set the MPEG layer - - const int layerBits = (static_cast<unsigned char>(data[1]) >> 1) & 0x03; - - if(layerBits == 1) - d->layer = 3; - else if(layerBits == 2) - d->layer = 2; - else if(layerBits == 3) - d->layer = 1; - else - return; - - d->protectionEnabled = (static_cast<unsigned char>(data[1] & 0x01) == 0); - - // Set the bitrate - - static const int bitrates[2][3][16] = { - { // Version 1 - { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // layer 1 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // layer 2 - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 } // layer 3 - }, - { // Version 2 or 2.5 - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, // layer 1 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } // layer 3 - } - }; - - const int versionIndex = (d->version == Version1) ? 0 : 1; - const int layerIndex = (d->layer > 0) ? d->layer - 1 : 0; - - // The bitrate index is encoded as the first 4 bits of the 3rd byte, - // i.e. 1111xxxx - - const int bitrateIndex = (static_cast<unsigned char>(data[2]) >> 4) & 0x0F; - - d->bitrate = bitrates[versionIndex][layerIndex][bitrateIndex]; - - if(d->bitrate == 0) - return; - - // Set the sample rate - - static const int sampleRates[3][4] = { - { 44100, 48000, 32000, 0 }, // Version 1 - { 22050, 24000, 16000, 0 }, // Version 2 - { 11025, 12000, 8000, 0 } // Version 2.5 - }; - - // The sample rate index is encoded as two bits in the 3nd byte, i.e. xxxx11xx - - const int samplerateIndex = (static_cast<unsigned char>(data[2]) >> 2) & 0x03; - - d->sampleRate = sampleRates[d->version][samplerateIndex]; - - if(d->sampleRate == 0) { - return; - } - - // The channel mode is encoded as a 2 bit value at the end of the 3nd byte, - // i.e. xxxxxx11 - - d->channelMode = static_cast<ChannelMode>((static_cast<unsigned char>(data[3]) >> 6) & 0x03); - - // TODO: Add mode extension for completeness - - d->isOriginal = ((static_cast<unsigned char>(data[3]) & 0x04) != 0); - d->isCopyrighted = ((static_cast<unsigned char>(data[3]) & 0x08) != 0); - d->isPadded = ((static_cast<unsigned char>(data[2]) & 0x02) != 0); - - // Samples per frame - - static const int samplesPerFrame[3][2] = { - // MPEG1, 2/2.5 - { 384, 384 }, // Layer I - { 1152, 1152 }, // Layer II - { 1152, 576 } // Layer III - }; - - d->samplesPerFrame = samplesPerFrame[layerIndex][versionIndex]; - - // Calculate the frame length - - static const int paddingSize[3] = { 4, 1, 1 }; - - d->frameLength = d->samplesPerFrame * d->bitrate * 125 / d->sampleRate; - - if(d->isPadded) - d->frameLength += paddingSize[layerIndex]; - - if(checkLength) { - - // Check if the frame length has been calculated correctly, or the next frame - // header is right next to the end of this frame. - - // The MPEG versions, layers and sample rates of the two frames should be - // consistent. Otherwise, we assume that either or both of the frames are - // broken. - - file->seek(offset + d->frameLength); - const ByteVector nextData = file->readBlock(4); - - if(nextData.size() < 4) - return; - - const unsigned int HeaderMask = 0xfffe0c00; - - const unsigned int header = data.toUInt(0, true) & HeaderMask; - const unsigned int nextHeader = nextData.toUInt(0, true) & HeaderMask; - - if(header != nextHeader) - return; - } - - // Now that we're done parsing, set this to be a valid frame. - - d->isValid = true; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.cpp deleted file mode 100755 index d8b7bd506..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegproperties.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tstring.h> - -#include "mpegproperties.h" -#include "mpegfile.h" -#include "xingheader.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -class MPEG::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - xingHeader(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - layer(0), - version(Header::Version1), - channelMode(Header::Stereo), - protectionEnabled(false), - isCopyrighted(false), - isOriginal(false) {} - - ~PropertiesPrivate() - { - delete xingHeader; - } - - XingHeader *xingHeader; - int length; - int bitrate; - int sampleRate; - int channels; - int layer; - Header::Version version; - Header::ChannelMode channelMode; - bool protectionEnabled; - bool isCopyrighted; - bool isOriginal; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -MPEG::Properties::~Properties() -{ - delete d; -} - -int MPEG::Properties::length() const -{ - return lengthInSeconds(); -} - -int MPEG::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int MPEG::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int MPEG::Properties::bitrate() const -{ - return d->bitrate; -} - -int MPEG::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int MPEG::Properties::channels() const -{ - return d->channels; -} - -const MPEG::XingHeader *MPEG::Properties::xingHeader() const -{ - return d->xingHeader; -} - -MPEG::Header::Version MPEG::Properties::version() const -{ - return d->version; -} - -int MPEG::Properties::layer() const -{ - return d->layer; -} - -bool MPEG::Properties::protectionEnabled() const -{ - return d->protectionEnabled; -} - -MPEG::Header::ChannelMode MPEG::Properties::channelMode() const -{ - return d->channelMode; -} - -bool MPEG::Properties::isCopyrighted() const -{ - return d->isCopyrighted; -} - -bool MPEG::Properties::isOriginal() const -{ - return d->isOriginal; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::Properties::read(File *file) -{ - // Only the first valid frame is required if we have a VBR header. - - const long firstFrameOffset = file->firstFrameOffset(); - if(firstFrameOffset < 0) { - debug("MPEG::Properties::read() -- Could not find an MPEG frame in the stream."); - return; - } - - const Header firstHeader(file, firstFrameOffset, false); - - // Check for a VBR header that will help us in gathering information about a - // VBR stream. - - file->seek(firstFrameOffset); - d->xingHeader = new XingHeader(file->readBlock(firstHeader.frameLength())); - if(!d->xingHeader->isValid()) { - delete d->xingHeader; - d->xingHeader = 0; - } - - if(d->xingHeader && firstHeader.samplesPerFrame() > 0 && firstHeader.sampleRate() > 0) { - - // Read the length and the bitrate from the VBR header. - - const double timePerFrame = firstHeader.samplesPerFrame() * 1000.0 / firstHeader.sampleRate(); - const double length = timePerFrame * d->xingHeader->totalFrames(); - - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(d->xingHeader->totalSize() * 8.0 / length + 0.5); - } - else if(firstHeader.bitrate() > 0) { - - // Since there was no valid VBR header found, we hope that we're in a constant - // bitrate file. - - // TODO: Make this more robust with audio property detection for VBR without a - // Xing header. - - d->bitrate = firstHeader.bitrate(); - - // Look for the last MPEG audio frame to calculate the stream length. - - const long lastFrameOffset = file->lastFrameOffset(); - if(lastFrameOffset < 0) { - debug("MPEG::Properties::read() -- Could not find an MPEG frame in the stream."); - return; - } - - const Header lastHeader(file, lastFrameOffset, false); - const long streamLength = lastFrameOffset - firstFrameOffset + lastHeader.frameLength(); - if(streamLength > 0) - d->length = static_cast<int>(streamLength * 8.0 / d->bitrate + 0.5); - } - - d->sampleRate = firstHeader.sampleRate(); - d->channels = firstHeader.channelMode() == Header::SingleChannel ? 1 : 2; - d->version = firstHeader.version(); - d->layer = firstHeader.layer(); - d->protectionEnabled = firstHeader.protectionEnabled(); - d->channelMode = firstHeader.channelMode(); - d->isCopyrighted = firstHeader.isCopyrighted(); - d->isOriginal = firstHeader.isOriginal(); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegutils.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegutils.h deleted file mode 100755 index 31b45a43b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/mpegutils.h +++ /dev/null @@ -1,63 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_MPEGUTILS_H -#define TAGLIB_MPEGUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -namespace TagLib -{ - namespace MPEG - { - namespace - { - - /*! - * MPEG frames can be recognized by the bit pattern 11111111 111, so the - * first byte is easy to check for, however checking to see if the second byte - * starts with \e 111 is a bit more tricky, hence these functions. - * - * \note This does not check the length of the vector, since this is an - * internal utility function. - */ - inline bool isFrameSync(const ByteVector &bytes, unsigned int offset = 0) - { - // 0xFF in the second byte is possible in theory, but it's very unlikely. - - const unsigned char b1 = bytes[offset + 0]; - const unsigned char b2 = bytes[offset + 1]; - return (b1 == 0xFF && b2 != 0xFF && (b2 & 0xE0) == 0xE0); - } - - } - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/xingheader.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/xingheader.cpp deleted file mode 100755 index 6c2b25dc5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/mpeg/xingheader.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/*************************************************************************** - copyright : (C) 2003 by Ismael Orenstein - email : orenstein@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> - -#include "xingheader.h" -#include "mpegfile.h" - -using namespace TagLib; - -class MPEG::XingHeader::XingHeaderPrivate -{ -public: - XingHeaderPrivate() : - frames(0), - size(0), - type(MPEG::XingHeader::Invalid) {} - - unsigned int frames; - unsigned int size; - - MPEG::XingHeader::HeaderType type; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -MPEG::XingHeader::XingHeader(const ByteVector &data) : - d(new XingHeaderPrivate()) -{ - parse(data); -} - -MPEG::XingHeader::~XingHeader() -{ - delete d; -} - -bool MPEG::XingHeader::isValid() const -{ - return (d->type != Invalid && d->frames > 0 && d->size > 0); -} - -unsigned int MPEG::XingHeader::totalFrames() const -{ - return d->frames; -} - -unsigned int MPEG::XingHeader::totalSize() const -{ - return d->size; -} - -MPEG::XingHeader::HeaderType MPEG::XingHeader::type() const -{ - return d->type; -} - -int MPEG::XingHeader::xingHeaderOffset(TagLib::MPEG::Header::Version /*v*/, - TagLib::MPEG::Header::ChannelMode /*c*/) -{ - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void MPEG::XingHeader::parse(const ByteVector &data) -{ - // Look for a Xing header. - - long offset = data.find("Xing"); - if(offset < 0) - offset = data.find("Info"); - - if(offset >= 0) { - - // Xing header found. - - if(data.size() < static_cast<unsigned long>(offset + 16)) { - debug("MPEG::XingHeader::parse() -- Xing header found but too short."); - return; - } - - if((data[offset + 7] & 0x03) != 0x03) { - debug("MPEG::XingHeader::parse() -- Xing header doesn't contain the required information."); - return; - } - - d->frames = data.toUInt(offset + 8, true); - d->size = data.toUInt(offset + 12, true); - d->type = Xing; - } - else { - - // Xing header not found. Then look for a VBRI header. - - offset = data.find("VBRI"); - - if(offset >= 0) { - - // VBRI header found. - - if(data.size() < static_cast<unsigned long>(offset + 32)) { - debug("MPEG::XingHeader::parse() -- VBRI header found but too short."); - return; - } - - d->frames = data.toUInt(offset + 14, true); - d->size = data.toUInt(offset + 10, true); - d->type = VBRI; - } - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/flac/oggflacfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/flac/oggflacfile.cpp deleted file mode 100755 index 07ea9dccc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/flac/oggflacfile.cpp +++ /dev/null @@ -1,321 +0,0 @@ -/*************************************************************************** - copyright : (C) 2004-2005 by Allan Sandfeld Jensen - email : kde@carewolf.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include <xiphcomment.h> -#include "oggflacfile.h" - -using namespace TagLib; -using TagLib::FLAC::Properties; - -class Ogg::FLAC::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0), - streamStart(0), - streamLength(0), - scanned(false), - hasXiphComment(false), - commentPacket(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - - Properties *properties; - ByteVector streamInfoData; - ByteVector xiphCommentData; - long streamStart; - long streamLength; - bool scanned; - - bool hasXiphComment; - int commentPacket; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool Ogg::FLAC::File::isSupported(IOStream *stream) -{ - // An Ogg FLAC file has IDs "OggS" and "fLaC" somewhere. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); - return (buffer.find("OggS") >= 0 && buffer.find("fLaC") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::FLAC::File::File(FileName file, bool readProperties, - Properties::ReadStyle propertiesStyle) : - Ogg::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Ogg::FLAC::File::File(IOStream *stream, bool readProperties, - Properties::ReadStyle propertiesStyle) : - Ogg::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties, propertiesStyle); -} - -Ogg::FLAC::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Ogg::FLAC::File::tag() const -{ - return d->comment; -} - -PropertyMap Ogg::FLAC::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Ogg::FLAC::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Properties *Ogg::FLAC::File::audioProperties() const -{ - return d->properties; -} - - -bool Ogg::FLAC::File::save() -{ - d->xiphCommentData = d->comment->render(false); - - // Create FLAC metadata-block: - - // Put the size in the first 32 bit (I assume no more than 24 bit are used) - - ByteVector v = ByteVector::fromUInt(d->xiphCommentData.size()); - - // Set the type of the metadata-block to be a Xiph / Vorbis comment - - v[0] = 4; - - // Append the comment-data after the 32 bit header - - v.append(d->xiphCommentData); - - // Save the packet at the old spot - // FIXME: Use padding if size is increasing - - setPacket(d->commentPacket, v); - - return Ogg::File::save(); -} - -bool Ogg::FLAC::File::hasXiphComment() const -{ - return d->hasXiphComment; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::FLAC::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) -{ - // Sanity: Check if we really have an Ogg/FLAC file - -/* - ByteVector oggHeader = packet(0); - - if (oggHeader.mid(28,4) != "fLaC") { - debug("Ogg::FLAC::File::read() -- Not an Ogg/FLAC file"); - setValid(false); - return; - }*/ - - // Look for FLAC metadata, including vorbis comments - - scan(); - - if (!d->scanned) { - setValid(false); - return; - } - - - if(d->hasXiphComment) - d->comment = new Ogg::XiphComment(xiphCommentData()); - else - d->comment = new Ogg::XiphComment(); - - - if(readProperties) - d->properties = new Properties(streamInfoData(), streamLength(), propertiesStyle); -} - -ByteVector Ogg::FLAC::File::streamInfoData() -{ - scan(); - return d->streamInfoData; -} - -ByteVector Ogg::FLAC::File::xiphCommentData() -{ - scan(); - return d->xiphCommentData; -} - -long Ogg::FLAC::File::streamLength() -{ - scan(); - return d->streamLength; -} - -void Ogg::FLAC::File::scan() -{ - // Scan the metadata pages - - if(d->scanned) - return; - - if(!isValid()) - return; - - int ipacket = 0; - long overhead = 0; - - ByteVector metadataHeader = packet(ipacket); - if(metadataHeader.isEmpty()) - return; - - if(!metadataHeader.startsWith("fLaC")) { - // FLAC 1.1.2+ - // See https://xiph.org/flac/ogg_mapping.html for the header specification. - if(metadataHeader.size() < 13) - return; - - if(metadataHeader[0] != 0x7f) - return; - - if(metadataHeader.mid(1, 4) != "FLAC") - return; - - if(metadataHeader[5] != 1 && metadataHeader[6] != 0) - return; // not version 1.0 - - if(metadataHeader.mid(9, 4) != "fLaC") - return; - - metadataHeader = metadataHeader.mid(13); - } - else { - // FLAC 1.1.0 & 1.1.1 - metadataHeader = packet(++ipacket); - } - - ByteVector header = metadataHeader.mid(0, 4); - if(header.size() != 4) { - debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC metadata header"); - return; - } - - // Header format (from spec): - // <1> Last-metadata-block flag - // <7> BLOCK_TYPE - // 0 : STREAMINFO - // 1 : PADDING - // .. - // 4 : VORBIS_COMMENT - // .. - // <24> Length of metadata to follow - - char blockType = header[0] & 0x7f; - bool lastBlock = (header[0] & 0x80) != 0; - unsigned int length = header.toUInt(1, 3, true); - overhead += length; - - // Sanity: First block should be the stream_info metadata - - if(blockType != 0) { - debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC stream"); - return; - } - - d->streamInfoData = metadataHeader.mid(4, length); - - // Search through the remaining metadata - - while(!lastBlock) { - metadataHeader = packet(++ipacket); - header = metadataHeader.mid(0, 4); - if(header.size() != 4) { - debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC metadata header"); - return; - } - - blockType = header[0] & 0x7f; - lastBlock = (header[0] & 0x80) != 0; - length = header.toUInt(1, 3, true); - overhead += length; - - if(blockType == 1) { - // debug("Ogg::FLAC::File::scan() -- Padding found"); - } - else if(blockType == 4) { - // debug("Ogg::FLAC::File::scan() -- Vorbis-comments found"); - d->xiphCommentData = metadataHeader.mid(4, length); - d->hasXiphComment = true; - d->commentPacket = ipacket; - } - else if(blockType > 5) { - debug("Ogg::FLAC::File::scan() -- Unknown metadata block"); - } - } - - // End of metadata, now comes the datastream - d->streamStart = overhead; - d->streamLength = File::length() - d->streamStart; - - d->scanned = true; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggfile.cpp deleted file mode 100755 index c36e4d46c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggfile.cpp +++ /dev/null @@ -1,313 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorlist.h> -#include <tmap.h> -#include <tstring.h> -#include <tdebug.h> - -#include "oggfile.h" -#include "oggpage.h" -#include "oggpageheader.h" - -using namespace TagLib; - -namespace -{ - // Returns the first packet index of the right next page to the given one. - unsigned int nextPacketIndex(const Ogg::Page *page) - { - if(page->header()->lastPacketCompleted()) - return page->firstPacketIndex() + page->packetCount(); - else - return page->firstPacketIndex() + page->packetCount() - 1; - } -} - -class Ogg::File::FilePrivate -{ -public: - FilePrivate() : - firstPageHeader(0), - lastPageHeader(0) - { - pages.setAutoDelete(true); - } - - ~FilePrivate() - { - delete firstPageHeader; - delete lastPageHeader; - } - - unsigned int streamSerialNumber; - List<Page *> pages; - PageHeader *firstPageHeader; - PageHeader *lastPageHeader; - Map<unsigned int, ByteVector> dirtyPackets; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::File::~File() -{ - delete d; -} - -ByteVector Ogg::File::packet(unsigned int i) -{ - // Check to see if we're called setPacket() for this packet since the last - // save: - - if(d->dirtyPackets.contains(i)) - return d->dirtyPackets[i]; - - // If we haven't indexed the page where the packet we're interested in starts, - // begin reading pages until we have. - - if(!readPages(i)) { - debug("Ogg::File::packet() -- Could not find the requested packet."); - return ByteVector(); - } - - // Look for the first page in which the requested packet starts. - - List<Page *>::ConstIterator it = d->pages.begin(); - while((*it)->containsPacket(i) == Page::DoesNotContainPacket) - ++it; - - // If the packet is completely contained in the first page that it's in. - - // If the packet is *not* completely contained in the first page that it's a - // part of then that packet trails off the end of the page. Continue appending - // the pages' packet data until we hit a page that either does not end with the - // packet that we're fetching or where the last packet is complete. - - ByteVector packet = (*it)->packets()[i - (*it)->firstPacketIndex()]; - - while(nextPacketIndex(*it) <= i) { - ++it; - packet.append((*it)->packets().front()); - } - - return packet; -} - -void Ogg::File::setPacket(unsigned int i, const ByteVector &p) -{ - if(!readPages(i)) { - debug("Ogg::File::setPacket() -- Could not set the requested packet."); - return; - } - - d->dirtyPackets[i] = p; -} - -const Ogg::PageHeader *Ogg::File::firstPageHeader() -{ - if(!d->firstPageHeader) { - const long firstPageHeaderOffset = find("OggS"); - if(firstPageHeaderOffset < 0) - return 0; - - d->firstPageHeader = new PageHeader(this, firstPageHeaderOffset); - } - - return d->firstPageHeader->isValid() ? d->firstPageHeader : 0; -} - -const Ogg::PageHeader *Ogg::File::lastPageHeader() -{ - if(!d->lastPageHeader) { - const long lastPageHeaderOffset = rfind("OggS"); - if(lastPageHeaderOffset < 0) - return 0; - - d->lastPageHeader = new PageHeader(this, lastPageHeaderOffset); - } - - return d->lastPageHeader->isValid() ? d->lastPageHeader : 0; -} - -bool Ogg::File::save() -{ - if(readOnly()) { - debug("Ogg::File::save() - Cannot save to a read only file."); - return false; - } - - Map<unsigned int, ByteVector>::ConstIterator it; - for(it = d->dirtyPackets.begin(); it != d->dirtyPackets.end(); ++it) - writePacket(it->first, it->second); - - d->dirtyPackets.clear(); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::File::File(FileName file) : - TagLib::File(file), - d(new FilePrivate()) -{ -} - -Ogg::File::File(IOStream *stream) : - TagLib::File(stream), - d(new FilePrivate()) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -bool Ogg::File::readPages(unsigned int i) -{ - while(true) { - unsigned int packetIndex; - long offset; - - if(d->pages.isEmpty()) { - packetIndex = 0; - offset = find("OggS"); - if(offset < 0) - return false; - } - else { - const Page *page = d->pages.back(); - packetIndex = nextPacketIndex(page); - offset = page->fileOffset() + page->size(); - } - - // Enough pages have been fetched. - - if(packetIndex > i) - return true; - - // Read the next page and add it to the page list. - - Page *nextPage = new Page(this, offset); - if(!nextPage->header()->isValid()) { - delete nextPage; - return false; - } - - nextPage->setFirstPacketIndex(packetIndex); - d->pages.append(nextPage); - - if(nextPage->header()->lastPageOfStream()) - return false; - } -} - -void Ogg::File::writePacket(unsigned int i, const ByteVector &packet) -{ - if(!readPages(i)) { - debug("Ogg::File::writePacket() -- Could not find the requested packet."); - return; - } - - // Look for the pages where the requested packet should belong to. - - List<Page *>::ConstIterator it = d->pages.begin(); - while((*it)->containsPacket(i) == Page::DoesNotContainPacket) - ++it; - - const Page *firstPage = *it; - - while(nextPacketIndex(*it) <= i) - ++it; - - const Page *lastPage = *it; - - // Replace the requested packet and create new pages to replace the located pages. - - ByteVectorList packets = firstPage->packets(); - packets[i - firstPage->firstPacketIndex()] = packet; - - if(firstPage != lastPage && lastPage->packetCount() > 1) { - ByteVectorList lastPagePackets = lastPage->packets(); - lastPagePackets.erase(lastPagePackets.begin()); - packets.append(lastPagePackets); - } - - // TODO: This pagination method isn't accurate for what's being done here. - // This should account for real possibilities like non-aligned packets and such. - - List<Page *> pages = Page::paginate(packets, - Page::SinglePagePerGroup, - firstPage->header()->streamSerialNumber(), - firstPage->pageSequenceNumber(), - firstPage->header()->firstPacketContinued(), - lastPage->header()->lastPacketCompleted()); - pages.setAutoDelete(true); - - // Write the pages. - - ByteVector data; - for(it = pages.begin(); it != pages.end(); ++it) - data.append((*it)->render()); - - const unsigned long originalOffset = firstPage->fileOffset(); - const unsigned long originalLength = lastPage->fileOffset() + lastPage->size() - originalOffset; - - insert(data, originalOffset, originalLength); - - // Renumber the following pages if the pages have been split or merged. - - const int numberOfNewPages - = pages.back()->pageSequenceNumber() - lastPage->pageSequenceNumber(); - - if(numberOfNewPages != 0) { - long pageOffset = originalOffset + data.size(); - - while(true) { - Page page(this, pageOffset); - if(!page.header()->isValid()) - break; - - page.setPageSequenceNumber(page.pageSequenceNumber() + numberOfNewPages); - const ByteVector data = page.render(); - - seek(pageOffset + 18); - writeBlock(data.mid(18, 8)); - - if(page.header()->lastPageOfStream()) - break; - - pageOffset += page.size(); - } - } - - // Discard all the pages to keep them up-to-date by fetching them again. - - d->pages.clear(); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpage.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpage.cpp deleted file mode 100755 index 414d3d530..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpage.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> - -#include <tstring.h> -#include <tdebug.h> - -#include "oggpage.h" -#include "oggpageheader.h" -#include "oggfile.h" - -using namespace TagLib; - -class Ogg::Page::PagePrivate -{ -public: - PagePrivate(File *f = 0, long pageOffset = -1) : - file(f), - fileOffset(pageOffset), - header(f, pageOffset), - firstPacketIndex(-1) {} - - File *file; - long fileOffset; - PageHeader header; - int firstPacketIndex; - ByteVectorList packets; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::Page::Page(Ogg::File *file, long pageOffset) : - d(new PagePrivate(file, pageOffset)) -{ -} - -Ogg::Page::~Page() -{ - delete d; -} - -long Ogg::Page::fileOffset() const -{ - return d->fileOffset; -} - -const Ogg::PageHeader *Ogg::Page::header() const -{ - return &d->header; -} - -int Ogg::Page::pageSequenceNumber() const -{ - return d->header.pageSequenceNumber(); -} - -void Ogg::Page::setPageSequenceNumber(int sequenceNumber) -{ - d->header.setPageSequenceNumber(sequenceNumber); -} - -int Ogg::Page::firstPacketIndex() const -{ - return d->firstPacketIndex; -} - -void Ogg::Page::setFirstPacketIndex(int index) -{ - d->firstPacketIndex = index; -} - -Ogg::Page::ContainsPacketFlags Ogg::Page::containsPacket(int index) const -{ - const int lastPacketIndex = d->firstPacketIndex + packetCount() - 1; - if(index < d->firstPacketIndex || index > lastPacketIndex) - return DoesNotContainPacket; - - ContainsPacketFlags flags = DoesNotContainPacket; - - if(index == d->firstPacketIndex) - flags = ContainsPacketFlags(flags | BeginsWithPacket); - - if(index == lastPacketIndex) - flags = ContainsPacketFlags(flags | EndsWithPacket); - - // If there's only one page and it's complete: - - if(packetCount() == 1 && - !d->header.firstPacketContinued() && - d->header.lastPacketCompleted()) - { - flags = ContainsPacketFlags(flags | CompletePacket); - } - - // Or if there is more than one page and the page is - // (a) the first page and it's complete or - // (b) the last page and it's complete or - // (c) a page in the middle. - else if(packetCount() > 1 && - ((flags & BeginsWithPacket && !d->header.firstPacketContinued()) || - (flags & EndsWithPacket && d->header.lastPacketCompleted()) || - (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket)))) - { - flags = ContainsPacketFlags(flags | CompletePacket); - } - - return flags; -} - -unsigned int Ogg::Page::packetCount() const -{ - return d->header.packetSizes().size(); -} - -ByteVectorList Ogg::Page::packets() const -{ - if(!d->packets.isEmpty()) - return d->packets; - - ByteVectorList l; - - if(d->file && d->header.isValid()) { - - d->file->seek(d->fileOffset + d->header.size()); - - List<int> packetSizes = d->header.packetSizes(); - - List<int>::ConstIterator it = packetSizes.begin(); - for(; it != packetSizes.end(); ++it) - l.append(d->file->readBlock(*it)); - } - else - debug("Ogg::Page::packets() -- attempting to read packets from an invalid page."); - - return l; -} - -int Ogg::Page::size() const -{ - return d->header.size() + d->header.dataSize(); -} - -ByteVector Ogg::Page::render() const -{ - ByteVector data; - - data.append(d->header.render()); - - if(d->packets.isEmpty()) { - if(d->file) { - d->file->seek(d->fileOffset + d->header.size()); - data.append(d->file->readBlock(d->header.dataSize())); - } - else - debug("Ogg::Page::render() -- this page is empty!"); - } - else { - ByteVectorList::ConstIterator it = d->packets.begin(); - for(; it != d->packets.end(); ++it) - data.append(*it); - } - - // Compute and set the checksum for the Ogg page. The checksum is taken over - // the entire page with the 4 bytes reserved for the checksum zeroed and then - // inserted in bytes 22-25 of the page header. - - const ByteVector checksum = ByteVector::fromUInt(data.checksum(), false); - std::copy(checksum.begin(), checksum.end(), data.begin() + 22); - - return data; -} - -List<Ogg::Page *> Ogg::Page::paginate(const ByteVectorList &packets, - PaginationStrategy strategy, - unsigned int streamSerialNumber, - int firstPage, - bool firstPacketContinued, - bool lastPacketCompleted, - bool containsLastPacket) -{ - // SplitSize must be a multiple of 255 in order to get the lacing values right - // create pages of about 8KB each - - static const unsigned int SplitSize = 32 * 255; - - // Force repagination if the segment table will exceed the size limit. - - if(strategy != Repaginate) { - - size_t tableSize = 0; - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) - tableSize += it->size() / 255 + 1; - - if(tableSize > 255) - strategy = Repaginate; - } - - List<Page *> l; - - // Handle creation of multiple pages with appropriate pagination. - - if(strategy == Repaginate) { - - int pageIndex = firstPage; - - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { - - const bool lastPacketInList = (it == --packets.end()); - - // mark very first packet? - - bool continued = (firstPacketContinued && it == packets.begin()); - unsigned int pos = 0; - - while(pos < it->size()) { - - const bool lastSplit = (pos + SplitSize >= it->size()); - - ByteVectorList packetList; - packetList.append(it->mid(pos, SplitSize)); - - l.append(new Page(packetList, - streamSerialNumber, - pageIndex, - continued, - lastSplit && (lastPacketInList ? lastPacketCompleted : true), - lastSplit && (containsLastPacket && lastPacketInList))); - pageIndex++; - continued = true; - - pos += SplitSize; - } - } - } - else { - l.append(new Page(packets, - streamSerialNumber, - firstPage, - firstPacketContinued, - lastPacketCompleted, - containsLastPacket)); - } - - return l; -} - -Ogg::Page* Ogg::Page::getCopyWithNewPageSequenceNumber(int /*sequenceNumber*/) -{ - debug("Ogg::Page::getCopyWithNewPageSequenceNumber() -- This function is obsolete. Returning null."); - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::Page::Page(const ByteVectorList &packets, - unsigned int streamSerialNumber, - int pageNumber, - bool firstPacketContinued, - bool lastPacketCompleted, - bool containsLastPacket) : - d(new PagePrivate()) -{ - d->header.setFirstPageOfStream(pageNumber == 0 && !firstPacketContinued); - d->header.setLastPageOfStream(containsLastPacket); - d->header.setFirstPacketContinued(firstPacketContinued); - d->header.setLastPacketCompleted(lastPacketCompleted); - d->header.setStreamSerialNumber(streamSerialNumber); - d->header.setPageSequenceNumber(pageNumber); - - // Build a page from the list of packets. - - ByteVector data; - List<int> packetSizes; - - for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { - packetSizes.append((*it).size()); - data.append(*it); - } - d->packets = packets; - d->header.setPacketSizes(packetSizes); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpageheader.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpageheader.cpp deleted file mode 100755 index b867567cb..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/oggpageheader.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <taglib.h> - -#include "oggpageheader.h" -#include "oggfile.h" - -using namespace TagLib; - -class Ogg::PageHeader::PageHeaderPrivate -{ -public: - PageHeaderPrivate() : - isValid(false), - firstPacketContinued(false), - lastPacketCompleted(false), - firstPageOfStream(false), - lastPageOfStream(false), - absoluteGranularPosition(0), - streamSerialNumber(0), - pageSequenceNumber(-1), - size(0), - dataSize(0) {} - - bool isValid; - List<int> packetSizes; - bool firstPacketContinued; - bool lastPacketCompleted; - bool firstPageOfStream; - bool lastPageOfStream; - long long absoluteGranularPosition; - unsigned int streamSerialNumber; - int pageSequenceNumber; - int size; - int dataSize; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::PageHeader::PageHeader(Ogg::File *file, long pageOffset) : - d(new PageHeaderPrivate()) -{ - if(file && pageOffset >= 0) - read(file, pageOffset); -} - -Ogg::PageHeader::~PageHeader() -{ - delete d; -} - -bool Ogg::PageHeader::isValid() const -{ - return d->isValid; -} - -List<int> Ogg::PageHeader::packetSizes() const -{ - return d->packetSizes; -} - -void Ogg::PageHeader::setPacketSizes(const List<int> &sizes) -{ - d->packetSizes = sizes; -} - -bool Ogg::PageHeader::firstPacketContinued() const -{ - return d->firstPacketContinued; -} - -void Ogg::PageHeader::setFirstPacketContinued(bool continued) -{ - d->firstPacketContinued = continued; -} - -bool Ogg::PageHeader::lastPacketCompleted() const -{ - return d->lastPacketCompleted; -} - -void Ogg::PageHeader::setLastPacketCompleted(bool completed) -{ - d->lastPacketCompleted = completed; -} - -bool Ogg::PageHeader::firstPageOfStream() const -{ - return d->firstPageOfStream; -} - -void Ogg::PageHeader::setFirstPageOfStream(bool first) -{ - d->firstPageOfStream = first; -} - -bool Ogg::PageHeader::lastPageOfStream() const -{ - return d->lastPageOfStream; -} - -void Ogg::PageHeader::setLastPageOfStream(bool last) -{ - d->lastPageOfStream = last; -} - -long long Ogg::PageHeader::absoluteGranularPosition() const -{ - return d->absoluteGranularPosition; -} - -void Ogg::PageHeader::setAbsoluteGranularPosition(long long agp) -{ - d->absoluteGranularPosition = agp; -} - -int Ogg::PageHeader::pageSequenceNumber() const -{ - return d->pageSequenceNumber; -} - -void Ogg::PageHeader::setPageSequenceNumber(int sequenceNumber) -{ - d->pageSequenceNumber = sequenceNumber; -} - -unsigned int Ogg::PageHeader::streamSerialNumber() const -{ - return d->streamSerialNumber; -} - -void Ogg::PageHeader::setStreamSerialNumber(unsigned int n) -{ - d->streamSerialNumber = n; -} - -int Ogg::PageHeader::size() const -{ - return d->size; -} - -int Ogg::PageHeader::dataSize() const -{ - return d->dataSize; -} - -ByteVector Ogg::PageHeader::render() const -{ - ByteVector data; - - // capture pattern - - data.append("OggS"); - - // stream structure version - - data.append(char(0)); - - // header type flag - - std::bitset<8> flags; - flags[0] = d->firstPacketContinued; - flags[1] = d->pageSequenceNumber == 0; - flags[2] = d->lastPageOfStream; - - data.append(char(flags.to_ulong())); - - // absolute granular position - - data.append(ByteVector::fromLongLong(d->absoluteGranularPosition, false)); - - // stream serial number - - data.append(ByteVector::fromUInt(d->streamSerialNumber, false)); - - // page sequence number - - data.append(ByteVector::fromUInt(d->pageSequenceNumber, false)); - - // checksum -- this is left empty and should be filled in by the Ogg::Page - // class - - data.append(ByteVector(4, 0)); - - // page segment count and page segment table - - ByteVector pageSegments = lacingValues(); - - data.append(static_cast<unsigned char>(pageSegments.size())); - data.append(pageSegments); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::PageHeader::read(Ogg::File *file, long pageOffset) -{ - file->seek(pageOffset); - - // An Ogg page header is at least 27 bytes, so we'll go ahead and read that - // much and then get the rest when we're ready for it. - - const ByteVector data = file->readBlock(27); - - // Sanity check -- make sure that we were in fact able to read as much data as - // we asked for and that the page begins with "OggS". - - if(data.size() != 27 || !data.startsWith("OggS")) { - debug("Ogg::PageHeader::read() -- error reading page header"); - return; - } - - const std::bitset<8> flags(data[5]); - - d->firstPacketContinued = flags.test(0); - d->firstPageOfStream = flags.test(1); - d->lastPageOfStream = flags.test(2); - - d->absoluteGranularPosition = data.toLongLong(6, false); - d->streamSerialNumber = data.toUInt(14, false); - d->pageSequenceNumber = data.toUInt(18, false); - - // Byte number 27 is the number of page segments, which is the only variable - // length portion of the page header. After reading the number of page - // segments we'll then read in the corresponding data for this count. - - int pageSegmentCount = static_cast<unsigned char>(data[26]); - - const ByteVector pageSegments = file->readBlock(pageSegmentCount); - - // Another sanity check. - - if(pageSegmentCount < 1 || int(pageSegments.size()) != pageSegmentCount) - return; - - // The base size of an Ogg page 27 bytes plus the number of lacing values. - - d->size = 27 + pageSegmentCount; - - int packetSize = 0; - - for(int i = 0; i < pageSegmentCount; i++) { - d->dataSize += static_cast<unsigned char>(pageSegments[i]); - packetSize += static_cast<unsigned char>(pageSegments[i]); - - if(static_cast<unsigned char>(pageSegments[i]) < 255) { - d->packetSizes.append(packetSize); - packetSize = 0; - } - } - - if(packetSize > 0) { - d->packetSizes.append(packetSize); - d->lastPacketCompleted = false; - } - else - d->lastPacketCompleted = true; - - d->isValid = true; -} - -ByteVector Ogg::PageHeader::lacingValues() const -{ - ByteVector data; - - for(List<int>::ConstIterator it = d->packetSizes.begin(); it != d->packetSizes.end(); ++it) { - - // The size of a packet in an Ogg page is indicated by a series of "lacing - // values" where the sum of the values is the packet size in bytes. Each of - // these values is a byte. A value of less than 255 (0xff) indicates the end - // of the packet. - - data.resize(data.size() + (*it / 255), '\xff'); - - if(it != --d->packetSizes.end() || d->lastPacketCompleted) - data.append(static_cast<unsigned char>(*it % 255)); - } - - return data; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusfile.cpp deleted file mode 100755 index d4f191ad1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusfile.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "opusfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Opus::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool Ogg::Opus::File::isSupported(IOStream *stream) -{ - // An Opus file has IDs "OggS" and "OpusHead" somewhere. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); - return (buffer.find("OggS") >= 0 && buffer.find("OpusHead") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Opus::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - Ogg::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Opus::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - Ogg::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Opus::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Opus::File::tag() const -{ - return d->comment; -} - -PropertyMap Opus::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Opus::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Opus::Properties *Opus::File::audioProperties() const -{ - return d->properties; -} - -bool Opus::File::save() -{ - if(!d->comment) - d->comment = new Ogg::XiphComment(); - - setPacket(1, ByteVector("OpusTags", 8) + d->comment->render(false)); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Opus::File::read(bool readProperties) -{ - ByteVector opusHeaderData = packet(0); - - if(!opusHeaderData.startsWith("OpusHead")) { - setValid(false); - debug("Opus::File::read() -- invalid Opus identification header"); - return; - } - - ByteVector commentHeaderData = packet(1); - - if(!commentHeaderData.startsWith("OpusTags")) { - setValid(false); - debug("Opus::File::read() -- invalid Opus tags header"); - return; - } - - d->comment = new Ogg::XiphComment(commentHeaderData.mid(8)); - - if(readProperties) - d->properties = new Properties(this); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.cpp deleted file mode 100755 index b60cc01d6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/opus/opusproperties.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "opusproperties.h" -#include "opusfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Opus::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - inputSampleRate(0), - channels(0), - opusVersion(0) {} - - int length; - int bitrate; - int inputSampleRate; - int channels; - int opusVersion; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Opus::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -Opus::Properties::~Properties() -{ - delete d; -} - -int Opus::Properties::length() const -{ - return lengthInSeconds(); -} - -int Ogg::Opus::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int Ogg::Opus::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int Opus::Properties::bitrate() const -{ - return d->bitrate; -} - -int Opus::Properties::sampleRate() const -{ - // Opus can decode any stream at a sample rate of 8, 12, 16, 24, or 48 kHz, - // so there is no single sample rate. Let's assume it's the highest - // possible. - return 48000; -} - -int Opus::Properties::channels() const -{ - return d->channels; -} - -int Opus::Properties::inputSampleRate() const -{ - return d->inputSampleRate; -} - -int Opus::Properties::opusVersion() const -{ - return d->opusVersion; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Opus::Properties::read(File *file) -{ - // Get the identification header from the Ogg implementation. - - // http://tools.ietf.org/html/draft-terriberry-oggopus-01#section-5.1 - - const ByteVector data = file->packet(0); - - // *Magic Signature* - unsigned int pos = 8; - - // *Version* (8 bits, unsigned) - d->opusVersion = static_cast<unsigned char>(data.at(pos)); - pos += 1; - - // *Output Channel Count* 'C' (8 bits, unsigned) - d->channels = static_cast<unsigned char>(data.at(pos)); - pos += 1; - - // *Pre-skip* (16 bits, unsigned, little endian) - const unsigned short preSkip = data.toUShort(pos, false); - pos += 2; - - // *Input Sample Rate* (32 bits, unsigned, little endian) - d->inputSampleRate = data.toUInt(pos, false); - pos += 4; - - // *Output Gain* (16 bits, signed, little endian) - pos += 2; - - // *Channel Mapping Family* (8 bits, unsigned) - pos += 1; - - const Ogg::PageHeader *first = file->firstPageHeader(); - const Ogg::PageHeader *last = file->lastPageHeader(); - - if(first && last) { - const long long start = first->absoluteGranularPosition(); - const long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0) { - const long long frameCount = (end - start - preSkip); - - if(frameCount > 0) { - const double length = frameCount * 1000.0 / 48000.0; - long fileLengthWithoutOverhead = file->length(); - // Ignore the two mandatory header packets, see "3. Packet Organization" - // in https://tools.ietf.org/html/rfc7845.html - for (unsigned int i = 0; i < 2; ++i) { - fileLengthWithoutOverhead -= file->packet(i).size(); - } - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); - } - } - else { - debug("Opus::Properties::read() -- The PCM values for the start or " - "end of this file was incorrect."); - } - } - else - debug("Opus::Properties::read() -- Could not find valid first and last Ogg pages."); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexfile.cpp deleted file mode 100755 index 394cb17be..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexfile.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "speexfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Speex::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool Ogg::Speex::File::isSupported(IOStream *stream) -{ - // A Speex file has IDs "OggS" and "Speex " somewhere. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); - return (buffer.find("OggS") >= 0 && buffer.find("Speex ") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Speex::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - Ogg::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Speex::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - Ogg::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Speex::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Speex::File::tag() const -{ - return d->comment; -} - -PropertyMap Speex::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Speex::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Speex::Properties *Speex::File::audioProperties() const -{ - return d->properties; -} - -bool Speex::File::save() -{ - if(!d->comment) - d->comment = new Ogg::XiphComment(); - - setPacket(1, d->comment->render()); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Speex::File::read(bool readProperties) -{ - ByteVector speexHeaderData = packet(0); - - if(!speexHeaderData.startsWith("Speex ")) { - debug("Speex::File::read() -- invalid Speex identification header"); - setValid(false); - return; - } - - ByteVector commentHeaderData = packet(1); - - d->comment = new Ogg::XiphComment(commentHeaderData); - - if(readProperties) - d->properties = new Properties(this); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.cpp deleted file mode 100755 index b7a11cc6e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/speex/speexproperties.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - (original Vorbis implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "speexproperties.h" -#include "speexfile.h" - -using namespace TagLib; -using namespace TagLib::Ogg; - -class Speex::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - bitrateNominal(0), - sampleRate(0), - channels(0), - speexVersion(0), - vbr(false), - mode(0) {} - - int length; - int bitrate; - int bitrateNominal; - int sampleRate; - int channels; - int speexVersion; - bool vbr; - int mode; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Speex::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -Speex::Properties::~Properties() -{ - delete d; -} - -int Speex::Properties::length() const -{ - return lengthInSeconds(); -} - -int Speex::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int Speex::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int Speex::Properties::bitrate() const -{ - return d->bitrate; -} - -int Speex::Properties::bitrateNominal() const -{ - return d->bitrateNominal; -} - -int Speex::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int Speex::Properties::channels() const -{ - return d->channels; -} - -int Speex::Properties::speexVersion() const -{ - return d->speexVersion; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Speex::Properties::read(File *file) -{ - // Get the identification header from the Ogg implementation. - - const ByteVector data = file->packet(0); - if(data.size() < 64) { - debug("Speex::Properties::read() -- data is too short."); - return; - } - - unsigned int pos = 28; - - // speex_version_id; /**< Version for Speex (for checking compatibility) */ - d->speexVersion = data.toUInt(pos, false); - pos += 4; - - // header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ - pos += 4; - - // rate; /**< Sampling rate used */ - d->sampleRate = data.toUInt(pos, false); - pos += 4; - - // mode; /**< Mode used (0 for narrowband, 1 for wideband) */ - d->mode = data.toUInt(pos, false); - pos += 4; - - // mode_bitstream_version; /**< Version ID of the bit-stream */ - pos += 4; - - // nb_channels; /**< Number of channels encoded */ - d->channels = data.toUInt(pos, false); - pos += 4; - - // bitrate; /**< Bit-rate used */ - d->bitrateNominal = data.toUInt(pos, false); - pos += 4; - - // frame_size; /**< Size of frames */ - // unsigned int frameSize = data.mid(pos, 4).toUInt(false); - pos += 4; - - // vbr; /**< 1 for a VBR encoding, 0 otherwise */ - d->vbr = data.toUInt(pos, false) == 1; - pos += 4; - - // frames_per_packet; /**< Number of frames stored per Ogg packet */ - // unsigned int framesPerPacket = data.mid(pos, 4).toUInt(false); - - const Ogg::PageHeader *first = file->firstPageHeader(); - const Ogg::PageHeader *last = file->lastPageHeader(); - - if(first && last) { - const long long start = first->absoluteGranularPosition(); - const long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0 && d->sampleRate > 0) { - const long long frameCount = end - start; - - if(frameCount > 0) { - const double length = frameCount * 1000.0 / d->sampleRate; - long fileLengthWithoutOverhead = file->length(); - // Ignore the two header packets, see "Ogg file format" in - // https://www.speex.org/docs/manual/speex-manual/node8.html - for (unsigned int i = 0; i < 2; ++i) { - fileLengthWithoutOverhead -= file->packet(i).size(); - } - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); - } - } - else { - debug("Speex::Properties::read() -- Either the PCM values for the start or " - "end of this file was incorrect or the sample rate is zero."); - } - } - else - debug("Speex::Properties::read() -- Could not find valid first and last Ogg pages."); - - // Alternative to the actual average bitrate. - - if(d->bitrate == 0 && d->bitrateNominal > 0) - d->bitrate = static_cast<int>(d->bitrateNominal / 1000.0 + 0.5); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisfile.cpp deleted file mode 100755 index b4f221ab1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisfile.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <bitset> - -#include <tstring.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "vorbisfile.h" - -using namespace TagLib; - -class Vorbis::File::FilePrivate -{ -public: - FilePrivate() : - comment(0), - properties(0) {} - - ~FilePrivate() - { - delete comment; - delete properties; - } - - Ogg::XiphComment *comment; - Properties *properties; -}; - -namespace TagLib { - /*! - * Vorbis headers can be found with one type ID byte and the string "vorbis" in - * an Ogg stream. 0x03 indicates the comment header. - */ - static const char vorbisCommentHeaderID[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's', 0 }; -} - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool Vorbis::File::isSupported(IOStream *stream) -{ - // An Ogg Vorbis file has IDs "OggS" and "\x01vorbis" somewhere. - - const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); - return (buffer.find("OggS") >= 0 && buffer.find("\x01vorbis") >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Vorbis::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - Ogg::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Vorbis::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - Ogg::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -Vorbis::File::~File() -{ - delete d; -} - -Ogg::XiphComment *Vorbis::File::tag() const -{ - return d->comment; -} - -PropertyMap Vorbis::File::properties() const -{ - return d->comment->properties(); -} - -PropertyMap Vorbis::File::setProperties(const PropertyMap &properties) -{ - return d->comment->setProperties(properties); -} - -Vorbis::Properties *Vorbis::File::audioProperties() const -{ - return d->properties; -} - -bool Vorbis::File::save() -{ - ByteVector v(vorbisCommentHeaderID); - - if(!d->comment) - d->comment = new Ogg::XiphComment(); - v.append(d->comment->render()); - - setPacket(1, v); - - return Ogg::File::save(); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Vorbis::File::read(bool readProperties) -{ - ByteVector commentHeaderData = packet(1); - - if(commentHeaderData.mid(0, 7) != vorbisCommentHeaderID) { - debug("Vorbis::File::read() - Could not find the Vorbis comment header."); - setValid(false); - return; - } - - d->comment = new Ogg::XiphComment(commentHeaderData.mid(7)); - - if(readProperties) - d->properties = new Properties(this); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.cpp deleted file mode 100755 index 4000c254d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/vorbis/vorbisproperties.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include <oggpageheader.h> - -#include "vorbisproperties.h" -#include "vorbisfile.h" - -using namespace TagLib; - -class Vorbis::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - vorbisVersion(0), - bitrateMaximum(0), - bitrateNominal(0), - bitrateMinimum(0) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int vorbisVersion; - int bitrateMaximum; - int bitrateNominal; - int bitrateMinimum; -}; - -namespace TagLib { - /*! - * Vorbis headers can be found with one type ID byte and the string "vorbis" in - * an Ogg stream. 0x01 indicates the setup header. - */ - static const char vorbisSetupHeaderID[] = { 0x01, 'v', 'o', 'r', 'b', 'i', 's', 0 }; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Vorbis::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -Vorbis::Properties::~Properties() -{ - delete d; -} - -int Vorbis::Properties::length() const -{ - return lengthInSeconds(); -} - -int Vorbis::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int Vorbis::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int Vorbis::Properties::bitrate() const -{ - return d->bitrate; -} - -int Vorbis::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int Vorbis::Properties::channels() const -{ - return d->channels; -} - -int Vorbis::Properties::vorbisVersion() const -{ - return d->vorbisVersion; -} - -int Vorbis::Properties::bitrateMaximum() const -{ - return d->bitrateMaximum; -} - -int Vorbis::Properties::bitrateNominal() const -{ - return d->bitrateNominal; -} - -int Vorbis::Properties::bitrateMinimum() const -{ - return d->bitrateMinimum; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void Vorbis::Properties::read(File *file) -{ - // Get the identification header from the Ogg implementation. - - const ByteVector data = file->packet(0); - if(data.size() < 28) { - debug("Vorbis::Properties::read() -- data is too short."); - return; - } - - unsigned int pos = 0; - - if(data.mid(pos, 7) != vorbisSetupHeaderID) { - debug("Vorbis::Properties::read() -- invalid Vorbis identification header"); - return; - } - - pos += 7; - - d->vorbisVersion = data.toUInt(pos, false); - pos += 4; - - d->channels = static_cast<unsigned char>(data[pos]); - pos += 1; - - d->sampleRate = data.toUInt(pos, false); - pos += 4; - - d->bitrateMaximum = data.toUInt(pos, false); - pos += 4; - - d->bitrateNominal = data.toUInt(pos, false); - pos += 4; - - d->bitrateMinimum = data.toUInt(pos, false); - pos += 4; - - // Find the length of the file. See http://wiki.xiph.org/VorbisStreamLength/ - // for my notes on the topic. - - const Ogg::PageHeader *first = file->firstPageHeader(); - const Ogg::PageHeader *last = file->lastPageHeader(); - - if(first && last) { - const long long start = first->absoluteGranularPosition(); - const long long end = last->absoluteGranularPosition(); - - if(start >= 0 && end >= 0 && d->sampleRate > 0) { - const long long frameCount = end - start; - - if(frameCount > 0) { - const double length = frameCount * 1000.0 / d->sampleRate; - long fileLengthWithoutOverhead = file->length(); - // Ignore the three initial header packets, see "1.3.1. Decode Setup" in - // https://xiph.org/vorbis/doc/Vorbis_I_spec.html - for (unsigned int i = 0; i < 3; ++i) { - fileLengthWithoutOverhead -= file->packet(i).size(); - } - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); - } - } - else { - debug("Vorbis::Properties::read() -- Either the PCM values for the start or " - "end of this file was incorrect or the sample rate is zero."); - } - } - else - debug("Vorbis::Properties::read() -- Could not find valid first and last Ogg pages."); - - // Alternative to the actual average bitrate. - - if(d->bitrate == 0 && d->bitrateNominal > 0) - d->bitrate = static_cast<int>(d->bitrateNominal / 1000.0 + 0.5); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.cpp deleted file mode 100755 index f56bf810c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/ogg/xiphcomment.cpp +++ /dev/null @@ -1,515 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> - -#include <flacpicture.h> -#include <xiphcomment.h> -#include <tpropertymap.h> - -using namespace TagLib; - -namespace -{ - typedef Ogg::FieldListMap::Iterator FieldIterator; - typedef Ogg::FieldListMap::ConstIterator FieldConstIterator; - - typedef List<FLAC::Picture *> PictureList; - typedef PictureList::Iterator PictureIterator; - typedef PictureList::Iterator PictureConstIterator; -} - -class Ogg::XiphComment::XiphCommentPrivate -{ -public: - XiphCommentPrivate() - { - pictureList.setAutoDelete(true); - } - - FieldListMap fieldListMap; - String vendorID; - String commentField; - PictureList pictureList; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -Ogg::XiphComment::XiphComment() : - TagLib::Tag(), - d(new XiphCommentPrivate()) -{ -} - -Ogg::XiphComment::XiphComment(const ByteVector &data) : - TagLib::Tag(), - d(new XiphCommentPrivate()) -{ - parse(data); -} - -Ogg::XiphComment::~XiphComment() -{ - delete d; -} - -String Ogg::XiphComment::title() const -{ - if(d->fieldListMap["TITLE"].isEmpty()) - return String(); - return d->fieldListMap["TITLE"].toString(); -} - -String Ogg::XiphComment::artist() const -{ - if(d->fieldListMap["ARTIST"].isEmpty()) - return String(); - return d->fieldListMap["ARTIST"].toString(); -} - -String Ogg::XiphComment::album() const -{ - if(d->fieldListMap["ALBUM"].isEmpty()) - return String(); - return d->fieldListMap["ALBUM"].toString(); -} - -String Ogg::XiphComment::comment() const -{ - if(!d->fieldListMap["DESCRIPTION"].isEmpty()) { - d->commentField = "DESCRIPTION"; - return d->fieldListMap["DESCRIPTION"].toString(); - } - - if(!d->fieldListMap["COMMENT"].isEmpty()) { - d->commentField = "COMMENT"; - return d->fieldListMap["COMMENT"].toString(); - } - - return String(); -} - -String Ogg::XiphComment::genre() const -{ - if(d->fieldListMap["GENRE"].isEmpty()) - return String(); - return d->fieldListMap["GENRE"].toString(); -} - -unsigned int Ogg::XiphComment::year() const -{ - if(!d->fieldListMap["DATE"].isEmpty()) - return d->fieldListMap["DATE"].front().toInt(); - if(!d->fieldListMap["YEAR"].isEmpty()) - return d->fieldListMap["YEAR"].front().toInt(); - return 0; -} - -unsigned int Ogg::XiphComment::track() const -{ - if(!d->fieldListMap["TRACKNUMBER"].isEmpty()) - return d->fieldListMap["TRACKNUMBER"].front().toInt(); - if(!d->fieldListMap["TRACKNUM"].isEmpty()) - return d->fieldListMap["TRACKNUM"].front().toInt(); - return 0; -} - -void Ogg::XiphComment::setTitle(const String &s) -{ - addField("TITLE", s); -} - -void Ogg::XiphComment::setArtist(const String &s) -{ - addField("ARTIST", s); -} - -void Ogg::XiphComment::setAlbum(const String &s) -{ - addField("ALBUM", s); -} - -void Ogg::XiphComment::setComment(const String &s) -{ - if(d->commentField.isEmpty()) { - if(!d->fieldListMap["DESCRIPTION"].isEmpty()) - d->commentField = "DESCRIPTION"; - else - d->commentField = "COMMENT"; - } - - addField(d->commentField, s); -} - -void Ogg::XiphComment::setGenre(const String &s) -{ - addField("GENRE", s); -} - -void Ogg::XiphComment::setYear(unsigned int i) -{ - removeFields("YEAR"); - if(i == 0) - removeFields("DATE"); - else - addField("DATE", String::number(i)); -} - -void Ogg::XiphComment::setTrack(unsigned int i) -{ - removeFields("TRACKNUM"); - if(i == 0) - removeFields("TRACKNUMBER"); - else - addField("TRACKNUMBER", String::number(i)); -} - -bool Ogg::XiphComment::isEmpty() const -{ - for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) { - if(!(*it).second.isEmpty()) - return false; - } - - return true; -} - -unsigned int Ogg::XiphComment::fieldCount() const -{ - unsigned int count = 0; - - for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) - count += (*it).second.size(); - - count += d->pictureList.size(); - - return count; -} - -const Ogg::FieldListMap &Ogg::XiphComment::fieldListMap() const -{ - return d->fieldListMap; -} - -PropertyMap Ogg::XiphComment::properties() const -{ - return d->fieldListMap; -} - -PropertyMap Ogg::XiphComment::setProperties(const PropertyMap &properties) -{ - // check which keys are to be deleted - StringList toRemove; - for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) - if (!properties.contains(it->first)) - toRemove.append(it->first); - - for(StringList::ConstIterator it = toRemove.begin(); it != toRemove.end(); ++it) - removeFields(*it); - - // now go through keys in \a properties and check that the values match those in the xiph comment - PropertyMap invalid; - PropertyMap::ConstIterator it = properties.begin(); - for(; it != properties.end(); ++it) - { - if(!checkKey(it->first)) - invalid.insert(it->first, it->second); - else if(!d->fieldListMap.contains(it->first) || !(it->second == d->fieldListMap[it->first])) { - const StringList &sl = it->second; - if(sl.isEmpty()) - // zero size string list -> remove the tag with all values - removeFields(it->first); - else { - // replace all strings in the list for the tag - StringList::ConstIterator valueIterator = sl.begin(); - addField(it->first, *valueIterator, true); - ++valueIterator; - for(; valueIterator != sl.end(); ++valueIterator) - addField(it->first, *valueIterator, false); - } - } - } - return invalid; -} - -bool Ogg::XiphComment::checkKey(const String &key) -{ - if(key.size() < 1) - return false; - - // A key may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. - - for(String::ConstIterator it = key.begin(); it != key.end(); it++) { - if(*it < 0x20 || *it > 0x7D || *it == 0x3D) - return false; - } - - return true; -} - -String Ogg::XiphComment::vendorID() const -{ - return d->vendorID; -} - -void Ogg::XiphComment::addField(const String &key, const String &value, bool replace) -{ - if(!checkKey(key)) { - debug("Ogg::XiphComment::addField() - Invalid key. Field not added."); - return; - } - - const String upperKey = key.upper(); - - if(replace) - removeFields(upperKey); - - if(!key.isEmpty() && !value.isEmpty()) - d->fieldListMap[upperKey].append(value); -} - -void Ogg::XiphComment::removeField(const String &key, const String &value) -{ - if(!value.isNull()) - removeFields(key, value); - else - removeFields(key); -} - -void Ogg::XiphComment::removeFields(const String &key) -{ - d->fieldListMap.erase(key.upper()); -} - -void Ogg::XiphComment::removeFields(const String &key, const String &value) -{ - StringList &fields = d->fieldListMap[key.upper()]; - for(StringList::Iterator it = fields.begin(); it != fields.end(); ) { - if(*it == value) - it = fields.erase(it); - else - ++it; - } -} - -void Ogg::XiphComment::removeAllFields() -{ - d->fieldListMap.clear(); -} - -bool Ogg::XiphComment::contains(const String &key) const -{ - return !d->fieldListMap[key.upper()].isEmpty(); -} - -void Ogg::XiphComment::removePicture(FLAC::Picture *picture, bool del) -{ - PictureIterator it = d->pictureList.find(picture); - if(it != d->pictureList.end()) - d->pictureList.erase(it); - - if(del) - delete picture; -} - -void Ogg::XiphComment::removeAllPictures() -{ - d->pictureList.clear(); -} - -void Ogg::XiphComment::addPicture(FLAC::Picture * picture) -{ - d->pictureList.append(picture); -} - -List<FLAC::Picture *> Ogg::XiphComment::pictureList() -{ - return d->pictureList; -} - -ByteVector Ogg::XiphComment::render() const -{ - return render(true); -} - -ByteVector Ogg::XiphComment::render(bool addFramingBit) const -{ - ByteVector data; - - // Add the vendor ID length and the vendor ID. It's important to use the - // length of the data(String::UTF8) rather than the length of the the string - // since this is UTF8 text and there may be more characters in the data than - // in the UTF16 string. - - ByteVector vendorData = d->vendorID.data(String::UTF8); - - data.append(ByteVector::fromUInt(vendorData.size(), false)); - data.append(vendorData); - - // Add the number of fields. - - data.append(ByteVector::fromUInt(fieldCount(), false)); - - // Iterate over the the field lists. Our iterator returns a - // std::pair<String, StringList> where the first String is the field name and - // the StringList is the values associated with that field. - - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) { - - // And now iterate over the values of the current list. - - String fieldName = (*it).first; - StringList values = (*it).second; - - StringList::ConstIterator valuesIt = values.begin(); - for(; valuesIt != values.end(); ++valuesIt) { - ByteVector fieldData = fieldName.data(String::UTF8); - fieldData.append('='); - fieldData.append((*valuesIt).data(String::UTF8)); - - data.append(ByteVector::fromUInt(fieldData.size(), false)); - data.append(fieldData); - } - } - - for(PictureConstIterator it = d->pictureList.begin(); it != d->pictureList.end(); ++it) { - ByteVector picture = (*it)->render().toBase64(); - data.append(ByteVector::fromUInt(picture.size() + 23, false)); - data.append("METADATA_BLOCK_PICTURE="); - data.append(picture); - } - - // Append the "framing bit". - - if(addFramingBit) - data.append(char(1)); - - return data; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void Ogg::XiphComment::parse(const ByteVector &data) -{ - // The first thing in the comment data is the vendor ID length, followed by a - // UTF8 string with the vendor ID. - - unsigned int pos = 0; - - const unsigned int vendorLength = data.toUInt(0, false); - pos += 4; - - d->vendorID = String(data.mid(pos, vendorLength), String::UTF8); - pos += vendorLength; - - // Next the number of fields in the comment vector. - - const unsigned int commentFields = data.toUInt(pos, false); - pos += 4; - - if(commentFields > (data.size() - 8) / 4) { - return; - } - - for(unsigned int i = 0; i < commentFields; i++) { - - // Each comment field is in the format "KEY=value" in a UTF8 string and has - // 4 bytes before the text starts that gives the length. - - const unsigned int commentLength = data.toUInt(pos, false); - pos += 4; - - const ByteVector entry = data.mid(pos, commentLength); - pos += commentLength; - - // Don't go past data end - - if(pos > data.size()) - break; - - // Check for field separator - - const int sep = entry.find('='); - if(sep < 1) { - debug("Ogg::XiphComment::parse() - Discarding a field. Separator not found."); - continue; - } - - // Parse the key - - const String key = String(entry.mid(0, sep), String::UTF8).upper(); - if(!checkKey(key)) { - debug("Ogg::XiphComment::parse() - Discarding a field. Invalid key."); - continue; - } - - if(key == "METADATA_BLOCK_PICTURE" || key == "COVERART") { - - // Handle Pictures separately - - const ByteVector picturedata = ByteVector::fromBase64(entry.mid(sep + 1)); - if(picturedata.isEmpty()) { - debug("Ogg::XiphComment::parse() - Discarding a field. Invalid base64 data"); - continue; - } - - if(key[0] == L'M') { - - // Decode FLAC Picture - - FLAC::Picture * picture = new FLAC::Picture(); - if(picture->parse(picturedata)) { - d->pictureList.append(picture); - } - else { - delete picture; - debug("Ogg::XiphComment::parse() - Failed to decode FLAC Picture block"); - } - } - else { - - // Assume it's some type of image file - - FLAC::Picture * picture = new FLAC::Picture(); - picture->setData(picturedata); - picture->setMimeType("image/"); - picture->setType(FLAC::Picture::Other); - d->pictureList.append(picture); - } - } - else { - - // Parse the text - - addField(key, String(entry.mid(sep + 1), String::UTF8), false); - } - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aifffile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aifffile.cpp deleted file mode 100755 index 6ef4c9be5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aifffile.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> -#include <id3v2tag.h> -#include <tstringlist.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "aifffile.h" - -using namespace TagLib; - -class RIFF::AIFF::File::FilePrivate -{ -public: - FilePrivate() : - properties(0), - tag(0), - hasID3v2(false) {} - - ~FilePrivate() - { - delete properties; - delete tag; - } - - Properties *properties; - ID3v2::Tag *tag; - - bool hasID3v2; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool RIFF::AIFF::File::isSupported(IOStream *stream) -{ - // An AIFF file has to start with "FORM????AIFF" or "FORM????AIFC". - - const ByteVector id = Utils::readHeader(stream, 12, false); - return (id.startsWith("FORM") && (id.containsAt("AIFF", 8) || id.containsAt("AIFC", 8))); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::AIFF::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - RIFF::File(file, BigEndian), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -RIFF::AIFF::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - RIFF::File(stream, BigEndian), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -RIFF::AIFF::File::~File() -{ - delete d; -} - -ID3v2::Tag *RIFF::AIFF::File::tag() const -{ - return d->tag; -} - -PropertyMap RIFF::AIFF::File::properties() const -{ - return d->tag->properties(); -} - -void RIFF::AIFF::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag->removeUnsupportedProperties(unsupported); -} - -PropertyMap RIFF::AIFF::File::setProperties(const PropertyMap &properties) -{ - return d->tag->setProperties(properties); -} - -RIFF::AIFF::Properties *RIFF::AIFF::File::audioProperties() const -{ - return d->properties; -} - -bool RIFF::AIFF::File::save() -{ - return save(ID3v2::v4); -} - -bool RIFF::AIFF::File::save(ID3v2::Version version) -{ - if(readOnly()) { - debug("RIFF::AIFF::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("RIFF::AIFF::File::save() -- Trying to save invalid file."); - return false; - } - - if(d->hasID3v2) { - removeChunk("ID3 "); - removeChunk("id3 "); - d->hasID3v2 = false; - } - - if(tag() && !tag()->isEmpty()) { - setChunkData("ID3 ", d->tag->render(version)); - d->hasID3v2 = true; - } - - return true; -} - -bool RIFF::AIFF::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::AIFF::File::read(bool readProperties) -{ - for(unsigned int i = 0; i < chunkCount(); ++i) { - const ByteVector name = chunkName(i); - if(name == "ID3 " || name == "id3 ") { - if(!d->tag) { - d->tag = new ID3v2::Tag(this, chunkOffset(i)); - d->hasID3v2 = true; - } - else { - debug("RIFF::AIFF::File::read() - Duplicate ID3v2 tag found."); - } - } - } - - if(!d->tag) - d->tag = new ID3v2::Tag(); - - if(readProperties) - d->properties = new Properties(this, Properties::Average); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.cpp deleted file mode 100755 index e1d954feb..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/aiff/aiffproperties.cpp +++ /dev/null @@ -1,192 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include "aifffile.h" -#include "aiffproperties.h" - -using namespace TagLib; - -class RIFF::AIFF::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - sampleFrames(0) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - - ByteVector compressionType; - String compressionName; - - unsigned int sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::AIFF::Properties::Properties(const ByteVector &, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("RIFF::AIFF::Properties::Properties() - This constructor is no longer used."); -} - -RIFF::AIFF::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -RIFF::AIFF::Properties::~Properties() -{ - delete d; -} - -int RIFF::AIFF::Properties::length() const -{ - return lengthInSeconds(); -} - -int RIFF::AIFF::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int RIFF::AIFF::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int RIFF::AIFF::Properties::bitrate() const -{ - return d->bitrate; -} - -int RIFF::AIFF::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int RIFF::AIFF::Properties::channels() const -{ - return d->channels; -} - -int RIFF::AIFF::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -int RIFF::AIFF::Properties::sampleWidth() const -{ - return bitsPerSample(); -} - -unsigned int RIFF::AIFF::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -bool RIFF::AIFF::Properties::isAiffC() const -{ - return (!d->compressionType.isEmpty()); -} - -ByteVector RIFF::AIFF::Properties::compressionType() const -{ - return d->compressionType; -} - -String RIFF::AIFF::Properties::compressionName() const -{ - return d->compressionName; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::AIFF::Properties::read(File *file) -{ - ByteVector data; - unsigned int streamLength = 0; - for(unsigned int i = 0; i < file->chunkCount(); i++) { - const ByteVector name = file->chunkName(i); - if(name == "COMM") { - if(data.isEmpty()) - data = file->chunkData(i); - else - debug("RIFF::AIFF::Properties::read() - Duplicate 'COMM' chunk found."); - } - else if(name == "SSND") { - if(streamLength == 0) - streamLength = file->chunkDataSize(i) + file->chunkPadding(i); - else - debug("RIFF::AIFF::Properties::read() - Duplicate 'SSND' chunk found."); - } - } - - if(data.size() < 18) { - debug("RIFF::AIFF::Properties::read() - 'COMM' chunk not found or too short."); - return; - } - - if(streamLength == 0) { - debug("RIFF::AIFF::Properties::read() - 'SSND' chunk not found."); - return; - } - - d->channels = data.toShort(0U); - d->sampleFrames = data.toUInt(2U); - d->bitsPerSample = data.toShort(6U); - - const long double sampleRate = data.toFloat80BE(8); - if(sampleRate >= 1.0) - d->sampleRate = static_cast<int>(sampleRate + 0.5); - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } - - if(data.size() >= 23) { - d->compressionType = data.mid(18, 4); - d->compressionName - = String(data.mid(23, static_cast<unsigned char>(data[22])), String::Latin1); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/rifffile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/rifffile.cpp deleted file mode 100755 index d3e1aa21c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/rifffile.cpp +++ /dev/null @@ -1,372 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> -#include <vector> - -#include <tbytevector.h> -#include <tdebug.h> -#include <tstring.h> - -#include "rifffile.h" -#include "riffutils.h" - -using namespace TagLib; - -struct Chunk -{ - ByteVector name; - unsigned int offset; - unsigned int size; - unsigned int padding; -}; - -class RIFF::File::FilePrivate -{ -public: - FilePrivate(Endianness endianness) : - endianness(endianness), - size(0), - sizeOffset(0) {} - - const Endianness endianness; - - unsigned int size; - long sizeOffset; - - std::vector<Chunk> chunks; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::File::~File() -{ - delete d; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::File::File(FileName file, Endianness endianness) : - TagLib::File(file), - d(new FilePrivate(endianness)) -{ - if(isOpen()) - read(); -} - -RIFF::File::File(IOStream *stream, Endianness endianness) : - TagLib::File(stream), - d(new FilePrivate(endianness)) -{ - if(isOpen()) - read(); -} - -unsigned int RIFF::File::riffSize() const -{ - return d->size; -} - -unsigned int RIFF::File::chunkCount() const -{ - return static_cast<unsigned int>(d->chunks.size()); -} - -unsigned int RIFF::File::chunkDataSize(unsigned int i) const -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::chunkDataSize() - Index out of range. Returning 0."); - return 0; - } - - return d->chunks[i].size; -} - -unsigned int RIFF::File::chunkOffset(unsigned int i) const -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::chunkOffset() - Index out of range. Returning 0."); - return 0; - } - - return d->chunks[i].offset; -} - -unsigned int RIFF::File::chunkPadding(unsigned int i) const -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::chunkPadding() - Index out of range. Returning 0."); - return 0; - } - - return d->chunks[i].padding; -} - -ByteVector RIFF::File::chunkName(unsigned int i) const -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::chunkName() - Index out of range. Returning an empty vector."); - return ByteVector(); - } - - return d->chunks[i].name; -} - -ByteVector RIFF::File::chunkData(unsigned int i) -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::chunkData() - Index out of range. Returning an empty vector."); - return ByteVector(); - } - - seek(d->chunks[i].offset); - return readBlock(d->chunks[i].size); -} - -void RIFF::File::setChunkData(unsigned int i, const ByteVector &data) -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::setChunkData() - Index out of range."); - return; - } - - // Now update the specific chunk - - std::vector<Chunk>::iterator it = d->chunks.begin(); - std::advance(it, i); - - const long long originalSize = static_cast<long long>(it->size) + it->padding; - - writeChunk(it->name, data, it->offset - 8, it->size + it->padding + 8); - - it->size = data.size(); - it->padding = data.size() % 2; - - const long long diff = static_cast<long long>(it->size) + it->padding - originalSize; - - // Now update the internal offsets - - for(++it; it != d->chunks.end(); ++it) - it->offset += static_cast<int>(diff); - - // Update the global size. - - updateGlobalSize(); -} - -void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data) -{ - setChunkData(name, data, false); -} - -void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate) -{ - if(d->chunks.empty()) { - debug("RIFF::File::setChunkData - No valid chunks found."); - return; - } - - if(alwaysCreate && name != "LIST") { - debug("RIFF::File::setChunkData - alwaysCreate should be used for only \"LIST\" chunks."); - return; - } - - if(!alwaysCreate) { - for(unsigned int i = 0; i < d->chunks.size(); i++) { - if(d->chunks[i].name == name) { - setChunkData(i, data); - return; - } - } - } - - // Couldn't find an existing chunk, so let's create a new one. - - // Adjust the padding of the last chunk to place the new chunk at even position. - - Chunk &last = d->chunks.back(); - - long offset = last.offset + last.size + last.padding; - if(offset & 1) { - if(last.padding == 1) { - last.padding = 0; // This should not happen unless the file is corrupted. - offset--; - removeBlock(offset, 1); - } - else { - insert(ByteVector("\0", 1), offset, 0); - last.padding = 1; - offset++; - } - } - - // Now add the chunk to the file. - - writeChunk(name, data, offset, 0); - - // And update our internal structure - - Chunk chunk; - chunk.name = name; - chunk.size = data.size(); - chunk.offset = offset + 8; - chunk.padding = data.size() % 2; - - d->chunks.push_back(chunk); - - // Update the global size. - - updateGlobalSize(); -} - -void RIFF::File::removeChunk(unsigned int i) -{ - if(i >= d->chunks.size()) { - debug("RIFF::File::removeChunk() - Index out of range."); - return; - } - - std::vector<Chunk>::iterator it = d->chunks.begin(); - std::advance(it, i); - - const unsigned int removeSize = it->size + it->padding + 8; - removeBlock(it->offset - 8, removeSize); - it = d->chunks.erase(it); - - for(; it != d->chunks.end(); ++it) - it->offset -= removeSize; - - // Update the global size. - - updateGlobalSize(); -} - -void RIFF::File::removeChunk(const ByteVector &name) -{ - for(int i = static_cast<int>(d->chunks.size()) - 1; i >= 0; --i) { - if(d->chunks[i].name == name) - removeChunk(i); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::File::read() -{ - const bool bigEndian = (d->endianness == BigEndian); - - long offset = tell(); - - offset += 4; - d->sizeOffset = offset; - - seek(offset); - d->size = readBlock(4).toUInt(bigEndian); - - offset += 8; - - // + 8: chunk header at least, fix for additional junk bytes - while(offset + 8 <= length()) { - - seek(offset); - const ByteVector chunkName = readBlock(4); - const unsigned int chunkSize = readBlock(4).toUInt(bigEndian); - - if(!isValidChunkName(chunkName)) { - debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid ID"); - setValid(false); - break; - } - - if(static_cast<long long>(offset) + 8 + chunkSize > length()) { - debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid size (larger than the file size)"); - setValid(false); - break; - } - - Chunk chunk; - chunk.name = chunkName; - chunk.size = chunkSize; - chunk.offset = offset + 8; - chunk.padding = 0; - - offset = chunk.offset + chunk.size; - - // Check padding - - if(offset & 1) { - seek(offset); - const ByteVector iByte = readBlock(1); - if(iByte.size() == 1) { - bool skipPadding = iByte[0] == '\0'; - if(!skipPadding) { - // Padding byte is not zero, check if it is good to ignore it - const ByteVector fourCcAfterPadding = readBlock(4); - if(isValidChunkName(fourCcAfterPadding)) { - // Use the padding, it is followed by a valid chunk name. - skipPadding = true; - } - } - if(skipPadding) { - chunk.padding = 1; - offset++; - } - } - } - - d->chunks.push_back(chunk); - } -} - -void RIFF::File::writeChunk(const ByteVector &name, const ByteVector &data, - unsigned long offset, unsigned long replace) -{ - ByteVector combined; - - combined.append(name); - combined.append(ByteVector::fromUInt(data.size(), d->endianness == BigEndian)); - combined.append(data); - - if(data.size() & 1) - combined.resize(combined.size() + 1, '\0'); - - insert(combined, offset, replace); -} - -void RIFF::File::updateGlobalSize() -{ - const Chunk first = d->chunks.front(); - const Chunk last = d->chunks.back(); - d->size = last.offset + last.size + last.padding - first.offset + 12; - - const ByteVector data = ByteVector::fromUInt(d->size, d->endianness == BigEndian); - insert(data, d->sizeOffset, 4); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/riffutils.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/riffutils.h deleted file mode 100755 index ecb985a4b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/riffutils.h +++ /dev/null @@ -1,60 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_RIFFUTILS_H -#define TAGLIB_RIFFUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -namespace TagLib -{ - namespace RIFF - { - namespace - { - - inline bool isValidChunkName(const ByteVector &name) - { - if(name.size() != 4) - return false; - - for(ByteVector::ConstIterator it = name.begin(); it != name.end(); ++it) { - const int c = static_cast<unsigned char>(*it); - if(c < 32 || 127 < c) - return false; - } - - return true; - } - - } - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/infotag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/infotag.cpp deleted file mode 100755 index df1cfbeef..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/infotag.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include <tfile.h> - -#include "infotag.h" -#include "riffutils.h" - -using namespace TagLib; -using namespace RIFF::Info; - -namespace -{ - const RIFF::Info::StringHandler defaultStringHandler; - const RIFF::Info::StringHandler *stringHandler = &defaultStringHandler; -} - -class RIFF::Info::Tag::TagPrivate -{ -public: - FieldListMap fieldListMap; -}; - -//////////////////////////////////////////////////////////////////////////////// -// StringHandler implementation -//////////////////////////////////////////////////////////////////////////////// - -StringHandler::StringHandler() -{ -} - -StringHandler::~StringHandler() -{ -} - -String RIFF::Info::StringHandler::parse(const ByteVector &data) const -{ - return String(data, String::UTF8); -} - -ByteVector RIFF::Info::StringHandler::render(const String &s) const -{ - return s.data(String::UTF8); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::Info::Tag::Tag(const ByteVector &data) : - TagLib::Tag(), - d(new TagPrivate()) -{ - parse(data); -} - -RIFF::Info::Tag::Tag() : - TagLib::Tag(), - d(new TagPrivate()) -{ -} - -RIFF::Info::Tag::~Tag() -{ - delete d; -} - -String RIFF::Info::Tag::title() const -{ - return fieldText("INAM"); -} - -String RIFF::Info::Tag::artist() const -{ - return fieldText("IART"); -} - -String RIFF::Info::Tag::album() const -{ - return fieldText("IPRD"); -} - -String RIFF::Info::Tag::comment() const -{ - return fieldText("ICMT"); -} - -String RIFF::Info::Tag::genre() const -{ - return fieldText("IGNR"); -} - -unsigned int RIFF::Info::Tag::year() const -{ - return fieldText("ICRD").substr(0, 4).toInt(); -} - -unsigned int RIFF::Info::Tag::track() const -{ - return fieldText("IPRT").toInt(); -} - -void RIFF::Info::Tag::setTitle(const String &s) -{ - setFieldText("INAM", s); -} - -void RIFF::Info::Tag::setArtist(const String &s) -{ - setFieldText("IART", s); -} - -void RIFF::Info::Tag::setAlbum(const String &s) -{ - setFieldText("IPRD", s); -} - -void RIFF::Info::Tag::setComment(const String &s) -{ - setFieldText("ICMT", s); -} - -void RIFF::Info::Tag::setGenre(const String &s) -{ - setFieldText("IGNR", s); -} - -void RIFF::Info::Tag::setYear(unsigned int i) -{ - if(i != 0) - setFieldText("ICRD", String::number(i)); - else - d->fieldListMap.erase("ICRD"); -} - -void RIFF::Info::Tag::setTrack(unsigned int i) -{ - if(i != 0) - setFieldText("IPRT", String::number(i)); - else - d->fieldListMap.erase("IPRT"); -} - -bool RIFF::Info::Tag::isEmpty() const -{ - return d->fieldListMap.isEmpty(); -} - -FieldListMap RIFF::Info::Tag::fieldListMap() const -{ - return d->fieldListMap; -} - -String RIFF::Info::Tag::fieldText(const ByteVector &id) const -{ - if(d->fieldListMap.contains(id)) - return String(d->fieldListMap[id]); - else - return String(); -} - -void RIFF::Info::Tag::setFieldText(const ByteVector &id, const String &s) -{ - // id must be four-byte long pure ascii string. - if(!isValidChunkName(id)) - return; - - if(!s.isEmpty()) - d->fieldListMap[id] = s; - else - removeField(id); -} - -void RIFF::Info::Tag::removeField(const ByteVector &id) -{ - if(d->fieldListMap.contains(id)) - d->fieldListMap.erase(id); -} - -ByteVector RIFF::Info::Tag::render() const -{ - ByteVector data("INFO"); - - FieldListMap::ConstIterator it = d->fieldListMap.begin(); - for(; it != d->fieldListMap.end(); ++it) { - ByteVector text = stringHandler->render(it->second); - if(text.isEmpty()) - continue; - - data.append(it->first); - data.append(ByteVector::fromUInt(text.size() + 1, false)); - data.append(text); - - do { - data.append('\0'); - } while(data.size() & 1); - } - - if(data.size() == 4) - return ByteVector(); - else - return data; -} - -void RIFF::Info::Tag::setStringHandler(const StringHandler *handler) -{ - if(handler) - stringHandler = handler; - else - stringHandler = &defaultStringHandler; -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::Info::Tag::parse(const ByteVector &data) -{ - unsigned int p = 4; - while(p < data.size()) { - const unsigned int size = data.toUInt(p + 4, false); - if(size > data.size() - p - 8) - break; - - const ByteVector id = data.mid(p, 4); - if(isValidChunkName(id)) { - const String text = stringHandler->parse(data.mid(p + 8, size)); - d->fieldListMap[id] = text; - } - - p += ((size + 1) & ~1) + 8; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.cpp deleted file mode 100755 index 3dce70b1c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavfile.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tdebug.h> -#include <tstringlist.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "wavfile.h" -#include "id3v2tag.h" -#include "infotag.h" -#include "tagunion.h" - -using namespace TagLib; - -namespace -{ - enum { ID3v2Index = 0, InfoIndex = 1 }; -} - -class RIFF::WAV::File::FilePrivate -{ -public: - FilePrivate() : - properties(0), - hasID3v2(false), - hasInfo(false) {} - - ~FilePrivate() - { - delete properties; - } - - Properties *properties; - TagUnion tag; - - bool hasID3v2; - bool hasInfo; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool RIFF::WAV::File::isSupported(IOStream *stream) -{ - // A WAV file has to start with "RIFF????WAVE". - - const ByteVector id = Utils::readHeader(stream, 12, false); - return (id.startsWith("RIFF") && id.containsAt("WAVE", 8)); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::WAV::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - RIFF::File(file, LittleEndian), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -RIFF::WAV::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - RIFF::File(stream, LittleEndian), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -RIFF::WAV::File::~File() -{ - delete d; -} - -ID3v2::Tag *RIFF::WAV::File::tag() const -{ - return ID3v2Tag(); -} - -ID3v2::Tag *RIFF::WAV::File::ID3v2Tag() const -{ - return d->tag.access<ID3v2::Tag>(ID3v2Index, false); -} - -RIFF::Info::Tag *RIFF::WAV::File::InfoTag() const -{ - return d->tag.access<RIFF::Info::Tag>(InfoIndex, false); -} - -void RIFF::WAV::File::strip(TagTypes tags) -{ - removeTagChunks(tags); - - if(tags & ID3v2) - d->tag.set(ID3v2Index, new ID3v2::Tag()); - - if(tags & Info) - d->tag.set(InfoIndex, new RIFF::Info::Tag()); -} - -PropertyMap RIFF::WAV::File::properties() const -{ - return d->tag.properties(); -} - -void RIFF::WAV::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag.removeUnsupportedProperties(unsupported); -} - -PropertyMap RIFF::WAV::File::setProperties(const PropertyMap &properties) -{ - InfoTag()->setProperties(properties); - return ID3v2Tag()->setProperties(properties); -} - -RIFF::WAV::Properties *RIFF::WAV::File::audioProperties() const -{ - return d->properties; -} - -bool RIFF::WAV::File::save() -{ - return RIFF::WAV::File::save(AllTags); -} - -bool RIFF::WAV::File::save(TagTypes tags, bool stripOthers, int id3v2Version) -{ - return save(tags, - stripOthers ? StripOthers : StripNone, - id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4); -} - -bool RIFF::WAV::File::save(TagTypes tags, StripTags strip, ID3v2::Version version) -{ - if(readOnly()) { - debug("RIFF::WAV::File::save() -- File is read only."); - return false; - } - - if(!isValid()) { - debug("RIFF::WAV::File::save() -- Trying to save invalid file."); - return false; - } - - if(strip == StripOthers) - File::strip(static_cast<TagTypes>(AllTags & ~tags)); - - if(tags & ID3v2) { - removeTagChunks(ID3v2); - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - setChunkData("ID3 ", ID3v2Tag()->render(version)); - d->hasID3v2 = true; - } - } - - if(tags & Info) { - removeTagChunks(Info); - - if(InfoTag() && !InfoTag()->isEmpty()) { - setChunkData("LIST", InfoTag()->render(), true); - d->hasInfo = true; - } - } - - return true; -} - -bool RIFF::WAV::File::hasID3v2Tag() const -{ - return d->hasID3v2; -} - -bool RIFF::WAV::File::hasInfoTag() const -{ - return d->hasInfo; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::WAV::File::read(bool readProperties) -{ - for(unsigned int i = 0; i < chunkCount(); ++i) { - const ByteVector name = chunkName(i); - if(name == "ID3 " || name == "id3 ") { - if(!d->tag[ID3v2Index]) { - d->tag.set(ID3v2Index, new ID3v2::Tag(this, chunkOffset(i))); - d->hasID3v2 = true; - } - else { - debug("RIFF::WAV::File::read() - Duplicate ID3v2 tag found."); - } - } - else if(name == "LIST") { - const ByteVector data = chunkData(i); - if(data.startsWith("INFO")) { - if(!d->tag[InfoIndex]) { - d->tag.set(InfoIndex, new RIFF::Info::Tag(data)); - d->hasInfo = true; - } - else { - debug("RIFF::WAV::File::read() - Duplicate INFO tag found."); - } - } - } - } - - if(!d->tag[ID3v2Index]) - d->tag.set(ID3v2Index, new ID3v2::Tag()); - - if(!d->tag[InfoIndex]) - d->tag.set(InfoIndex, new RIFF::Info::Tag()); - - if(readProperties) - d->properties = new Properties(this, Properties::Average); -} - -void RIFF::WAV::File::removeTagChunks(TagTypes tags) -{ - if((tags & ID3v2) && d->hasID3v2) { - removeChunk("ID3 "); - removeChunk("id3 "); - - d->hasID3v2 = false; - } - - if((tags & Info) && d->hasInfo) { - for(int i = static_cast<int>(chunkCount()) - 1; i >= 0; --i) { - if(chunkName(i) == "LIST" && chunkData(i).startsWith("INFO")) - removeChunk(i); - } - - d->hasInfo = false; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.cpp deleted file mode 100755 index cfb59333d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/riff/wav/wavproperties.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tdebug.h> -#include "wavfile.h" -#include "wavproperties.h" - -using namespace TagLib; - -namespace -{ - // Quoted from RFC 2361. - enum WaveFormat - { - FORMAT_UNKNOWN = 0x0000, - FORMAT_PCM = 0x0001, - FORMAT_IEEE_FLOAT = 0x0003 - }; -} - -class RIFF::WAV::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - format(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - sampleFrames(0) {} - - int format; - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - unsigned int sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -RIFF::WAV::Properties::Properties(const ByteVector &, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("RIFF::WAV::Properties::Properties() -- This constructor is no longer used."); -} - -RIFF::WAV::Properties::Properties(const ByteVector &, unsigned int, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("RIFF::WAV::Properties::Properties() -- This constructor is no longer used."); -} - -TagLib::RIFF::WAV::Properties::Properties(File *file, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file); -} - -RIFF::WAV::Properties::~Properties() -{ - delete d; -} - -int RIFF::WAV::Properties::length() const -{ - return lengthInSeconds(); -} - -int RIFF::WAV::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int RIFF::WAV::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int RIFF::WAV::Properties::bitrate() const -{ - return d->bitrate; -} - -int RIFF::WAV::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int RIFF::WAV::Properties::channels() const -{ - return d->channels; -} - -int RIFF::WAV::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -int RIFF::WAV::Properties::sampleWidth() const -{ - return bitsPerSample(); -} - -unsigned int RIFF::WAV::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -int RIFF::WAV::Properties::format() const -{ - return d->format; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void RIFF::WAV::Properties::read(File *file) -{ - ByteVector data; - unsigned int streamLength = 0; - unsigned int totalSamples = 0; - - for(unsigned int i = 0; i < file->chunkCount(); ++i) { - const ByteVector name = file->chunkName(i); - if(name == "fmt ") { - if(data.isEmpty()) - data = file->chunkData(i); - else - debug("RIFF::WAV::Properties::read() - Duplicate 'fmt ' chunk found."); - } - else if(name == "data") { - if(streamLength == 0) - streamLength = file->chunkDataSize(i) + file->chunkPadding(i); - else - debug("RIFF::WAV::Properties::read() - Duplicate 'data' chunk found."); - } - else if(name == "fact") { - if(totalSamples == 0) - totalSamples = file->chunkData(i).toUInt(0, false); - else - debug("RIFF::WAV::Properties::read() - Duplicate 'fact' chunk found."); - } - } - - if(data.size() < 16) { - debug("RIFF::WAV::Properties::read() - 'fmt ' chunk not found or too short."); - return; - } - - if(streamLength == 0) { - debug("RIFF::WAV::Properties::read() - 'data' chunk not found."); - return; - } - - d->format = data.toShort(0, false); - if(d->format != FORMAT_PCM && d->format != FORMAT_IEEE_FLOAT && totalSamples == 0) { - debug("RIFF::WAV::Properties::read() - Non-PCM format, but 'fact' chunk not found."); - return; - } - - d->channels = data.toShort(2, false); - d->sampleRate = data.toUInt(4, false); - d->bitsPerSample = data.toShort(14, false); - - if (d->format != FORMAT_PCM && !(d->format == FORMAT_IEEE_FLOAT && totalSamples == 0)) - d->sampleFrames = totalSamples; - else if(d->channels > 0 && d->bitsPerSample > 0) - d->sampleFrames = streamLength / (d->channels * ((d->bitsPerSample + 7) / 8)); - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } - else { - const unsigned int byteRate = data.toUInt(8, false); - if(byteRate > 0) { - d->length = static_cast<int>(streamLength * 1000.0 / byteRate + 0.5); - d->bitrate = static_cast<int>(byteRate * 8.0 / 1000.0 + 0.5); - } - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mfile.cpp deleted file mode 100755 index ebd637afc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mfile.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "s3mfile.h" -#include "tstringlist.h" -#include "tdebug.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -#include <iostream> - -using namespace TagLib; -using namespace S3M; - -class S3M::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : properties(propertiesStyle) - { - } - - Mod::Tag tag; - S3M::Properties properties; -}; - -S3M::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -S3M::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -S3M::File::~File() -{ - delete d; -} - -Mod::Tag *S3M::File::tag() const -{ - return &d->tag; -} - -PropertyMap S3M::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap S3M::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -S3M::Properties *S3M::File::audioProperties() const -{ - return &d->properties; -} - -bool S3M::File::save() -{ - if(readOnly()) { - debug("S3M::File::save() - Cannot save to a read only file."); - return false; - } - // note: if title starts with "Extended Module: " - // the file would look like an .xm file - seek(0); - writeString(d->tag.title(), 27); - // string terminating NUL is not optional: - writeByte(0); - - seek(32); - - unsigned short length = 0; - unsigned short sampleCount = 0; - - if(!readU16L(length) || !readU16L(sampleCount)) - return false; - - seek(28, Current); - - int channels = 0; - for(int i = 0; i < 32; ++ i) { - unsigned char setting = 0; - if(!readByte(setting)) - return false; - // or if(setting >= 128)? - // or channels = i + 1;? - // need a better spec! - if(setting != 0xff) ++ channels; - } - - seek(channels, Current); - - StringList lines = d->tag.comment().split("\n"); - // write comment as sample names: - for(unsigned short i = 0; i < sampleCount; ++ i) { - seek(96L + length + ((long)i << 1)); - - unsigned short instrumentOffset = 0; - if(!readU16L(instrumentOffset)) - return false; - seek(((long)instrumentOffset << 4) + 48); - - if(i < lines.size()) - writeString(lines[i], 27); - else - writeString(String(), 27); - // string terminating NUL is not optional: - writeByte(0); - } - return true; -} - -void S3M::File::read(bool) -{ - if(!isOpen()) - return; - - READ_STRING(d->tag.setTitle, 28); - READ_BYTE_AS(mark); - READ_BYTE_AS(type); - - READ_ASSERT(mark == 0x1A && type == 0x10); - - seek(32); - - READ_U16L_AS(length); - READ_U16L_AS(sampleCount); - - d->properties.setSampleCount(sampleCount); - - READ_U16L(d->properties.setPatternCount); - READ_U16L(d->properties.setFlags); - READ_U16L(d->properties.setTrackerVersion); - READ_U16L(d->properties.setFileFormatVersion); - - READ_ASSERT(readBlock(4) == "SCRM"); - - READ_BYTE(d->properties.setGlobalVolume); - READ_BYTE(d->properties.setBpmSpeed); - READ_BYTE(d->properties.setTempo); - - READ_BYTE_AS(masterVolume); - d->properties.setMasterVolume(masterVolume & 0x7f); - d->properties.setStereo((masterVolume & 0x80) != 0); - - // I've seen players who call the next two bytes - // "ultra click" and "use panning values" (if == 0xFC). - // I don't see them in any spec, though. - // Hm, but there is "UltraClick-removal" and some other - // variables in ScreamTracker IIIs GUI. - - seek(12, Current); - - int channels = 0; - for(int i = 0; i < 32; ++ i) { - READ_BYTE_AS(setting); - // or if(setting >= 128)? - // or channels = i + 1;? - // need a better spec! - if(setting != 0xff) ++ channels; - } - d->properties.setChannels(channels); - - seek(96); - unsigned short realLength = 0; - for(unsigned short i = 0; i < length; ++ i) { - READ_BYTE_AS(order); - if(order == 255) break; - if(order != 254) ++ realLength; - } - d->properties.setLengthInPatterns(realLength); - - seek(channels, Current); - - // Note: The S3M spec mentions samples and instruments, but in - // the header there are only pointers to instruments. - // However, there I never found instruments (SCRI) but - // instead samples (SCRS). - StringList comment; - for(unsigned short i = 0; i < sampleCount; ++ i) { - seek(96L + length + ((long)i << 1)); - - READ_U16L_AS(sampleHeaderOffset); - seek((long)sampleHeaderOffset << 4); - - READ_BYTE_AS(sampleType); - READ_STRING_AS(dosFileName, 13); - READ_U16L_AS(sampleDataOffset); - READ_U32L_AS(sampleLength); - READ_U32L_AS(repeatStart); - READ_U32L_AS(repeatStop); - READ_BYTE_AS(sampleVolume); - - seek(1, Current); - - READ_BYTE_AS(packing); - READ_BYTE_AS(sampleFlags); - READ_U32L_AS(baseFrequency); - - seek(12, Current); - - READ_STRING_AS(sampleName, 28); - // The next 4 bytes should be "SCRS", but I've found - // files that are otherwise ok with 4 nils instead. - // READ_ASSERT(readBlock(4) == "SCRS"); - - comment.append(sampleName); - } - - d->tag.setComment(comment.toString("\n")); - d->tag.setTrackerName("ScreamTracker III"); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mproperties.cpp deleted file mode 100755 index e3e443cb8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/s3m/s3mproperties.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "s3mproperties.h" - -using namespace TagLib; -using namespace S3M; - -class S3M::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - lengthInPatterns(0), - channels(0), - stereo(false), - sampleCount(0), - patternCount(0), - flags(0), - trackerVersion(0), - fileFormatVersion(0), - globalVolume(0), - masterVolume(0), - tempo(0), - bpmSpeed(0) - { - } - - unsigned short lengthInPatterns; - int channels; - bool stereo; - unsigned short sampleCount; - unsigned short patternCount; - unsigned short flags; - unsigned short trackerVersion; - unsigned short fileFormatVersion; - unsigned char globalVolume; - unsigned char masterVolume; - unsigned char tempo; - unsigned char bpmSpeed; -}; - -S3M::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate()) -{ -} - -S3M::Properties::~Properties() -{ - delete d; -} - -int S3M::Properties::length() const -{ - return 0; -} - -int S3M::Properties::lengthInSeconds() const -{ - return 0; -} - -int S3M::Properties::lengthInMilliseconds() const -{ - return 0; -} - -int S3M::Properties::bitrate() const -{ - return 0; -} - -int S3M::Properties::sampleRate() const -{ - return 0; -} - -int S3M::Properties::channels() const -{ - return d->channels; -} - -unsigned short S3M::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -bool S3M::Properties::stereo() const -{ - return d->stereo; -} - -unsigned short S3M::Properties::sampleCount() const -{ - return d->sampleCount; -} - -unsigned short S3M::Properties::patternCount() const -{ - return d->patternCount; -} - -unsigned short S3M::Properties::flags() const -{ - return d->flags; -} - -unsigned short S3M::Properties::trackerVersion() const -{ - return d->trackerVersion; -} - -unsigned short S3M::Properties::fileFormatVersion() const -{ - return d->fileFormatVersion; -} - -unsigned char S3M::Properties::globalVolume() const -{ - return d->globalVolume; -} - -unsigned char S3M::Properties::masterVolume() const -{ - return d->masterVolume; -} - -unsigned char S3M::Properties::tempo() const -{ - return d->tempo; -} - -unsigned char S3M::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -void S3M::Properties::setLengthInPatterns(unsigned short lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void S3M::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void S3M::Properties::setStereo(bool stereo) -{ - d->stereo = stereo; -} - -void S3M::Properties::setSampleCount(unsigned short sampleCount) -{ - d->sampleCount = sampleCount; -} - -void S3M::Properties::setPatternCount(unsigned short patternCount) -{ - d->patternCount = patternCount; -} - -void S3M::Properties::setFlags(unsigned short flags) -{ - d->flags = flags; -} - -void S3M::Properties::setTrackerVersion(unsigned short trackerVersion) -{ - d->trackerVersion = trackerVersion; -} - -void S3M::Properties::setFileFormatVersion(unsigned short fileFormatVersion) -{ - d->fileFormatVersion = fileFormatVersion; -} - -void S3M::Properties::setGlobalVolume(unsigned char globalVolume) -{ - d->globalVolume = globalVolume; -} - -void S3M::Properties::setMasterVolume(unsigned char masterVolume) -{ - d->masterVolume = masterVolume; -} - -void S3M::Properties::setTempo(unsigned char tempo) -{ - d->tempo = tempo; -} - -void S3M::Properties::setBpmSpeed(unsigned char bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tag.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/tag.cpp deleted file mode 100755 index 3526226f8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/tag.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tag.h" -#include "tstringlist.h" -#include "tpropertymap.h" - -using namespace TagLib; - -class Tag::TagPrivate -{ - -}; - -Tag::Tag() -{ - -} - -Tag::~Tag() -{ - -} - -bool Tag::isEmpty() const -{ - return (title().isEmpty() && - artist().isEmpty() && - album().isEmpty() && - comment().isEmpty() && - genre().isEmpty() && - year() == 0 && - track() == 0); -} - -PropertyMap Tag::properties() const -{ - PropertyMap map; - if(!(title().isEmpty())) - map["TITLE"].append(title()); - if(!(artist().isEmpty())) - map["ARTIST"].append(artist()); - if(!(album().isEmpty())) - map["ALBUM"].append(album()); - if(!(comment().isEmpty())) - map["COMMENT"].append(comment()); - if(!(genre().isEmpty())) - map["GENRE"].append(genre()); - if(!(year() == 0)) - map["DATE"].append(String::number(year())); - if(!(track() == 0)) - map["TRACKNUMBER"].append(String::number(track())); - return map; -} - -void Tag::removeUnsupportedProperties(const StringList&) -{ -} - -PropertyMap Tag::setProperties(const PropertyMap &origProps) -{ - PropertyMap properties(origProps); - properties.removeEmpty(); - StringList oneValueSet; - // can this be simplified by using some preprocessor defines / function pointers? - if(properties.contains("TITLE")) { - setTitle(properties["TITLE"].front()); - oneValueSet.append("TITLE"); - } else - setTitle(String()); - - if(properties.contains("ARTIST")) { - setArtist(properties["ARTIST"].front()); - oneValueSet.append("ARTIST"); - } else - setArtist(String()); - - if(properties.contains("ALBUM")) { - setAlbum(properties["ALBUM"].front()); - oneValueSet.append("ALBUM"); - } else - setAlbum(String()); - - if(properties.contains("COMMENT")) { - setComment(properties["COMMENT"].front()); - oneValueSet.append("COMMENT"); - } else - setComment(String()); - - if(properties.contains("GENRE")) { - setGenre(properties["GENRE"].front()); - oneValueSet.append("GENRE"); - } else - setGenre(String()); - - if(properties.contains("DATE")) { - bool ok; - int date = properties["DATE"].front().toInt(&ok); - if(ok) { - setYear(date); - oneValueSet.append("DATE"); - } else - setYear(0); - } - else - setYear(0); - - if(properties.contains("TRACKNUMBER")) { - bool ok; - int track = properties["TRACKNUMBER"].front().toInt(&ok); - if(ok) { - setTrack(track); - oneValueSet.append("TRACKNUMBER"); - } else - setTrack(0); - } - else - setTrack(0); - - // for each tag that has been set above, remove the first entry in the corresponding - // value list. The others will be returned as unsupported by this format. - for(StringList::ConstIterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { - if(properties[*it].size() == 1) - properties.erase(*it); - else - properties[*it].erase( properties[*it].begin() ); - } - return properties; -} - -void Tag::duplicate(const Tag *source, Tag *target, bool overwrite) // static -{ - if(overwrite) { - target->setTitle(source->title()); - target->setArtist(source->artist()); - target->setAlbum(source->album()); - target->setComment(source->comment()); - target->setGenre(source->genre()); - target->setYear(source->year()); - target->setTrack(source->track()); - } - else { - if(target->title().isEmpty()) - target->setTitle(source->title()); - if(target->artist().isEmpty()) - target->setArtist(source->artist()); - if(target->album().isEmpty()) - target->setAlbum(source->album()); - if(target->comment().isEmpty()) - target->setComment(source->comment()); - if(target->genre().isEmpty()) - target->setGenre(source->genre()); - if(target->year() <= 0) - target->setYear(source->year()); - if(target->track() <= 0) - target->setTrack(source->track()); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.cpp deleted file mode 100755 index 64d786b9a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.cpp +++ /dev/null @@ -1,248 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tagunion.h> -#include <tstringlist.h> -#include <tpropertymap.h> - -#include "id3v1tag.h" -#include "id3v2tag.h" -#include "apetag.h" -#include "xiphcomment.h" -#include "infotag.h" - -using namespace TagLib; - -#define stringUnion(method) \ - if(tag(0) && !tag(0)->method().isEmpty()) \ - return tag(0)->method(); \ - if(tag(1) && !tag(1)->method().isEmpty()) \ - return tag(1)->method(); \ - if(tag(2) && !tag(2)->method().isEmpty()) \ - return tag(2)->method(); \ - return String(); \ - -#define numberUnion(method) \ - if(tag(0) && tag(0)->method() > 0) \ - return tag(0)->method(); \ - if(tag(1) && tag(1)->method() > 0) \ - return tag(1)->method(); \ - if(tag(2) && tag(2)->method() > 0) \ - return tag(2)->method(); \ - return 0 - -#define setUnion(method, value) \ - if(tag(0)) \ - tag(0)->set##method(value); \ - if(tag(1)) \ - tag(1)->set##method(value); \ - if(tag(2)) \ - tag(2)->set##method(value); \ - -class TagUnion::TagUnionPrivate -{ -public: - TagUnionPrivate() : tags(3, static_cast<Tag *>(0)) - { - - } - - ~TagUnionPrivate() - { - delete tags[0]; - delete tags[1]; - delete tags[2]; - } - - std::vector<Tag *> tags; -}; - -TagUnion::TagUnion(Tag *first, Tag *second, Tag *third) : - d(new TagUnionPrivate()) -{ - d->tags[0] = first; - d->tags[1] = second; - d->tags[2] = third; -} - -TagUnion::~TagUnion() -{ - delete d; -} - -Tag *TagUnion::operator[](int index) const -{ - return tag(index); -} - -Tag *TagUnion::tag(int index) const -{ - return d->tags[index]; -} - -void TagUnion::set(int index, Tag *tag) -{ - delete d->tags[index]; - d->tags[index] = tag; -} - -PropertyMap TagUnion::properties() const -{ - // This is an ugly workaround but we can't add a virtual function. - // Should be virtual in taglib2. - - for(size_t i = 0; i < 3; ++i) { - - if(d->tags[i] && !d->tags[i]->isEmpty()) { - - if(dynamic_cast<const ID3v1::Tag *>(d->tags[i])) - return dynamic_cast<const ID3v1::Tag *>(d->tags[i])->properties(); - - else if(dynamic_cast<const ID3v2::Tag *>(d->tags[i])) - return dynamic_cast<const ID3v2::Tag *>(d->tags[i])->properties(); - - else if(dynamic_cast<const APE::Tag *>(d->tags[i])) - return dynamic_cast<const APE::Tag *>(d->tags[i])->properties(); - - else if(dynamic_cast<const Ogg::XiphComment *>(d->tags[i])) - return dynamic_cast<const Ogg::XiphComment *>(d->tags[i])->properties(); - - else if(dynamic_cast<const RIFF::Info::Tag *>(d->tags[i])) - return dynamic_cast<const RIFF::Info::Tag *>(d->tags[i])->properties(); - } - } - - return PropertyMap(); -} - -void TagUnion::removeUnsupportedProperties(const StringList &unsupported) -{ - // This is an ugly workaround but we can't add a virtual function. - // Should be virtual in taglib2. - - for(size_t i = 0; i < 3; ++i) { - - if(d->tags[i]) { - - if(dynamic_cast<ID3v1::Tag *>(d->tags[i])) - dynamic_cast<ID3v1::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); - - else if(dynamic_cast<ID3v2::Tag *>(d->tags[i])) - dynamic_cast<ID3v2::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); - - else if(dynamic_cast<APE::Tag *>(d->tags[i])) - dynamic_cast<APE::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); - - else if(dynamic_cast<Ogg::XiphComment *>(d->tags[i])) - dynamic_cast<Ogg::XiphComment *>(d->tags[i])->removeUnsupportedProperties(unsupported); - - else if(dynamic_cast<RIFF::Info::Tag *>(d->tags[i])) - dynamic_cast<RIFF::Info::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); - } - } -} - -String TagUnion::title() const -{ - stringUnion(title); -} - -String TagUnion::artist() const -{ - stringUnion(artist); -} - -String TagUnion::album() const -{ - stringUnion(album); -} - -String TagUnion::comment() const -{ - stringUnion(comment); -} - -String TagUnion::genre() const -{ - stringUnion(genre); -} - -unsigned int TagUnion::year() const -{ - numberUnion(year); -} - -unsigned int TagUnion::track() const -{ - numberUnion(track); -} - -void TagUnion::setTitle(const String &s) -{ - setUnion(Title, s); -} - -void TagUnion::setArtist(const String &s) -{ - setUnion(Artist, s); -} - -void TagUnion::setAlbum(const String &s) -{ - setUnion(Album, s); -} - -void TagUnion::setComment(const String &s) -{ - setUnion(Comment, s); -} - -void TagUnion::setGenre(const String &s) -{ - setUnion(Genre, s); -} - -void TagUnion::setYear(unsigned int i) -{ - setUnion(Year, i); -} - -void TagUnion::setTrack(unsigned int i) -{ - setUnion(Track, i); -} - -bool TagUnion::isEmpty() const -{ - if(d->tags[0] && !d->tags[0]->isEmpty()) - return false; - if(d->tags[1] && !d->tags[1]->isEmpty()) - return false; - if(d->tags[2] && !d->tags[2]->isEmpty()) - return false; - - return true; -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.h deleted file mode 100755 index 1eb38a01d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagunion.h +++ /dev/null @@ -1,98 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAGUNION_H -#define TAGLIB_TAGUNION_H - -#include "tag.h" - -#ifndef DO_NOT_DOCUMENT - -namespace TagLib { - - /*! - * \internal - */ - - class TagUnion : public Tag - { - public: - - enum AccessType { Read, Write }; - - /*! - * Creates a TagLib::Tag that is the union of \a first, \a second, and - * \a third. The TagUnion takes ownership of these tags and will handle - * their deletion. - */ - TagUnion(Tag *first = 0, Tag *second = 0, Tag *third = 0); - - virtual ~TagUnion(); - - Tag *operator[](int index) const; - Tag *tag(int index) const; - - void set(int index, Tag *tag); - - PropertyMap properties() const; - void removeUnsupportedProperties(const StringList &unsupported); - - virtual String title() const; - virtual String artist() const; - virtual String album() const; - virtual String comment() const; - virtual String genre() const; - virtual unsigned int year() const; - virtual unsigned int track() const; - - virtual void setTitle(const String &s); - virtual void setArtist(const String &s); - virtual void setAlbum(const String &s); - virtual void setComment(const String &s); - virtual void setGenre(const String &s); - virtual void setYear(unsigned int i); - virtual void setTrack(unsigned int i); - virtual bool isEmpty() const; - - template <class T> T *access(int index, bool create) - { - if(!create || tag(index)) - return static_cast<T *>(tag(index)); - - set(index, new T); - return static_cast<T *>(tag(index)); - } - - private: - TagUnion(const Tag &); - TagUnion &operator=(const Tag &); - - class TagUnionPrivate; - TagUnionPrivate *d; - }; -} - -#endif -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.cpp deleted file mode 100755 index d6d924064..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tfile.h> - -#include "id3v1tag.h" -#include "id3v2header.h" -#include "apetag.h" - -#include "tagutils.h" - -using namespace TagLib; - -long Utils::findID3v1(File *file) -{ - if(!file->isValid()) - return -1; - - file->seek(-128, File::End); - const long p = file->tell(); - - if(file->readBlock(3) == ID3v1::Tag::fileIdentifier()) - return p; - - return -1; -} - -long Utils::findID3v2(File *file) -{ - if(!file->isValid()) - return -1; - - file->seek(0); - - if(file->readBlock(3) == ID3v2::Header::fileIdentifier()) - return 0; - - return -1; -} - -long Utils::findAPE(File *file, long id3v1Location) -{ - if(!file->isValid()) - return -1; - - if(id3v1Location >= 0) - file->seek(id3v1Location - 32, File::Beginning); - else - file->seek(-32, File::End); - - const long p = file->tell(); - - if(file->readBlock(8) == APE::Tag::fileIdentifier()) - return p; - - return -1; -} - -ByteVector TagLib::Utils::readHeader(IOStream *stream, unsigned int length, - bool skipID3v2, long *headerOffset) -{ - if(!stream || !stream->isOpen()) - return ByteVector(); - - const long originalPosition = stream->tell(); - long bufferOffset = 0; - - if(skipID3v2) { - stream->seek(0); - const ByteVector data = stream->readBlock(ID3v2::Header::size()); - if(data.startsWith(ID3v2::Header::fileIdentifier())) - bufferOffset = ID3v2::Header(data).completeTagSize(); - } - - stream->seek(bufferOffset); - const ByteVector header = stream->readBlock(length); - stream->seek(originalPosition); - - if(headerOffset) - *headerOffset = bufferOffset; - - return header; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.h deleted file mode 100755 index 4488a32ba..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/tagutils.h +++ /dev/null @@ -1,55 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TAGUTILS_H -#define TAGLIB_TAGUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -#include <tbytevector.h> - -namespace TagLib { - - class File; - class IOStream; - - namespace Utils { - - long findID3v1(File *file); - - long findID3v2(File *file); - - long findAPE(File *file, long id3v1Location); - - ByteVector readHeader(IOStream *stream, unsigned int length, bool skipID3v2, - long *headerOffset = 0); - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.cpp deleted file mode 100755 index d272057f6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevector.cpp +++ /dev/null @@ -1,1044 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <algorithm> -#include <iostream> -#include <limits> -#include <cmath> -#include <cstdio> -#include <cstring> - -#include <tstring.h> -#include <tdebug.h> -#include <trefcounter.h> -#include <tutils.h> - -#include "tbytevector.h" - -// This is a bit ugly to keep writing over and over again. - -// A rather obscure feature of the C++ spec that I hadn't thought of that makes -// working with C libs much more efficient. There's more here: -// -// http://www.informit.com/isapi/product_id~{9C84DAB4-FE6E-49C5-BB0A-FB50331233EA}/content/index.asp - -namespace TagLib { - -template <class TIterator> -int findChar( - const TIterator dataBegin, const TIterator dataEnd, - char c, unsigned int offset, int byteAlign) -{ - const size_t dataSize = dataEnd - dataBegin; - if(offset + 1 > dataSize) - return -1; - - // n % 0 is invalid - - if(byteAlign == 0) - return -1; - - for(TIterator it = dataBegin + offset; it < dataEnd; it += byteAlign) { - if(*it == c) - return static_cast<int>(it - dataBegin); - } - - return -1; -} - -template <class TIterator> -int findVector( - const TIterator dataBegin, const TIterator dataEnd, - const TIterator patternBegin, const TIterator patternEnd, - unsigned int offset, int byteAlign) -{ - const size_t dataSize = dataEnd - dataBegin; - const size_t patternSize = patternEnd - patternBegin; - if(patternSize == 0 || offset + patternSize > dataSize) - return -1; - - // Special case that pattern contains just single char. - - if(patternSize == 1) - return findChar(dataBegin, dataEnd, *patternBegin, offset, byteAlign); - - // n % 0 is invalid - - if(byteAlign == 0) - return -1; - - // We don't use sophisticated algorithms like Knuth-Morris-Pratt here. - - // In the current implementation of TagLib, data and patterns are too small - // for such algorithms to work effectively. - - for(TIterator it = dataBegin + offset; it < dataEnd - patternSize + 1; it += byteAlign) { - - TIterator itData = it; - TIterator itPattern = patternBegin; - - while(*itData == *itPattern) { - ++itData; - ++itPattern; - - if(itPattern == patternEnd) - return static_cast<int>(it - dataBegin); - } - } - - return -1; -} - -template <class T> -T toNumber(const ByteVector &v, size_t offset, size_t length, bool mostSignificantByteFirst) -{ - if(offset >= v.size()) { - debug("toNumber<T>() -- No data to convert. Returning 0."); - return 0; - } - - length = std::min(length, v.size() - offset); - - T sum = 0; - for(size_t i = 0; i < length; i++) { - const size_t shift = (mostSignificantByteFirst ? length - 1 - i : i) * 8; - sum |= static_cast<T>(static_cast<unsigned char>(v[static_cast<int>(offset + i)])) << shift; - } - - return sum; -} - -template <class T> -T toNumber(const ByteVector &v, size_t offset, bool mostSignificantByteFirst) -{ - const bool isBigEndian = (Utils::systemByteOrder() == Utils::BigEndian); - const bool swap = (mostSignificantByteFirst != isBigEndian); - - if(offset + sizeof(T) > v.size()) - return toNumber<T>(v, offset, v.size() - offset, mostSignificantByteFirst); - - // Uses memcpy instead of reinterpret_cast to avoid an alignment exception. - T tmp; - ::memcpy(&tmp, v.data() + offset, sizeof(T)); - - if(swap) - return Utils::byteSwap(tmp); - else - return tmp; -} - -template <class T> -ByteVector fromNumber(T value, bool mostSignificantByteFirst) -{ - const bool isBigEndian = (Utils::systemByteOrder() == Utils::BigEndian); - const bool swap = (mostSignificantByteFirst != isBigEndian); - - if(swap) - value = Utils::byteSwap(value); - - return ByteVector(reinterpret_cast<const char *>(&value), sizeof(T)); -} - -template <typename TFloat, typename TInt, Utils::ByteOrder ENDIAN> -TFloat toFloat(const ByteVector &v, size_t offset) -{ - if(offset > v.size() - sizeof(TInt)) { - debug("toFloat() - offset is out of range. Returning 0."); - return 0.0; - } - - union { - TInt i; - TFloat f; - } tmp; - ::memcpy(&tmp, v.data() + offset, sizeof(TInt)); - - if(ENDIAN != Utils::systemByteOrder()) - tmp.i = Utils::byteSwap(tmp.i); - - return tmp.f; -} - -template <typename TFloat, typename TInt, Utils::ByteOrder ENDIAN> -ByteVector fromFloat(TFloat value) -{ - union { - TInt i; - TFloat f; - } tmp; - tmp.f = value; - - if(ENDIAN != Utils::systemByteOrder()) - tmp.i = Utils::byteSwap(tmp.i); - - return ByteVector(reinterpret_cast<char *>(&tmp), sizeof(TInt)); -} - -template <Utils::ByteOrder ENDIAN> -long double toFloat80(const ByteVector &v, size_t offset) -{ - using std::swap; - - if(offset > v.size() - 10) { - debug("toFloat80() - offset is out of range. Returning 0."); - return 0.0; - } - - unsigned char bytes[10]; - ::memcpy(bytes, v.data() + offset, 10); - - if(ENDIAN == Utils::LittleEndian) { - swap(bytes[0], bytes[9]); - swap(bytes[1], bytes[8]); - swap(bytes[2], bytes[7]); - swap(bytes[3], bytes[6]); - swap(bytes[4], bytes[5]); - } - - // 1-bit sign - const bool negative = ((bytes[0] & 0x80) != 0); - - // 15-bit exponent - const int exponent = ((bytes[0] & 0x7F) << 8) | bytes[1]; - - // 64-bit fraction. Leading 1 is explicit. - const unsigned long long fraction - = (static_cast<unsigned long long>(bytes[2]) << 56) - | (static_cast<unsigned long long>(bytes[3]) << 48) - | (static_cast<unsigned long long>(bytes[4]) << 40) - | (static_cast<unsigned long long>(bytes[5]) << 32) - | (static_cast<unsigned long long>(bytes[6]) << 24) - | (static_cast<unsigned long long>(bytes[7]) << 16) - | (static_cast<unsigned long long>(bytes[8]) << 8) - | (static_cast<unsigned long long>(bytes[9])); - - long double val; - if(exponent == 0 && fraction == 0) - val = 0; - else { - if(exponent == 0x7FFF) { - debug("toFloat80() - can't handle the infinity or NaN. Returning 0."); - return 0.0; - } - else - val = ::ldexp(static_cast<long double>(fraction), exponent - 16383 - 63); - } - - if(negative) - return -val; - else - return val; -} - -class ByteVector::ByteVectorPrivate -{ -public: - ByteVectorPrivate(unsigned int l, char c) : - counter(new RefCounter()), - data(new std::vector<char>(l, c)), - offset(0), - length(l) {} - - ByteVectorPrivate(const char *s, unsigned int l) : - counter(new RefCounter()), - data(new std::vector<char>(s, s + l)), - offset(0), - length(l) {} - - ByteVectorPrivate(const ByteVectorPrivate &d, unsigned int o, unsigned int l) : - counter(d.counter), - data(d.data), - offset(d.offset + o), - length(l) - { - counter->ref(); - } - - ~ByteVectorPrivate() - { - if(counter->deref()) { - delete counter; - delete data; - } - } - - RefCounter *counter; - std::vector<char> *data; - unsigned int offset; - unsigned int length; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -ByteVector ByteVector::null; - -ByteVector ByteVector::fromCString(const char *s, unsigned int length) -{ - if(length == 0xffffffff) - return ByteVector(s, static_cast<unsigned int>(::strlen(s))); - else - return ByteVector(s, length); -} - -ByteVector ByteVector::fromUInt(unsigned int value, bool mostSignificantByteFirst) -{ - return fromNumber<unsigned int>(value, mostSignificantByteFirst); -} - -ByteVector ByteVector::fromShort(short value, bool mostSignificantByteFirst) -{ - return fromNumber<unsigned short>(value, mostSignificantByteFirst); -} - -ByteVector ByteVector::fromLongLong(long long value, bool mostSignificantByteFirst) -{ - return fromNumber<unsigned long long>(value, mostSignificantByteFirst); -} - -ByteVector ByteVector::fromFloat32LE(float value) -{ - return fromFloat<float, unsigned int, Utils::LittleEndian>(value); -} - -ByteVector ByteVector::fromFloat32BE(float value) -{ - return fromFloat<float, unsigned int, Utils::BigEndian>(value); -} - -ByteVector ByteVector::fromFloat64LE(double value) -{ - return fromFloat<double, unsigned long long, Utils::LittleEndian>(value); -} - -ByteVector ByteVector::fromFloat64BE(double value) -{ - return fromFloat<double, unsigned long long, Utils::BigEndian>(value); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVector::ByteVector() : - d(new ByteVectorPrivate(0, '\0')) -{ -} - -ByteVector::ByteVector(unsigned int size, char value) : - d(new ByteVectorPrivate(size, value)) -{ -} - -ByteVector::ByteVector(const ByteVector &v) : - d(new ByteVectorPrivate(*v.d, 0, v.d->length)) -{ -} - -ByteVector::ByteVector(const ByteVector &v, unsigned int offset, unsigned int length) : - d(new ByteVectorPrivate(*v.d, offset, length)) -{ -} - -ByteVector::ByteVector(char c) : - d(new ByteVectorPrivate(1, c)) -{ -} - -ByteVector::ByteVector(const char *data, unsigned int length) : - d(new ByteVectorPrivate(data, length)) -{ -} - -ByteVector::ByteVector(const char *data) : - d(new ByteVectorPrivate(data, static_cast<unsigned int>(::strlen(data)))) -{ -} - -ByteVector::~ByteVector() -{ - delete d; -} - -ByteVector &ByteVector::setData(const char *s, unsigned int length) -{ - ByteVector(s, length).swap(*this); - return *this; -} - -ByteVector &ByteVector::setData(const char *data) -{ - ByteVector(data).swap(*this); - return *this; -} - -char *ByteVector::data() -{ - detach(); - return (size() > 0) ? (&(*d->data)[d->offset]) : 0; -} - -const char *ByteVector::data() const -{ - return (size() > 0) ? (&(*d->data)[d->offset]) : 0; -} - -ByteVector ByteVector::mid(unsigned int index, unsigned int length) const -{ - index = std::min(index, size()); - length = std::min(length, size() - index); - - return ByteVector(*this, index, length); -} - -char ByteVector::at(unsigned int index) const -{ - return (index < size()) ? (*d->data)[d->offset + index] : 0; -} - -int ByteVector::find(const ByteVector &pattern, unsigned int offset, int byteAlign) const -{ - return findVector<ConstIterator>( - begin(), end(), pattern.begin(), pattern.end(), offset, byteAlign); -} - -int ByteVector::find(char c, unsigned int offset, int byteAlign) const -{ - return findChar<ConstIterator>(begin(), end(), c, offset, byteAlign); -} - -int ByteVector::rfind(const ByteVector &pattern, unsigned int offset, int byteAlign) const -{ - if(offset > 0) { - offset = size() - offset - pattern.size(); - if(offset >= size()) - offset = 0; - } - - const int pos = findVector<ConstReverseIterator>( - rbegin(), rend(), pattern.rbegin(), pattern.rend(), offset, byteAlign); - - if(pos == -1) - return -1; - else - return size() - pos - pattern.size(); -} - -bool ByteVector::containsAt(const ByteVector &pattern, unsigned int offset, unsigned int patternOffset, unsigned int patternLength) const -{ - if(pattern.size() < patternLength) - patternLength = pattern.size(); - - // do some sanity checking -- all of these things are needed for the search to be valid - const unsigned int compareLength = patternLength - patternOffset; - if(offset + compareLength > size() || patternOffset >= pattern.size() || patternLength == 0) - return false; - - return (::memcmp(data() + offset, pattern.data() + patternOffset, compareLength) == 0); -} - -bool ByteVector::startsWith(const ByteVector &pattern) const -{ - return containsAt(pattern, 0); -} - -bool ByteVector::endsWith(const ByteVector &pattern) const -{ - return containsAt(pattern, size() - pattern.size()); -} - -ByteVector &ByteVector::replace(char oldByte, char newByte) -{ - detach(); - - for(ByteVector::Iterator it = begin(); it != end(); ++it) { - if(*it == oldByte) - *it = newByte; - } - - return *this; -} - -ByteVector &ByteVector::replace(const ByteVector &pattern, const ByteVector &with) -{ - if(pattern.size() == 1 && with.size() == 1) - return replace(pattern[0], with[0]); - - // Check if there is at least one occurrence of the pattern. - - int offset = find(pattern, 0); - if(offset == -1) - return *this; - - if(pattern.size() == with.size()) { - - // We think this case might be common enough to optimize it. - - detach(); - do - { - ::memcpy(data() + offset, with.data(), with.size()); - offset = find(pattern, offset + pattern.size()); - } while(offset != -1); - } - else { - - // Loop once to calculate the result size. - - unsigned int dstSize = size(); - do - { - dstSize += with.size() - pattern.size(); - offset = find(pattern, offset + pattern.size()); - } while(offset != -1); - - // Loop again to copy modified data to the new vector. - - ByteVector dst(dstSize); - int dstOffset = 0; - - offset = 0; - while(true) { - const int next = find(pattern, offset); - if(next == -1) { - ::memcpy(dst.data() + dstOffset, data() + offset, size() - offset); - break; - } - - ::memcpy(dst.data() + dstOffset, data() + offset, next - offset); - dstOffset += next - offset; - - ::memcpy(dst.data() + dstOffset, with.data(), with.size()); - dstOffset += with.size(); - - offset = next + pattern.size(); - } - - swap(dst); - } - - return *this; -} - -int ByteVector::endsWithPartialMatch(const ByteVector &pattern) const -{ - if(pattern.size() > size()) - return -1; - - const int startIndex = size() - pattern.size(); - - // try to match the last n-1 bytes from the vector (where n is the pattern - // size) -- continue trying to match n-2, n-3...1 bytes - - for(unsigned int i = 1; i < pattern.size(); i++) { - if(containsAt(pattern, startIndex + i, 0, pattern.size() - i)) - return startIndex + i; - } - - return -1; -} - -ByteVector &ByteVector::append(const ByteVector &v) -{ - if(v.isEmpty()) - return *this; - - detach(); - - const unsigned int originalSize = size(); - const unsigned int appendSize = v.size(); - - resize(originalSize + appendSize); - ::memcpy(data() + originalSize, v.data(), appendSize); - - return *this; -} - -ByteVector &ByteVector::append(char c) -{ - resize(size() + 1, c); - return *this; -} - -ByteVector &ByteVector::clear() -{ - ByteVector().swap(*this); - return *this; -} - -unsigned int ByteVector::size() const -{ - return d->length; -} - -ByteVector &ByteVector::resize(unsigned int size, char padding) -{ - if(size != d->length) { - detach(); - - // Remove the excessive length of the internal buffer first to pad correctly. - // This doesn't reallocate the buffer, since std::vector::resize() doesn't - // reallocate the buffer when shrinking. - - d->data->resize(d->offset + d->length); - d->data->resize(d->offset + size, padding); - - d->length = size; - } - - return *this; -} - -ByteVector::Iterator ByteVector::begin() -{ - detach(); - return d->data->begin() + d->offset; -} - -ByteVector::ConstIterator ByteVector::begin() const -{ - return d->data->begin() + d->offset; -} - -ByteVector::Iterator ByteVector::end() -{ - detach(); - return d->data->begin() + d->offset + d->length; -} - -ByteVector::ConstIterator ByteVector::end() const -{ - return d->data->begin() + d->offset + d->length; -} - -ByteVector::ReverseIterator ByteVector::rbegin() -{ - detach(); - return d->data->rbegin() + (d->data->size() - (d->offset + d->length)); -} - -ByteVector::ConstReverseIterator ByteVector::rbegin() const -{ - // Workaround for the Solaris Studio 12.4 compiler. - // We need a const reference to the data vector so we can ensure the const version of rbegin() is called. - const std::vector<char> &v = *d->data; - return v.rbegin() + (v.size() - (d->offset + d->length)); -} - -ByteVector::ReverseIterator ByteVector::rend() -{ - detach(); - return d->data->rbegin() + (d->data->size() - d->offset); -} - -ByteVector::ConstReverseIterator ByteVector::rend() const -{ - // Workaround for the Solaris Studio 12.4 compiler. - // We need a const reference to the data vector so we can ensure the const version of rbegin() is called. - const std::vector<char> &v = *d->data; - return v.rbegin() + (v.size() - d->offset); -} - -bool ByteVector::isNull() const -{ - return (d == null.d); -} - -bool ByteVector::isEmpty() const -{ - return (d->length == 0); -} - -unsigned int ByteVector::checksum() const -{ - static const unsigned int crcTable[256] = { - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, - 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, - 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, - 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, - 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, - 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, - 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, - 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, - 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, - 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, - 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, - 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, - 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, - 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, - 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, - 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, - 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, - 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, - 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, - 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, - 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, - 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, - 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, - 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, - 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, - 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, - 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, - 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, - 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, - 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, - 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, - 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, - 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, - 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 - }; - - unsigned int sum = 0; - for(ByteVector::ConstIterator it = begin(); it != end(); ++it) - sum = (sum << 8) ^ crcTable[((sum >> 24) & 0xff) ^ static_cast<unsigned char>(*it)]; - return sum; -} - -unsigned int ByteVector::toUInt(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned int>(*this, 0, mostSignificantByteFirst); -} - -unsigned int ByteVector::toUInt(unsigned int offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned int>(*this, offset, mostSignificantByteFirst); -} - -unsigned int ByteVector::toUInt(unsigned int offset, unsigned int length, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned int>(*this, offset, length, mostSignificantByteFirst); -} - -short ByteVector::toShort(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); -} - -short ByteVector::toShort(unsigned int offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); -} - -unsigned short ByteVector::toUShort(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); -} - -unsigned short ByteVector::toUShort(unsigned int offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); -} - -long long ByteVector::toLongLong(bool mostSignificantByteFirst) const -{ - return toNumber<unsigned long long>(*this, 0, mostSignificantByteFirst); -} - -long long ByteVector::toLongLong(unsigned int offset, bool mostSignificantByteFirst) const -{ - return toNumber<unsigned long long>(*this, offset, mostSignificantByteFirst); -} - -float ByteVector::toFloat32LE(size_t offset) const -{ - return toFloat<float, unsigned int, Utils::LittleEndian>(*this, offset); -} - -float ByteVector::toFloat32BE(size_t offset) const -{ - return toFloat<float, unsigned int, Utils::BigEndian>(*this, offset); -} - -double ByteVector::toFloat64LE(size_t offset) const -{ - return toFloat<double, unsigned long long, Utils::LittleEndian>(*this, offset); -} - -double ByteVector::toFloat64BE(size_t offset) const -{ - return toFloat<double, unsigned long long, Utils::BigEndian>(*this, offset); -} - -long double ByteVector::toFloat80LE(size_t offset) const -{ - return toFloat80<Utils::LittleEndian>(*this, offset); -} - -long double ByteVector::toFloat80BE(size_t offset) const -{ - return toFloat80<Utils::BigEndian>(*this, offset); -} - -const char &ByteVector::operator[](int index) const -{ - return (*d->data)[d->offset + index]; -} - -char &ByteVector::operator[](int index) -{ - detach(); - return (*d->data)[d->offset + index]; -} - -bool ByteVector::operator==(const ByteVector &v) const -{ - if(size() != v.size()) - return false; - - return (::memcmp(data(), v.data(), size()) == 0); -} - -bool ByteVector::operator!=(const ByteVector &v) const -{ - return !(*this == v); -} - -bool ByteVector::operator==(const char *s) const -{ - if(size() != ::strlen(s)) - return false; - - return (::memcmp(data(), s, size()) == 0); -} - -bool ByteVector::operator!=(const char *s) const -{ - return !(*this == s); -} - -bool ByteVector::operator<(const ByteVector &v) const -{ - const int result = ::memcmp(data(), v.data(), std::min(size(), v.size())); - if(result != 0) - return result < 0; - else - return size() < v.size(); -} - -bool ByteVector::operator>(const ByteVector &v) const -{ - return (v < *this); -} - -ByteVector ByteVector::operator+(const ByteVector &v) const -{ - ByteVector sum(*this); - sum.append(v); - return sum; -} - -ByteVector &ByteVector::operator=(const ByteVector &v) -{ - ByteVector(v).swap(*this); - return *this; -} - -ByteVector &ByteVector::operator=(char c) -{ - ByteVector(c).swap(*this); - return *this; -} - -ByteVector &ByteVector::operator=(const char *data) -{ - ByteVector(data).swap(*this); - return *this; -} - -void ByteVector::swap(ByteVector &v) -{ - using std::swap; - - swap(d, v.d); -} - -ByteVector ByteVector::toHex() const -{ - static const char hexTable[17] = "0123456789abcdef"; - - ByteVector encoded(size() * 2); - char *p = encoded.data(); - - for(unsigned int i = 0; i < size(); i++) { - unsigned char c = data()[i]; - *p++ = hexTable[(c >> 4) & 0x0F]; - *p++ = hexTable[(c ) & 0x0F]; - } - - return encoded; -} - -ByteVector ByteVector::fromBase64(const ByteVector & input) -{ - static const unsigned char base64[256] = { - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x3e,0x80,0x80,0x80,0x3f, - 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, - 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x80,0x80,0x80,0x80,0x80, - 0x80,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, - 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, - 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80 - }; - - unsigned int len = input.size(); - - ByteVector output(len); - - const unsigned char * src = (const unsigned char*) input.data(); - unsigned char * dst = (unsigned char*) output.data(); - - while(4 <= len) { - - // Check invalid character - if(base64[src[0]] == 0x80) - break; - - // Check invalid character - if(base64[src[1]] == 0x80) - break; - - // Decode first byte - *dst++ = ((base64[src[0]] << 2) & 0xfc) | ((base64[src[1]] >> 4) & 0x03); - - if(src[2] != '=') { - - // Check invalid character - if(base64[src[2]] == 0x80) - break; - - // Decode second byte - *dst++ = ((base64[src[1]] & 0x0f) << 4) | ((base64[src[2]] >> 2) & 0x0f); - - if(src[3] != '=') { - - // Check invalid character - if(base64[src[3]] == 0x80) - break; - - // Decode third byte - *dst++ = ((base64[src[2]] & 0x03) << 6) | (base64[src[3]] & 0x3f); - } - else { - // assume end of data - len -= 4; - break; - } - } - else { - // assume end of data - len -= 4; - break; - } - src += 4; - len -= 4; - } - - // Only return output if we processed all bytes - if(len == 0) { - output.resize(static_cast<unsigned int>(dst - (unsigned char*) output.data())); - return output; - } - return ByteVector(); -} - -ByteVector ByteVector::toBase64() const -{ - static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - if(!isEmpty()) { - unsigned int len = size(); - ByteVector output(4 * ((len - 1) / 3 + 1)); // note roundup - - const char * src = data(); - char * dst = output.data(); - while(3 <= len) { - *dst++ = alphabet[(src[0] >> 2) & 0x3f]; - *dst++ = alphabet[((src[0] & 0x03) << 4) | ((src[1] >> 4) & 0x0f)]; - *dst++ = alphabet[((src[1] & 0x0f) << 2) | ((src[2] >> 6) & 0x03)]; - *dst++ = alphabet[src[2] & 0x3f]; - src += 3; - len -= 3; - } - if(len) { - *dst++ = alphabet[(src[0] >> 2) & 0x3f]; - if(len>1) { - *dst++ = alphabet[((src[0] & 0x03) << 4) | ((src[1] >> 4) & 0x0f)]; - *dst++ = alphabet[((src[1] & 0x0f) << 2)]; - } - else { - *dst++ = alphabet[(src[0] & 0x03) << 4]; - *dst++ = '='; - } - *dst++ = '='; - } - return output; - } - return ByteVector(); -} - - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void ByteVector::detach() -{ - if(d->counter->count() > 1) { - if(!isEmpty()) - ByteVector(&d->data->front() + d->offset, d->length).swap(*this); - else - ByteVector().swap(*this); - } -} -} - -//////////////////////////////////////////////////////////////////////////////// -// related functions -//////////////////////////////////////////////////////////////////////////////// - -std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v) -{ - for(unsigned int i = 0; i < v.size(); i++) - s << v[i]; - return s; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorlist.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorlist.cpp deleted file mode 100755 index c4fdf5933..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorlist.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tbytevectorlist.h" - -using namespace TagLib; - -class ByteVectorListPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, - int byteAlign) -{ - return split(v, pattern, byteAlign, 0); -} - -ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, - int byteAlign, int max) -{ - ByteVectorList l; - - unsigned int previousOffset = 0; - for(int offset = v.find(pattern, 0, byteAlign); - offset != -1 && (max == 0 || max > int(l.size()) + 1); - offset = v.find(pattern, offset + pattern.size(), byteAlign)) - { - if(offset - previousOffset >= 1) - l.append(v.mid(previousOffset, offset - previousOffset)); - else - l.append(ByteVector()); - - previousOffset = offset + pattern.size(); - } - - if(previousOffset < v.size()) - l.append(v.mid(previousOffset, v.size() - previousOffset)); - - return l; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorList::ByteVectorList() : List<ByteVector>() -{ - -} - -ByteVectorList::ByteVectorList(const ByteVectorList &l) : List<ByteVector>(l) -{ - -} - -ByteVectorList::~ByteVectorList() -{ - -} - -ByteVector ByteVectorList::toByteVector(const ByteVector &separator) const -{ - ByteVector v; - - ConstIterator it = begin(); - - while(it != end()) { - v.append(*it); - it++; - if(it != end()) - v.append(separator); - } - - return v; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorstream.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorstream.cpp deleted file mode 100755 index 333f528c1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tbytevectorstream.cpp +++ /dev/null @@ -1,167 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tbytevectorstream.h" -#include "tstring.h" -#include "tdebug.h" - -#include <stdio.h> -#include <string.h> - -#include <stdlib.h> - -using namespace TagLib; - -class ByteVectorStream::ByteVectorStreamPrivate -{ -public: - ByteVectorStreamPrivate(const ByteVector &data); - - ByteVector data; - long position; -}; - -ByteVectorStream::ByteVectorStreamPrivate::ByteVectorStreamPrivate(const ByteVector &data) : - data(data), - position(0) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -ByteVectorStream::ByteVectorStream(const ByteVector &data) : - d(new ByteVectorStreamPrivate(data)) -{ -} - -ByteVectorStream::~ByteVectorStream() -{ - delete d; -} - -FileName ByteVectorStream::name() const -{ - return FileName(""); // XXX do we need a name? -} - -ByteVector ByteVectorStream::readBlock(unsigned long length) -{ - if(length == 0) - return ByteVector(); - - ByteVector v = d->data.mid(d->position, length); - d->position += v.size(); - return v; -} - -void ByteVectorStream::writeBlock(const ByteVector &data) -{ - unsigned int size = data.size(); - if(long(d->position + size) > length()) { - truncate(d->position + size); - } - memcpy(d->data.data() + d->position, data.data(), size); - d->position += size; -} - -void ByteVectorStream::insert(const ByteVector &data, unsigned long start, unsigned long replace) -{ - long sizeDiff = data.size() - replace; - if(sizeDiff < 0) { - removeBlock(start + data.size(), -sizeDiff); - } - else if(sizeDiff > 0) { - truncate(length() + sizeDiff); - unsigned long readPosition = start + replace; - unsigned long writePosition = start + data.size(); - memmove(d->data.data() + writePosition, d->data.data() + readPosition, length() - sizeDiff - readPosition); - } - seek(start); - writeBlock(data); -} - -void ByteVectorStream::removeBlock(unsigned long start, unsigned long length) -{ - unsigned long readPosition = start + length; - unsigned long writePosition = start; - if(readPosition < static_cast<unsigned long>(ByteVectorStream::length())) { - unsigned long bytesToMove = ByteVectorStream::length() - readPosition; - memmove(d->data.data() + writePosition, d->data.data() + readPosition, bytesToMove); - writePosition += bytesToMove; - } - d->position = writePosition; - truncate(writePosition); -} - -bool ByteVectorStream::readOnly() const -{ - return false; -} - -bool ByteVectorStream::isOpen() const -{ - return true; -} - -void ByteVectorStream::seek(long offset, Position p) -{ - switch(p) { - case Beginning: - d->position = offset; - break; - case Current: - d->position += offset; - break; - case End: - d->position = length() + offset; // offset is expected to be negative - break; - } -} - -void ByteVectorStream::clear() -{ -} - -long ByteVectorStream::tell() const -{ - return d->position; -} - -long ByteVectorStream::length() -{ - return d->data.size(); -} - -void ByteVectorStream::truncate(long length) -{ - d->data.resize(length); -} - -ByteVector *ByteVectorStream::data() -{ - return &d->data; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.cpp deleted file mode 100755 index b2efc4cb5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) - -#include "tdebug.h" -#include "tstring.h" -#include "tdebuglistener.h" -#include "tutils.h" - -#include <bitset> -#include <cstdio> -#include <cstdarg> - -namespace TagLib -{ - // The instance is defined in tdebuglistener.cpp. - extern DebugListener *debugListener; - - void debug(const String &s) - { - debugListener->printMessage("TagLib: " + s + "\n"); - } - - void debugData(const ByteVector &v) - { - for(unsigned int i = 0; i < v.size(); ++i) { - const std::string bits = std::bitset<8>(v[i]).to_string(); - const String msg = Utils::formatString( - "*** [%u] - char '%c' - int %d, 0x%02x, 0b%s\n", - i, v[i], v[i], v[i], bits.c_str()); - - debugListener->printMessage(msg); - } - } -} - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.h deleted file mode 100755 index 80d00d39e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebug.h +++ /dev/null @@ -1,70 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_DEBUG_H -#define TAGLIB_DEBUG_H - -namespace TagLib { - - class String; - class ByteVector; - -#ifndef DO_NOT_DOCUMENT -#if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) - - /*! - * A simple function that outputs the debug messages to the listener. - * The default listener redirects the messages to \a stderr when NDEBUG is - * not defined. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debug(const String &s); - - /*! - * For debugging binary data. - * - * \warning Do not use this outside of TagLib, it could lead to undefined - * symbols in your build if TagLib is built with NDEBUG defined and your - * application is not. - * - * \internal - */ - void debugData(const ByteVector &v); - -#else - - #define debug(x) ((void)0) - #define debugData(x) ((void)0) - -#endif -} - -#endif -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebuglistener.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebuglistener.cpp deleted file mode 100755 index 48912222d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tdebuglistener.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tdebuglistener.h" - -#include <iostream> -#include <bitset> - -#ifdef _WIN32 -# include <windows.h> -#endif - -using namespace TagLib; - -namespace -{ - class DefaultListener : public DebugListener - { - public: - virtual void printMessage(const String &msg) - { -#ifdef _WIN32 - - const wstring wstr = msg.toWString(); - const int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); - if(len != 0) { - std::vector<char> buf(len); - WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &buf[0], len, NULL, NULL); - - std::cerr << std::string(&buf[0]); - } - -#else - - std::cerr << msg; - -#endif - } - }; - - DefaultListener defaultListener; -} - -namespace TagLib -{ - DebugListener *debugListener = &defaultListener; - - DebugListener::DebugListener() - { - } - - DebugListener::~DebugListener() - { - } - - void setDebugListener(DebugListener *listener) - { - if(listener) - debugListener = listener; - else - debugListener = &defaultListener; - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.cpp deleted file mode 100755 index aff1684d9..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfile.cpp +++ /dev/null @@ -1,499 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tfile.h" -#include "tfilestream.h" -#include "tstring.h" -#include "tdebug.h" -#include "tpropertymap.h" - -#ifdef _WIN32 -# include <windows.h> -# include <io.h> -#else -# include <stdio.h> -# include <unistd.h> -#endif - -#ifndef R_OK -# define R_OK 4 -#endif -#ifndef W_OK -# define W_OK 2 -#endif - -#include "asffile.h" -#include "mpegfile.h" -#include "vorbisfile.h" -#include "flacfile.h" -#include "oggflacfile.h" -#include "mpcfile.h" -#include "mp4file.h" -#include "wavpackfile.h" -#include "speexfile.h" -#include "opusfile.h" -#include "trueaudiofile.h" -#include "aifffile.h" -#include "wavfile.h" -#include "apefile.h" -#include "modfile.h" -#include "s3mfile.h" -#include "itfile.h" -#include "xmfile.h" -#include "mp4file.h" - -using namespace TagLib; - -class File::FilePrivate -{ -public: - FilePrivate(IOStream *stream, bool owner) : - stream(stream), - streamOwner(owner), - valid(true) {} - - ~FilePrivate() - { - if(streamOwner) - delete stream; - } - - IOStream *stream; - bool streamOwner; - bool valid; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -File::File(FileName fileName) : - d(new FilePrivate(new FileStream(fileName), true)) -{ -} - -File::File(IOStream *stream) : - d(new FilePrivate(stream, false)) -{ -} - -File::~File() -{ - delete d; -} - -FileName File::name() const -{ - return d->stream->name(); -} - -PropertyMap File::properties() const -{ - // ugly workaround until this method is virtual - if(dynamic_cast<const APE::File* >(this)) - return dynamic_cast<const APE::File* >(this)->properties(); - if(dynamic_cast<const FLAC::File* >(this)) - return dynamic_cast<const FLAC::File* >(this)->properties(); - if(dynamic_cast<const IT::File* >(this)) - return dynamic_cast<const IT::File* >(this)->properties(); - if(dynamic_cast<const Mod::File* >(this)) - return dynamic_cast<const Mod::File* >(this)->properties(); - if(dynamic_cast<const MPC::File* >(this)) - return dynamic_cast<const MPC::File* >(this)->properties(); - if(dynamic_cast<const MPEG::File* >(this)) - return dynamic_cast<const MPEG::File* >(this)->properties(); - if(dynamic_cast<const Ogg::FLAC::File* >(this)) - return dynamic_cast<const Ogg::FLAC::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Speex::File* >(this)) - return dynamic_cast<const Ogg::Speex::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Opus::File* >(this)) - return dynamic_cast<const Ogg::Opus::File* >(this)->properties(); - if(dynamic_cast<const Ogg::Vorbis::File* >(this)) - return dynamic_cast<const Ogg::Vorbis::File* >(this)->properties(); - if(dynamic_cast<const RIFF::AIFF::File* >(this)) - return dynamic_cast<const RIFF::AIFF::File* >(this)->properties(); - if(dynamic_cast<const RIFF::WAV::File* >(this)) - return dynamic_cast<const RIFF::WAV::File* >(this)->properties(); - if(dynamic_cast<const S3M::File* >(this)) - return dynamic_cast<const S3M::File* >(this)->properties(); - if(dynamic_cast<const TrueAudio::File* >(this)) - return dynamic_cast<const TrueAudio::File* >(this)->properties(); - if(dynamic_cast<const WavPack::File* >(this)) - return dynamic_cast<const WavPack::File* >(this)->properties(); - if(dynamic_cast<const XM::File* >(this)) - return dynamic_cast<const XM::File* >(this)->properties(); - if(dynamic_cast<const MP4::File* >(this)) - return dynamic_cast<const MP4::File* >(this)->properties(); - if(dynamic_cast<const ASF::File* >(this)) - return dynamic_cast<const ASF::File* >(this)->properties(); - return tag()->properties(); -} - -void File::removeUnsupportedProperties(const StringList &properties) -{ - // here we only consider those formats that could possibly contain - // unsupported properties - if(dynamic_cast<APE::File* >(this)) - dynamic_cast<APE::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<FLAC::File* >(this)) - dynamic_cast<FLAC::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MPC::File* >(this)) - dynamic_cast<MPC::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MPEG::File* >(this)) - dynamic_cast<MPEG::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<Ogg::Vorbis::File* >(this)) - dynamic_cast<Ogg::Vorbis::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<RIFF::AIFF::File* >(this)) - dynamic_cast<RIFF::AIFF::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<RIFF::WAV::File* >(this)) - dynamic_cast<RIFF::WAV::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<TrueAudio::File* >(this)) - dynamic_cast<TrueAudio::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<WavPack::File* >(this)) - dynamic_cast<WavPack::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<MP4::File* >(this)) - dynamic_cast<MP4::File* >(this)->removeUnsupportedProperties(properties); - else if(dynamic_cast<ASF::File* >(this)) - dynamic_cast<ASF::File* >(this)->removeUnsupportedProperties(properties); - else - tag()->removeUnsupportedProperties(properties); -} - -PropertyMap File::setProperties(const PropertyMap &properties) -{ - if(dynamic_cast<APE::File* >(this)) - return dynamic_cast<APE::File* >(this)->setProperties(properties); - else if(dynamic_cast<FLAC::File* >(this)) - return dynamic_cast<FLAC::File* >(this)->setProperties(properties); - else if(dynamic_cast<IT::File* >(this)) - return dynamic_cast<IT::File* >(this)->setProperties(properties); - else if(dynamic_cast<Mod::File* >(this)) - return dynamic_cast<Mod::File* >(this)->setProperties(properties); - else if(dynamic_cast<MPC::File* >(this)) - return dynamic_cast<MPC::File* >(this)->setProperties(properties); - else if(dynamic_cast<MPEG::File* >(this)) - return dynamic_cast<MPEG::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::FLAC::File* >(this)) - return dynamic_cast<Ogg::FLAC::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Speex::File* >(this)) - return dynamic_cast<Ogg::Speex::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Opus::File* >(this)) - return dynamic_cast<Ogg::Opus::File* >(this)->setProperties(properties); - else if(dynamic_cast<Ogg::Vorbis::File* >(this)) - return dynamic_cast<Ogg::Vorbis::File* >(this)->setProperties(properties); - else if(dynamic_cast<RIFF::AIFF::File* >(this)) - return dynamic_cast<RIFF::AIFF::File* >(this)->setProperties(properties); - else if(dynamic_cast<RIFF::WAV::File* >(this)) - return dynamic_cast<RIFF::WAV::File* >(this)->setProperties(properties); - else if(dynamic_cast<S3M::File* >(this)) - return dynamic_cast<S3M::File* >(this)->setProperties(properties); - else if(dynamic_cast<TrueAudio::File* >(this)) - return dynamic_cast<TrueAudio::File* >(this)->setProperties(properties); - else if(dynamic_cast<WavPack::File* >(this)) - return dynamic_cast<WavPack::File* >(this)->setProperties(properties); - else if(dynamic_cast<XM::File* >(this)) - return dynamic_cast<XM::File* >(this)->setProperties(properties); - else if(dynamic_cast<MP4::File* >(this)) - return dynamic_cast<MP4::File* >(this)->setProperties(properties); - else if(dynamic_cast<ASF::File* >(this)) - return dynamic_cast<ASF::File* >(this)->setProperties(properties); - else - return tag()->setProperties(properties); -} - -ByteVector File::readBlock(unsigned long length) -{ - return d->stream->readBlock(length); -} - -void File::writeBlock(const ByteVector &data) -{ - d->stream->writeBlock(data); -} - -long File::find(const ByteVector &pattern, long fromOffset, const ByteVector &before) -{ - if(!d->stream || pattern.size() > bufferSize()) - return -1; - - // The position in the file that the current buffer starts at. - - long bufferOffset = fromOffset; - ByteVector buffer; - - // These variables are used to keep track of a partial match that happens at - // the end of a buffer. - - int previousPartialMatch = -1; - int beforePreviousPartialMatch = -1; - - // Save the location of the current read pointer. We will restore the - // position using seek() before all returns. - - long originalPosition = tell(); - - // Start the search at the offset. - - seek(fromOffset); - - // This loop is the crux of the find method. There are three cases that we - // want to account for: - // - // (1) The previously searched buffer contained a partial match of the search - // pattern and we want to see if the next one starts with the remainder of - // that pattern. - // - // (2) The search pattern is wholly contained within the current buffer. - // - // (3) The current buffer ends with a partial match of the pattern. We will - // note this for use in the next iteration, where we will check for the rest - // of the pattern. - // - // All three of these are done in two steps. First we check for the pattern - // and do things appropriately if a match (or partial match) is found. We - // then check for "before". The order is important because it gives priority - // to "real" matches. - - for(buffer = readBlock(bufferSize()); buffer.size() > 0; buffer = readBlock(bufferSize())) { - - // (1) previous partial match - - if(previousPartialMatch >= 0 && int(bufferSize()) > previousPartialMatch) { - const int patternOffset = (bufferSize() - previousPartialMatch); - if(buffer.containsAt(pattern, 0, patternOffset)) { - seek(originalPosition); - return bufferOffset - bufferSize() + previousPartialMatch; - } - } - - if(!before.isEmpty() && beforePreviousPartialMatch >= 0 && int(bufferSize()) > beforePreviousPartialMatch) { - const int beforeOffset = (bufferSize() - beforePreviousPartialMatch); - if(buffer.containsAt(before, 0, beforeOffset)) { - seek(originalPosition); - return -1; - } - } - - // (2) pattern contained in current buffer - - long location = buffer.find(pattern); - if(location >= 0) { - seek(originalPosition); - return bufferOffset + location; - } - - if(!before.isEmpty() && buffer.find(before) >= 0) { - seek(originalPosition); - return -1; - } - - // (3) partial match - - previousPartialMatch = buffer.endsWithPartialMatch(pattern); - - if(!before.isEmpty()) - beforePreviousPartialMatch = buffer.endsWithPartialMatch(before); - - bufferOffset += bufferSize(); - } - - // Since we hit the end of the file, reset the status before continuing. - - clear(); - - seek(originalPosition); - - return -1; -} - - -long File::rfind(const ByteVector &pattern, long fromOffset, const ByteVector &before) -{ - if(!d->stream || pattern.size() > bufferSize()) - return -1; - - // The position in the file that the current buffer starts at. - - ByteVector buffer; - - // These variables are used to keep track of a partial match that happens at - // the end of a buffer. - - /* - int previousPartialMatch = -1; - int beforePreviousPartialMatch = -1; - */ - - // Save the location of the current read pointer. We will restore the - // position using seek() before all returns. - - long originalPosition = tell(); - - // Start the search at the offset. - - if(fromOffset == 0) - fromOffset = length(); - - long bufferLength = bufferSize(); - long bufferOffset = fromOffset + pattern.size(); - - // See the notes in find() for an explanation of this algorithm. - - while(true) { - - if(bufferOffset > bufferLength) { - bufferOffset -= bufferLength; - } - else { - bufferLength = bufferOffset; - bufferOffset = 0; - } - seek(bufferOffset); - - buffer = readBlock(bufferLength); - if(buffer.isEmpty()) - break; - - // TODO: (1) previous partial match - - // (2) pattern contained in current buffer - - const long location = buffer.rfind(pattern); - if(location >= 0) { - seek(originalPosition); - return bufferOffset + location; - } - - if(!before.isEmpty() && buffer.find(before) >= 0) { - seek(originalPosition); - return -1; - } - - // TODO: (3) partial match - } - - // Since we hit the end of the file, reset the status before continuing. - - clear(); - - seek(originalPosition); - - return -1; -} - -void File::insert(const ByteVector &data, unsigned long start, unsigned long replace) -{ - d->stream->insert(data, start, replace); -} - -void File::removeBlock(unsigned long start, unsigned long length) -{ - d->stream->removeBlock(start, length); -} - -bool File::readOnly() const -{ - return d->stream->readOnly(); -} - -bool File::isOpen() const -{ - return d->stream->isOpen(); -} - -bool File::isValid() const -{ - return isOpen() && d->valid; -} - -void File::seek(long offset, Position p) -{ - d->stream->seek(offset, IOStream::Position(p)); -} - -void File::truncate(long length) -{ - d->stream->truncate(length); -} - -void File::clear() -{ - d->stream->clear(); -} - -long File::tell() const -{ - return d->stream->tell(); -} - -long File::length() -{ - return d->stream->length(); -} - -bool File::isReadable(const char *file) -{ - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later - - return _access_s(file, R_OK) == 0; - -#else - - return access(file, R_OK) == 0; - -#endif - -} - -bool File::isWritable(const char *file) -{ - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later - - return _access_s(file, W_OK) == 0; - -#else - - return access(file, W_OK) == 0; - -#endif - -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -unsigned int File::bufferSize() -{ - return 1024; -} - -void File::setValid(bool valid) -{ - d->valid = valid; -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfilestream.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfilestream.cpp deleted file mode 100755 index 94bd33627..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tfilestream.cpp +++ /dev/null @@ -1,507 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tfilestream.h" -#include "tstring.h" -#include "tdebug.h" - -#ifdef _WIN32 -# include <windows.h> -#else -# include <stdio.h> -# include <unistd.h> -#endif - -using namespace TagLib; - -namespace -{ -#ifdef _WIN32 - - // Uses Win32 native API instead of POSIX API to reduce the resource consumption. - - typedef FileName FileNameHandle; - typedef HANDLE FileHandle; - - const FileHandle InvalidFileHandle = INVALID_HANDLE_VALUE; - - FileHandle openFile(const FileName &path, bool readOnly) - { - const DWORD access = readOnly ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE); - -#if defined (PLATFORM_WINRT) - return CreateFile2(path.wstr().c_str(), access, FILE_SHARE_READ, OPEN_EXISTING, NULL); -#else - return CreateFileW(path.wstr().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); -#endif - } - - FileHandle openFile(const int fileDescriptor, bool readOnly) - { - return InvalidFileHandle; - } - - void closeFile(FileHandle file) - { - CloseHandle(file); - } - - size_t readFile(FileHandle file, ByteVector &buffer) - { - DWORD length; - if(ReadFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) - return static_cast<size_t>(length); - else - return 0; - } - - size_t writeFile(FileHandle file, const ByteVector &buffer) - { - DWORD length; - if(WriteFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) - return static_cast<size_t>(length); - else - return 0; - } - -#else // _WIN32 - - struct FileNameHandle : public std::string - { - FileNameHandle(FileName name) : std::string(name) {} - operator FileName () const { return c_str(); } - }; - - typedef FILE* FileHandle; - - const FileHandle InvalidFileHandle = 0; - - FileHandle openFile(const FileName &path, bool readOnly) - { - return fopen(path, readOnly ? "rb" : "rb+"); - } - - FileHandle openFile(const int fileDescriptor, bool readOnly) - { - return fdopen(fileDescriptor, readOnly ? "rb" : "rb+"); - } - - void closeFile(FileHandle file) - { - fclose(file); - } - - size_t readFile(FileHandle file, ByteVector &buffer) - { - return fread(buffer.data(), sizeof(char), buffer.size(), file); - } - - size_t writeFile(FileHandle file, const ByteVector &buffer) - { - return fwrite(buffer.data(), sizeof(char), buffer.size(), file); - } - -#endif // _WIN32 -} - -class FileStream::FileStreamPrivate -{ -public: - FileStreamPrivate(const FileName &fileName) - : file(InvalidFileHandle) - , name(fileName) - , readOnly(true) - { - } - - FileHandle file; - FileNameHandle name; - bool readOnly; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -FileStream::FileStream(FileName fileName, bool openReadOnly) - : d(new FileStreamPrivate(fileName)) -{ - // First try with read / write mode, if that fails, fall back to read only. - - if(!openReadOnly) - d->file = openFile(fileName, false); - - if(d->file != InvalidFileHandle) - d->readOnly = false; - else - d->file = openFile(fileName, true); - - if(d->file == InvalidFileHandle) -# ifdef _WIN32 - debug("Could not open file " + fileName.toString()); -# else - debug("Could not open file " + String(static_cast<const char *>(d->name))); -# endif -} - -FileStream::FileStream(int fileDescriptor, bool openReadOnly) - : d(new FileStreamPrivate("")) -{ - // First try with read / write mode, if that fails, fall back to read only. - - if(!openReadOnly) - d->file = openFile(fileDescriptor, false); - - if(d->file != InvalidFileHandle) - d->readOnly = false; - else - d->file = openFile(fileDescriptor, true); - - if(d->file == InvalidFileHandle) - debug("Could not open file using file descriptor"); -} - -FileStream::~FileStream() -{ - if(isOpen()) - closeFile(d->file); - - delete d; -} - -FileName FileStream::name() const -{ - return d->name; -} - -ByteVector FileStream::readBlock(unsigned long length) -{ - if(!isOpen()) { - debug("FileStream::readBlock() -- invalid file."); - return ByteVector(); - } - - if(length == 0) - return ByteVector(); - - const unsigned long streamLength = static_cast<unsigned long>(FileStream::length()); - if(length > bufferSize() && length > streamLength) - length = streamLength; - - ByteVector buffer(static_cast<unsigned int>(length)); - - const size_t count = readFile(d->file, buffer); - buffer.resize(static_cast<unsigned int>(count)); - - return buffer; -} - -void FileStream::writeBlock(const ByteVector &data) -{ - if(!isOpen()) { - debug("FileStream::writeBlock() -- invalid file."); - return; - } - - if(readOnly()) { - debug("FileStream::writeBlock() -- read only file."); - return; - } - - writeFile(d->file, data); -} - -void FileStream::insert(const ByteVector &data, unsigned long start, unsigned long replace) -{ - if(!isOpen()) { - debug("FileStream::insert() -- invalid file."); - return; - } - - if(readOnly()) { - debug("FileStream::insert() -- read only file."); - return; - } - - if(data.size() == replace) { - seek(start); - writeBlock(data); - return; - } - else if(data.size() < replace) { - seek(start); - writeBlock(data); - removeBlock(start + data.size(), replace - data.size()); - return; - } - - // Woohoo! Faster (about 20%) than id3lib at last. I had to get hardcore - // and avoid TagLib's high level API for rendering just copying parts of - // the file that don't contain tag data. - // - // Now I'll explain the steps in this ugliness: - - // First, make sure that we're working with a buffer that is longer than - // the *difference* in the tag sizes. We want to avoid overwriting parts - // that aren't yet in memory, so this is necessary. - - unsigned long bufferLength = bufferSize(); - - while(data.size() - replace > bufferLength) - bufferLength += bufferSize(); - - // Set where to start the reading and writing. - - long readPosition = start + replace; - long writePosition = start; - - ByteVector buffer = data; - ByteVector aboutToOverwrite(static_cast<unsigned int>(bufferLength)); - - while(true) { - // Seek to the current read position and read the data that we're about - // to overwrite. Appropriately increment the readPosition. - - seek(readPosition); - const unsigned int bytesRead = static_cast<unsigned int>(readFile(d->file, aboutToOverwrite)); - aboutToOverwrite.resize(bytesRead); - readPosition += bufferLength; - - // Check to see if we just read the last block. We need to call clear() - // if we did so that the last write succeeds. - - if(bytesRead < bufferLength) - clear(); - - // Seek to the write position and write our buffer. Increment the - // writePosition. - - seek(writePosition); - writeBlock(buffer); - - // We hit the end of the file. - - if(bytesRead == 0) - break; - - writePosition += buffer.size(); - - // Make the current buffer the data that we read in the beginning. - - buffer = aboutToOverwrite; - } -} - -void FileStream::removeBlock(unsigned long start, unsigned long length) -{ - if(!isOpen()) { - debug("FileStream::removeBlock() -- invalid file."); - return; - } - - unsigned long bufferLength = bufferSize(); - - long readPosition = start + length; - long writePosition = start; - - ByteVector buffer(static_cast<unsigned int>(bufferLength)); - - for(unsigned int bytesRead = -1; bytesRead != 0;) { - seek(readPosition); - bytesRead = static_cast<unsigned int>(readFile(d->file, buffer)); - readPosition += bytesRead; - - // Check to see if we just read the last block. We need to call clear() - // if we did so that the last write succeeds. - - if(bytesRead < buffer.size()) { - clear(); - buffer.resize(bytesRead); - } - - seek(writePosition); - writeFile(d->file, buffer); - - writePosition += bytesRead; - } - - truncate(writePosition); -} - -bool FileStream::readOnly() const -{ - return d->readOnly; -} - -bool FileStream::isOpen() const -{ - return (d->file != InvalidFileHandle); -} - -void FileStream::seek(long offset, Position p) -{ - if(!isOpen()) { - debug("FileStream::seek() -- invalid file."); - return; - } - -#ifdef _WIN32 - - if(p != Beginning && p != Current && p != End) { - debug("FileStream::seek() -- Invalid Position value."); - return; - } - - LARGE_INTEGER liOffset; - liOffset.QuadPart = offset; - - if(!SetFilePointerEx(d->file, liOffset, NULL, static_cast<DWORD>(p))) { - debug("FileStream::seek() -- Failed to set the file pointer."); - } - -#else - - int whence; - switch(p) { - case Beginning: - whence = SEEK_SET; - break; - case Current: - whence = SEEK_CUR; - break; - case End: - whence = SEEK_END; - break; - default: - debug("FileStream::seek() -- Invalid Position value."); - return; - } - - fseek(d->file, offset, whence); - -#endif -} - -void FileStream::clear() -{ -#ifdef _WIN32 - - // NOP - -#else - - clearerr(d->file); - -#endif -} - -long FileStream::tell() const -{ -#ifdef _WIN32 - - const LARGE_INTEGER zero = {}; - LARGE_INTEGER position; - - if(SetFilePointerEx(d->file, zero, &position, FILE_CURRENT) && - position.QuadPart <= LONG_MAX) { - return static_cast<long>(position.QuadPart); - } - else { - debug("FileStream::tell() -- Failed to get the file pointer."); - return 0; - } - -#else - - return ftell(d->file); - -#endif -} - -long FileStream::length() -{ - if(!isOpen()) { - debug("FileStream::length() -- invalid file."); - return 0; - } - -#ifdef _WIN32 - - LARGE_INTEGER fileSize; - - if(GetFileSizeEx(d->file, &fileSize) && fileSize.QuadPart <= LONG_MAX) { - return static_cast<long>(fileSize.QuadPart); - } - else { - debug("FileStream::length() -- Failed to get the file size."); - return 0; - } - -#else - - const long curpos = tell(); - - seek(0, End); - const long endpos = tell(); - - seek(curpos, Beginning); - - return endpos; - -#endif -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void FileStream::truncate(long length) -{ -#ifdef _WIN32 - - const long currentPos = tell(); - - seek(length); - - if(!SetEndOfFile(d->file)) { - debug("FileStream::truncate() -- Failed to truncate the file."); - } - - seek(currentPos); - -#else - - fflush(d->file); - const int error = ftruncate(fileno(d->file), length); - if(error != 0) - debug("FileStream::truncate() -- Coundn't truncate the file."); - -#endif -} - -unsigned int FileStream::bufferSize() -{ - return 1024; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tiostream.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tiostream.cpp deleted file mode 100755 index de0bd5053..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tiostream.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lalinsky@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef _WIN32 -# include <windows.h> -# include <tstring.h> -#endif - -#include "tiostream.h" - -using namespace TagLib; - -#ifdef _WIN32 - -namespace -{ - std::wstring ansiToUnicode(const char *str) - { - const int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); - if(len == 0) - return std::wstring(); - - std::wstring wstr(len - 1, L'\0'); - MultiByteToWideChar(CP_ACP, 0, str, -1, &wstr[0], len); - - return wstr; - } -} - -// m_name is no longer used, but kept for backward compatibility. - -FileName::FileName(const wchar_t *name) : - m_name(), - m_wname(name) -{ -} - -FileName::FileName(const char *name) : - m_name(), - m_wname(ansiToUnicode(name)) -{ -} - -FileName::FileName(const FileName &name) : - m_name(), - m_wname(name.m_wname) -{ -} - -FileName::operator const wchar_t *() const -{ - return m_wname.c_str(); -} - -FileName::operator const char *() const -{ - return m_name.c_str(); -} - -const std::wstring &FileName::wstr() const -{ - return m_wname; -} - -const std::string &FileName::str() const -{ - return m_name; -} - -String FileName::toString() const -{ - return String(m_wname.c_str()); -} - -#endif // _WIN32 - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -IOStream::IOStream() -{ -} - -IOStream::~IOStream() -{ -} - -void IOStream::clear() -{ -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.cpp deleted file mode 100755 index b3e1ec3ad..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tpropertymap.cpp +++ /dev/null @@ -1,179 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Michael Helmling - email : helmling@mathematik.uni-kl.de - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "tpropertymap.h" -using namespace TagLib; - - -PropertyMap::PropertyMap() : SimplePropertyMap() -{ -} - -PropertyMap::PropertyMap(const PropertyMap &m) : SimplePropertyMap(m), unsupported(m.unsupported) -{ -} - -PropertyMap::PropertyMap(const SimplePropertyMap &m) -{ - for(SimplePropertyMap::ConstIterator it = m.begin(); it != m.end(); ++it){ - String key = it->first.upper(); - if(!key.isEmpty()) - insert(it->first, it->second); - else - unsupported.append(it->first); - } -} - -PropertyMap::~PropertyMap() -{ -} - -bool PropertyMap::insert(const String &key, const StringList &values) -{ - String realKey = key.upper(); - Iterator result = SimplePropertyMap::find(realKey); - if(result == end()) - SimplePropertyMap::insert(realKey, values); - else - SimplePropertyMap::operator[](realKey).append(values); - return true; -} - -bool PropertyMap::replace(const String &key, const StringList &values) -{ - String realKey = key.upper(); - SimplePropertyMap::erase(realKey); - SimplePropertyMap::insert(realKey, values); - return true; -} - -PropertyMap::Iterator PropertyMap::find(const String &key) -{ - return SimplePropertyMap::find(key.upper()); -} - -PropertyMap::ConstIterator PropertyMap::find(const String &key) const -{ - return SimplePropertyMap::find(key.upper()); -} - -bool PropertyMap::contains(const String &key) const -{ - return SimplePropertyMap::contains(key.upper()); -} - -bool PropertyMap::contains(const PropertyMap &other) const -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) { - if(!SimplePropertyMap::contains(it->first)) - return false; - if ((*this)[it->first] != it->second) - return false; - } - return true; -} - -PropertyMap &PropertyMap::erase(const String &key) -{ - SimplePropertyMap::erase(key.upper()); - return *this; -} - -PropertyMap &PropertyMap::erase(const PropertyMap &other) -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) - erase(it->first); - return *this; -} - -PropertyMap &PropertyMap::merge(const PropertyMap &other) -{ - for(PropertyMap::ConstIterator it = other.begin(); it != other.end(); ++it) - insert(it->first, it->second); - unsupported.append(other.unsupported); - return *this; -} - -const StringList &PropertyMap::operator[](const String &key) const -{ - return SimplePropertyMap::operator[](key.upper()); -} - -StringList &PropertyMap::operator[](const String &key) -{ - return SimplePropertyMap::operator[](key.upper()); -} - -bool PropertyMap::operator==(const PropertyMap &other) const -{ - for(ConstIterator it = other.begin(); it != other.end(); ++it) { - ConstIterator thisFind = find(it->first); - if( thisFind == end() || (thisFind->second != it->second) ) - return false; - } - for(ConstIterator it = begin(); it != end(); ++it) { - ConstIterator otherFind = other.find(it->first); - if( otherFind == other.end() || (otherFind->second != it->second) ) - return false; - } - return unsupported == other.unsupported; -} - -bool PropertyMap::operator!=(const PropertyMap &other) const -{ - return !(*this == other); -} - -String PropertyMap::toString() const -{ - String ret; - - for(ConstIterator it = begin(); it != end(); ++it) - ret += it->first+"="+it->second.toString(", ") + "\n"; - if(!unsupported.isEmpty()) - ret += "Unsupported Data: " + unsupported.toString(", ") + "\n"; - return ret; -} - -void PropertyMap::removeEmpty() -{ - PropertyMap m; - for(ConstIterator it = begin(); it != end(); ++it) { - if(!it->second.isEmpty()) - m.insert(it->first, it->second); - } - *this = m; -} - -StringList &PropertyMap::unsupportedData() -{ - return unsupported; -} - -const StringList &PropertyMap::unsupportedData() const -{ - return unsupported; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/trefcounter.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/trefcounter.cpp deleted file mode 100755 index 6638fcaa5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/trefcounter.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "trefcounter.h" - -#if defined(HAVE_STD_ATOMIC) -# include <atomic> -# define ATOMIC_INT std::atomic_int -# define ATOMIC_INC(x) (++x) -# define ATOMIC_DEC(x) (--x) -#elif defined(HAVE_GCC_ATOMIC) -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) -#elif defined(HAVE_WIN_ATOMIC) -# if !defined(NOMINMAX) -# define NOMINMAX -# endif -# include <windows.h> -# define ATOMIC_INT long -# define ATOMIC_INC(x) InterlockedIncrement(&x) -# define ATOMIC_DEC(x) InterlockedDecrement(&x) -#elif defined(HAVE_MAC_ATOMIC) -# include <libkern/OSAtomic.h> -# define ATOMIC_INT int32_t -# define ATOMIC_INC(x) OSAtomicIncrement32Barrier(&x) -# define ATOMIC_DEC(x) OSAtomicDecrement32Barrier(&x) -#elif defined(HAVE_IA64_ATOMIC) -# include <ia64intrin.h> -# define ATOMIC_INT int -# define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) -# define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) -#else -# define ATOMIC_INT int -# define ATOMIC_INC(x) (++x) -# define ATOMIC_DEC(x) (--x) -#endif - -namespace TagLib -{ - - class RefCounter::RefCounterPrivate - { - public: - RefCounterPrivate() : - refCount(1) {} - - volatile ATOMIC_INT refCount; - }; - - RefCounter::RefCounter() : - d(new RefCounterPrivate()) - { - } - - RefCounter::~RefCounter() - { - delete d; - } - - void RefCounter::ref() - { - ATOMIC_INC(d->refCount); - } - - bool RefCounter::deref() - { - return (ATOMIC_DEC(d->refCount) == 0); - } - - int RefCounter::count() const - { - return static_cast<int>(d->refCount); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.cpp deleted file mode 100755 index c60a3e2ed..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstring.cpp +++ /dev/null @@ -1,747 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <cerrno> -#include <climits> - -#include <utf8-cpp/checked.h> - -#include <tdebug.h> -#include <tstringlist.h> -#include <trefcounter.h> -#include <tutils.h> - -#include "tstring.h" - -namespace -{ - using namespace TagLib; - - // Returns the native format of std::wstring. - String::Type wcharByteOrder() - { - if(Utils::systemByteOrder() == Utils::LittleEndian) - return String::UTF16LE; - else - return String::UTF16BE; - } - - // Converts a Latin-1 string into UTF-16(without BOM/CPU byte order) - // and copies it to the internal buffer. - void copyFromLatin1(std::wstring &data, const char *s, size_t length) - { - data.resize(length); - - for(size_t i = 0; i < length; ++i) - data[i] = static_cast<unsigned char>(s[i]); - } - - // Converts a UTF-8 string into UTF-16(without BOM/CPU byte order) - // and copies it to the internal buffer. - void copyFromUTF8(std::wstring &data, const char *s, size_t length) - { - data.resize(length); - - try { - const std::wstring::iterator dstEnd = utf8::utf8to16(s, s + length, data.begin()); - data.resize(dstEnd - data.begin()); - } - catch(const utf8::exception &e) { - const String message(e.what()); - debug("String::copyFromUTF8() - UTF8-CPP error: " + message); - data.clear(); - } - } - - // Helper functions to read a UTF-16 character from an array. - template <typename T> - unsigned short nextUTF16(const T **p); - - template <> - unsigned short nextUTF16<wchar_t>(const wchar_t **p) - { - return static_cast<unsigned short>(*(*p)++); - } - - template <> - unsigned short nextUTF16<char>(const char **p) - { - union { - unsigned short w; - char c[2]; - } u; - u.c[0] = *(*p)++; - u.c[1] = *(*p)++; - return u.w; - } - - // Converts a UTF-16 (with BOM), UTF-16LE or UTF16-BE string into - // UTF-16(without BOM/CPU byte order) and copies it to the internal buffer. - template <typename T> - void copyFromUTF16(std::wstring &data, const T *s, size_t length, String::Type t) - { - bool swap; - if(t == String::UTF16) { - if(length < 1) { - debug("String::copyFromUTF16() - Invalid UTF16 string. Too short to have a BOM."); - return; - } - - const unsigned short bom = nextUTF16(&s); - if(bom == 0xfeff) - swap = false; // Same as CPU endian. No need to swap bytes. - else if(bom == 0xfffe) - swap = true; // Not same as CPU endian. Need to swap bytes. - else { - debug("String::copyFromUTF16() - Invalid UTF16 string. BOM is broken."); - return; - } - - length--; - } - else { - swap = (t != wcharByteOrder()); - } - - data.resize(length); - for(size_t i = 0; i < length; ++i) { - const unsigned short c = nextUTF16(&s); - if(swap) - data[i] = Utils::byteSwap(c); - else - data[i] = c; - } - } -} - -namespace TagLib { - -class String::StringPrivate : public RefCounter -{ -public: - StringPrivate() : - RefCounter() {} - - /*! - * Stores string in UTF-16. The byte order depends on the CPU endian. - */ - TagLib::wstring data; - - /*! - * This is only used to hold the the most recent value of toCString(). - */ - std::string cstring; -}; - -String String::null; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -String::String() : - d(new StringPrivate()) -{ -} - -String::String(const String &s) : - d(s.d) -{ - d->ref(); -} - -String::String(const std::string &s, Type t) : - d(new StringPrivate()) -{ - if(t == Latin1) - copyFromLatin1(d->data, s.c_str(), s.length()); - else if(t == String::UTF8) - copyFromUTF8(d->data, s.c_str(), s.length()); - else { - debug("String::String() -- std::string should not contain UTF16."); - } -} - -String::String(const wstring &s, Type t) : - d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) { - // This looks ugly but needed for the compatibility with TagLib1.8. - // Should be removed in TabLib2.0. - if (t == UTF16BE) - t = wcharByteOrder(); - else if (t == UTF16LE) - t = (wcharByteOrder() == UTF16LE ? UTF16BE : UTF16LE); - - copyFromUTF16(d->data, s.c_str(), s.length(), t); - } - else { - debug("String::String() -- TagLib::wstring should not contain Latin1 or UTF-8."); - } -} - -String::String(const wchar_t *s, Type t) : - d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) { - // This looks ugly but needed for the compatibility with TagLib1.8. - // Should be removed in TabLib2.0. - if (t == UTF16BE) - t = wcharByteOrder(); - else if (t == UTF16LE) - t = (wcharByteOrder() == UTF16LE ? UTF16BE : UTF16LE); - - copyFromUTF16(d->data, s, ::wcslen(s), t); - } - else { - debug("String::String() -- const wchar_t * should not contain Latin1 or UTF-8."); - } -} - -String::String(const char *s, Type t) : - d(new StringPrivate()) -{ - if(t == Latin1) - copyFromLatin1(d->data, s, ::strlen(s)); - else if(t == String::UTF8) - copyFromUTF8(d->data, s, ::strlen(s)); - else { - debug("String::String() -- const char * should not contain UTF16."); - } -} - -String::String(wchar_t c, Type t) : - d(new StringPrivate()) -{ - if(t == UTF16 || t == UTF16BE || t == UTF16LE) - copyFromUTF16(d->data, &c, 1, t); - else { - debug("String::String() -- wchar_t should not contain Latin1 or UTF-8."); - } -} - -String::String(char c, Type t) : - d(new StringPrivate()) -{ - if(t == Latin1) - copyFromLatin1(d->data, &c, 1); - else if(t == String::UTF8) - copyFromUTF8(d->data, &c, 1); - else { - debug("String::String() -- char should not contain UTF16."); - } -} - -String::String(const ByteVector &v, Type t) : - d(new StringPrivate()) -{ - if(v.isEmpty()) - return; - - if(t == Latin1) - copyFromLatin1(d->data, v.data(), v.size()); - else if(t == UTF8) - copyFromUTF8(d->data, v.data(), v.size()); - else - copyFromUTF16(d->data, v.data(), v.size() / 2, t); - - // If we hit a null in the ByteVector, shrink the string again. - d->data.resize(::wcslen(d->data.c_str())); -} - -//////////////////////////////////////////////////////////////////////////////// - -String::~String() -{ - if(d->deref()) - delete d; -} - -std::string String::to8Bit(bool unicode) const -{ - const ByteVector v = data(unicode ? UTF8 : Latin1); - return std::string(v.data(), v.size()); -} - -TagLib::wstring String::toWString() const -{ - return d->data; -} - -const char *String::toCString(bool unicode) const -{ - d->cstring = to8Bit(unicode); - return d->cstring.c_str(); -} - -const wchar_t *String::toCWString() const -{ - return d->data.c_str(); -} - -String::Iterator String::begin() -{ - detach(); - return d->data.begin(); -} - -String::ConstIterator String::begin() const -{ - return d->data.begin(); -} - -String::Iterator String::end() -{ - detach(); - return d->data.end(); -} - -String::ConstIterator String::end() const -{ - return d->data.end(); -} - -int String::find(const String &s, int offset) const -{ - return static_cast<int>(d->data.find(s.d->data, offset)); -} - -int String::rfind(const String &s, int offset) const -{ - return static_cast<int>(d->data.rfind(s.d->data, offset)); -} - -StringList String::split(const String &separator) const -{ - StringList list; - for(int index = 0;;) { - int sep = find(separator, index); - if(sep < 0) { - list.append(substr(index, size() - index)); - break; - } - else { - list.append(substr(index, sep - index)); - index = sep + separator.size(); - } - } - return list; -} - -bool String::startsWith(const String &s) const -{ - if(s.length() > length()) - return false; - - return substr(0, s.length()) == s; -} - -String String::substr(unsigned int position, unsigned int n) const -{ - if(position == 0 && n >= size()) - return *this; - else - return String(d->data.substr(position, n)); -} - -String &String::append(const String &s) -{ - detach(); - d->data += s.d->data; - return *this; -} - -String & String::clear() -{ - *this = String(); - return *this; -} - -String String::upper() const -{ - String s; - s.d->data.reserve(size()); - - for(ConstIterator it = begin(); it != end(); ++it) { - if(*it >= 'a' && *it <= 'z') - s.d->data.push_back(*it + 'A' - 'a'); - else - s.d->data.push_back(*it); - } - - return s; -} - -unsigned int String::size() const -{ - return static_cast<unsigned int>(d->data.size()); -} - -unsigned int String::length() const -{ - return size(); -} - -bool String::isEmpty() const -{ - return d->data.empty(); -} - -bool String::isNull() const -{ - return d == null.d; -} - -ByteVector String::data(Type t) const -{ - switch(t) - { - case Latin1: - { - ByteVector v(size(), 0); - char *p = v.data(); - - for(ConstIterator it = begin(); it != end(); ++it) - *p++ = static_cast<char>(*it); - - return v; - } - case UTF8: - { - ByteVector v(size() * 4, 0); - - try { - const ByteVector::Iterator dstEnd = utf8::utf16to8(begin(), end(), v.begin()); - v.resize(static_cast<unsigned int>(dstEnd - v.begin())); - } - catch(const utf8::exception &e) { - const String message(e.what()); - debug("String::data() - UTF8-CPP error: " + message); - v.clear(); - } - - return v; - } - case UTF16: - { - ByteVector v(2 + size() * 2, 0); - char *p = v.data(); - - // We use little-endian encoding here and need a BOM. - - *p++ = '\xff'; - *p++ = '\xfe'; - - for(ConstIterator it = begin(); it != end(); ++it) { - *p++ = static_cast<char>(*it & 0xff); - *p++ = static_cast<char>(*it >> 8); - } - - return v; - } - case UTF16BE: - { - ByteVector v(size() * 2, 0); - char *p = v.data(); - - for(ConstIterator it = begin(); it != end(); ++it) { - *p++ = static_cast<char>(*it >> 8); - *p++ = static_cast<char>(*it & 0xff); - } - - return v; - } - case UTF16LE: - { - ByteVector v(size() * 2, 0); - char *p = v.data(); - - for(ConstIterator it = begin(); it != end(); ++it) { - *p++ = static_cast<char>(*it & 0xff); - *p++ = static_cast<char>(*it >> 8); - } - - return v; - } - default: - { - debug("String::data() - Invalid Type value."); - return ByteVector(); - } - } -} - -int String::toInt() const -{ - return toInt(0); -} - -int String::toInt(bool *ok) const -{ - const wchar_t *begin = d->data.c_str(); - wchar_t *end; - errno = 0; - const long value = ::wcstol(begin, &end, 10); - - // Has wcstol() consumed the entire string and not overflowed? - if(ok) { - *ok = (errno == 0 && end > begin && *end == L'\0'); - *ok = (*ok && value > INT_MIN && value < INT_MAX); - } - - return static_cast<int>(value); -} - -String String::stripWhiteSpace() const -{ - static const wchar_t *WhiteSpaceChars = L"\t\n\f\r "; - - const size_t pos1 = d->data.find_first_not_of(WhiteSpaceChars); - if(pos1 == std::wstring::npos) - return String(); - - const size_t pos2 = d->data.find_last_not_of(WhiteSpaceChars); - return substr(static_cast<unsigned int>(pos1), static_cast<unsigned int>(pos2 - pos1 + 1)); -} - -bool String::isLatin1() const -{ - for(ConstIterator it = begin(); it != end(); ++it) { - if(*it >= 256) - return false; - } - return true; -} - -bool String::isAscii() const -{ - for(ConstIterator it = begin(); it != end(); ++it) { - if(*it >= 128) - return false; - } - return true; -} - -String String::number(int n) // static -{ - return Utils::formatString("%d", n); -} - -wchar_t &String::operator[](int i) -{ - detach(); - return d->data[i]; -} - -const wchar_t &String::operator[](int i) const -{ - return d->data[i]; -} - -bool String::operator==(const String &s) const -{ - return (d == s.d || d->data == s.d->data); -} - -bool String::operator!=(const String &s) const -{ - return !(*this == s); -} - -bool String::operator==(const char *s) const -{ - const wchar_t *p = toCWString(); - - while(*p != L'\0' || *s != '\0') { - if(*p++ != static_cast<unsigned char>(*s++)) - return false; - } - return true; -} - -bool String::operator!=(const char *s) const -{ - return !(*this == s); -} - -bool String::operator==(const wchar_t *s) const -{ - return (d->data == s); -} - -bool String::operator!=(const wchar_t *s) const -{ - return !(*this == s); -} - -String &String::operator+=(const String &s) -{ - detach(); - - d->data += s.d->data; - return *this; -} - -String &String::operator+=(const wchar_t *s) -{ - detach(); - - d->data += s; - return *this; -} - -String &String::operator+=(const char *s) -{ - detach(); - - for(int i = 0; s[i] != 0; i++) - d->data += static_cast<unsigned char>(s[i]); - return *this; -} - -String &String::operator+=(wchar_t c) -{ - detach(); - - d->data += c; - return *this; -} - -String &String::operator+=(char c) -{ - detach(); - - d->data += static_cast<unsigned char>(c); - return *this; -} - -String &String::operator=(const String &s) -{ - String(s).swap(*this); - return *this; -} - -String &String::operator=(const std::string &s) -{ - String(s).swap(*this); - return *this; -} - -String &String::operator=(const wstring &s) -{ - String(s).swap(*this); - return *this; -} - -String &String::operator=(const wchar_t *s) -{ - String(s).swap(*this); - return *this; -} - -String &String::operator=(char c) -{ - String(c).swap(*this); - return *this; -} - -String &String::operator=(wchar_t c) -{ - String(c, wcharByteOrder()).swap(*this); - return *this; -} - -String &String::operator=(const char *s) -{ - String(s).swap(*this); - return *this; -} - -String &String::operator=(const ByteVector &v) -{ - String(v).swap(*this); - return *this; -} - -void String::swap(String &s) -{ - using std::swap; - - swap(d, s.d); -} - -bool String::operator<(const String &s) const -{ - return (d->data < s.d->data); -} - -//////////////////////////////////////////////////////////////////////////////// -// protected members -//////////////////////////////////////////////////////////////////////////////// - -void String::detach() -{ - if(d->count() > 1) - String(d->data.c_str()).swap(*this); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -const String::Type String::WCharByteOrder = wcharByteOrder(); -} - -//////////////////////////////////////////////////////////////////////////////// -// related non-member functions -//////////////////////////////////////////////////////////////////////////////// - -const TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -const TagLib::String operator+(const char *s1, const TagLib::String &s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -const TagLib::String operator+(const TagLib::String &s1, const char *s2) -{ - TagLib::String s(s1); - s.append(s2); - return s; -} - -std::ostream &operator<<(std::ostream &s, const TagLib::String &str) -{ - s << str.to8Bit(); - return s; -} - diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.cpp deleted file mode 100755 index 655fe6c4b..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tstringlist.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - copyright : (C) 2002 - 2008 by Scott Wheeler - email : wheeler@kde.org - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tstringlist.h" - -using namespace TagLib; - -class StringListPrivate -{ - -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -StringList StringList::split(const String &s, const String &pattern) -{ - StringList l; - - int previousOffset = 0; - for(int offset = s.find(pattern); offset != -1; offset = s.find(pattern, offset + 1)) { - l.append(s.substr(previousOffset, offset - previousOffset)); - previousOffset = offset + 1; - } - - l.append(s.substr(previousOffset, s.size() - previousOffset)); - - return l; -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -StringList::StringList() : List<String>() -{ - -} - -StringList::StringList(const StringList &l) : List<String>(l) -{ - -} - -StringList::StringList(const String &s) : List<String>() -{ - append(s); -} - -StringList::StringList(const ByteVectorList &bl, String::Type t) : List<String>() -{ - ByteVectorList::ConstIterator i = bl.begin(); - for(;i != bl.end(); i++) { - append(String(*i, t)); - } -} - -StringList::~StringList() -{ - -} - -String StringList::toString(const String &separator) const -{ - String s; - - ConstIterator it = begin(); - ConstIterator itEnd = end(); - - while(it != itEnd) { - s += *it; - it++; - if(it != itEnd) - s += separator; - } - - return s; -} - -StringList &StringList::append(const String &s) -{ - List<String>::append(s); - return *this; -} - -StringList &StringList::append(const StringList &l) -{ - List<String>::append(l); - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -// related functions -//////////////////////////////////////////////////////////////////////////////// - -std::ostream &operator<<(std::ostream &s, const StringList &l) -{ - s << l.toString(); - return s; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tutils.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tutils.h deleted file mode 100755 index 6d96cd12d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tutils.h +++ /dev/null @@ -1,243 +0,0 @@ -/*************************************************************************** - copyright : (C) 2013 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TUTILS_H -#define TAGLIB_TUTILS_H - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#if defined(HAVE_MSC_BYTESWAP) -# include <stdlib.h> -#elif defined(HAVE_GLIBC_BYTESWAP) -# include <byteswap.h> -#elif defined(HAVE_MAC_BYTESWAP) -# include <libkern/OSByteOrder.h> -#elif defined(HAVE_OPENBSD_BYTESWAP) -# include <sys/endian.h> -#endif - -#include <tstring.h> -#include <cstdio> -#include <cstdarg> -#include <cstring> - -namespace TagLib -{ - namespace Utils - { - namespace - { - - /*! - * Reverses the order of bytes in an 16-bit integer. - */ - inline unsigned short byteSwap(unsigned short x) - { -#if defined(HAVE_GCC_BYTESWAP) - - return __builtin_bswap16(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ushort(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_16(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt16(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap16(x); - -#else - - return ((x >> 8) & 0xff) | ((x & 0xff) << 8); - -#endif - } - - /*! - * Reverses the order of bytes in an 32-bit integer. - */ - inline unsigned int byteSwap(unsigned int x) - { -#if defined(HAVE_GCC_BYTESWAP) - - return __builtin_bswap32(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_ulong(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_32(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt32(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap32(x); - -#else - - return ((x & 0xff000000u) >> 24) - | ((x & 0x00ff0000u) >> 8) - | ((x & 0x0000ff00u) << 8) - | ((x & 0x000000ffu) << 24); - -#endif - } - - /*! - * Reverses the order of bytes in an 64-bit integer. - */ - inline unsigned long long byteSwap(unsigned long long x) - { -#if defined(HAVE_GCC_BYTESWAP) - - return __builtin_bswap64(x); - -#elif defined(HAVE_MSC_BYTESWAP) - - return _byteswap_uint64(x); - -#elif defined(HAVE_GLIBC_BYTESWAP) - - return __bswap_64(x); - -#elif defined(HAVE_MAC_BYTESWAP) - - return OSSwapInt64(x); - -#elif defined(HAVE_OPENBSD_BYTESWAP) - - return swap64(x); - -#else - - return ((x & 0xff00000000000000ull) >> 56) - | ((x & 0x00ff000000000000ull) >> 40) - | ((x & 0x0000ff0000000000ull) >> 24) - | ((x & 0x000000ff00000000ull) >> 8) - | ((x & 0x00000000ff000000ull) << 8) - | ((x & 0x0000000000ff0000ull) << 24) - | ((x & 0x000000000000ff00ull) << 40) - | ((x & 0x00000000000000ffull) << 56); - -#endif - } - - /*! - * Returns a formatted string just like standard sprintf(), but makes use of - * safer functions such as snprintf() if available. - */ - inline String formatString(const char *format, ...) - { - // Sufficient buffer size for the current internal uses. - // Consider changing this value when you use this function. - - static const size_t BufferSize = 128; - - va_list args; - va_start(args, format); - - char buf[BufferSize]; - int length; - -#if defined(HAVE_VSNPRINTF) - - length = vsnprintf(buf, BufferSize, format, args); - -#elif defined(HAVE_VSPRINTF_S) - - length = vsprintf_s(buf, format, args); - -#else - - // The last resort. May cause a buffer overflow. - - length = vsprintf(buf, format, args); - if(length >= BufferSize) { - debug("Utils::formatString() - Buffer overflow! Returning an empty string."); - length = -1; - } - -#endif - - va_end(args); - - if(length > 0) - return String(buf); - else - return String(); - } - - /*! - * The types of byte order of the running system. - */ - enum ByteOrder - { - //! Little endian systems. - LittleEndian, - //! Big endian systems. - BigEndian - }; - - /*! - * Returns the byte order of the system. - */ - inline ByteOrder systemByteOrder() - { - union { - int i; - char c; - } u; - - u.i = 1; - if(u.c == 1) - return LittleEndian; - else - return BigEndian; - } - } - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.cpp deleted file mode 100755 index 6d07ba3d2..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/*************************************************************************** - copyright : (C) 2016 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#ifdef HAVE_ZLIB -# include <zlib.h> -# include <tstring.h> -# include <tdebug.h> -#endif - -#include "tzlib.h" - -using namespace TagLib; - -bool zlib::isAvailable() -{ -#ifdef HAVE_ZLIB - - return true; - -#else - - return false; - -#endif -} - -ByteVector zlib::decompress(const ByteVector &data) -{ -#ifdef HAVE_ZLIB - - z_stream stream = {}; - - if(inflateInit(&stream) != Z_OK) { - debug("zlib::decompress() - Failed to initizlize zlib."); - return ByteVector(); - } - - ByteVector inData = data; - - stream.avail_in = static_cast<uInt>(inData.size()); - stream.next_in = reinterpret_cast<Bytef *>(inData.data()); - - const unsigned int chunkSize = 1024; - - ByteVector outData; - - do { - const size_t offset = outData.size(); - outData.resize(outData.size() + chunkSize); - - stream.avail_out = static_cast<uInt>(chunkSize); - stream.next_out = reinterpret_cast<Bytef *>(outData.data() + offset); - - const int result = inflate(&stream, Z_NO_FLUSH); - - if(result == Z_STREAM_ERROR || - result == Z_NEED_DICT || - result == Z_DATA_ERROR || - result == Z_MEM_ERROR) - { - if(result != Z_STREAM_ERROR) - inflateEnd(&stream); - - debug("zlib::decompress() - Error reading compressed stream."); - return ByteVector(); - } - - outData.resize(outData.size() - stream.avail_out); - } while(stream.avail_out == 0); - - inflateEnd(&stream); - - return outData; - -#else - - return ByteVector(); - -#endif -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.h b/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.h deleted file mode 100755 index b1f1fcaf8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/toolkit/tzlib.h +++ /dev/null @@ -1,54 +0,0 @@ -/*************************************************************************** - copyright : (C) 2016 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifndef TAGLIB_TZLIB_H -#define TAGLIB_TZLIB_H - -#include <tbytevector.h> - -// THIS FILE IS NOT A PART OF THE TAGLIB API - -#ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header - -namespace TagLib { - - namespace zlib { - - /*! - * Returns whether or not zlib is installed and ready to use. - */ - bool isAvailable(); - - /*! - * Decompress \a data by zlib. - */ - ByteVector decompress(const ByteVector &data); - - } -} - -#endif - -#endif diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.cpp deleted file mode 100755 index e4de436ed..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudiofile.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tstringlist.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "trueaudiofile.h" -#include "id3v1tag.h" -#include "id3v2tag.h" -#include "id3v2header.h" - -using namespace TagLib; - -namespace -{ - enum { TrueAudioID3v2Index = 0, TrueAudioID3v1Index = 1 }; -} - -class TrueAudio::File::FilePrivate -{ -public: - FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : - ID3v2FrameFactory(frameFactory), - ID3v2Location(-1), - ID3v2OriginalSize(0), - ID3v1Location(-1), - properties(0) {} - - ~FilePrivate() - { - delete properties; - } - - const ID3v2::FrameFactory *ID3v2FrameFactory; - long ID3v2Location; - long ID3v2OriginalSize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool TrueAudio::File::isSupported(IOStream *stream) -{ - // A TrueAudio file has to start with "TTA". An ID3v2 tag may precede. - - const ByteVector id = Utils::readHeader(stream, 3, true); - return (id == "TTA"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -TrueAudio::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -TrueAudio::File::File(FileName file, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -TrueAudio::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -TrueAudio::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, - bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate(frameFactory)) -{ - if(isOpen()) - read(readProperties); -} - -TrueAudio::File::~File() -{ - delete d; -} - -TagLib::Tag *TrueAudio::File::tag() const -{ - return &d->tag; -} - -PropertyMap TrueAudio::File::properties() const -{ - return d->tag.properties(); -} - -void TrueAudio::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag.removeUnsupportedProperties(unsupported); -} - -PropertyMap TrueAudio::File::setProperties(const PropertyMap &properties) -{ - if(ID3v1Tag()) - ID3v1Tag()->setProperties(properties); - - return ID3v2Tag(true)->setProperties(properties); -} - -TrueAudio::Properties *TrueAudio::File::audioProperties() const -{ - return d->properties; -} - -void TrueAudio::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) -{ - d->ID3v2FrameFactory = factory; -} - -bool TrueAudio::File::save() -{ - if(readOnly()) { - debug("TrueAudio::File::save() -- File is read only."); - return false; - } - - // Update ID3v2 tag - - if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { - - // ID3v2 tag is not empty. Update the old one or create a new one. - - if(d->ID3v2Location < 0) - d->ID3v2Location = 0; - - const ByteVector data = ID3v2Tag()->render(); - insert(data, d->ID3v2Location, d->ID3v2OriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); - - d->ID3v2OriginalSize = data.size(); - } - else { - - // ID3v2 tag is empty. Remove the old one. - - if(d->ID3v2Location >= 0) { - removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->ID3v2OriginalSize; - - d->ID3v2Location = -1; - d->ID3v2OriginalSize = 0; - } - } - - // Update ID3v1 tag - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - if(d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - } - } - - return true; -} - -ID3v1::Tag *TrueAudio::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, create); -} - -ID3v2::Tag *TrueAudio::File::ID3v2Tag(bool create) -{ - return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, create); -} - -void TrueAudio::File::strip(int tags) -{ - if(tags & ID3v1) - d->tag.set(TrueAudioID3v1Index, 0); - - if(tags & ID3v2) - d->tag.set(TrueAudioID3v2Index, 0); - - if(!ID3v1Tag()) - ID3v2Tag(true); -} - -bool TrueAudio::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -bool TrueAudio::File::hasID3v2Tag() const -{ - return (d->ID3v2Location >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void TrueAudio::File::read(bool readProperties) -{ - // Look for an ID3v2 tag - - d->ID3v2Location = Utils::findID3v2(this); - - if(d->ID3v2Location >= 0) { - d->tag.set(TrueAudioID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); - d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); - } - - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(TrueAudioID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - if(d->ID3v1Location < 0) - ID3v2Tag(true); - - // Look for TrueAudio metadata - - if(readProperties) { - - long streamLength; - - if(d->ID3v1Location >= 0) - streamLength = d->ID3v1Location; - else - streamLength = length(); - - if(d->ID3v2Location >= 0) { - seek(d->ID3v2Location + d->ID3v2OriginalSize); - streamLength -= (d->ID3v2Location + d->ID3v2OriginalSize); - } - else { - seek(0); - } - - d->properties = new Properties(readBlock(TrueAudio::HeaderSize), streamLength); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.cpp deleted file mode 100755 index 0aab24193..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/trueaudio/trueaudioproperties.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> -#include <bitset> - -#include "trueaudioproperties.h" -#include "trueaudiofile.h" - -using namespace TagLib; - -class TrueAudio::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - version(0), - length(0), - bitrate(0), - sampleRate(0), - channels(0), - bitsPerSample(0), - sampleFrames(0) {} - - int version; - int length; - int bitrate; - int sampleRate; - int channels; - int bitsPerSample; - unsigned int sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -TrueAudio::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(data, streamLength); -} - -TrueAudio::Properties::~Properties() -{ - delete d; -} - -int TrueAudio::Properties::length() const -{ - return lengthInSeconds(); -} - -int TrueAudio::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int TrueAudio::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int TrueAudio::Properties::bitrate() const -{ - return d->bitrate; -} - -int TrueAudio::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int TrueAudio::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -int TrueAudio::Properties::channels() const -{ - return d->channels; -} - -unsigned int TrueAudio::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -int TrueAudio::Properties::ttaVersion() const -{ - return d->version; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void TrueAudio::Properties::read(const ByteVector &data, long streamLength) -{ - if(data.size() < 4) { - debug("TrueAudio::Properties::read() -- data is too short."); - return; - } - - if(!data.startsWith("TTA")) { - debug("TrueAudio::Properties::read() -- invalid header signature."); - return; - } - - unsigned int pos = 3; - - d->version = data[pos] - '0'; - pos += 1; - - // According to http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description - // TTA2 headers are in development, and have a different format - if(1 == d->version) { - if(data.size() < 18) { - debug("TrueAudio::Properties::read() -- data is too short."); - return; - } - - // Skip the audio format - pos += 2; - - d->channels = data.toShort(pos, false); - pos += 2; - - d->bitsPerSample = data.toShort(pos, false); - pos += 2; - - d->sampleRate = data.toUInt(pos, false); - pos += 4; - - d->sampleFrames = data.toUInt(pos, false); - pos += 4; - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackfile.cpp deleted file mode 100755 index 01bdba36c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackfile.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tstring.h> -#include <tdebug.h> -#include <tagunion.h> -#include <tpropertymap.h> -#include <tagutils.h> - -#include "wavpackfile.h" -#include "id3v1tag.h" -#include "id3v2header.h" -#include "apetag.h" -#include "apefooter.h" - -using namespace TagLib; - -namespace -{ - enum { WavAPEIndex, WavID3v1Index }; -} - -class WavPack::File::FilePrivate -{ -public: - FilePrivate() : - APELocation(-1), - APESize(0), - ID3v1Location(-1), - properties(0) {} - - ~FilePrivate() - { - delete properties; - } - - long APELocation; - long APESize; - - long ID3v1Location; - - TagUnion tag; - - Properties *properties; -}; - -//////////////////////////////////////////////////////////////////////////////// -// static members -//////////////////////////////////////////////////////////////////////////////// - -bool WavPack::File::isSupported(IOStream *stream) -{ - // A WavPack file has to start with "wvpk". - - const ByteVector id = Utils::readHeader(stream, 4, false); - return (id == "wvpk"); -} - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -WavPack::File::File(FileName file, bool readProperties, Properties::ReadStyle) : - TagLib::File(file), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -WavPack::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : - TagLib::File(stream), - d(new FilePrivate()) -{ - if(isOpen()) - read(readProperties); -} - -WavPack::File::~File() -{ - delete d; -} - -TagLib::Tag *WavPack::File::tag() const -{ - return &d->tag; -} - -PropertyMap WavPack::File::properties() const -{ - return d->tag.properties(); -} - -void WavPack::File::removeUnsupportedProperties(const StringList &unsupported) -{ - d->tag.removeUnsupportedProperties(unsupported); -} - -PropertyMap WavPack::File::setProperties(const PropertyMap &properties) -{ - if(ID3v1Tag()) - ID3v1Tag()->setProperties(properties); - - return APETag(true)->setProperties(properties); -} - -WavPack::Properties *WavPack::File::audioProperties() const -{ - return d->properties; -} - -bool WavPack::File::save() -{ - if(readOnly()) { - debug("WavPack::File::save() -- File is read only."); - return false; - } - - // Update ID3v1 tag - - if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { - - // ID3v1 tag is not empty. Update the old one or create a new one. - - if(d->ID3v1Location >= 0) { - seek(d->ID3v1Location); - } - else { - seek(0, End); - d->ID3v1Location = tell(); - } - - writeBlock(ID3v1Tag()->render()); - } - else { - - // ID3v1 tag is empty. Remove the old one. - - if(d->ID3v1Location >= 0) { - truncate(d->ID3v1Location); - d->ID3v1Location = -1; - } - } - - // Update APE tag - - if(APETag() && !APETag()->isEmpty()) { - - // APE tag is not empty. Update the old one or create a new one. - - if(d->APELocation < 0) { - if(d->ID3v1Location >= 0) - d->APELocation = d->ID3v1Location; - else - d->APELocation = length(); - } - - const ByteVector data = APETag()->render(); - insert(data, d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); - - d->APESize = data.size(); - } - else { - - // APE tag is empty. Remove the old one. - - if(d->APELocation >= 0) { - removeBlock(d->APELocation, d->APESize); - - if(d->ID3v1Location >= 0) - d->ID3v1Location -= d->APESize; - - d->APELocation = -1; - d->APESize = 0; - } - } - - return true; -} - -ID3v1::Tag *WavPack::File::ID3v1Tag(bool create) -{ - return d->tag.access<ID3v1::Tag>(WavID3v1Index, create); -} - -APE::Tag *WavPack::File::APETag(bool create) -{ - return d->tag.access<APE::Tag>(WavAPEIndex, create); -} - -void WavPack::File::strip(int tags) -{ - if(tags & ID3v1) - d->tag.set(WavID3v1Index, 0); - - if(tags & APE) - d->tag.set(WavAPEIndex, 0); - - if(!ID3v1Tag()) - APETag(true); -} - -bool WavPack::File::hasID3v1Tag() const -{ - return (d->ID3v1Location >= 0); -} - -bool WavPack::File::hasAPETag() const -{ - return (d->APELocation >= 0); -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -void WavPack::File::read(bool readProperties) -{ - // Look for an ID3v1 tag - - d->ID3v1Location = Utils::findID3v1(this); - - if(d->ID3v1Location >= 0) - d->tag.set(WavID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); - - // Look for an APE tag - - d->APELocation = Utils::findAPE(this, d->ID3v1Location); - - if(d->APELocation >= 0) { - d->tag.set(WavAPEIndex, new APE::Tag(this, d->APELocation)); - d->APESize = APETag()->footer()->completeTagSize(); - d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; - } - - if(d->ID3v1Location >= 0) - APETag(true); - - // Look for WavPack audio properties - - if(readProperties) { - - long streamLength; - - if(d->APELocation >= 0) - streamLength = d->APELocation; - else if(d->ID3v1Location >= 0) - streamLength = d->ID3v1Location; - else - streamLength = length(); - - d->properties = new Properties(this, streamLength); - } -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.cpp deleted file mode 100755 index c1d04fd29..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/wavpack/wavpackproperties.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/*************************************************************************** - copyright : (C) 2006 by Lukáš Lalinský - email : lalinsky@gmail.com - - copyright : (C) 2004 by Allan Sandfeld Jensen - email : kde@carewolf.org - (original MPC implementation) - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tdebug.h> - -#include "wavpackproperties.h" -#include "wavpackfile.h" - -// Implementation of this class is based on the information at: -// http://www.wavpack.com/file_format.txt - -using namespace TagLib; - -class WavPack::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - length(0), - bitrate(0), - sampleRate(0), - channels(0), - version(0), - bitsPerSample(0), - lossless(false), - sampleFrames(0) {} - - int length; - int bitrate; - int sampleRate; - int channels; - int version; - int bitsPerSample; - bool lossless; - unsigned int sampleFrames; -}; - -//////////////////////////////////////////////////////////////////////////////// -// public members -//////////////////////////////////////////////////////////////////////////////// - -WavPack::Properties::Properties(const ByteVector &, long, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - debug("WavPack::Properties::Properties() -- This constructor is no longer used."); -} - -WavPack::Properties::Properties(File *file, long streamLength, ReadStyle style) : - AudioProperties(style), - d(new PropertiesPrivate()) -{ - read(file, streamLength); -} - -WavPack::Properties::~Properties() -{ - delete d; -} - -int WavPack::Properties::length() const -{ - return lengthInSeconds(); -} - -int WavPack::Properties::lengthInSeconds() const -{ - return d->length / 1000; -} - -int WavPack::Properties::lengthInMilliseconds() const -{ - return d->length; -} - -int WavPack::Properties::bitrate() const -{ - return d->bitrate; -} - -int WavPack::Properties::sampleRate() const -{ - return d->sampleRate; -} - -int WavPack::Properties::channels() const -{ - return d->channels; -} - -int WavPack::Properties::version() const -{ - return d->version; -} - -int WavPack::Properties::bitsPerSample() const -{ - return d->bitsPerSample; -} - -bool WavPack::Properties::isLossless() const -{ - return d->lossless; -} - -unsigned int WavPack::Properties::sampleFrames() const -{ - return d->sampleFrames; -} - -//////////////////////////////////////////////////////////////////////////////// -// private members -//////////////////////////////////////////////////////////////////////////////// - -namespace -{ - const unsigned int sample_rates[] = { - 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, - 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0 }; -} - -#define BYTES_STORED 3 -#define MONO_FLAG 4 -#define LOSSLESS_FLAG 8 - -#define SHIFT_LSB 13 -#define SHIFT_MASK (0x1fL << SHIFT_LSB) - -#define SRATE_LSB 23 -#define SRATE_MASK (0xfL << SRATE_LSB) - -#define MIN_STREAM_VERS 0x402 -#define MAX_STREAM_VERS 0x410 - -#define FINAL_BLOCK 0x1000 - -void WavPack::Properties::read(File *file, long streamLength) -{ - long offset = 0; - - while(true) { - file->seek(offset); - const ByteVector data = file->readBlock(32); - - if(data.size() < 32) { - debug("WavPack::Properties::read() -- data is too short."); - break; - } - - if(!data.startsWith("wvpk")) { - debug("WavPack::Properties::read() -- Block header not found."); - break; - } - - const unsigned int flags = data.toUInt(24, false); - - if(offset == 0) { - d->version = data.toShort(8, false); - if(d->version < MIN_STREAM_VERS || d->version > MAX_STREAM_VERS) - break; - - d->bitsPerSample = ((flags & BYTES_STORED) + 1) * 8 - ((flags & SHIFT_MASK) >> SHIFT_LSB); - d->sampleRate = sample_rates[(flags & SRATE_MASK) >> SRATE_LSB]; - d->lossless = !(flags & LOSSLESS_FLAG); - d->sampleFrames = data.toUInt(12, false); - } - - d->channels += (flags & MONO_FLAG) ? 1 : 2; - - if(flags & FINAL_BLOCK) - break; - - const unsigned int blockSize = data.toUInt(4, false); - offset += blockSize + 8; - } - - if(d->sampleFrames == ~0u) - d->sampleFrames = seekFinalIndex(file, streamLength); - - if(d->sampleFrames > 0 && d->sampleRate > 0) { - const double length = d->sampleFrames * 1000.0 / d->sampleRate; - d->length = static_cast<int>(length + 0.5); - d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); - } -} - -unsigned int WavPack::Properties::seekFinalIndex(File *file, long streamLength) -{ - const long offset = file->rfind("wvpk", streamLength); - if(offset == -1) - return 0; - - file->seek(offset); - const ByteVector data = file->readBlock(32); - if(data.size() < 32) - return 0; - - const int version = data.toShort(8, false); - if(version < MIN_STREAM_VERS || version > MAX_STREAM_VERS) - return 0; - - const unsigned int flags = data.toUInt(24, false); - if(!(flags & FINAL_BLOCK)) - return 0; - - const unsigned int blockIndex = data.toUInt(16, false); - const unsigned int blockSamples = data.toUInt(20, false); - - return blockIndex + blockSamples; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmfile.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmfile.cpp deleted file mode 100755 index e10e8f014..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmfile.cpp +++ /dev/null @@ -1,644 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include "tstringlist.h" -#include "tdebug.h" -#include "xmfile.h" -#include "modfileprivate.h" -#include "tpropertymap.h" - -#include <string.h> -#include <algorithm> - -using namespace TagLib; -using namespace XM; - -/*! - * The Reader classes are helpers to make handling of the stripped XM - * format more easy. In the stripped XM format certain header sizes might - * be smaller than one would expect. The fields that are not included - * are then just some predefined valued (e.g. 0). - * - * Using these classes this code: - * - * if(headerSize >= 4) { - * if(!readU16L(value1)) ERROR(); - * if(headerSize >= 8) { - * if(!readU16L(value2)) ERROR(); - * if(headerSize >= 12) { - * if(!readString(value3, 22)) ERROR(); - * ... - * } - * } - * } - * - * Becomes: - * - * StructReader header; - * header.u16L(value1).u16L(value2).string(value3, 22). ...; - * if(header.read(*this, headerSize) < std::min(header.size(), headerSize)) - * ERROR(); - * - * Maybe if this is useful to other formats these classes can be moved to - * their own public files. - */ -class Reader -{ -public: - virtual ~Reader() - { - } - - /*! - * Reads associated values from \a file, but never reads more - * then \a limit bytes. - */ - virtual unsigned int read(TagLib::File &file, unsigned int limit) = 0; - - /*! - * Returns the number of bytes this reader would like to read. - */ - virtual unsigned int size() const = 0; -}; - -class SkipReader : public Reader -{ -public: - SkipReader(unsigned int size) : m_size(size) - { - } - - unsigned int read(TagLib::File &file, unsigned int limit) - { - unsigned int count = std::min(m_size, limit); - file.seek(count, TagLib::File::Current); - return count; - } - - unsigned int size() const - { - return m_size; - } - -private: - unsigned int m_size; -}; - -template<typename T> -class ValueReader : public Reader -{ -public: - ValueReader(T &value) : value(value) - { - } - -protected: - T &value; -}; - -class StringReader : public ValueReader<String> -{ -public: - StringReader(String &string, unsigned int size) : - ValueReader<String>(string), m_size(size) - { - } - - unsigned int read(TagLib::File &file, unsigned int limit) - { - ByteVector data = file.readBlock(std::min(m_size, limit)); - unsigned int count = data.size(); - int index = data.find((char) 0); - if(index > -1) { - data.resize(index); - } - data.replace('\xff', ' '); - value = data; - return count; - } - - unsigned int size() const - { - return m_size; - } - -private: - unsigned int m_size; -}; - -class ByteReader : public ValueReader<unsigned char> -{ -public: - ByteReader(unsigned char &byte) : ValueReader<unsigned char>(byte) {} - - unsigned int read(TagLib::File &file, unsigned int limit) - { - ByteVector data = file.readBlock(std::min(1U,limit)); - if(data.size() > 0) { - value = data[0]; - } - return data.size(); - } - - unsigned int size() const - { - return 1; - } -}; - -template<typename T> -class NumberReader : public ValueReader<T> -{ -public: - NumberReader(T &value, bool bigEndian) : - ValueReader<T>(value), bigEndian(bigEndian) - { - } - -protected: - bool bigEndian; -}; - -class U16Reader : public NumberReader<unsigned short> -{ -public: - U16Reader(unsigned short &value, bool bigEndian) - : NumberReader<unsigned short>(value, bigEndian) {} - - unsigned int read(TagLib::File &file, unsigned int limit) - { - ByteVector data = file.readBlock(std::min(2U,limit)); - value = data.toUShort(bigEndian); - return data.size(); - } - - unsigned int size() const - { - return 2; - } -}; - -class U32Reader : public NumberReader<unsigned long> -{ -public: - U32Reader(unsigned long &value, bool bigEndian = true) : - NumberReader<unsigned long>(value, bigEndian) - { - } - - unsigned int read(TagLib::File &file, unsigned int limit) - { - ByteVector data = file.readBlock(std::min(4U,limit)); - value = data.toUInt(bigEndian); - return data.size(); - } - - unsigned int size() const - { - return 4; - } -}; - -class StructReader : public Reader -{ -public: - StructReader() - { - m_readers.setAutoDelete(true); - } - - /*! - * Add a nested reader. This reader takes ownership. - */ - StructReader &reader(Reader *reader) - { - m_readers.append(reader); - return *this; - } - - /*! - * Don't read anything but skip \a size bytes. - */ - StructReader &skip(unsigned int size) - { - m_readers.append(new SkipReader(size)); - return *this; - } - - /*! - * Read a string of \a size characters (bytes) into \a string. - */ - StructReader &string(String &string, unsigned int size) - { - m_readers.append(new StringReader(string, size)); - return *this; - } - - /*! - * Read a byte into \a byte. - */ - StructReader &byte(unsigned char &byte) - { - m_readers.append(new ByteReader(byte)); - return *this; - } - - /*! - * Read a unsigned 16 Bit integer into \a number. The byte order - * is controlled by \a bigEndian. - */ - StructReader &u16(unsigned short &number, bool bigEndian) - { - m_readers.append(new U16Reader(number, bigEndian)); - return *this; - } - - /*! - * Read a unsigned 16 Bit little endian integer into \a number. - */ - StructReader &u16L(unsigned short &number) - { - return u16(number, false); - } - - /*! - * Read a unsigned 16 Bit big endian integer into \a number. - */ - StructReader &u16B(unsigned short &number) - { - return u16(number, true); - } - - /*! - * Read a unsigned 32 Bit integer into \a number. The byte order - * is controlled by \a bigEndian. - */ - StructReader &u32(unsigned long &number, bool bigEndian) - { - m_readers.append(new U32Reader(number, bigEndian)); - return *this; - } - - /*! - * Read a unsigned 32 Bit little endian integer into \a number. - */ - StructReader &u32L(unsigned long &number) - { - return u32(number, false); - } - - /*! - * Read a unsigned 32 Bit big endian integer into \a number. - */ - StructReader &u32B(unsigned long &number) - { - return u32(number, true); - } - - unsigned int size() const - { - unsigned int size = 0; - for(List<Reader*>::ConstIterator i = m_readers.begin(); - i != m_readers.end(); ++ i) { - size += (*i)->size(); - } - return size; - } - - unsigned int read(TagLib::File &file, unsigned int limit) - { - unsigned int sumcount = 0; - for(List<Reader*>::ConstIterator i = m_readers.begin(); - limit > 0 && i != m_readers.end(); ++ i) { - unsigned int count = (*i)->read(file, limit); - limit -= count; - sumcount += count; - } - return sumcount; - } - -private: - List<Reader*> m_readers; -}; - -class XM::File::FilePrivate -{ -public: - FilePrivate(AudioProperties::ReadStyle propertiesStyle) - : tag(), properties(propertiesStyle) - { - } - - Mod::Tag tag; - XM::Properties properties; -}; - -XM::File::File(FileName file, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(file), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -XM::File::File(IOStream *stream, bool readProperties, - AudioProperties::ReadStyle propertiesStyle) : - Mod::FileBase(stream), - d(new FilePrivate(propertiesStyle)) -{ - if(isOpen()) - read(readProperties); -} - -XM::File::~File() -{ - delete d; -} - -Mod::Tag *XM::File::tag() const -{ - return &d->tag; -} - -PropertyMap XM::File::properties() const -{ - return d->tag.properties(); -} - -PropertyMap XM::File::setProperties(const PropertyMap &properties) -{ - return d->tag.setProperties(properties); -} - -XM::Properties *XM::File::audioProperties() const -{ - return &d->properties; -} - -bool XM::File::save() -{ - if(readOnly()) { - debug("XM::File::save() - Cannot save to a read only file."); - return false; - } - - seek(17); - writeString(d->tag.title(), 20); - - seek(38); - writeString(d->tag.trackerName(), 20); - - seek(60); - unsigned long headerSize = 0; - if(!readU32L(headerSize)) - return false; - - seek(70); - unsigned short patternCount = 0; - unsigned short instrumentCount = 0; - if(!readU16L(patternCount) || !readU16L(instrumentCount)) - return false; - - long pos = 60 + headerSize; // should be long long in taglib2. - - // need to read patterns again in order to seek to the instruments: - for(unsigned short i = 0; i < patternCount; ++ i) { - seek(pos); - unsigned long patternHeaderLength = 0; - if(!readU32L(patternHeaderLength) || patternHeaderLength < 4) - return false; - - seek(pos + 7); - unsigned short dataSize = 0; - if (!readU16L(dataSize)) - return false; - - pos += patternHeaderLength + dataSize; - } - - const StringList lines = d->tag.comment().split("\n"); - unsigned int sampleNameIndex = instrumentCount; - for(unsigned short i = 0; i < instrumentCount; ++ i) { - seek(pos); - unsigned long instrumentHeaderSize = 0; - if(!readU32L(instrumentHeaderSize) || instrumentHeaderSize < 4) - return false; - - seek(pos + 4); - const unsigned int len = std::min(22UL, instrumentHeaderSize - 4U); - if(i >= lines.size()) - writeString(String(), len); - else - writeString(lines[i], len); - - unsigned short sampleCount = 0; - if(instrumentHeaderSize >= 29U) { - seek(pos + 27); - if(!readU16L(sampleCount)) - return false; - } - - unsigned long sampleHeaderSize = 0; - if(sampleCount > 0) { - seek(pos + 29); - if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) - return false; - } - - pos += instrumentHeaderSize; - - for(unsigned short j = 0; j < sampleCount; ++ j) { - if(sampleHeaderSize > 4U) { - seek(pos); - unsigned long sampleLength = 0; - if(!readU32L(sampleLength)) - return false; - - if(sampleHeaderSize > 18U) { - seek(pos + 18); - const unsigned int len = std::min(sampleHeaderSize - 18U, 22UL); - if(sampleNameIndex >= lines.size()) - writeString(String(), len); - else - writeString(lines[sampleNameIndex ++], len); - } - } - pos += sampleHeaderSize; - } - } - - return true; -} - -void XM::File::read(bool) -{ - if(!isOpen()) - return; - - seek(0); - ByteVector magic = readBlock(17); - // it's all 0x00 for stripped XM files: - READ_ASSERT(magic == "Extended Module: " || magic == ByteVector(17, 0)); - - READ_STRING(d->tag.setTitle, 20); - READ_BYTE_AS(escape); - // in stripped XM files this is 0x00: - READ_ASSERT(escape == 0x1A || escape == 0x00); - - READ_STRING(d->tag.setTrackerName, 20); - READ_U16L(d->properties.setVersion); - - READ_U32L_AS(headerSize); - READ_ASSERT(headerSize >= 4); - - unsigned short length = 0; - unsigned short restartPosition = 0; - unsigned short channels = 0; - unsigned short patternCount = 0; - unsigned short instrumentCount = 0; - unsigned short flags = 0; - unsigned short tempo = 0; - unsigned short bpmSpeed = 0; - - StructReader header; - header.u16L(length) - .u16L(restartPosition) - .u16L(channels) - .u16L(patternCount) - .u16L(instrumentCount) - .u16L(flags) - .u16L(tempo) - .u16L(bpmSpeed); - - unsigned int count = header.read(*this, headerSize - 4U); - unsigned int size = std::min(headerSize - 4U, (unsigned long)header.size()); - - READ_ASSERT(count == size); - - d->properties.setLengthInPatterns(length); - d->properties.setRestartPosition(restartPosition); - d->properties.setChannels(channels); - d->properties.setPatternCount(patternCount); - d->properties.setInstrumentCount(instrumentCount); - d->properties.setFlags(flags); - d->properties.setTempo(tempo); - d->properties.setBpmSpeed(bpmSpeed); - - seek(60 + headerSize); - - // read patterns: - for(unsigned short i = 0; i < patternCount; ++ i) { - READ_U32L_AS(patternHeaderLength); - READ_ASSERT(patternHeaderLength >= 4); - - unsigned char packingType = 0; - unsigned short rowCount = 0; - unsigned short dataSize = 0; - StructReader pattern; - pattern.byte(packingType).u16L(rowCount).u16L(dataSize); - - unsigned int count = pattern.read(*this, patternHeaderLength - 4U); - READ_ASSERT(count == std::min(patternHeaderLength - 4U, (unsigned long)pattern.size())); - - seek(patternHeaderLength - (4 + count) + dataSize, Current); - } - - StringList intrumentNames; - StringList sampleNames; - unsigned int sumSampleCount = 0; - - // read instruments: - for(unsigned short i = 0; i < instrumentCount; ++ i) { - READ_U32L_AS(instrumentHeaderSize); - READ_ASSERT(instrumentHeaderSize >= 4); - - String instrumentName; - unsigned char instrumentType = 0; - unsigned short sampleCount = 0; - - StructReader instrument; - instrument.string(instrumentName, 22).byte(instrumentType).u16L(sampleCount); - - // 4 for instrumentHeaderSize - unsigned int count = 4 + instrument.read(*this, instrumentHeaderSize - 4U); - READ_ASSERT(count == std::min(instrumentHeaderSize, (unsigned long)instrument.size() + 4)); - - long offset = 0; - if(sampleCount > 0) { - unsigned long sampleHeaderSize = 0; - sumSampleCount += sampleCount; - // wouldn't know which header size to assume otherwise: - READ_ASSERT(instrumentHeaderSize >= count + 4 && readU32L(sampleHeaderSize)); - // skip unhandled header proportion: - seek(instrumentHeaderSize - count - 4, Current); - - for(unsigned short j = 0; j < sampleCount; ++ j) { - unsigned long sampleLength = 0; - unsigned long loopStart = 0; - unsigned long loopLength = 0; - unsigned char volume = 0; - unsigned char finetune = 0; - unsigned char sampleType = 0; - unsigned char panning = 0; - unsigned char noteNumber = 0; - unsigned char compression = 0; - String sampleName; - StructReader sample; - sample.u32L(sampleLength) - .u32L(loopStart) - .u32L(loopLength) - .byte(volume) - .byte(finetune) - .byte(sampleType) - .byte(panning) - .byte(noteNumber) - .byte(compression) - .string(sampleName, 22); - - unsigned int count = sample.read(*this, sampleHeaderSize); - READ_ASSERT(count == std::min(sampleHeaderSize, (unsigned long)sample.size())); - // skip unhandled header proportion: - seek(sampleHeaderSize - count, Current); - - offset += sampleLength; - sampleNames.append(sampleName); - } - } - else { - offset = instrumentHeaderSize - count; - } - intrumentNames.append(instrumentName); - seek(offset, Current); - } - - d->properties.setSampleCount(sumSampleCount); - String comment(intrumentNames.toString("\n")); - if(!sampleNames.isEmpty()) { - comment += "\n"; - comment += sampleNames.toString("\n"); - } - d->tag.setComment(comment); -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmproperties.cpp b/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmproperties.cpp deleted file mode 100755 index 93d849868..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/taglib/xm/xmproperties.cpp +++ /dev/null @@ -1,195 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include "xmproperties.h" - -using namespace TagLib; -using namespace XM; - -class XM::Properties::PropertiesPrivate -{ -public: - PropertiesPrivate() : - lengthInPatterns(0), - channels(0), - version(0), - restartPosition(0), - patternCount(0), - instrumentCount(0), - sampleCount(0), - flags(0), - tempo(0), - bpmSpeed(0) - { - } - - unsigned short lengthInPatterns; - int channels; - unsigned short version; - unsigned short restartPosition; - unsigned short patternCount; - unsigned short instrumentCount; - unsigned int sampleCount; - unsigned short flags; - unsigned short tempo; - unsigned short bpmSpeed; -}; - -XM::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : - AudioProperties(propertiesStyle), - d(new PropertiesPrivate()) -{ -} - -XM::Properties::~Properties() -{ - delete d; -} - -int XM::Properties::length() const -{ - return 0; -} - -int XM::Properties::lengthInSeconds() const -{ - return 0; -} - -int XM::Properties::lengthInMilliseconds() const -{ - return 0; -} - -int XM::Properties::bitrate() const -{ - return 0; -} - -int XM::Properties::sampleRate() const -{ - return 0; -} - -int XM::Properties::channels() const -{ - return d->channels; -} - -unsigned short XM::Properties::lengthInPatterns() const -{ - return d->lengthInPatterns; -} - -unsigned short XM::Properties::version() const -{ - return d->version; -} - -unsigned short XM::Properties::restartPosition() const -{ - return d->restartPosition; -} - -unsigned short XM::Properties::patternCount() const -{ - return d->patternCount; -} - -unsigned short XM::Properties::instrumentCount() const -{ - return d->instrumentCount; -} - -unsigned int XM::Properties::sampleCount() const -{ - return d->sampleCount; -} - -unsigned short XM::Properties::flags() const -{ - return d->flags; -} - -unsigned short XM::Properties::tempo() const -{ - return d->tempo; -} - -unsigned short XM::Properties::bpmSpeed() const -{ - return d->bpmSpeed; -} - -void XM::Properties::setLengthInPatterns(unsigned short lengthInPatterns) -{ - d->lengthInPatterns = lengthInPatterns; -} - -void XM::Properties::setChannels(int channels) -{ - d->channels = channels; -} - -void XM::Properties::setVersion(unsigned short version) -{ - d->version = version; -} - -void XM::Properties::setRestartPosition(unsigned short restartPosition) -{ - d->restartPosition = restartPosition; -} - -void XM::Properties::setPatternCount(unsigned short patternCount) -{ - d->patternCount = patternCount; -} - -void XM::Properties::setInstrumentCount(unsigned short instrumentCount) -{ - d->instrumentCount = instrumentCount; -} - -void XM::Properties::setSampleCount(unsigned int sampleCount) -{ - d->sampleCount = sampleCount; -} - -void XM::Properties::setFlags(unsigned short flags) -{ - d->flags = flags; -} - -void XM::Properties::setTempo(unsigned short tempo) -{ - d->tempo = tempo; -} - -void XM::Properties::setBpmSpeed(unsigned short bpmSpeed) -{ - d->bpmSpeed = bpmSpeed; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/CMakeLists.txt b/src/plugins/taglib_plugin/taglib-1.11/tests/CMakeLists.txt deleted file mode 100755 index b3dbb8ee2..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/CMakeLists.txt +++ /dev/null @@ -1,80 +0,0 @@ -set(CMAKE_CXX_STANDARD 11) - -INCLUDE_DIRECTORIES( - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/asf - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2/frames - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpc - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mp4 - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/aiff - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/wav - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/trueaudio - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/vorbis - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/speex - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/opus - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/flac - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/wavpack - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mod - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/s3m - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/it - ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/xm -) - -SET(test_runner_SRCS - main.cpp - test_list.cpp - test_map.cpp - test_mpeg.cpp - test_synchdata.cpp - test_trueaudio.cpp - test_bytevector.cpp - test_bytevectorlist.cpp - test_bytevectorstream.cpp - test_string.cpp - test_propertymap.cpp - test_file.cpp - test_fileref.cpp - test_id3v1.cpp - test_id3v2.cpp - test_xiphcomment.cpp - test_aiff.cpp - test_riff.cpp - test_ogg.cpp - test_oggflac.cpp - test_flac.cpp - test_flacpicture.cpp - test_flacunknownmetadatablock.cpp - test_ape.cpp - test_apetag.cpp - test_wav.cpp - test_info.cpp - test_wavpack.cpp - test_mp4.cpp - test_mp4item.cpp - test_mp4coverart.cpp - test_asf.cpp - test_mod.cpp - test_s3m.cpp - test_it.cpp - test_xm.cpp - test_mpc.cpp - test_opus.cpp - test_speex.cpp -) - -INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIR}) - -ADD_EXECUTABLE(test_runner ${test_runner_SRCS}) -TARGET_LINK_LIBRARIES(test_runner tag ${CPPUNIT_LIBRARIES}) - -ADD_TEST(test_runner test_runner) -ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND} -V - DEPENDS test_runner) diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/005411.id3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/005411.id3 deleted file mode 100755 index ab2e0997a..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/005411.id3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/64bit.mp4 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/64bit.mp4 deleted file mode 100755 index 0bd7f9f33..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/64bit.mp4 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.aifc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.aifc deleted file mode 100755 index 33b4ea2a5..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.aifc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.wav deleted file mode 100755 index cf548effc..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/alaw.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v1.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v1.mp3 deleted file mode 100755 index a761d6ca6..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v1.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v2.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v2.mp3 deleted file mode 100755 index 72c1291d1..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape-id3v2.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape.mp3 deleted file mode 100755 index a17e26993..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ape.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/bladeenc.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/bladeenc.mp3 deleted file mode 100755 index e3d1a4b51..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/bladeenc.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/blank_video.m4v b/src/plugins/taglib_plugin/taglib-1.11/tests/data/blank_video.m4v deleted file mode 100755 index 4bb15ded3..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/blank_video.m4v and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/broken-tenc.id3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/broken-tenc.id3 deleted file mode 100755 index 809040506..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/broken-tenc.id3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.mod b/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.mod deleted file mode 100755 index 13dcea8bc..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.mod and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.s3m b/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.s3m deleted file mode 100755 index 37bd49cdd..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.s3m and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.xm b/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.xm deleted file mode 100755 index bb5db3ddd..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/changed.xm and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.mpc deleted file mode 100755 index a41f14e9e..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.wv b/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.wv deleted file mode 100755 index f8bd1a851..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/click.wv and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/compressed_id3_frame.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/compressed_id3_frame.mp3 deleted file mode 100755 index 824d036fa..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/compressed_id3_frame.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/correctness_gain_silent_output.opus b/src/plugins/taglib_plugin/taglib-1.11/tests/data/correctness_gain_silent_output.opus deleted file mode 100755 index 00972c42f..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/correctness_gain_silent_output.opus and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/covr-junk.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/covr-junk.m4a deleted file mode 100755 index ac80cb29d..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/covr-junk.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.aiff b/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.aiff deleted file mode 100755 index 6703583f2..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.aiff and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.mp3 deleted file mode 100755 index 34f4f158c..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_id3v2.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_tags.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_tags.wav deleted file mode 100755 index b9865bbd5..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/duplicate_tags.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty-seektable.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty-seektable.flac deleted file mode 100644 index 20dd90d91..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty-seektable.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.aiff b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.aiff deleted file mode 100755 index 849b762da..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.aiff and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.ogg b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.ogg deleted file mode 100755 index aa533104d..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.ogg and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.spx b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.spx deleted file mode 100755 index 70572b458..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.spx and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.tta b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.tta deleted file mode 100755 index 9cc00ba81..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.tta and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.wav deleted file mode 100755 index 74b5a6de7..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dff b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dff deleted file mode 100644 index 9dc0b9ecd..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dff and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dsf b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dsf deleted file mode 100644 index 31a4d7c1b..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty10ms.dsf and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_alac.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_alac.m4a deleted file mode 100755 index 8c6783218..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_alac.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_flac.oga b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_flac.oga deleted file mode 100755 index 444587fd0..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_flac.oga and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_vorbis.oga b/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_vorbis.oga deleted file mode 100755 index aa533104d..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/empty_vorbis.oga and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.aif b/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.aif deleted file mode 100755 index 9cb3a6e10..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.aif and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.mp3 deleted file mode 100755 index cd8aa2aba..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/excessive_alloc.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/float64.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/float64.wav deleted file mode 100755 index d34f692bf..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/float64.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/four_channels.wv b/src/plugins/taglib_plugin/taglib-1.11/tests/data/four_channels.wv deleted file mode 100755 index de682f242..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/four_channels.wv and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/garbage.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/garbage.mp3 deleted file mode 100644 index 730b74e7c..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/garbage.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/gnre.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/gnre.m4a deleted file mode 100755 index f925ea9eb..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/gnre.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/has-tags.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/has-tags.m4a deleted file mode 100755 index f48a28b52..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/has-tags.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/id3v22-tda.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/id3v22-tda.mp3 deleted file mode 100755 index b0545ea6f..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/id3v22-tda.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ilst-is-last.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/ilst-is-last.m4a deleted file mode 100755 index c56c80498..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/ilst-is-last.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.m4a deleted file mode 100755 index bbf76db8f..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.mpc deleted file mode 100755 index 46861ab37..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wav deleted file mode 100755 index c220baa8f..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wv b/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wv deleted file mode 100755 index d8c720cfe..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/infloop.wv and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames1.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames1.mp3 deleted file mode 100755 index c076712c0..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames1.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames2.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames2.mp3 deleted file mode 100755 index 01976fc54..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames2.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames3.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames3.mp3 deleted file mode 100755 index 6bbd2d397..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/invalid-frames3.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_cbr.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_cbr.mp3 deleted file mode 100755 index b7badeb05..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_cbr.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_vbr.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_vbr.mp3 deleted file mode 100755 index 643056ef8..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lame_vbr.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/longloop.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/longloop.ape deleted file mode 100755 index 3800387ac..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/longloop.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lossless.wma b/src/plugins/taglib_plugin/taglib-1.11/tests/data/lossless.wma deleted file mode 100755 index e29befcc8..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lossless.wma and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lowercase-fields.ogg b/src/plugins/taglib_plugin/taglib-1.11/tests/data/lowercase-fields.ogg deleted file mode 100644 index 0ddd49357..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/lowercase-fields.ogg and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-390-hdr.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-390-hdr.ape deleted file mode 100755 index c703e2e2f..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-390-hdr.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-396.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-396.ape deleted file mode 100755 index fa7ae4149..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-396.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-id3v2.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-id3v2.ape deleted file mode 100755 index 2ea97fc45..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-id3v2.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-tagged.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-tagged.ape deleted file mode 100755 index 3f5a656eb..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399-tagged.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399.ape deleted file mode 100755 index 3b0661ee1..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mac-399.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mpeg2.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/mpeg2.mp3 deleted file mode 100755 index 13e8d53df..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/mpeg2.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/multiple-vc.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/multiple-vc.flac deleted file mode 100755 index 93d9a8a14..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/multiple-vc.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-extension b/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-extension deleted file mode 100755 index 65f57c2ee..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-extension and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.3g2 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.3g2 deleted file mode 100755 index d31a6ce96..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.3g2 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.flac deleted file mode 100755 index 417144167..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.m4a deleted file mode 100755 index ba4e92bae..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no-tags.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no_length.wv b/src/plugins/taglib_plugin/taglib-1.11/tests/data/no_length.wv deleted file mode 100755 index c06d1071d..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/no_length.wv and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise.aif b/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise.aif deleted file mode 100755 index 310b995e3..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise.aif and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise_odd.aif b/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise_odd.aif deleted file mode 100755 index bccfd7283..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/noise_odd.aif and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/pcm_with_fact_chunk.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/pcm_with_fact_chunk.wav deleted file mode 100755 index a6dc1d6c5..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/pcm_with_fact_chunk.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/rare_frames.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/rare_frames.mp3 deleted file mode 100755 index e485337f9..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/rare_frames.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.aif b/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.aif deleted file mode 100755 index 5dce192b0..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.aif and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.mpc deleted file mode 100755 index 2c7e29fb7..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.oga b/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.oga deleted file mode 100755 index e23c21706..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.oga and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.wav deleted file mode 100755 index 0385e99be..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault2.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault2.mpc deleted file mode 100755 index fcfa982f6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/data/segfault2.mpc +++ /dev/null @@ -1 +0,0 @@ -MPCKSH \ No newline at end of file diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-1.wma b/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-1.wma deleted file mode 100755 index e06f91766..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-1.wma and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-44-s.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-44-s.flac deleted file mode 100755 index 24e15deb8..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/silence-44-s.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sinewave.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/sinewave.flac deleted file mode 100755 index 25d31b2d7..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sinewave.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/stripped.xm b/src/plugins/taglib_plugin/taglib-1.11/tests/data/stripped.xm deleted file mode 100755 index 57055f5f1..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/stripped.xm and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv4_header.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv4_header.mpc deleted file mode 100755 index 214f7ac4e..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv4_header.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv5_header.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv5_header.mpc deleted file mode 100755 index 6d17e65f0..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv5_header.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv8_header.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv8_header.mpc deleted file mode 100755 index 3405545a2..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/sv8_header.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.tta b/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.tta deleted file mode 100755 index 1677a7edf..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.tta and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.wv b/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.wv deleted file mode 100755 index 333f86871..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/tagged.wv and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.it b/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.it deleted file mode 100755 index 379444b91..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.it and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.mod b/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.mod deleted file mode 100755 index 136b61191..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.mod and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.ogg b/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.ogg deleted file mode 100755 index 220f76f0c..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.ogg and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.s3m b/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.s3m deleted file mode 100755 index 668250bb7..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.s3m and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.xm b/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.xm deleted file mode 100755 index b09d91324..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/test.xm and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/toc_many_children.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/toc_many_children.mp3 deleted file mode 100644 index 168c47981..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/toc_many_children.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsupported-extension.xx b/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsupported-extension.xx deleted file mode 100644 index 65f57c2ee..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsupported-extension.xx and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsynch.id3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsynch.id3 deleted file mode 100755 index cfe6ee1a6..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/unsynch.id3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/w000.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/w000.mp3 deleted file mode 100755 index f9c226176..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/w000.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/xing.mp3 b/src/plugins/taglib_plugin/taglib-1.11/tests/data/xing.mp3 deleted file mode 100755 index 0c880151b..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/xing.mp3 and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-length-mdat.m4a b/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-length-mdat.m4a deleted file mode 100644 index 578d2ef7a..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-length-mdat.m4a and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-size-chunk.wav b/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-size-chunk.wav deleted file mode 100755 index 8517e797d..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-size-chunk.wav and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-sized-padding.flac b/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-sized-padding.flac deleted file mode 100755 index 86ab8bf7b..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zero-sized-padding.flac and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.ape b/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.ape deleted file mode 100755 index 683bc2ddb..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.ape and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.mpc b/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.mpc deleted file mode 100755 index d3ea57c75..000000000 Binary files a/src/plugins/taglib_plugin/taglib-1.11/tests/data/zerodiv.mpc and /dev/null differ diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/main.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/main.cpp deleted file mode 100755 index 86a4208c7..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/main.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <stdlib.h> -#include <string.h> -#include <fstream> -#include <stdexcept> -#include <cppunit/TestResult.h> -#include <cppunit/TestResultCollector.h> -#include <cppunit/TestRunner.h> -#include <cppunit/extensions/TestFactoryRegistry.h> -#include <cppunit/BriefTestProgressListener.h> -#include <cppunit/CompilerOutputter.h> -#include <cppunit/XmlOutputter.h> - -int main(int argc, char* argv[]) -{ - std::string testPath = (argc > 1) ? std::string(argv[1]) : ""; - - // Create the event manager and test controller - CppUnit::TestResult controller; - - // Add a listener that collects test result - CppUnit::TestResultCollector result; - controller.addListener(&result); - - // Add a listener that print dots as test run. - CppUnit::BriefTestProgressListener progress; - controller.addListener(&progress); - - // Add the top suite to the test runner - CppUnit::TestRunner runner; - runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); - - try { - std::cout << "Running " << testPath; - runner.run(controller, testPath); - - std::cerr << std::endl; - - // Print test in a compiler compatible format. - CppUnit::CompilerOutputter outputter(&result, std::cerr); - outputter.write(); - -#if defined(_MSC_VER) && _MSC_VER > 1500 - char *xml = NULL; - ::_dupenv_s(&xml, NULL, "CPPUNIT_XML"); -#else - char *xml = ::getenv("CPPUNIT_XML"); -#endif - if(xml && !::strcmp(xml, "1")) { - std::ofstream xmlfileout("cpptestresults.xml"); - CppUnit::XmlOutputter xmlout(&result, xmlfileout); - xmlout.write(); - } -#if defined(_MSC_VER) && _MSC_VER > 1500 - ::free(xml); -#endif - } - catch(std::invalid_argument &e){ - std::cerr << std::endl - << "ERROR: " << e.what() - << std::endl; - return 0; - } - - return result.wasSuccessful() ? 0 : 1; -} diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_aiff.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_aiff.cpp deleted file mode 100755 index 116c13a62..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_aiff.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <aifffile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAIFF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAIFF); - CPPUNIT_TEST(testAiffProperties); - CPPUNIT_TEST(testAiffCProperties); - CPPUNIT_TEST(testSaveID3v2); - CPPUNIT_TEST(testSaveID3v23); - CPPUNIT_TEST(testDuplicateID3v2); - CPPUNIT_TEST(testFuzzedFile1); - CPPUNIT_TEST(testFuzzedFile2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAiffProperties() - { - RIFF::AIFF::File f(TEST_FILE_PATH_C("empty.aiff")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(67, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(706, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(2941U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isAiffC()); - } - - void testAiffCProperties() - { - RIFF::AIFF::File f(TEST_FILE_PATH_C("alaw.aifc")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(37, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(355, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(1622U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isAiffC()); - CPPUNIT_ASSERT_EQUAL(ByteVector("ALAW"), f.audioProperties()->compressionType()); - CPPUNIT_ASSERT_EQUAL(String("SGI CCITT G.711 A-law"), f.audioProperties()->compressionName()); - } - - void testSaveID3v2() - { - ScopedFileCopy copy("empty", ".aiff"); - string newname = copy.fileName(); - - { - RIFF::AIFF::File f(newname.c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - - f.tag()->setTitle(L"TitleXXX"); - f.save(); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - } - { - RIFF::AIFF::File f(newname.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String(L"TitleXXX"), f.tag()->title()); - - f.tag()->setTitle(""); - f.save(); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - } - { - RIFF::AIFF::File f(newname.c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - } - } - - void testSaveID3v23() - { - ScopedFileCopy copy("empty", ".aiff"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - { - RIFF::AIFF::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(ID3v2::v3); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - } - { - RIFF::AIFF::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - } - - void testDuplicateID3v2() - { - ScopedFileCopy copy("duplicate_id3v2", ".aiff"); - - // duplicate_id3v2.aiff has duplicate ID3v2 tag chunks. - // title() returns "Title2" if can't skip the second tag. - - RIFF::AIFF::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("Title1"), f.tag()->title()); - - f.save(); - CPPUNIT_ASSERT_EQUAL(7030L, f.length()); - CPPUNIT_ASSERT_EQUAL(-1L, f.find("Title2")); - } - - void testFuzzedFile1() - { - RIFF::AIFF::File f(TEST_FILE_PATH_C("segfault.aif")); - CPPUNIT_ASSERT(!f.isValid()); - } - - void testFuzzedFile2() - { - RIFF::AIFF::File f(TEST_FILE_PATH_C("excessive_alloc.aif")); - CPPUNIT_ASSERT(!f.isValid()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAIFF); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_ape.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_ape.cpp deleted file mode 100755 index 8c120483d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_ape.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <apetag.h> -#include <id3v1tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <apefile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAPE : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAPE); - CPPUNIT_TEST(testProperties399); - CPPUNIT_TEST(testProperties399Tagged); - CPPUNIT_TEST(testProperties399Id3v2); - CPPUNIT_TEST(testProperties396); - CPPUNIT_TEST(testProperties390); - CPPUNIT_TEST(testFuzzedFile1); - CPPUNIT_TEST(testFuzzedFile2); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testProperties399() - { - APE::File f(TEST_FILE_PATH_C("mac-399.ape")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); - } - - void testProperties399Tagged() - { - APE::File f(TEST_FILE_PATH_C("mac-399-tagged.ape")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); - } - - void testProperties399Id3v2() - { - APE::File f(TEST_FILE_PATH_C("mac-399-id3v2.ape")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); - } - - void testProperties396() - { - APE::File f(TEST_FILE_PATH_C("mac-396.ape")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3960, f.audioProperties()->version()); - } - - void testProperties390() - { - APE::File f(TEST_FILE_PATH_C("mac-390-hdr.ape")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(15, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(15630, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(689262U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3900, f.audioProperties()->version()); - } - - void testFuzzedFile1() - { - APE::File f(TEST_FILE_PATH_C("longloop.ape")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testFuzzedFile2() - { - APE::File f(TEST_FILE_PATH_C("zerodiv.ape")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testStripAndProperties() - { - ScopedFileCopy copy("mac-399", ".ape"); - - { - APE::File f(copy.fileName().c_str()); - f.APETag(true)->setTitle("APE"); - f.ID3v1Tag(true)->setTitle("ID3v1"); - f.save(); - } - { - APE::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); - f.strip(APE::File::APE); - CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); - f.strip(APE::File::ID3v1); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testRepeatedSave() - { - ScopedFileCopy copy("mac-399", ".ape"); - - { - APE::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasAPETag()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - - f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - - f.APETag()->setTitle("0"); - f.save(); - - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); - f.save(); - } - { - APE::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasAPETag()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAPE); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_apetag.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_apetag.cpp deleted file mode 100755 index 577ec4b0f..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_apetag.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <apetag.h> -#include <tdebug.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestAPETag : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestAPETag); - CPPUNIT_TEST(testIsEmpty); - CPPUNIT_TEST(testIsEmpty2); - CPPUNIT_TEST(testPropertyInterface1); - CPPUNIT_TEST(testPropertyInterface2); - CPPUNIT_TEST(testInvalidKeys); - CPPUNIT_TEST(testTextBinary); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testIsEmpty() - { - APE::Tag tag; - CPPUNIT_ASSERT(tag.isEmpty()); - tag.addValue("COMPOSER", "Mike Oldfield"); - CPPUNIT_ASSERT(!tag.isEmpty()); - } - - void testIsEmpty2() - { - APE::Tag tag; - CPPUNIT_ASSERT(tag.isEmpty()); - tag.setArtist("Mike Oldfield"); - CPPUNIT_ASSERT(!tag.isEmpty()); - } - - void testPropertyInterface1() - { - APE::Tag tag; - PropertyMap dict = tag.properties(); - CPPUNIT_ASSERT(dict.isEmpty()); - dict["ARTIST"] = String("artist 1"); - dict["ARTIST"].append("artist 2"); - dict["TRACKNUMBER"].append("17"); - tag.setProperties(dict); - CPPUNIT_ASSERT_EQUAL(String("17"), tag.itemListMap()["TRACK"].values()[0]); - CPPUNIT_ASSERT_EQUAL(2u, tag.itemListMap()["ARTIST"].values().size()); - CPPUNIT_ASSERT_EQUAL(String("artist 1 artist 2"), tag.artist()); - CPPUNIT_ASSERT_EQUAL(17u, tag.track()); - } - - void testPropertyInterface2() - { - APE::Tag tag; - APE::Item item1 = APE::Item("TRACK", "17"); - tag.setItem("TRACK", item1); - - APE::Item item2 = APE::Item(); - item2.setType(APE::Item::Binary); - tag.setItem("TESTBINARY", item2); - - PropertyMap properties = tag.properties(); - CPPUNIT_ASSERT_EQUAL(1u, properties.unsupportedData().size()); - CPPUNIT_ASSERT(properties.contains("TRACKNUMBER")); - CPPUNIT_ASSERT(!properties.contains("TRACK")); - CPPUNIT_ASSERT(tag.itemListMap().contains("TESTBINARY")); - - tag.removeUnsupportedProperties(properties.unsupportedData()); - CPPUNIT_ASSERT(!tag.itemListMap().contains("TESTBINARY")); - - APE::Item item3 = APE::Item("TRACKNUMBER", "29"); - tag.setItem("TRACKNUMBER", item3); - properties = tag.properties(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, properties["TRACKNUMBER"].size()); - CPPUNIT_ASSERT_EQUAL(String("17"), properties["TRACKNUMBER"][0]); - CPPUNIT_ASSERT_EQUAL(String("29"), properties["TRACKNUMBER"][1]); - - } - - void testInvalidKeys() - { - PropertyMap properties; - properties["A"] = String("invalid key: one character"); - properties["MP+"] = String("invalid key: forbidden string"); - properties[L"\x1234\x3456"] = String("invalid key: Unicode"); - properties["A B~C"] = String("valid key: space and tilde"); - properties["ARTIST"] = String("valid key: normal one"); - - APE::Tag tag; - PropertyMap unsuccessful = tag.setProperties(properties); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, unsuccessful.size()); - CPPUNIT_ASSERT(unsuccessful.contains("A")); - CPPUNIT_ASSERT(unsuccessful.contains("MP+")); - CPPUNIT_ASSERT(unsuccessful.contains(L"\x1234\x3456")); - - CPPUNIT_ASSERT_EQUAL((unsigned int)2, tag.itemListMap().size()); - tag.addValue("VALID KEY", "Test Value 1"); - tag.addValue("INVALID KEY \x7f", "Test Value 2"); - tag.addValue(L"INVALID KEY \x1234\x3456", "Test Value 3"); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, tag.itemListMap().size()); - } - - void testTextBinary() - { - APE::Item item = APE::Item("DUMMY", "Test Text"); - CPPUNIT_ASSERT_EQUAL(String("Test Text"), item.toString()); - CPPUNIT_ASSERT_EQUAL(ByteVector(), item.binaryData()); - - ByteVector data("Test Data"); - item.setBinaryData(data); - CPPUNIT_ASSERT(item.values().isEmpty()); - CPPUNIT_ASSERT_EQUAL(String(), item.toString()); - CPPUNIT_ASSERT_EQUAL(data, item.binaryData()); - - item.setValue("Test Text 2"); - CPPUNIT_ASSERT_EQUAL(String("Test Text 2"), item.toString()); - CPPUNIT_ASSERT_EQUAL(ByteVector(), item.binaryData()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestAPETag); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_asf.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_asf.cpp deleted file mode 100755 index e9b8dab73..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_asf.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <asffile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestASF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestASF); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testLosslessProperties); - CPPUNIT_TEST(testRead); - CPPUNIT_TEST(testSaveMultipleValues); - CPPUNIT_TEST(testSaveStream); - CPPUNIT_TEST(testSaveLanguage); - CPPUNIT_TEST(testDWordTrackNumber); - CPPUNIT_TEST(testSaveLargeValue); - CPPUNIT_TEST(testSavePicture); - CPPUNIT_TEST(testSaveMultiplePictures); - CPPUNIT_TEST(testProperties); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAudioProperties() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3712, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(ASF::Properties::WMA2, f.audioProperties()->codec()); - CPPUNIT_ASSERT_EQUAL(String("Windows Media Audio 9.1"), f.audioProperties()->codecName()); - CPPUNIT_ASSERT_EQUAL(String("64 kbps, 48 kHz, stereo 2-pass CBR"), f.audioProperties()->codecDescription()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); - } - - void testLosslessProperties() - { - ASF::File f(TEST_FILE_PATH_C("lossless.wma")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3549, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(1152, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(ASF::Properties::WMA9Lossless, f.audioProperties()->codec()); - CPPUNIT_ASSERT_EQUAL(String("Windows Media Audio 9.2 Lossless"), f.audioProperties()->codecName()); - CPPUNIT_ASSERT_EQUAL(String("VBR Quality 100, 44 kHz, 2 channel 16 bit 1-pass VBR"), f.audioProperties()->codecDescription()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); - } - - void testRead() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - CPPUNIT_ASSERT_EQUAL(String("test"), f.tag()->title()); - } - - void testSaveMultipleValues() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::AttributeList values; - values.append("Foo"); - values.append("Bar"); - f.tag()->setAttribute("WM/AlbumTitle", values); - f.save(); - } - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(2, (int)f.tag()->attributeListMap()["WM/AlbumTitle"].size()); - } - } - - void testDWordTrackNumber() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT(!f.tag()->contains("WM/TrackNumber")); - f.tag()->setAttribute("WM/TrackNumber", (unsigned int)(123)); - f.save(); - } - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(ASF::Attribute::DWordType, - f.tag()->attribute("WM/TrackNumber").front().type()); - CPPUNIT_ASSERT_EQUAL((unsigned int)123, f.tag()->track()); - f.tag()->setTrack(234); - f.save(); - } - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(ASF::Attribute::UnicodeType, - f.tag()->attribute("WM/TrackNumber").front().type()); - CPPUNIT_ASSERT_EQUAL((unsigned int)234, f.tag()->track()); - } - } - - void testSaveStream() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::Attribute attr("Foo"); - attr.setStream(43); - f.tag()->setAttribute("WM/AlbumTitle", attr); - f.save(); - } - - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(43, f.tag()->attribute("WM/AlbumTitle").front().stream()); - } - } - - void testSaveLanguage() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::Attribute attr("Foo"); - attr.setStream(32); - attr.setLanguage(56); - f.tag()->setAttribute("WM/AlbumTitle", attr); - f.save(); - } - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(32, f.tag()->attribute("WM/AlbumTitle").front().stream()); - CPPUNIT_ASSERT_EQUAL(56, f.tag()->attribute("WM/AlbumTitle").front().language()); - } - } - - void testSaveLargeValue() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::Attribute attr(ByteVector(70000, 'x')); - f.tag()->setAttribute("WM/Blob", attr); - f.save(); - } - { - ASF::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector(70000, 'x'), - f.tag()->attribute("WM/Blob").front().toByteVector()); - } - } - - void testSavePicture() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::Picture picture; - picture.setMimeType("image/jpeg"); - picture.setType(ASF::Picture::FrontCover); - picture.setDescription("description"); - picture.setPicture("data"); - f.tag()->setAttribute("WM/Picture", picture); - f.save(); - } - { - ASF::File f(newname.c_str()); - ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, values2.size()); - ASF::Attribute attr2 = values2.front(); - ASF::Picture picture2 = attr2.toPicture(); - CPPUNIT_ASSERT(picture2.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture2.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture2.type()); - CPPUNIT_ASSERT_EQUAL(String("description"), picture2.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture2.picture()); - } - } - - void testSaveMultiplePictures() - { - ScopedFileCopy copy("silence-1", ".wma"); - string newname = copy.fileName(); - - { - ASF::File f(newname.c_str()); - ASF::AttributeList values; - ASF::Picture picture; - picture.setMimeType("image/jpeg"); - picture.setType(ASF::Picture::FrontCover); - picture.setDescription("description"); - picture.setPicture("data"); - values.append(ASF::Attribute(picture)); - ASF::Picture picture2; - picture2.setMimeType("image/png"); - picture2.setType(ASF::Picture::BackCover); - picture2.setDescription("back cover"); - picture2.setPicture("PNG data"); - values.append(ASF::Attribute(picture2)); - f.tag()->setAttribute("WM/Picture", values); - f.save(); - } - { - ASF::File f(newname.c_str()); - ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, values2.size()); - ASF::Picture picture3 = values2[1].toPicture(); - CPPUNIT_ASSERT(picture3.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture3.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture3.type()); - CPPUNIT_ASSERT_EQUAL(String("description"), picture3.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture3.picture()); - ASF::Picture picture4 = values2[0].toPicture(); - CPPUNIT_ASSERT(picture4.isValid()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), picture4.mimeType()); - CPPUNIT_ASSERT_EQUAL(ASF::Picture::BackCover, picture4.type()); - CPPUNIT_ASSERT_EQUAL(String("back cover"), picture4.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("PNG data"), picture4.picture()); - } - } - - void testProperties() - { - ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); - - PropertyMap tags = f.properties(); - - tags["TRACKNUMBER"] = StringList("2"); - tags["DISCNUMBER"] = StringList("3"); - tags["BPM"] = StringList("123"); - tags["ARTIST"] = StringList("Foo Bar"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); - - CPPUNIT_ASSERT(f.tag()->contains("WM/BeatsPerMinute")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/BeatsPerMinute"].size()); - CPPUNIT_ASSERT_EQUAL(String("123"), f.tag()->attribute("WM/BeatsPerMinute").front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); - - CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/TrackNumber"].size()); - CPPUNIT_ASSERT_EQUAL(String("2"), f.tag()->attribute("WM/TrackNumber").front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("2"), tags["TRACKNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->contains("WM/PartOfSet")); - CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/PartOfSet"].size()); - CPPUNIT_ASSERT_EQUAL(String("3"), f.tag()->attribute("WM/PartOfSet").front().toString()); - CPPUNIT_ASSERT_EQUAL(StringList("3"), tags["DISCNUMBER"]); - } - - void testRepeatedSave() - { - ScopedFileCopy copy("silence-1", ".wma"); - - { - ASF::File f(copy.fileName().c_str()); - f.tag()->setTitle(longText(128 * 1024)); - f.save(); - CPPUNIT_ASSERT_EQUAL(297578L, f.length()); - f.tag()->setTitle(longText(16 * 1024)); - f.save(); - CPPUNIT_ASSERT_EQUAL(68202L, f.length()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestASF); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevector.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevector.cpp deleted file mode 100755 index 26cde765f..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevector.cpp +++ /dev/null @@ -1,599 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#define _USE_MATH_DEFINES -#include <cmath> -#include <tbytevector.h> -#include <tbytevectorlist.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVector : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVector); - CPPUNIT_TEST(testByteVector); - CPPUNIT_TEST(testFind1); - CPPUNIT_TEST(testFind2); - CPPUNIT_TEST(testFind3); - CPPUNIT_TEST(testRfind1); - CPPUNIT_TEST(testRfind2); - CPPUNIT_TEST(testRfind3); - CPPUNIT_TEST(testToHex); - CPPUNIT_TEST(testIntegerConversion); - CPPUNIT_TEST(testFloatingPointConversion); - CPPUNIT_TEST(testReplace); - CPPUNIT_TEST(testReplaceAndDetach); - CPPUNIT_TEST(testIterator); - CPPUNIT_TEST(testResize); - CPPUNIT_TEST(testAppend1); - CPPUNIT_TEST(testAppend2); - CPPUNIT_TEST(testBase64); - CPPUNIT_TEST_SUITE_END(); - -public: - void testByteVector() - { - ByteVector s1("foo"); - CPPUNIT_ASSERT(ByteVectorList::split(s1, " ").size() == 1); - - ByteVector s2("f"); - CPPUNIT_ASSERT(ByteVectorList::split(s2, " ").size() == 1); - - CPPUNIT_ASSERT(ByteVector().isEmpty()); - CPPUNIT_ASSERT_EQUAL(0U, ByteVector().size()); - CPPUNIT_ASSERT(ByteVector("asdf").clear().isEmpty()); - CPPUNIT_ASSERT_EQUAL(0U, ByteVector("asdf").clear().size()); - CPPUNIT_ASSERT_EQUAL(ByteVector(), ByteVector("asdf").clear()); - - ByteVector i("blah blah"); - ByteVector j("blah"); - CPPUNIT_ASSERT(i.containsAt(j, 5, 0)); - CPPUNIT_ASSERT(i.containsAt(j, 6, 1)); - CPPUNIT_ASSERT(i.containsAt(j, 6, 1, 3)); - - i.clear(); - CPPUNIT_ASSERT(i.isEmpty()); - } - - void testFind1() - { - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO")); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 0)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 1)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 2)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 3)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 4)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 5)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 6)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 7)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 8)); - - // Intentional out-of-bounds access. - ByteVector v("0123456789x"); - v.resize(10); - v.data()[10] = 'x'; - CPPUNIT_ASSERT_EQUAL(-1, v.find("789x", 7)); - } - - void testFind2() - { - CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01", 1).find("\x01")); - CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01\x02", 2).find("\x01\x02")); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01", 1).find("\x02")); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01\x02", 2).find("\x01\x03")); - } - - void testFind3() - { - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S')); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 0)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 1)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 2)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 3)); - CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 4)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 5)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 6)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 7)); - CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 8)); - } - - void testRfind1() - { - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 0)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 1)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 2)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 3)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 4)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 5)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 6)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 7)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 8)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS")); - } - - void testRfind2() - { - ByteVector r0("**************"); - ByteVector r1("OggS**********"); - ByteVector r2("**********OggS"); - ByteVector r3("OggS******OggS"); - ByteVector r4("OggS*OggS*OggS"); - - CPPUNIT_ASSERT_EQUAL(-1, r0.find("OggS")); - CPPUNIT_ASSERT_EQUAL(-1, r0.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r1.find("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r1.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r2.find("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r2.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(0, r3.find("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r3.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS")); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 0)); - CPPUNIT_ASSERT_EQUAL(5, r4.rfind("OggS", 7)); - CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 12)); - } - - void testRfind3() - { - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 0)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 1)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 2)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 3)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 4)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 5)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 6)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 7)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 8)); - CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O')); - } - - void testToHex() - { - ByteVector v("\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f", 16); - - CPPUNIT_ASSERT_EQUAL(ByteVector("f0e1d2c3b4a5968778695a4b3c2d1e0f"), v.toHex()); - } - - void testIntegerConversion() - { - const ByteVector data("\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff", 14); - - CPPUNIT_ASSERT_EQUAL((short)0x00ff, data.toShort()); - CPPUNIT_ASSERT_EQUAL((short)0xff00, data.toShort(false)); - CPPUNIT_ASSERT_EQUAL((short)0xff01, data.toShort(5U)); - CPPUNIT_ASSERT_EQUAL((short)0x01ff, data.toShort(5U, false)); - CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U)); - CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U, false)); - - CPPUNIT_ASSERT_EQUAL((unsigned short)0x00ff, data.toUShort()); - CPPUNIT_ASSERT_EQUAL((unsigned short)0xff00, data.toUShort(false)); - CPPUNIT_ASSERT_EQUAL((unsigned short)0xff01, data.toUShort(5U)); - CPPUNIT_ASSERT_EQUAL((unsigned short)0x01ff, data.toUShort(5U, false)); - CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U)); - CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U, false)); - - CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt()); - CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(false)); - CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(5U)); - CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt(5U, false)); - CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U)); - CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, false)); - - CPPUNIT_ASSERT_EQUAL(0x00ff01U, data.toUInt(0U, 3U)); - CPPUNIT_ASSERT_EQUAL(0x01ff00U, data.toUInt(0U, 3U, false)); - CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U)); - CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U, false)); - CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U, 3U)); - CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, 3U, false)); - - CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong()); - CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(false)); - CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(5U)); - CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong(5U, false)); - CPPUNIT_ASSERT_EQUAL((long long)0x00ffU, data.toLongLong(12U)); - CPPUNIT_ASSERT_EQUAL((long long)0xff00U, data.toLongLong(12U, false)); -} - - void testFloatingPointConversion() - { - const double Tolerance = 1.0e-7; - - const ByteVector pi32le("\xdb\x0f\x49\x40", 4); - CPPUNIT_ASSERT(std::abs(pi32le.toFloat32LE(0) - M_PI) < Tolerance); - CPPUNIT_ASSERT_EQUAL(pi32le, ByteVector::fromFloat32LE(pi32le.toFloat32LE(0))); - - const ByteVector pi32be("\x40\x49\x0f\xdb", 4); - CPPUNIT_ASSERT(std::abs(pi32be.toFloat32BE(0) - M_PI) < Tolerance); - CPPUNIT_ASSERT_EQUAL(pi32be, ByteVector::fromFloat32BE(pi32be.toFloat32BE(0))); - - const ByteVector pi64le("\x18\x2d\x44\x54\xfb\x21\x09\x40", 8); - CPPUNIT_ASSERT(std::abs(pi64le.toFloat64LE(0) - M_PI) < Tolerance); - CPPUNIT_ASSERT_EQUAL(pi64le, ByteVector::fromFloat64LE(pi64le.toFloat64LE(0))); - - const ByteVector pi64be("\x40\x09\x21\xfb\x54\x44\x2d\x18", 8); - CPPUNIT_ASSERT(std::abs(pi64be.toFloat64BE(0) - M_PI) < Tolerance); - CPPUNIT_ASSERT_EQUAL(pi64be, ByteVector::fromFloat64BE(pi64be.toFloat64BE(0))); - - const ByteVector pi80le("\x00\xc0\x68\x21\xa2\xda\x0f\xc9\x00\x40", 10); - CPPUNIT_ASSERT(std::abs(pi80le.toFloat80LE(0) - M_PI) < Tolerance); - - const ByteVector pi80be("\x40\x00\xc9\x0f\xda\xa2\x21\x68\xc0\x00", 10); - CPPUNIT_ASSERT(std::abs(pi80be.toFloat80BE(0) - M_PI) < Tolerance); - } - - void testReplace() - { - { - ByteVector a("abcdabf"); - a.replace(ByteVector(""), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("foobartoolong"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("xx"), ByteVector("yy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("a"), ByteVector("x")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); - a.replace(ByteVector("x"), ByteVector("a")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace('a', 'x'); - CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); - a.replace('x', 'a'); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("ab"), ByteVector("xy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a); - a.replace(ByteVector("xy"), ByteVector("ab")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("a"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a); - a.replace(ByteVector("<a>"), ByteVector("a")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabf"); - a.replace(ByteVector("b"), ByteVector("<b>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("a<b>cda<b>f"), a); - a.replace(ByteVector("<b>"), ByteVector("b")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); - } - { - ByteVector a("abcdabc"); - a.replace(ByteVector("c"), ByteVector("<c>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), a); - a.replace(ByteVector("<c>"), ByteVector("c")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a); - } - { - ByteVector a("abcdaba"); - a.replace(ByteVector("a"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>b<a>"), a); - a.replace(ByteVector("<a>"), ByteVector("a")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdaba"), a); - } - } - - void testReplaceAndDetach() - { - { - ByteVector a("abcdabf"); - ByteVector b = a; - a.replace(ByteVector("a"), ByteVector("x")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); - } - { - ByteVector a("abcdabf"); - ByteVector b = a; - a.replace('a', 'x'); - CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); - } - { - ByteVector a("abcdabf"); - ByteVector b = a; - a.replace(ByteVector("ab"), ByteVector("xy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); - } - { - ByteVector a("abcdabf"); - ByteVector b = a; - a.replace(ByteVector("a"), ByteVector("<a>")); - CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); - } - { - ByteVector a("ab<c>dab<c>"); - ByteVector b = a; - a.replace(ByteVector("<c>"), ByteVector("c")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a); - CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), b); - } - } - - void testIterator() - { - ByteVector v1("taglib"); - ByteVector v2 = v1; - - ByteVector::Iterator it1 = v1.begin(); - ByteVector::Iterator it2 = v2.begin(); - - CPPUNIT_ASSERT_EQUAL('t', *it1); - CPPUNIT_ASSERT_EQUAL('t', *it2); - - std::advance(it1, 4); - std::advance(it2, 4); - *it2 = 'I'; - CPPUNIT_ASSERT_EQUAL('i', *it1); - CPPUNIT_ASSERT_EQUAL('I', *it2); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglIb"), v2); - - ByteVector::ReverseIterator it3 = v1.rbegin(); - ByteVector::ReverseIterator it4 = v2.rbegin(); - - CPPUNIT_ASSERT_EQUAL('b', *it3); - CPPUNIT_ASSERT_EQUAL('b', *it4); - - std::advance(it3, 4); - std::advance(it4, 4); - *it4 = 'A'; - CPPUNIT_ASSERT_EQUAL('a', *it3); - CPPUNIT_ASSERT_EQUAL('A', *it4); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1); - CPPUNIT_ASSERT_EQUAL(ByteVector("tAglIb"), v2); - - ByteVector v3; - v3 = ByteVector("0123456789").mid(3, 4); - - it1 = v3.begin(); - it2 = v3.end() - 1; - CPPUNIT_ASSERT_EQUAL('3', *it1); - CPPUNIT_ASSERT_EQUAL('6', *it2); - - it3 = v3.rbegin(); - it4 = v3.rend() - 1; - CPPUNIT_ASSERT_EQUAL('6', *it3); - CPPUNIT_ASSERT_EQUAL('3', *it4); - } - - void testResize() - { - ByteVector a = ByteVector("0123456789"); - ByteVector b = a.mid(3, 4); - b.resize(6, 'A'); - CPPUNIT_ASSERT_EQUAL((unsigned int)6, b.size()); - CPPUNIT_ASSERT_EQUAL('6', b[3]); - CPPUNIT_ASSERT_EQUAL('A', b[4]); - CPPUNIT_ASSERT_EQUAL('A', b[5]); - b.resize(10, 'B'); - CPPUNIT_ASSERT_EQUAL((unsigned int)10, b.size()); - CPPUNIT_ASSERT_EQUAL('6', b[3]); - CPPUNIT_ASSERT_EQUAL('B', b[6]); - CPPUNIT_ASSERT_EQUAL('B', b[9]); - b.resize(3, 'C'); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size()); - CPPUNIT_ASSERT_EQUAL(-1, b.find('C')); - b.resize(3); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size()); - - // Check if a and b were properly detached. - - CPPUNIT_ASSERT_EQUAL((unsigned int)10, a.size()); - CPPUNIT_ASSERT_EQUAL('3', a[3]); - CPPUNIT_ASSERT_EQUAL('5', a[5]); - - // Special case that refCount == 1 and d->offset != 0. - - ByteVector c = ByteVector("0123456789").mid(3, 4); - c.resize(6, 'A'); - CPPUNIT_ASSERT_EQUAL((unsigned int)6, c.size()); - CPPUNIT_ASSERT_EQUAL('6', c[3]); - CPPUNIT_ASSERT_EQUAL('A', c[4]); - CPPUNIT_ASSERT_EQUAL('A', c[5]); - c.resize(10, 'B'); - CPPUNIT_ASSERT_EQUAL((unsigned int)10, c.size()); - CPPUNIT_ASSERT_EQUAL('6', c[3]); - CPPUNIT_ASSERT_EQUAL('B', c[6]); - CPPUNIT_ASSERT_EQUAL('B', c[9]); - c.resize(3, 'C'); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, c.size()); - CPPUNIT_ASSERT_EQUAL(-1, c.find('C')); - } - - void testAppend1() - { - ByteVector v1("foo"); - v1.append("bar"); - CPPUNIT_ASSERT_EQUAL(ByteVector("foobar"), v1); - - ByteVector v2("foo"); - v2.append("b"); - CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v2); - - ByteVector v3; - v3.append("b"); - CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v3); - - ByteVector v4("foo"); - v4.append(v1); - CPPUNIT_ASSERT_EQUAL(ByteVector("foofoobar"), v4); - - ByteVector v5("foo"); - v5.append('b'); - CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v5); - - ByteVector v6; - v6.append('b'); - CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v6); - - ByteVector v7("taglib"); - ByteVector v8 = v7; - - v7.append("ABC"); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC"), v7); - v7.append('1'); - v7.append('2'); - v7.append('3'); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC123"), v7); - CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v8); - } - - void testAppend2() - { - ByteVector a("1234"); - a.append(a); - CPPUNIT_ASSERT_EQUAL(ByteVector("12341234"), a); - } - - void testBase64() - { - ByteVector sempty; - ByteVector t0("a"); // test 1 byte - ByteVector t1("any carnal pleasure."); - ByteVector t2("any carnal pleasure"); - ByteVector t3("any carnal pleasur"); - ByteVector s0("a"); // test 1 byte - ByteVector s1("any carnal pleasure."); - ByteVector s2("any carnal pleasure"); - ByteVector s3("any carnal pleasur"); - ByteVector eempty; - ByteVector e0("YQ=="); - ByteVector e1("YW55IGNhcm5hbCBwbGVhc3VyZS4="); - ByteVector e2("YW55IGNhcm5hbCBwbGVhc3VyZQ=="); - ByteVector e3("YW55IGNhcm5hbCBwbGVhc3Vy"); - - // Encode - CPPUNIT_ASSERT_EQUAL(eempty, sempty.toBase64()); - CPPUNIT_ASSERT_EQUAL(e0, s0.toBase64()); - CPPUNIT_ASSERT_EQUAL(e1, s1.toBase64()); - CPPUNIT_ASSERT_EQUAL(e2, s2.toBase64()); - CPPUNIT_ASSERT_EQUAL(e3, s3.toBase64()); - - // Decode - CPPUNIT_ASSERT_EQUAL(sempty, ByteVector::fromBase64(eempty)); - CPPUNIT_ASSERT_EQUAL(s0, ByteVector::fromBase64(e0)); - CPPUNIT_ASSERT_EQUAL(s1, ByteVector::fromBase64(e1)); - CPPUNIT_ASSERT_EQUAL(s2, ByteVector::fromBase64(e2)); - CPPUNIT_ASSERT_EQUAL(s3, ByteVector::fromBase64(e3)); - - CPPUNIT_ASSERT_EQUAL(t0, ByteVector::fromBase64(s0.toBase64())); - CPPUNIT_ASSERT_EQUAL(t1, ByteVector::fromBase64(s1.toBase64())); - CPPUNIT_ASSERT_EQUAL(t2, ByteVector::fromBase64(s2.toBase64())); - CPPUNIT_ASSERT_EQUAL(t3, ByteVector::fromBase64(s3.toBase64())); - - ByteVector all((unsigned int)256); - - // in order - { - for(int i = 0; i < 256; i++){ - all[i]=(unsigned char)i; - } - ByteVector b64 = all.toBase64(); - ByteVector original = ByteVector::fromBase64(b64); - CPPUNIT_ASSERT_EQUAL(all,original); - } - - // reverse - { - for(int i = 0; i < 256; i++){ - all[i]=(unsigned char)255-i; - } - ByteVector b64 = all.toBase64(); - ByteVector original = ByteVector::fromBase64(b64); - CPPUNIT_ASSERT_EQUAL(all,original); - } - - // all zeroes - { - for(int i = 0; i < 256; i++){ - all[i]=0; - } - ByteVector b64 = all.toBase64(); - ByteVector original = ByteVector::fromBase64(b64); - CPPUNIT_ASSERT_EQUAL(all,original); - } - - // all ones - { - for(int i = 0; i < 256; i++){ - all[i]=(unsigned char)0xff; - } - ByteVector b64 = all.toBase64(); - ByteVector original = ByteVector::fromBase64(b64); - CPPUNIT_ASSERT_EQUAL(all,original); - } - - // Missing end bytes - { - // No missing bytes - ByteVector m0("YW55IGNhcm5hbCBwbGVhc3VyZQ=="); - CPPUNIT_ASSERT_EQUAL(s2,ByteVector::fromBase64(m0)); - - // 1 missing byte - ByteVector m1("YW55IGNhcm5hbCBwbGVhc3VyZQ="); - CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m1)); - - // 2 missing bytes - ByteVector m2("YW55IGNhcm5hbCBwbGVhc3VyZQ"); - CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m2)); - - // 3 missing bytes - ByteVector m3("YW55IGNhcm5hbCBwbGVhc3VyZ"); - CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m3)); - } - - // Grok invalid characters - { - ByteVector invalid("abd\x00\x01\x02\x03\x04"); - CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(invalid)); - } - - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorlist.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorlist.cpp deleted file mode 100755 index 6fe325b84..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorlist.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevector.h> -#include <tbytevectorlist.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVectorList : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVectorList); - CPPUNIT_TEST(testSplitSingleChar); - CPPUNIT_TEST(testSplitSingleChar_2); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSplitSingleChar() - { - ByteVector v("a b"); - - ByteVectorList l = ByteVectorList::split(v, " "); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); - CPPUNIT_ASSERT_EQUAL(ByteVector("b"), l[1]); - } - - void testSplitSingleChar_2() - { - ByteVector v("a"); - - ByteVectorList l = ByteVectorList::split(v, " "); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, l.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorList); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorstream.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorstream.cpp deleted file mode 100755 index f8308c6dc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_bytevectorstream.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tbytevectorstream.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestByteVectorStream : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestByteVectorStream); - CPPUNIT_TEST(testInitialData); - CPPUNIT_TEST(testWriteBlock); - CPPUNIT_TEST(testWriteBlockResize); - CPPUNIT_TEST(testReadBlock); - CPPUNIT_TEST(testRemoveBlock); - CPPUNIT_TEST(testInsert); - CPPUNIT_TEST(testSeekEnd); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testInitialData() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), *stream.data()); - } - - void testWriteBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.seek(1); - stream.writeBlock(ByteVector("xx")); - CPPUNIT_ASSERT_EQUAL(ByteVector("axxd"), *stream.data()); - } - - void testWriteBlockResize() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.seek(3); - stream.writeBlock(ByteVector("xx")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcxx"), *stream.data()); - stream.seek(5); - stream.writeBlock(ByteVector("yy")); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcxxyy"), *stream.data()); - } - - void testReadBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - CPPUNIT_ASSERT_EQUAL(ByteVector("a"), stream.readBlock(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("bc"), stream.readBlock(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("d"), stream.readBlock(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector(""), stream.readBlock(3)); - } - - void testRemoveBlock() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.removeBlock(1, 1); - CPPUNIT_ASSERT_EQUAL(ByteVector("acd"), *stream.data()); - stream.removeBlock(0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("d"), *stream.data()); - stream.removeBlock(0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector(""), *stream.data()); - } - - void testInsert() - { - ByteVector v("abcd"); - ByteVectorStream stream(v); - - stream.insert(ByteVector("xx"), 1, 1); - CPPUNIT_ASSERT_EQUAL(ByteVector("axxcd"), *stream.data()); - stream.insert(ByteVector("yy"), 0, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyxcd"), *stream.data()); - stream.insert(ByteVector("foa"), 3, 2); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyxfoa"), *stream.data()); - stream.insert(ByteVector("123"), 3, 0); - CPPUNIT_ASSERT_EQUAL(ByteVector("yyx123foa"), *stream.data()); - } - - void testSeekEnd() - { - ByteVector v("abcdefghijklmnopqrstuvwxyz"); - ByteVectorStream stream(v); - CPPUNIT_ASSERT_EQUAL(26L, stream.length()); - - stream.seek(-4, IOStream::End); - CPPUNIT_ASSERT_EQUAL(ByteVector("w"), stream.readBlock(1)); - - stream.seek(-25, IOStream::End); - CPPUNIT_ASSERT_EQUAL(ByteVector("b"), stream.readBlock(1)); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorStream); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_file.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_file.cpp deleted file mode 100755 index 9aae07fe2..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_file.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace TagLib; - -// File subclass that gives tests access to filesystem operations -class PlainFile : public File { -public: - PlainFile(FileName name) : File(name) { } - Tag *tag() const { return NULL; } - AudioProperties *audioProperties() const { return NULL; } - bool save(){ return false; } - void truncate(long length) { File::truncate(length); } -}; - -class TestFile : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFile); - CPPUNIT_TEST(testFindInSmallFile); - CPPUNIT_TEST(testRFindInSmallFile); - CPPUNIT_TEST(testSeek); - CPPUNIT_TEST(testTruncate); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testFindInSmallFile() - { - ScopedFileCopy copy("empty", ".ogg"); - std::string name = copy.fileName(); - { - PlainFile file(name.c_str()); - file.seek(0); - file.writeBlock(ByteVector("0123456239", 10)); - file.truncate(10); - } - { - PlainFile file(name.c_str()); - CPPUNIT_ASSERT_EQUAL(10l, file.length()); - - CPPUNIT_ASSERT_EQUAL(2l, file.find(ByteVector("23", 2))); - CPPUNIT_ASSERT_EQUAL(2l, file.find(ByteVector("23", 2), 2)); - CPPUNIT_ASSERT_EQUAL(7l, file.find(ByteVector("23", 2), 3)); - - file.seek(0); - const ByteVector v = file.readBlock(file.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)10, v.size()); - - CPPUNIT_ASSERT_EQUAL((long)v.find("23"), file.find("23")); - CPPUNIT_ASSERT_EQUAL((long)v.find("23", 2), file.find("23", 2)); - CPPUNIT_ASSERT_EQUAL((long)v.find("23", 3), file.find("23", 3)); - } - } - - void testRFindInSmallFile() - { - ScopedFileCopy copy("empty", ".ogg"); - std::string name = copy.fileName(); - { - PlainFile file(name.c_str()); - file.seek(0); - file.writeBlock(ByteVector("0123456239", 10)); - file.truncate(10); - } - { - PlainFile file(name.c_str()); - CPPUNIT_ASSERT_EQUAL(10l, file.length()); - - CPPUNIT_ASSERT_EQUAL(7l, file.rfind(ByteVector("23", 2))); - CPPUNIT_ASSERT_EQUAL(7l, file.rfind(ByteVector("23", 2), 7)); - CPPUNIT_ASSERT_EQUAL(2l, file.rfind(ByteVector("23", 2), 6)); - - file.seek(0); - const ByteVector v = file.readBlock(file.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)10, v.size()); - - CPPUNIT_ASSERT_EQUAL((long)v.rfind("23"), file.rfind("23")); - CPPUNIT_ASSERT_EQUAL((long)v.rfind("23", 7), file.rfind("23", 7)); - CPPUNIT_ASSERT_EQUAL((long)v.rfind("23", 6), file.rfind("23", 6)); - } - } - - void testSeek() - { - ScopedFileCopy copy("empty", ".ogg"); - std::string name = copy.fileName(); - - PlainFile f(name.c_str()); - CPPUNIT_ASSERT_EQUAL((long)0, f.tell()); - CPPUNIT_ASSERT_EQUAL((long)4328, f.length()); - - f.seek(100, File::Beginning); - CPPUNIT_ASSERT_EQUAL((long)100, f.tell()); - f.seek(100, File::Current); - CPPUNIT_ASSERT_EQUAL((long)200, f.tell()); - f.seek(-300, File::Current); - CPPUNIT_ASSERT_EQUAL((long)200, f.tell()); - - f.seek(-100, File::End); - CPPUNIT_ASSERT_EQUAL((long)4228, f.tell()); - f.seek(-100, File::Current); - CPPUNIT_ASSERT_EQUAL((long)4128, f.tell()); - f.seek(300, File::Current); - CPPUNIT_ASSERT_EQUAL((long)4428, f.tell()); - } - - void testTruncate() - { - ScopedFileCopy copy("empty", ".ogg"); - std::string name = copy.fileName(); - - { - PlainFile f(name.c_str()); - CPPUNIT_ASSERT_EQUAL(4328L, f.length()); - - f.truncate(2000); - CPPUNIT_ASSERT_EQUAL(2000L, f.length()); - } - { - PlainFile f(name.c_str()); - CPPUNIT_ASSERT_EQUAL(2000L, f.length()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFile); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_fileref.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_fileref.cpp deleted file mode 100755 index 77f5f8875..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_fileref.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <fileref.h> -#include <oggflacfile.h> -#include <vorbisfile.h> -#include <mpegfile.h> -#include <mpcfile.h> -#include <asffile.h> -#include <speexfile.h> -#include <flacfile.h> -#include <trueaudiofile.h> -#include <mp4file.h> -#include <wavfile.h> -#include <apefile.h> -#include <aifffile.h> -#include <tfilestream.h> -#include <tbytevectorstream.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -namespace -{ - class DummyResolver : public FileRef::FileTypeResolver - { - public: - virtual File *createFile(FileName fileName, bool, AudioProperties::ReadStyle) const - { - return new Ogg::Vorbis::File(fileName); - } - }; -} - -class TestFileRef : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFileRef); - CPPUNIT_TEST(testASF); - CPPUNIT_TEST(testMusepack); - CPPUNIT_TEST(testVorbis); - CPPUNIT_TEST(testSpeex); - CPPUNIT_TEST(testFLAC); - CPPUNIT_TEST(testMP3); - CPPUNIT_TEST(testOGA_FLAC); - CPPUNIT_TEST(testOGA_Vorbis); - CPPUNIT_TEST(testMP4_1); - CPPUNIT_TEST(testMP4_2); - CPPUNIT_TEST(testMP4_3); - CPPUNIT_TEST(testMP4_4); - CPPUNIT_TEST(testTrueAudio); - CPPUNIT_TEST(testAPE); - CPPUNIT_TEST(testWav); - CPPUNIT_TEST(testAIFF_1); - CPPUNIT_TEST(testAIFF_2); - CPPUNIT_TEST(testUnsupported); - CPPUNIT_TEST(testCreate); - CPPUNIT_TEST(testFileResolver); - CPPUNIT_TEST_SUITE_END(); - -public: - - template <typename T> - void fileRefSave(const string &filename, const string &ext) - { - ScopedFileCopy copy(filename, ext); - string newname = copy.fileName(); - - { - FileRef f(newname.c_str()); - CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); - CPPUNIT_ASSERT(!f.isNull()); - f.tag()->setArtist("test artist"); - f.tag()->setTitle("test title"); - f.tag()->setGenre("Test!"); - f.tag()->setAlbum("albummmm"); - f.tag()->setTrack(5); - f.tag()->setYear(2020); - f.save(); - } - { - FileRef f(newname.c_str()); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); - f.tag()->setArtist("ttest artist"); - f.tag()->setTitle("ytest title"); - f.tag()->setGenre("uTest!"); - f.tag()->setAlbum("ialbummmm"); - f.tag()->setTrack(7); - f.tag()->setYear(2080); - f.save(); - } - { - FileRef f(newname.c_str()); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); - } - - { - FileStream fs(newname.c_str()); - FileRef f(&fs); - CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); - f.tag()->setArtist("test artist"); - f.tag()->setTitle("test title"); - f.tag()->setGenre("Test!"); - f.tag()->setAlbum("albummmm"); - f.tag()->setTrack(5); - f.tag()->setYear(2020); - f.save(); - } - - ByteVector fileContent; - { - FileStream fs(newname.c_str()); - FileRef f(&fs); - CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); - - fs.seek(0); - fileContent = fs.readBlock(fs.length()); - } - - { - ByteVectorStream bs(fileContent); - FileRef f(&bs); - CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); - f.tag()->setArtist("ttest artist"); - f.tag()->setTitle("ytest title"); - f.tag()->setGenre("uTest!"); - f.tag()->setAlbum("ialbummmm"); - f.tag()->setTrack(7); - f.tag()->setYear(2080); - f.save(); - - fileContent = *bs.data(); - } - { - ByteVectorStream bs(fileContent); - FileRef f(&bs); - CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); - CPPUNIT_ASSERT(!f.isNull()); - CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); - CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); - CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); - CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); - CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); - CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); - } - } - - void testMusepack() - { - fileRefSave<MPC::File>("click", ".mpc"); - } - - void testASF() - { - fileRefSave<ASF::File>("silence-1", ".wma"); - } - - void testVorbis() - { - fileRefSave<Ogg::Vorbis::File>("empty", ".ogg"); - } - - void testSpeex() - { - fileRefSave<Ogg::Speex::File>("empty", ".spx"); - } - - void testFLAC() - { - fileRefSave<FLAC::File>("no-tags", ".flac"); - } - - void testMP3() - { - fileRefSave<MPEG::File>("xing", ".mp3"); - } - - void testTrueAudio() - { - fileRefSave<TrueAudio::File>("empty", ".tta"); - } - - void testMP4_1() - { - fileRefSave<MP4::File>("has-tags", ".m4a"); - } - - void testMP4_2() - { - fileRefSave<MP4::File>("no-tags", ".m4a"); - } - - void testMP4_3() - { - fileRefSave<MP4::File>("no-tags", ".3g2"); - } - - void testMP4_4() - { - fileRefSave<MP4::File>("blank_video", ".m4v"); - } - - void testWav() - { - fileRefSave<RIFF::WAV::File>("empty", ".wav"); - } - - void testOGA_FLAC() - { - fileRefSave<Ogg::FLAC::File>("empty_flac", ".oga"); - } - - void testOGA_Vorbis() - { - fileRefSave<Ogg::Vorbis::File>("empty_vorbis", ".oga"); - } - - void testAPE() - { - fileRefSave<APE::File>("mac-399", ".ape"); - } - - void testAIFF_1() - { - fileRefSave<RIFF::AIFF::File>("empty", ".aiff"); - } - - void testAIFF_2() - { - fileRefSave<RIFF::AIFF::File>("alaw", ".aifc"); - } - - void testUnsupported() - { - FileRef f1(TEST_FILE_PATH_C("no-extension")); - CPPUNIT_ASSERT(f1.isNull()); - - FileRef f2(TEST_FILE_PATH_C("unsupported-extension.xx")); - CPPUNIT_ASSERT(f2.isNull()); - } - - void testCreate() - { - // This is deprecated. 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() - { - { - FileRef f(TEST_FILE_PATH_C("xing.mp3")); - CPPUNIT_ASSERT(dynamic_cast<MPEG::File *>(f.file()) != NULL); - } - - DummyResolver resolver; - FileRef::addFileTypeResolver(&resolver); - - { - FileRef f(TEST_FILE_PATH_C("xing.mp3")); - CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f.file()) != NULL); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFileRef); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flac.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_flac.cpp deleted file mode 100755 index 0cc2b7ecf..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flac.cpp +++ /dev/null @@ -1,538 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <flacfile.h> -#include <xiphcomment.h> -#include <id3v1tag.h> -#include <id3v2tag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLAC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLAC); - CPPUNIT_TEST(testSignature); - CPPUNIT_TEST(testMultipleCommentBlocks); - CPPUNIT_TEST(testReadPicture); - CPPUNIT_TEST(testAddPicture); - CPPUNIT_TEST(testReplacePicture); - CPPUNIT_TEST(testRemoveAllPictures); - CPPUNIT_TEST(testRepeatedSave1); - CPPUNIT_TEST(testRepeatedSave2); - CPPUNIT_TEST(testRepeatedSave3); - CPPUNIT_TEST(testSaveMultipleValues); - CPPUNIT_TEST(testDict); - CPPUNIT_TEST(testInvalid); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testZeroSizedPadding1); - CPPUNIT_TEST(testZeroSizedPadding2); - CPPUNIT_TEST(testShrinkPadding); - CPPUNIT_TEST(testSaveID3v1); - CPPUNIT_TEST(testUpdateID3v2); - CPPUNIT_TEST(testEmptyID3v2); - CPPUNIT_TEST(testStripTags); - CPPUNIT_TEST(testRemoveXiphField); - CPPUNIT_TEST(testEmptySeekTable); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSignature() - { - FLAC::File f(TEST_FILE_PATH_C("no-tags.flac")); - CPPUNIT_ASSERT_EQUAL(ByteVector("a1b141f766e9849ac3db1030a20a3c77"), f.audioProperties()->signature().toHex()); - } - - void testMultipleCommentBlocks() - { - ScopedFileCopy copy("multiple-vc", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("Artist 1"), f.tag()->artist()); - f.tag()->setArtist("The Artist"); - f.save(); - } - { - FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(69L, f.find("Artist")); - CPPUNIT_ASSERT_EQUAL(-1L, f.find("Artist", 70)); - } - } - - void testReadPicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - - FLAC::Picture *pic = lst.front(); - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(1, pic->width()); - CPPUNIT_ASSERT_EQUAL(1, pic->height()); - CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); - CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic->data().size()); - } - - void testAddPicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - - FLAC::Picture *newpic = new FLAC::Picture(); - newpic->setType(FLAC::Picture::BackCover); - newpic->setWidth(5); - newpic->setHeight(6); - newpic->setColorDepth(16); - newpic->setNumColors(7); - newpic->setMimeType("image/jpeg"); - newpic->setDescription("new image"); - newpic->setData("JPEG data"); - f.addPicture(newpic); - f.save(); - } - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, lst.size()); - - FLAC::Picture *pic = lst[0]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(1, pic->width()); - CPPUNIT_ASSERT_EQUAL(1, pic->height()); - CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); - CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic->data().size()); - - pic = lst[1]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(5, pic->width()); - CPPUNIT_ASSERT_EQUAL(6, pic->height()); - CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); - } - } - - void testReplacePicture() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - - FLAC::Picture *newpic = new FLAC::Picture(); - newpic->setType(FLAC::Picture::BackCover); - newpic->setWidth(5); - newpic->setHeight(6); - newpic->setColorDepth(16); - newpic->setNumColors(7); - newpic->setMimeType("image/jpeg"); - newpic->setDescription("new image"); - newpic->setData("JPEG data"); - f.removePictures(); - f.addPicture(newpic); - f.save(); - } - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - - FLAC::Picture *pic = lst[0]; - CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); - CPPUNIT_ASSERT_EQUAL(5, pic->width()); - CPPUNIT_ASSERT_EQUAL(6, pic->height()); - CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); - CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); - } - } - - void testRemoveAllPictures() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - - f.removePictures(); - f.save(); - } - { - FLAC::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)0, lst.size()); - } - } - - void testRepeatedSave1() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("Silence"), f.tag()->title()); - f.tag()->setTitle("NEW TITLE"); - f.save(); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE"), f.tag()->title()); - f.tag()->setTitle("NEW TITLE 2"); - f.save(); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), f.tag()->title()); - } - { - FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), f.tag()->title()); - } - } - - void testRepeatedSave2() - { - ScopedFileCopy copy("no-tags", ".flac"); - - FLAC::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("0123456789"); - f.save(); - CPPUNIT_ASSERT_EQUAL(5735L, f.length()); - f.save(); - CPPUNIT_ASSERT_EQUAL(5735L, f.length()); - CPPUNIT_ASSERT(f.find("fLaC") >= 0); - } - - void testRepeatedSave3() - { - ScopedFileCopy copy("no-tags", ".flac"); - - FLAC::File f(copy.fileName().c_str()); - f.xiphComment()->setTitle(longText(8 * 1024)); - f.save(); - CPPUNIT_ASSERT_EQUAL(12862L, f.length()); - f.save(); - CPPUNIT_ASSERT_EQUAL(12862L, f.length()); - } - - void testSaveMultipleValues() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - f.xiphComment(true)->addField("ARTIST", "artist 1", true); - f.xiphComment(true)->addField("ARTIST", "artist 2", false); - f.save(); - } - { - FLAC::File f(newname.c_str()); - Ogg::FieldListMap m = f.xiphComment()->fieldListMap(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, m["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("artist 1"), m["ARTIST"][0]); - CPPUNIT_ASSERT_EQUAL(String("artist 2"), m["ARTIST"][1]); - } - } - - void testDict() - { - // test unicode & multiple values with dict interface - ScopedFileCopy copy("silence-44-s", ".flac"); - string newname = copy.fileName(); - - { - FLAC::File f(newname.c_str()); - PropertyMap dict; - dict["ARTIST"].append("artøst 1"); - dict["ARTIST"].append("artöst 2"); - f.setProperties(dict); - f.save(); - } - { - FLAC::File f(newname.c_str()); - PropertyMap dict = f.properties(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("artøst 1"), dict["ARTIST"][0]); - CPPUNIT_ASSERT_EQUAL(String("artöst 2"), dict["ARTIST"][1]); - } - } - - void testInvalid() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - PropertyMap map; - map[L"H\x00c4\x00d6"] = String("bla"); - FLAC::File f(copy.fileName().c_str()); - PropertyMap invalid = f.setProperties(map); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, invalid.size()); - CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.properties().size()); - } - - void testAudioProperties() - { - FLAC::File f(TEST_FILE_PATH_C("sinewave.flac")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(145, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(156556ULL, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL( - ByteVector("\xcf\xe3\xd9\xda\xba\xde\xab\x2c\xbf\x2c\xa2\x35\x27\x4b\x7f\x76"), - f.audioProperties()->signature()); - } - - void testZeroSizedPadding1() - { - ScopedFileCopy copy("zero-sized-padding", ".flac"); - - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - } - - void testZeroSizedPadding2() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment()->setTitle("ABC"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment()->setTitle(std::string(3067, 'X').c_str()); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - } - } - - void testShrinkPadding() - { - ScopedFileCopy copy("no-tags", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment()->setTitle(longText(128 * 1024)); - f.save(); - CPPUNIT_ASSERT(f.length() > 128 * 1024); - } - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment()->setTitle("0123456789"); - f.save(); - CPPUNIT_ASSERT(f.length() < 8 * 1024); - } - } - - void testSaveID3v1() - { - ScopedFileCopy copy("no-tags", ".flac"); - - ByteVector audioStream; - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - CPPUNIT_ASSERT_EQUAL((long)4692, f.length()); - - f.seek(0x0100); - audioStream = f.readBlock(4436); - - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - CPPUNIT_ASSERT_EQUAL((long)4820, f.length()); - - f.seek(0x0100); - CPPUNIT_ASSERT_EQUAL(audioStream, f.readBlock(4436)); - } - } - - void testUpdateID3v2() - { - ScopedFileCopy copy("no-tags", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("0123456789"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - f.ID3v2Tag()->setTitle("ABCDEFGHIJ"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("ABCDEFGHIJ"), f.ID3v2Tag()->title()); - } - } - - void testEmptyID3v2() - { - ScopedFileCopy copy("no-tags", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.ID3v2Tag(true); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - } - } - - void testStripTags() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment(true)->setTitle("XiphComment Title"); - f.ID3v1Tag(true)->setTitle("ID3v1 Title"); - f.ID3v2Tag(true)->setTitle("ID3v2 Title"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasXiphComment()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); - CPPUNIT_ASSERT_EQUAL(String("ID3v1 Title"), f.ID3v1Tag()->title()); - CPPUNIT_ASSERT_EQUAL(String("ID3v2 Title"), f.ID3v2Tag()->title()); - f.strip(FLAC::File::ID3v2); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasXiphComment()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); - CPPUNIT_ASSERT_EQUAL(String("ID3v1 Title"), f.ID3v1Tag()->title()); - f.strip(FLAC::File::ID3v1); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasXiphComment()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); - f.strip(FLAC::File::XiphComment); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasXiphComment()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT(f.xiphComment()->isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("reference libFLAC 1.1.0 20030126"), f.xiphComment()->vendorID()); - } - } - - void testRemoveXiphField() - { - ScopedFileCopy copy("silence-44-s", ".flac"); - - { - FLAC::File f(copy.fileName().c_str()); - f.xiphComment(true)->setTitle("XiphComment Title"); - f.ID3v2Tag(true)->setTitle("ID3v2 Title"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); - f.xiphComment()->removeFields("TITLE"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String(), f.xiphComment()->title()); - } - } - - void testEmptySeekTable() - { - ScopedFileCopy copy("empty-seektable", ".flac"); - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - f.xiphComment(true)->setTitle("XiphComment Title"); - f.save(); - } - { - FLAC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - f.seek(42); - const ByteVector data = f.readBlock(4); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x03\x00\x00\x00", 4), data); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacpicture.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacpicture.cpp deleted file mode 100755 index 6613c5981..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacpicture.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <flacfile.h> -#include <flacmetadatablock.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLACPicture : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLACPicture); - CPPUNIT_TEST(testParse); - CPPUNIT_TEST(testPassThrough); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testParse() - { - const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; - const char *pdata = reinterpret_cast<const char*>(data); - - FLAC::Picture pic(ByteVector(pdata, 199)); - - CPPUNIT_ASSERT_EQUAL(3, int(pic.type())); - CPPUNIT_ASSERT_EQUAL(1, pic.width()); - CPPUNIT_ASSERT_EQUAL(1, pic.height()); - CPPUNIT_ASSERT_EQUAL(24, pic.colorDepth()); - CPPUNIT_ASSERT_EQUAL(0, pic.numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/png"), pic.mimeType()); - CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic.description()); - CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic.data().size()); - } - - void testPassThrough() - { - const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; - const char *pdata = reinterpret_cast<const char*>(data); - - FLAC::Picture pic(ByteVector(pdata, 199)); - CPPUNIT_ASSERT_EQUAL(ByteVector(pdata, 199), pic.render()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACPicture); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacunknownmetadatablock.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacunknownmetadatablock.cpp deleted file mode 100755 index d08a9bae3..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_flacunknownmetadatablock.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <flacunknownmetadatablock.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestFLACUnknownMetadataBlock : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestFLACUnknownMetadataBlock); - CPPUNIT_TEST(testAccessors); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAccessors() - { - ByteVector data("abc\x01", 4); - FLAC::UnknownMetadataBlock block(42, data); - CPPUNIT_ASSERT_EQUAL(42, block.code()); - CPPUNIT_ASSERT_EQUAL(data, block.data()); - CPPUNIT_ASSERT_EQUAL(data, block.render()); - ByteVector data2("xxx", 3); - block.setCode(13); - block.setData(data2); - CPPUNIT_ASSERT_EQUAL(13, block.code()); - CPPUNIT_ASSERT_EQUAL(data2, block.data()); - CPPUNIT_ASSERT_EQUAL(data2, block.render()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACUnknownMetadataBlock); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v1.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v1.cpp deleted file mode 100755 index 3358aead0..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v1.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tstring.h> -#include <mpegfile.h> -#include <id3v1tag.h> -#include <id3v1genres.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestID3v1 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v1); - CPPUNIT_TEST(testStripWhiteSpace); - CPPUNIT_TEST(testGenres); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testStripWhiteSpace() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File f(newname.c_str()); - f.ID3v1Tag(true)->setArtist("Artist "); - f.save(); - } - - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(f.ID3v1Tag(false)); - CPPUNIT_ASSERT_EQUAL(String("Artist"), f.ID3v1Tag(false)->artist()); - } - } - - void testGenres() - { - CPPUNIT_ASSERT_EQUAL(String("Darkwave"), ID3v1::genre(50)); - CPPUNIT_ASSERT_EQUAL(100, ID3v1::genreIndex("Humour")); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v1); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v2.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v2.cpp deleted file mode 100755 index 6e5452ba0..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_id3v2.cpp +++ /dev/null @@ -1,1317 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <id3v2tag.h> -#include <mpegfile.h> -#include <id3v2frame.h> -#include <uniquefileidentifierframe.h> -#include <textidentificationframe.h> -#include <attachedpictureframe.h> -#include <unsynchronizedlyricsframe.h> -#include <synchronizedlyricsframe.h> -#include <eventtimingcodesframe.h> -#include <generalencapsulatedobjectframe.h> -#include <relativevolumeframe.h> -#include <popularimeterframe.h> -#include <urllinkframe.h> -#include <ownershipframe.h> -#include <unknownframe.h> -#include <chapterframe.h> -#include <tableofcontentsframe.h> -#include <tdebug.h> -#include <tpropertymap.h> -#include <tzlib.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class PublicFrame : public ID3v2::Frame -{ - public: - PublicFrame() : ID3v2::Frame(ByteVector("XXXX\0\0\0\0\0\0", 10)) {} - String readStringField(const ByteVector &data, String::Type encoding, - int *position = 0) - { return ID3v2::Frame::readStringField(data, encoding, position); } - virtual String toString() const { return String(); } - virtual void parseFields(const ByteVector &) {} - virtual ByteVector renderFields() const { return ByteVector(); } -}; - -class TestID3v2 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v2); - CPPUNIT_TEST(testUnsynchDecode); - CPPUNIT_TEST(testDowngradeUTF8ForID3v23_1); - CPPUNIT_TEST(testDowngradeUTF8ForID3v23_2); - CPPUNIT_TEST(testUTF16BEDelimiter); - CPPUNIT_TEST(testUTF16Delimiter); - CPPUNIT_TEST(testReadStringField); - CPPUNIT_TEST(testParseAPIC); - CPPUNIT_TEST(testParseAPIC_UTF16_BOM); - CPPUNIT_TEST(testParseAPICv22); - CPPUNIT_TEST(testDontRender22); - CPPUNIT_TEST(testParseGEOB); - CPPUNIT_TEST(testPOPMtoString); - CPPUNIT_TEST(testParsePOPM); - CPPUNIT_TEST(testParsePOPMWithoutCounter); - CPPUNIT_TEST(testRenderPOPM); - CPPUNIT_TEST(testPOPMFromFile); - CPPUNIT_TEST(testParseRelativeVolumeFrame); - CPPUNIT_TEST(testParseUniqueFileIdentifierFrame); - CPPUNIT_TEST(testParseEmptyUniqueFileIdentifierFrame); - CPPUNIT_TEST(testBrokenFrame1); - CPPUNIT_TEST(testItunes24FrameSize); - CPPUNIT_TEST(testParseUrlLinkFrame); - CPPUNIT_TEST(testRenderUrlLinkFrame); - CPPUNIT_TEST(testParseUserUrlLinkFrame); - CPPUNIT_TEST(testRenderUserUrlLinkFrame); - CPPUNIT_TEST(testParseOwnershipFrame); - CPPUNIT_TEST(testRenderOwnershipFrame); - CPPUNIT_TEST(testParseSynchronizedLyricsFrame); - CPPUNIT_TEST(testParseSynchronizedLyricsFrameWithEmptyDescritpion); - CPPUNIT_TEST(testRenderSynchronizedLyricsFrame); - CPPUNIT_TEST(testParseEventTimingCodesFrame); - CPPUNIT_TEST(testRenderEventTimingCodesFrame); - CPPUNIT_TEST(testSaveUTF16Comment); - CPPUNIT_TEST(testUpdateGenre23_1); - CPPUNIT_TEST(testUpdateGenre23_2); - CPPUNIT_TEST(testUpdateGenre24); - CPPUNIT_TEST(testUpdateDate22); - CPPUNIT_TEST(testDowngradeTo23); - // CPPUNIT_TEST(testUpdateFullDate22); TODO TYE+TDA should be upgraded to TDRC together - CPPUNIT_TEST(testCompressedFrameWithBrokenLength); - CPPUNIT_TEST(testW000); - CPPUNIT_TEST(testPropertyInterface); - CPPUNIT_TEST(testPropertyInterface2); - CPPUNIT_TEST(testPropertiesMovement); - CPPUNIT_TEST(testPropertyGrouping); - CPPUNIT_TEST(testDeleteFrame); - CPPUNIT_TEST(testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2); - CPPUNIT_TEST(testParseChapterFrame); - CPPUNIT_TEST(testRenderChapterFrame); - CPPUNIT_TEST(testParseTableOfContentsFrame); - CPPUNIT_TEST(testRenderTableOfContentsFrame); - CPPUNIT_TEST(testShrinkPadding); - CPPUNIT_TEST(testEmptyFrame); - CPPUNIT_TEST(testDuplicateTags); - CPPUNIT_TEST(testParseTOCFrameWithManyChildren); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testUnsynchDecode() - { - MPEG::File f(TEST_FILE_PATH_C("unsynch.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL(String("My babe just cares for me"), f.tag()->title()); - } - - void testDowngradeUTF8ForID3v23_1() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - ID3v2::TextIdentificationFrame *f - = new ID3v2::TextIdentificationFrame(ByteVector("TPE1"), String::UTF8); - StringList sl; - sl.append("Foo"); - f->setText(sl); - - MPEG::File file(newname.c_str()); - file.ID3v2Tag(true)->addFrame(f); - file.save(MPEG::File::ID3v2, File::StripOthers, ID3v2::v3); - CPPUNIT_ASSERT_EQUAL(true, file.hasID3v2Tag()); - - ByteVector data = f->render(); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2), data.size()); - - ID3v2::TextIdentificationFrame f2(data); - CPPUNIT_ASSERT_EQUAL(sl, f2.fieldList()); - CPPUNIT_ASSERT_EQUAL(String::UTF16, f2.textEncoding()); - } - - void testDowngradeUTF8ForID3v23_2() - { - ScopedFileCopy copy("xing", ".mp3"); - - ID3v2::UnsynchronizedLyricsFrame *f - = new ID3v2::UnsynchronizedLyricsFrame(String::UTF8); - f->setText("Foo"); - - MPEG::File file(copy.fileName().c_str()); - file.ID3v2Tag(true)->addFrame(f); - file.save(MPEG::File::ID3v2, File::StripOthers, ID3v2::v3); - CPPUNIT_ASSERT(file.hasID3v2Tag()); - - ByteVector data = f->render(); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+3+2+2+6+2), data.size()); - - ID3v2::UnsynchronizedLyricsFrame f2(data); - CPPUNIT_ASSERT_EQUAL(String("Foo"), f2.text()); - CPPUNIT_ASSERT_EQUAL(String::UTF16, f2.textEncoding()); - } - - void testUTF16BEDelimiter() - { - ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16BE); - StringList sl; - sl.append("Foo"); - sl.append("Bar"); - f.setText(sl); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2+6), f.render().size()); - } - - void testUTF16Delimiter() - { - ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16); - StringList sl; - sl.append("Foo"); - sl.append("Bar"); - f.setText(sl); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+8+2+8), f.render().size()); - } - - void testBrokenFrame1() - { - MPEG::File f(TEST_FILE_PATH_C("broken-tenc.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TENC")); - } - - void testReadStringField() - { - PublicFrame f; - ByteVector data("abc\0", 4); - String str = f.readStringField(data, String::Latin1); - CPPUNIT_ASSERT_EQUAL(String("abc"), str); - } - - // http://bugs.kde.org/show_bug.cgi?id=151078 - void testParseAPIC() - { - ID3v2::AttachedPictureFrame f(ByteVector("APIC" - "\x00\x00\x00\x07" - "\x00\x00" - "\x00" - "m\x00" - "\x01" - "d\x00" - "\x00", 17)); - CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, f.type()); - CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); - } - - void testParseAPIC_UTF16_BOM() - { - ID3v2::AttachedPictureFrame f(ByteVector( - "\x41\x50\x49\x43\x00\x02\x0c\x59\x00\x00\x01\x69\x6d\x61\x67\x65" - "\x2f\x6a\x70\x65\x67\x00\x00\xfe\xff\x00\x63\x00\x6f\x00\x76\x00" - "\x65\x00\x72\x00\x2e\x00\x6a\x00\x70\x00\x67\x00\x00\xff\xd8\xff", - 16 * 3)); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, f.type()); - CPPUNIT_ASSERT_EQUAL(String("cover.jpg"), f.description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xd8\xff", 3), f.picture()); - } - - void testParseAPICv22() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("PIC" - "\x00\x00\x08" - "\x00" - "JPG" - "\x01" - "d\x00" - "\x00", 14); - ID3v2::Header header; - header.setMajorVersion(2); - ID3v2::AttachedPictureFrame *frame = - dynamic_cast<TagLib::ID3v2::AttachedPictureFrame *>(factory->createFrame(data, &header)); - - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), frame->mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, frame->type()); - CPPUNIT_ASSERT_EQUAL(String("d"), frame->description()); - - delete frame; - } - - void testDontRender22() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("FOO" - "\x00\x00\x08" - "\x00" - "JPG" - "\x01" - "d\x00" - "\x00", 14); - ID3v2::Header header; - header.setMajorVersion(2); - ID3v2::UnknownFrame *frame = - dynamic_cast<TagLib::ID3v2::UnknownFrame*>(factory->createFrame(data, &header)); - - CPPUNIT_ASSERT(frame); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL((unsigned int)1034, tag.render().size()); - } - - // http://bugs.kde.org/show_bug.cgi?id=151078 - void testParseGEOB() - { - ID3v2::GeneralEncapsulatedObjectFrame f(ByteVector("GEOB" - "\x00\x00\x00\x08" - "\x00\x00" - "\x00" - "m\x00" - "f\x00" - "d\x00" - "\x00", 18)); - CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); - CPPUNIT_ASSERT_EQUAL(String("f"), f.fileName()); - CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); - } - - void testParsePOPM() - { - ID3v2::PopularimeterFrame f(ByteVector("POPM" - "\x00\x00\x00\x17" - "\x00\x00" - "email@example.com\x00" - "\x02" - "\x00\x00\x00\x03", 33)); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); - CPPUNIT_ASSERT_EQUAL(2, f.rating()); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, f.counter()); - } - - void testParsePOPMWithoutCounter() - { - ID3v2::PopularimeterFrame f(ByteVector("POPM" - "\x00\x00\x00\x13" - "\x00\x00" - "email@example.com\x00" - "\x02", 29)); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); - CPPUNIT_ASSERT_EQUAL(2, f.rating()); - CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.counter()); - } - - void testRenderPOPM() - { - ID3v2::PopularimeterFrame f; - f.setEmail("email@example.com"); - f.setRating(2); - f.setCounter(3); - CPPUNIT_ASSERT_EQUAL( - ByteVector("POPM" - "\x00\x00\x00\x17" - "\x00\x00" - "email@example.com\x00" - "\x02" - "\x00\x00\x00\x03", 33), - f.render()); - } - - void testPOPMtoString() - { - ID3v2::PopularimeterFrame f; - f.setEmail("email@example.com"); - f.setRating(2); - f.setCounter(3); - CPPUNIT_ASSERT_EQUAL( - String("email@example.com rating=2 counter=3"), f.toString()); - } - - void testPOPMFromFile() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - ID3v2::PopularimeterFrame *f = new ID3v2::PopularimeterFrame(); - f->setEmail("email@example.com"); - f->setRating(200); - f->setCounter(3); - - { - MPEG::File foo(newname.c_str()); - foo.ID3v2Tag()->addFrame(f); - foo.save(); - } - { - MPEG::File bar(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("email@example.com"), dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->email()); - CPPUNIT_ASSERT_EQUAL(200, dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->rating()); - } - } - - // http://bugs.kde.org/show_bug.cgi?id=150481 - void testParseRelativeVolumeFrame() - { - ID3v2::RelativeVolumeFrame f( - ByteVector("RVA2" // Frame ID - "\x00\x00\x00\x0B" // Frame size - "\x00\x00" // Frame flags - "ident\x00" // Identification - "\x02" // Type of channel - "\x00\x0F" // Volume adjustment - "\x08" // Bits representing peak - "\x45", 21)); // Peak volume - CPPUNIT_ASSERT_EQUAL(String("ident"), f.identification()); - CPPUNIT_ASSERT_EQUAL(15.0f / 512.0f, - f.volumeAdjustment(ID3v2::RelativeVolumeFrame::FrontRight)); - CPPUNIT_ASSERT_EQUAL((unsigned char)8, - f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).bitsRepresentingPeak); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x45"), - f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).peakVolume); - } - - void testParseUniqueFileIdentifierFrame() - { - ID3v2::UniqueFileIdentifierFrame f( - ByteVector("UFID" // Frame ID - "\x00\x00\x00\x09" // Frame size - "\x00\x00" // Frame flags - "owner\x00" // Owner identifier - "\x00\x01\x02", 19)); // Identifier - CPPUNIT_ASSERT_EQUAL(String("owner"), - f.owner()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x00\x01\x02", 3), - f.identifier()); - } - - void testParseEmptyUniqueFileIdentifierFrame() - { - ID3v2::UniqueFileIdentifierFrame f( - ByteVector("UFID" // Frame ID - "\x00\x00\x00\x01" // Frame size - "\x00\x00" // Frame flags - "\x00" // Owner identifier - "", 11)); // Identifier - CPPUNIT_ASSERT_EQUAL(String(), - f.owner()); - CPPUNIT_ASSERT_EQUAL(ByteVector(), - f.identifier()); - } - - void testParseUrlLinkFrame() - { - ID3v2::UrlLinkFrame f( - ByteVector("WOAF" // Frame ID - "\x00\x00\x00\x12" // Frame size - "\x00\x00" // Frame flags - "http://example.com", 28)); // URL - CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); - } - - void testRenderUrlLinkFrame() - { - ID3v2::UrlLinkFrame f("WOAF"); - f.setUrl("http://example.com"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("WOAF" // Frame ID - "\x00\x00\x00\x12" // Frame size - "\x00\x00" // Frame flags - "http://example.com", 28), // URL - f.render()); - } - - void testParseUserUrlLinkFrame() - { - ID3v2::UserUrlLinkFrame f( - ByteVector("WXXX" // Frame ID - "\x00\x00\x00\x17" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "foo\x00" // Description - "http://example.com", 33)); // URL - CPPUNIT_ASSERT_EQUAL(String("foo"), f.description()); - CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); - } - - void testRenderUserUrlLinkFrame() - { - ID3v2::UserUrlLinkFrame f; - f.setDescription("foo"); - f.setUrl("http://example.com"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("WXXX" // Frame ID - "\x00\x00\x00\x17" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "foo\x00" // Description - "http://example.com", 33), // URL - f.render()); - } - - void testParseOwnershipFrame() - { - ID3v2::OwnershipFrame f( - ByteVector("OWNE" // Frame ID - "\x00\x00\x00\x19" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "GBP1.99\x00" // Price paid - "20120905" // Date of purchase - "Beatport", 35)); // Seller - CPPUNIT_ASSERT_EQUAL(String("GBP1.99"), f.pricePaid()); - CPPUNIT_ASSERT_EQUAL(String("20120905"), f.datePurchased()); - CPPUNIT_ASSERT_EQUAL(String("Beatport"), f.seller()); - } - - void testRenderOwnershipFrame() - { - ID3v2::OwnershipFrame f; - f.setPricePaid("GBP1.99"); - f.setDatePurchased("20120905"); - f.setSeller("Beatport"); - CPPUNIT_ASSERT_EQUAL( - ByteVector("OWNE" // Frame ID - "\x00\x00\x00\x19" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "GBP1.99\x00" // Price paid - "20120905" // Date of purchase - "Beatport", 35), // URL - f.render()); - } - - void testParseSynchronizedLyricsFrame() - { - ID3v2::SynchronizedLyricsFrame f( - ByteVector("SYLT" // Frame ID - "\x00\x00\x00\x21" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "eng" // Language - "\x02" // Time stamp format - "\x01" // Content type - "foo\x00" // Content descriptor - "Example\x00" // 1st text - "\x00\x00\x04\xd2" // 1st time stamp - "Lyrics\x00" // 2nd text - "\x00\x00\x11\xd7", 43)); // 2nd time stamp - CPPUNIT_ASSERT_EQUAL(String::Latin1, f.textEncoding()); - CPPUNIT_ASSERT_EQUAL(ByteVector("eng", 3), f.language()); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds, - f.timestampFormat()); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::Lyrics, f.type()); - CPPUNIT_ASSERT_EQUAL(String("foo"), f.description()); - ID3v2::SynchronizedLyricsFrame::SynchedTextList stl = f.synchedText(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, stl.size()); - CPPUNIT_ASSERT_EQUAL(String("Example"), stl[0].text); - CPPUNIT_ASSERT_EQUAL((unsigned int)1234, stl[0].time); - CPPUNIT_ASSERT_EQUAL(String("Lyrics"), stl[1].text); - CPPUNIT_ASSERT_EQUAL((unsigned int)4567, stl[1].time); - } - - void testParseSynchronizedLyricsFrameWithEmptyDescritpion() - { - ID3v2::SynchronizedLyricsFrame f( - ByteVector("SYLT" // Frame ID - "\x00\x00\x00\x21" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "eng" // Language - "\x02" // Time stamp format - "\x01" // Content type - "\x00" // Content descriptor - "Example\x00" // 1st text - "\x00\x00\x04\xd2" // 1st time stamp - "Lyrics\x00" // 2nd text - "\x00\x00\x11\xd7", 40)); // 2nd time stamp - CPPUNIT_ASSERT_EQUAL(String::Latin1, f.textEncoding()); - CPPUNIT_ASSERT_EQUAL(ByteVector("eng", 3), f.language()); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds, - f.timestampFormat()); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::Lyrics, f.type()); - CPPUNIT_ASSERT(f.description().isEmpty()); - ID3v2::SynchronizedLyricsFrame::SynchedTextList stl = f.synchedText(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, stl.size()); - CPPUNIT_ASSERT_EQUAL(String("Example"), stl[0].text); - CPPUNIT_ASSERT_EQUAL((unsigned int)1234, stl[0].time); - CPPUNIT_ASSERT_EQUAL(String("Lyrics"), stl[1].text); - CPPUNIT_ASSERT_EQUAL((unsigned int)4567, stl[1].time); - } - - void testRenderSynchronizedLyricsFrame() - { - ID3v2::SynchronizedLyricsFrame f; - f.setTextEncoding(String::Latin1); - f.setLanguage(ByteVector("eng", 3)); - f.setTimestampFormat(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds); - f.setType(ID3v2::SynchronizedLyricsFrame::Lyrics); - f.setDescription("foo"); - ID3v2::SynchronizedLyricsFrame::SynchedTextList stl; - stl.append(ID3v2::SynchronizedLyricsFrame::SynchedText(1234, "Example")); - stl.append(ID3v2::SynchronizedLyricsFrame::SynchedText(4567, "Lyrics")); - f.setSynchedText(stl); - CPPUNIT_ASSERT_EQUAL( - ByteVector("SYLT" // Frame ID - "\x00\x00\x00\x21" // Frame size - "\x00\x00" // Frame flags - "\x00" // Text encoding - "eng" // Language - "\x02" // Time stamp format - "\x01" // Content type - "foo\x00" // Content descriptor - "Example\x00" // 1st text - "\x00\x00\x04\xd2" // 1st time stamp - "Lyrics\x00" // 2nd text - "\x00\x00\x11\xd7", 43), // 2nd time stamp - f.render()); - } - - void testParseEventTimingCodesFrame() - { - ID3v2::EventTimingCodesFrame f( - ByteVector("ETCO" // Frame ID - "\x00\x00\x00\x0b" // Frame size - "\x00\x00" // Frame flags - "\x02" // Time stamp format - "\x02" // 1st event - "\x00\x00\xf3\x5c" // 1st time stamp - "\xfe" // 2nd event - "\x00\x36\xee\x80", 21)); // 2nd time stamp - CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::AbsoluteMilliseconds, - f.timestampFormat()); - ID3v2::EventTimingCodesFrame::SynchedEventList sel = f.synchedEvents(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, sel.size()); - CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::IntroStart, sel[0].type); - CPPUNIT_ASSERT_EQUAL((unsigned int)62300, sel[0].time); - CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::AudioFileEnds, sel[1].type); - CPPUNIT_ASSERT_EQUAL((unsigned int)3600000, sel[1].time); - } - - void testRenderEventTimingCodesFrame() - { - ID3v2::EventTimingCodesFrame f; - f.setTimestampFormat(ID3v2::EventTimingCodesFrame::AbsoluteMilliseconds); - ID3v2::EventTimingCodesFrame::SynchedEventList sel; - sel.append(ID3v2::EventTimingCodesFrame::SynchedEvent(62300, ID3v2::EventTimingCodesFrame::IntroStart)); - sel.append(ID3v2::EventTimingCodesFrame::SynchedEvent(3600000, ID3v2::EventTimingCodesFrame::AudioFileEnds)); - f.setSynchedEvents(sel); - CPPUNIT_ASSERT_EQUAL( - ByteVector("ETCO" // Frame ID - "\x00\x00\x00\x0b" // Frame size - "\x00\x00" // Frame flags - "\x02" // Time stamp format - "\x02" // 1st event - "\x00\x00\xf3\x5c" // 1st time stamp - "\xfe" // 2nd event - "\x00\x36\xee\x80", 21), // 2nd time stamp - f.render()); - } - - void testItunes24FrameSize() - { - MPEG::File f(TEST_FILE_PATH_C("005411.id3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("TIT2")); - CPPUNIT_ASSERT_EQUAL(String("Sunshine Superman"), f.ID3v2Tag()->frameListMap()["TIT2"].front()->toString()); - } - - void testSaveUTF16Comment() - { - String::Type defaultEncoding = ID3v2::FrameFactory::instance()->defaultTextEncoding(); - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(String::UTF16); - { - MPEG::File foo(newname.c_str()); - foo.strip(); - foo.tag()->setComment("Test comment!"); - foo.save(); - } - { - MPEG::File bar(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("Test comment!"), bar.tag()->comment()); - ID3v2::FrameFactory::instance()->setDefaultTextEncoding(defaultEncoding); - } - } - - void testUpdateGenre23_1() - { - // "Refinement" is the same as the ID3v1 genre - duplicate - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x10" // Frame size - "\x00\x00" // Frame flags - "\x00" // Encoding - "(22)Death Metal", 26); // Text - ID3v2::Header header; - header.setMajorVersion(3); - ID3v2::TextIdentificationFrame *frame = - dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("Death Metal"), frame->fieldList()[0]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("Death Metal"), tag.genre()); - } - - void testUpdateGenre23_2() - { - // "Refinement" is different from the ID3v1 genre - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x13" // Frame size - "\x00\x00" // Frame flags - "\x00" // Encoding - "(4)Eurodisco", 23); // Text - ID3v2::Header header; - header.setMajorVersion(3); - ID3v2::TextIdentificationFrame *frame = - dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("4"), frame->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("Disco Eurodisco"), tag.genre()); - } - - void testUpdateGenre24() - { - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ByteVector data = ByteVector("TCON" // Frame ID - "\x00\x00\x00\x0D" // Frame size - "\x00\x00" // Frame flags - "\0" // Encoding - "14\0Eurodisco", 23); // Text - ID3v2::Header header; - ID3v2::TextIdentificationFrame *frame = - dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, frame->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("14"), frame->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); - - ID3v2::Tag tag; - tag.addFrame(frame); - CPPUNIT_ASSERT_EQUAL(String("R&B Eurodisco"), tag.genre()); - } - - void testUpdateDate22() - { - MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL((unsigned int)2010, f.tag()->year()); - } - - void testUpdateFullDate22() - { - MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); - CPPUNIT_ASSERT(f.tag()); - CPPUNIT_ASSERT_EQUAL(String("2010-04-03"), f.ID3v2Tag()->frameListMap()["TDRC"].front()->toString()); - } - - void testDowngradeTo23() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - ID3v2::TextIdentificationFrame *tf; - { - MPEG::File foo(newname.c_str()); - tf = new ID3v2::TextIdentificationFrame("TDOR", String::Latin1); - tf->setText("2011-03-16"); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TDRC", String::Latin1); - tf->setText("2012-04-17T12:01"); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TMCL", String::Latin1); - tf->setText(StringList().append("Guitar").append("Artist 1").append("Drums").append("Artist 2")); - foo.ID3v2Tag()->addFrame(tf); - tf = new ID3v2::TextIdentificationFrame("TIPL", String::Latin1); - tf->setText(StringList().append("Producer").append("Artist 3").append("Mastering").append("Artist 4")); - foo.ID3v2Tag()->addFrame(tf); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDRL", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDTG", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TMOO", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TPRO", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOA", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOT", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSST", String::Latin1)); - foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOP", String::Latin1)); - foo.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v3); - } - { - MPEG::File bar(newname.c_str()); - tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDOR").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("2011"), tf->fieldList().front()); - tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDRC").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("2012-04-17T12:01"), tf->fieldList().front()); - tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TIPL").front()); - CPPUNIT_ASSERT(tf); - CPPUNIT_ASSERT_EQUAL((unsigned int)8, tf->fieldList().size()); - CPPUNIT_ASSERT_EQUAL(String("Guitar"), tf->fieldList()[0]); - CPPUNIT_ASSERT_EQUAL(String("Artist 1"), tf->fieldList()[1]); - CPPUNIT_ASSERT_EQUAL(String("Drums"), tf->fieldList()[2]); - CPPUNIT_ASSERT_EQUAL(String("Artist 2"), tf->fieldList()[3]); - CPPUNIT_ASSERT_EQUAL(String("Producer"), tf->fieldList()[4]); - CPPUNIT_ASSERT_EQUAL(String("Artist 3"), tf->fieldList()[5]); - CPPUNIT_ASSERT_EQUAL(String("Mastering"), tf->fieldList()[6]); - CPPUNIT_ASSERT_EQUAL(String("Artist 4"), tf->fieldList()[7]); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDRL")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDTG")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TMOO")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TPRO")); -#ifdef NO_ITUNES_HACKS - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOA")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOT")); - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOP")); -#endif - CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSST")); -} - } - - void testCompressedFrameWithBrokenLength() - { - MPEG::File f(TEST_FILE_PATH_C("compressed_id3_frame.mp3"), false); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("APIC")); - - if(zlib::isAvailable()) { - ID3v2::AttachedPictureFrame *frame - = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("image/bmp"), frame->mimeType()); - CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, frame->type()); - CPPUNIT_ASSERT_EQUAL(String(""), frame->description()); - CPPUNIT_ASSERT_EQUAL((unsigned int)86414, frame->picture().size()); - } - else { - // Skip the test if ZLIB is not installed. - // The message "Compressed frames are currently not supported." will be displayed. - - ID3v2::UnknownFrame *frame - = dynamic_cast<TagLib::ID3v2::UnknownFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); - CPPUNIT_ASSERT(frame); - } - } - - void testW000() - { - MPEG::File f(TEST_FILE_PATH_C("w000.mp3"), false); - CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("W000")); - ID3v2::UrlLinkFrame *frame = - dynamic_cast<TagLib::ID3v2::UrlLinkFrame*>(f.ID3v2Tag()->frameListMap()["W000"].front()); - CPPUNIT_ASSERT(frame); - CPPUNIT_ASSERT_EQUAL(String("lukas.lalinsky@example.com____"), frame->url()); - } - - void testPropertyInterface() - { - ScopedFileCopy copy("rare_frames", ".mp3"); - string newname = copy.fileName(); - MPEG::File f(newname.c_str()); - PropertyMap dict = f.ID3v2Tag(false)->properties(); - CPPUNIT_ASSERT_EQUAL((unsigned int)6, dict.size()); - - CPPUNIT_ASSERT(dict.contains("USERTEXTDESCRIPTION1")); - CPPUNIT_ASSERT(dict.contains("QuodLibet::USERTEXTDESCRIPTION2")); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["USERTEXTDESCRIPTION1"].size()); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["QuodLibet::USERTEXTDESCRIPTION2"].size()); - CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["USERTEXTDESCRIPTION1"][0]); - CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["USERTEXTDESCRIPTION1"][1]); - CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["QuodLibet::USERTEXTDESCRIPTION2"][0]); - CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["QuodLibet::USERTEXTDESCRIPTION2"][1]); - - CPPUNIT_ASSERT_EQUAL(String("Pop"), dict["GENRE"].front()); - - CPPUNIT_ASSERT_EQUAL(String("http://a.user.url"), dict["URL:USERURL"].front()); - - CPPUNIT_ASSERT_EQUAL(String("http://a.user.url/with/empty/description"), dict["URL"].front()); - CPPUNIT_ASSERT_EQUAL(String("A COMMENT"), dict["COMMENT"].front()); - - CPPUNIT_ASSERT_EQUAL(1u, dict.unsupportedData().size()); - CPPUNIT_ASSERT_EQUAL(String("UFID/supermihi@web.de"), dict.unsupportedData().front()); - } - - void testPropertyInterface2() - { - ID3v2::Tag tag; - ID3v2::UnsynchronizedLyricsFrame *frame1 = new ID3v2::UnsynchronizedLyricsFrame(); - frame1->setDescription("test"); - frame1->setText("la-la-la test"); - tag.addFrame(frame1); - - ID3v2::UnsynchronizedLyricsFrame *frame2 = new ID3v2::UnsynchronizedLyricsFrame(); - frame2->setDescription(""); - frame2->setText("la-la-la nodescription"); - tag.addFrame(frame2); - - ID3v2::AttachedPictureFrame *frame3 = new ID3v2::AttachedPictureFrame(); - frame3->setDescription("test picture"); - tag.addFrame(frame3); - - ID3v2::TextIdentificationFrame *frame4 = new ID3v2::TextIdentificationFrame("TIPL"); - frame4->setText("single value is invalid for TIPL"); - tag.addFrame(frame4); - - ID3v2::TextIdentificationFrame *frame5 = new ID3v2::TextIdentificationFrame("TMCL"); - StringList tmclData; - tmclData.append("VIOLIN"); - tmclData.append("a violinist"); - tmclData.append("PIANO"); - tmclData.append("a pianist"); - frame5->setText(tmclData); - tag.addFrame(frame5); - - ID3v2::UniqueFileIdentifierFrame *frame6 = new ID3v2::UniqueFileIdentifierFrame("http://musicbrainz.org", "152454b9-19ba-49f3-9fc9-8fc26545cf41"); - tag.addFrame(frame6); - - ID3v2::UniqueFileIdentifierFrame *frame7 = new ID3v2::UniqueFileIdentifierFrame("http://example.com", "123"); - tag.addFrame(frame7); - - ID3v2::UserTextIdentificationFrame *frame8 = new ID3v2::UserTextIdentificationFrame(); - frame8->setDescription("MusicBrainz Album Id"); - frame8->setText("95c454a5-d7e0-4d8f-9900-db04aca98ab3"); - tag.addFrame(frame8); - - PropertyMap properties = tag.properties(); - - CPPUNIT_ASSERT_EQUAL(3u, properties.unsupportedData().size()); - CPPUNIT_ASSERT(properties.unsupportedData().contains("TIPL")); - CPPUNIT_ASSERT(properties.unsupportedData().contains("APIC")); - CPPUNIT_ASSERT(properties.unsupportedData().contains("UFID/http://example.com")); - - CPPUNIT_ASSERT(properties.contains("PERFORMER:VIOLIN")); - CPPUNIT_ASSERT(properties.contains("PERFORMER:PIANO")); - CPPUNIT_ASSERT_EQUAL(String("a violinist"), properties["PERFORMER:VIOLIN"].front()); - CPPUNIT_ASSERT_EQUAL(String("a pianist"), properties["PERFORMER:PIANO"].front()); - - CPPUNIT_ASSERT(properties.contains("LYRICS")); - CPPUNIT_ASSERT(properties.contains("LYRICS:TEST")); - - CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_TRACKID")); - CPPUNIT_ASSERT_EQUAL(String("152454b9-19ba-49f3-9fc9-8fc26545cf41"), properties["MUSICBRAINZ_TRACKID"].front()); - - CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_ALBUMID")); - CPPUNIT_ASSERT_EQUAL(String("95c454a5-d7e0-4d8f-9900-db04aca98ab3"), properties["MUSICBRAINZ_ALBUMID"].front()); - - tag.removeUnsupportedProperties(properties.unsupportedData()); - CPPUNIT_ASSERT(tag.frameList("APIC").isEmpty()); - CPPUNIT_ASSERT(tag.frameList("TIPL").isEmpty()); - CPPUNIT_ASSERT_EQUAL((ID3v2::UniqueFileIdentifierFrame *)0, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://example.com")); - CPPUNIT_ASSERT_EQUAL(frame6, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://musicbrainz.org")); - } - - void testPropertiesMovement() - { - ID3v2::Tag tag; - ID3v2::TextIdentificationFrame *frameMvnm = new ID3v2::TextIdentificationFrame("MVNM"); - frameMvnm->setText("Movement Name"); - tag.addFrame(frameMvnm); - - ID3v2::TextIdentificationFrame *frameMvin = new ID3v2::TextIdentificationFrame("MVIN"); - frameMvin->setText("2/3"); - tag.addFrame(frameMvin); - - PropertyMap properties = tag.properties(); - CPPUNIT_ASSERT(properties.contains("MOVEMENTNAME")); - CPPUNIT_ASSERT(properties.contains("MOVEMENTNUMBER")); - CPPUNIT_ASSERT_EQUAL(String("Movement Name"), properties["MOVEMENTNAME"].front()); - CPPUNIT_ASSERT_EQUAL(String("2/3"), properties["MOVEMENTNUMBER"].front()); - - ByteVector frameDataMvnm("MVNM" - "\x00\x00\x00\x0e" - "\x00\x00" - "\x00" - "Movement Name", 24); - CPPUNIT_ASSERT_EQUAL(frameDataMvnm, frameMvnm->render()); - ByteVector frameDataMvin("MVIN" - "\x00\x00\x00\x04" - "\x00\x00" - "\x00" - "2/3", 14); - CPPUNIT_ASSERT_EQUAL(frameDataMvin, frameMvin->render()); - - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ID3v2::Header header; - ID3v2::TextIdentificationFrame *parsedFrameMvnm = - dynamic_cast<ID3v2::TextIdentificationFrame *>( - factory->createFrame(frameDataMvnm, &header)); - ID3v2::TextIdentificationFrame *parsedFrameMvin = - dynamic_cast<ID3v2::TextIdentificationFrame *>( - factory->createFrame(frameDataMvin, &header)); - CPPUNIT_ASSERT(parsedFrameMvnm); - CPPUNIT_ASSERT(parsedFrameMvin); - CPPUNIT_ASSERT_EQUAL(String("Movement Name"), parsedFrameMvnm->toString()); - CPPUNIT_ASSERT_EQUAL(String("2/3"), parsedFrameMvin->toString()); - - tag.addFrame(parsedFrameMvnm); - tag.addFrame(parsedFrameMvin); - } - - void testPropertyGrouping() - { - ID3v2::Tag tag; - ID3v2::TextIdentificationFrame *frameGrp1 = new ID3v2::TextIdentificationFrame("GRP1"); - frameGrp1->setText("Grouping"); - tag.addFrame(frameGrp1); - - PropertyMap properties = tag.properties(); - CPPUNIT_ASSERT(properties.contains("GROUPING")); - CPPUNIT_ASSERT_EQUAL(String("Grouping"), properties["GROUPING"].front()); - - ByteVector frameDataGrp1("GRP1" - "\x00\x00\x00\x09" - "\x00\x00" - "\x00" - "Grouping", 19); - CPPUNIT_ASSERT_EQUAL(frameDataGrp1, frameGrp1->render()); - - ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); - ID3v2::Header header; - ID3v2::TextIdentificationFrame *parsedFrameGrp1 = - dynamic_cast<ID3v2::TextIdentificationFrame *>( - factory->createFrame(frameDataGrp1, &header)); - CPPUNIT_ASSERT(parsedFrameGrp1); - CPPUNIT_ASSERT_EQUAL(String("Grouping"), parsedFrameGrp1->toString()); - - tag.addFrame(parsedFrameGrp1); - } - - void testDeleteFrame() - { - ScopedFileCopy copy("rare_frames", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File f(newname.c_str()); - ID3v2::Tag *t = f.ID3v2Tag(); - ID3v2::Frame *frame = t->frameList("TCON")[0]; - CPPUNIT_ASSERT_EQUAL(1u, t->frameList("TCON").size()); - t->removeFrame(frame, true); - f.save(MPEG::File::ID3v2); - } - { - MPEG::File f2(newname.c_str()); - ID3v2::Tag *t = f2.ID3v2Tag(); - CPPUNIT_ASSERT(t->frameList("TCON").isEmpty()); - } - } - - void testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File foo(newname.c_str()); - foo.tag()->setArtist("Artist"); - foo.save(MPEG::File::ID3v1 | MPEG::File::ID3v2); - } - - { - MPEG::File bar(newname.c_str()); - bar.ID3v2Tag()->removeFrames("TPE1"); - // Should strip ID3v1 here and not add old values to ID3v2 again - bar.save(MPEG::File::ID3v2, File::StripOthers); - } - - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TPE1")); - } - - void testParseChapterFrame() - { - ID3v2::Header header; - - ByteVector chapterData = - ByteVector("CHAP" // Frame ID - "\x00\x00\x00\x20" // Frame size - "\x00\x00" // Frame flags - "\x43\x00" // Element ID ("C") - "\x00\x00\x00\x03" // Start time - "\x00\x00\x00\x05" // End time - "\x00\x00\x00\x02" // Start offset - "\x00\x00\x00\x03", 28); // End offset - ByteVector embeddedFrameData = - ByteVector("TIT2" // Embedded frame ID - "\x00\x00\x00\x04" // Embedded frame size - "\x00\x00" // Embedded frame flags - "\x00" // TIT2 frame text encoding - "CH1", 14); // Chapter title - - ID3v2::ChapterFrame f1(&header, chapterData); - - CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f1.elementID()); - CPPUNIT_ASSERT((unsigned int)0x03 == f1.startTime()); - CPPUNIT_ASSERT((unsigned int)0x05 == f1.endTime()); - CPPUNIT_ASSERT((unsigned int)0x02 == f1.startOffset()); - CPPUNIT_ASSERT((unsigned int)0x03 == f1.endOffset()); - CPPUNIT_ASSERT((unsigned int)0x00 == f1.embeddedFrameList().size()); - - ID3v2::ChapterFrame f2(&header, chapterData + embeddedFrameData); - - CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f2.elementID()); - CPPUNIT_ASSERT((unsigned int)0x03 == f2.startTime()); - CPPUNIT_ASSERT((unsigned int)0x05 == f2.endTime()); - CPPUNIT_ASSERT((unsigned int)0x02 == f2.startOffset()); - CPPUNIT_ASSERT((unsigned int)0x03 == f2.endOffset()); - CPPUNIT_ASSERT((unsigned int)0x01 == f2.embeddedFrameList().size()); - CPPUNIT_ASSERT(f2.embeddedFrameList("TIT2").size() == 1); - CPPUNIT_ASSERT(f2.embeddedFrameList("TIT2")[0]->toString() == "CH1"); - } - - void testRenderChapterFrame() - { - ID3v2::Header header; - ID3v2::ChapterFrame f1(&header, "CHAP"); - f1.setElementID(ByteVector("\x43\x00", 2)); - f1.setStartTime(3); - f1.setEndTime(5); - f1.setStartOffset(2); - f1.setEndOffset(3); - ID3v2::TextIdentificationFrame *eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("CH1"); - f1.addEmbeddedFrame(eF); - - ByteVector expected = - ByteVector("CHAP" // Frame ID - "\x00\x00\x00\x20" // Frame size - "\x00\x00" // Frame flags - "\x43\x00" // Element ID - "\x00\x00\x00\x03" // Start time - "\x00\x00\x00\x05" // End time - "\x00\x00\x00\x02" // Start offset - "\x00\x00\x00\x03" // End offset - "TIT2" // Embedded frame ID - "\x00\x00\x00\x04" // Embedded frame size - "\x00\x00" // Embedded frame flags - "\x00" // TIT2 frame text encoding - "CH1", 42); // Chapter title - - CPPUNIT_ASSERT_EQUAL(expected, f1.render()); - - f1.setElementID("C"); - - CPPUNIT_ASSERT_EQUAL(expected, f1.render()); - - ID3v2::FrameList frames; - eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("CH1"); - frames.append(eF); - - ID3v2::ChapterFrame f2(ByteVector("\x43\x00", 2), 3, 5, 2, 3, frames); - CPPUNIT_ASSERT_EQUAL(expected, f2.render()); - - frames.clear(); - eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("CH1"); - frames.append(eF); - - ID3v2::ChapterFrame f3(ByteVector("C\x00", 2), 3, 5, 2, 3, frames); - CPPUNIT_ASSERT_EQUAL(expected, f3.render()); - - frames.clear(); - eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("CH1"); - frames.append(eF); - - ID3v2::ChapterFrame f4("C", 3, 5, 2, 3, frames); - CPPUNIT_ASSERT_EQUAL(expected, f4.render()); - - CPPUNIT_ASSERT(!f4.toString().isEmpty()); - - ID3v2::ChapterFrame f5("C", 3, 5, 2, 3); - eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("CH1"); - f5.addEmbeddedFrame(eF); - CPPUNIT_ASSERT_EQUAL(expected, f5.render()); - } - - void testParseTableOfContentsFrame() - { - ID3v2::Header header; - ID3v2::TableOfContentsFrame f( - &header, - ByteVector("CTOC" // Frame ID - "\x00\x00\x00\x16" // Frame size - "\x00\x00" // Frame flags - "\x54\x00" // Element ID ("T") - "\x01" // CTOC flags - "\x02" // Entry count - "\x43\x00" // First entry ("C") - "\x44\x00" // Second entry ("D") - "TIT2" // Embedded frame ID - "\x00\x00\x00\x04" // Embedded frame size - "\x00\x00" // Embedded frame flags - "\x00" // TIT2 frame text encoding - "TC1", 32)); // Table of contents title - CPPUNIT_ASSERT_EQUAL(ByteVector("T"), f.elementID()); - CPPUNIT_ASSERT(!f.isTopLevel()); - CPPUNIT_ASSERT(f.isOrdered()); - CPPUNIT_ASSERT((unsigned int)0x02 == f.entryCount()); - CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f.childElements()[0]); - CPPUNIT_ASSERT_EQUAL(ByteVector("D"), f.childElements()[1]); - CPPUNIT_ASSERT((unsigned int)0x01 == f.embeddedFrameList().size()); - CPPUNIT_ASSERT(f.embeddedFrameList("TIT2").size() == 1); - CPPUNIT_ASSERT(f.embeddedFrameList("TIT2")[0]->toString() == "TC1"); - } - - void testRenderTableOfContentsFrame() - { - ID3v2::Header header; - ID3v2::TableOfContentsFrame f(&header, "CTOC"); - f.setElementID(ByteVector("\x54\x00", 2)); - f.setIsTopLevel(false); - f.setIsOrdered(true); - f.addChildElement(ByteVector("\x43\x00", 2)); - f.addChildElement(ByteVector("\x44\x00", 2)); - ID3v2::TextIdentificationFrame *eF = new ID3v2::TextIdentificationFrame("TIT2"); - eF->setText("TC1"); - f.addEmbeddedFrame(eF); - CPPUNIT_ASSERT_EQUAL( - ByteVector("CTOC" // Frame ID - "\x00\x00\x00\x16" // Frame size - "\x00\x00" // Frame flags - "\x54\x00" // Element ID - "\x01" // CTOC flags - "\x02" // Entry count - "\x43\x00" // First entry - "\x44\x00" // Second entry - "TIT2" // Embedded frame ID - "\x00\x00\x00\x04" // Embedded frame size - "\x00\x00" // Embedded frame flags - "\x00" // TIT2 frame text encoding - "TC1", 32), // Table of contents title - f.render()); - } - - void testShrinkPadding() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File f(newname.c_str()); - f.ID3v2Tag()->setTitle(longText(64 * 1024)); - f.save(MPEG::File::ID3v2, File::StripOthers); - } - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(74789L, f.length()); - f.ID3v2Tag()->setTitle("ABCDEFGHIJ"); - f.save(MPEG::File::ID3v2, File::StripOthers); - } - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(9263L, f.length()); - } - } - - void testEmptyFrame() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - { - MPEG::File f(newname.c_str()); - ID3v2::Tag *tag = f.ID3v2Tag(true); - - ID3v2::UrlLinkFrame *frame1 = new ID3v2::UrlLinkFrame( - ByteVector("WOAF\x00\x00\x00\x01\x00\x00\x00", 11)); - tag->addFrame(frame1); - - ID3v2::TextIdentificationFrame *frame2 = new ID3v2::TextIdentificationFrame("TIT2"); - frame2->setText("Title"); - tag->addFrame(frame2); - - f.save(); - } - - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - - ID3v2::Tag *tag = f.ID3v2Tag(); - CPPUNIT_ASSERT_EQUAL(String("Title"), tag->title()); - CPPUNIT_ASSERT_EQUAL(true, tag->frameListMap()["WOAF"].isEmpty()); - } - } - - void testDuplicateTags() - { - ScopedFileCopy copy("duplicate_id3v2", ".mp3"); - - ByteVector audioStream; - { - MPEG::File f(copy.fileName().c_str()); - f.seek(f.ID3v2Tag()->header()->completeTagSize()); - audioStream = f.readBlock(2089); - - // duplicate_id3v2.mp3 has duplicate ID3v2 tags. - // Sample rate will be 32000 if we can't skip the second tag. - - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL((unsigned int)8049, f.ID3v2Tag()->header()->completeTagSize()); - - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - - f.ID3v2Tag()->setArtist("Artist A"); - f.save(MPEG::File::ID3v2, File::StripOthers); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL((long)3594, f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)1505, f.ID3v2Tag()->header()->completeTagSize()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f.ID3v2Tag()->artist()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - - f.seek(f.ID3v2Tag()->header()->completeTagSize()); - CPPUNIT_ASSERT_EQUAL(f.readBlock(2089), audioStream); - - } - } - - void testParseTOCFrameWithManyChildren() - { - MPEG::File f(TEST_FILE_PATH_C("toc_many_children.mp3")); - CPPUNIT_ASSERT(f.isValid()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_info.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_info.cpp deleted file mode 100755 index 4302a249c..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_info.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <infotag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestInfoTag : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestInfoTag); - CPPUNIT_TEST(testTitle); - CPPUNIT_TEST(testNumericFields); - CPPUNIT_TEST_SUITE_END(); - -public: - void testTitle() - { - RIFF::Info::Tag tag; - - CPPUNIT_ASSERT_EQUAL(String(""), tag.title()); - tag.setTitle("Test title 1"); - tag.setFieldText("TEST", "Dummy Text"); - - CPPUNIT_ASSERT_EQUAL(String("Test title 1"), tag.title()); - - RIFF::Info::FieldListMap map = tag.fieldListMap(); - CPPUNIT_ASSERT_EQUAL(String("Test title 1"), map["INAM"]); - CPPUNIT_ASSERT_EQUAL(String("Dummy Text"), map["TEST"]); - } - - void testNumericFields() - { - RIFF::Info::Tag tag; - - CPPUNIT_ASSERT_EQUAL((unsigned int)0, tag.track()); - tag.setTrack(1234); - CPPUNIT_ASSERT_EQUAL((unsigned int)1234, tag.track()); - CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("IPRT")); - - CPPUNIT_ASSERT_EQUAL((unsigned int)0, tag.year()); - tag.setYear(1234); - CPPUNIT_ASSERT_EQUAL((unsigned int)1234, tag.year()); - CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("ICRD")); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestInfoTag); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_it.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_it.cpp deleted file mode 100755 index 75afb54dc..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_it.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <itfile.h> -#include <tstringlist.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("test song name"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "This is a sample name.\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - " "); - -static const String newComment( - "This is a sample name!\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - "-----------------------------------\n" - "The previous line is truncated but starting with this line\n" - "the comment is not limeted in the line length but to 8000\n" - "additional characters (bytes).\n" - "\n" - "This is because it is saved in the 'message' proportion of\n" - "IT files."); - -static const String commentAfter( - "This is a sample name!\n" - "In module file formats\n" - "sample names are abused\n" - "as multiline comments.\n" - "-------------------------\n" - "The previous line is truncated but starting with this line\n" - "the comment is not limeted in the line length but to 8000\n" - "additional characters (bytes).\n" - "\n" - "This is because it is saved in the 'message' proportion of\n" - "IT files."); - -class TestIT : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestIT); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.it"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".it"); - { - IT::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - file.tag()->setTrackerName("won't be saved"); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - IT::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - IT::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL( 0, p->length()); - CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(64, p->channels()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(true, p->stereo()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 5, p->sampleCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short)535, p->version()); - CPPUNIT_ASSERT_EQUAL((unsigned short)532, p->compatibleVersion()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 9, p->flags()); - CPPUNIT_ASSERT_EQUAL((unsigned char)128, p->globalVolume()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 48, p->mixVolume()); - CPPUNIT_ASSERT_EQUAL((unsigned char)125, p->tempo()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 6, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL((unsigned char)128, p->panningSeparation()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 0, p->pitchWheelDepth()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String(), t->artist()); - CPPUNIT_ASSERT_EQUAL(String(), t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String(), t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("Impulse Tracker"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestIT); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_list.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_list.cpp deleted file mode 100755 index 1c6d8c4c6..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_list.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tlist.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestList : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestList); - CPPUNIT_TEST(testAppend); - CPPUNIT_TEST(testDetach); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAppend() - { - List<int> l1; - List<int> l2; - List<int> l3; - l1.append(2); - l2.append(3); - l2.append(4); - l1.append(l2); - l1.prepend(1); - l3.append(1); - l3.append(2); - l3.append(3); - l3.append(4); - CPPUNIT_ASSERT_EQUAL(4U, l1.size()); - CPPUNIT_ASSERT(l1 == l3); - } - - void testDetach() - { - List<int> l1; - l1.append(1); - l1.append(2); - l1.append(3); - l1.append(4); - - List<int> l2 = l1; - List<int>::Iterator it = l2.find(3); - *it = 33; - CPPUNIT_ASSERT_EQUAL(3, l1[2]); - CPPUNIT_ASSERT_EQUAL(33, l2[2]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestList); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_map.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_map.cpp deleted file mode 100755 index b5e493b61..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_map.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <tmap.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestMap : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMap); - CPPUNIT_TEST(testInsert); - CPPUNIT_TEST(testDetach); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testInsert() - { - Map<String, int> m1; - m1.insert("foo", 3); - m1.insert("bar", 5); - CPPUNIT_ASSERT_EQUAL(2U, m1.size()); - CPPUNIT_ASSERT_EQUAL(3, m1["foo"]); - CPPUNIT_ASSERT_EQUAL(5, m1["bar"]); - m1.insert("foo", 7); - CPPUNIT_ASSERT_EQUAL(2U, m1.size()); - CPPUNIT_ASSERT_EQUAL(7, m1["foo"]); - CPPUNIT_ASSERT_EQUAL(5, m1["bar"]); - } - - void testDetach() - { - Map<String, int> m1; - m1.insert("alice", 5); - m1.insert("bob", 9); - m1.insert("carol", 11); - - Map<String, int> m2 = m1; - Map<String, int>::Iterator it = m2.find("bob"); - (*it).second = 99; - CPPUNIT_ASSERT_EQUAL(9, m1["bob"]); - CPPUNIT_ASSERT_EQUAL(99, m2["bob"]); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMap); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mod.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mod.cpp deleted file mode 100755 index e1c07b7f8..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mod.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <modfile.h> -#include <tpropertymap.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("title of song"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "-+-+-+-+-+-+-+-+-+-+-+\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - -static const String newComment( - "This line will be truncated because it is too long for a mod instrument name.\n" - "This line is ok."); - -static const String commentAfter( - "This line will be trun\n" - "This line is ok.\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - -class TestMod : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMod); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST(testPropertyInterface); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.mod"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".mod"); - { - Mod::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.mod"))); - } - - void testPropertyInterface() - { - Mod::Tag t; - PropertyMap properties; - properties["BLA"] = String("bla"); - properties["ARTIST"] = String("artist1"); - properties["ARTIST"].append("artist2"); - properties["TITLE"] = String("title"); - - PropertyMap unsupported = t.setProperties(properties); - CPPUNIT_ASSERT(unsupported.contains("BLA")); - CPPUNIT_ASSERT(unsupported.contains("ARTIST")); - CPPUNIT_ASSERT_EQUAL(properties["ARTIST"], unsupported["ARTIST"]); - CPPUNIT_ASSERT(!unsupported.contains("TITLE")); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - Mod::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - Mod::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL(31U, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((unsigned char)1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String(), t->artist()); - CPPUNIT_ASSERT_EQUAL(String(), t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String(), t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("StarTrekker"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMod); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4.cpp deleted file mode 100755 index 05bf6bd38..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4.cpp +++ /dev/null @@ -1,460 +0,0 @@ -/*************************************************************************** - copyright : (C) 2008 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4tag.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <mp4atom.h> -#include <mp4file.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4 : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4); - CPPUNIT_TEST(testPropertiesAAC); - CPPUNIT_TEST(testPropertiesALAC); - CPPUNIT_TEST(testPropertiesM4V); - CPPUNIT_TEST(testFreeForm); - CPPUNIT_TEST(testCheckValid); - CPPUNIT_TEST(testHasTag); - CPPUNIT_TEST(testIsEmpty); - CPPUNIT_TEST(testUpdateStco); - CPPUNIT_TEST(testSaveExisingWhenIlstIsLast); - CPPUNIT_TEST(test64BitAtom); - CPPUNIT_TEST(testGnre); - CPPUNIT_TEST(testCovrRead); - CPPUNIT_TEST(testCovrWrite); - CPPUNIT_TEST(testCovrRead2); - CPPUNIT_TEST(testProperties); - CPPUNIT_TEST(testPropertiesMovement); - CPPUNIT_TEST(testFuzzedFile); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST(testWithZeroLengthAtom); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPropertiesAAC() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3708, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); - CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec()); - } - - void testPropertiesALAC() - { - MP4::File f(TEST_FILE_PATH_C("empty_alac.m4a")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); - CPPUNIT_ASSERT_EQUAL(MP4::Properties::ALAC, f.audioProperties()->codec()); - } - - void testPropertiesM4V() - { - MP4::File f(TEST_FILE_PATH_C("blank_video.m4v")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(975, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(96, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); - CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec()); - } - - void testCheckValid() - { - MP4::File f(TEST_FILE_PATH_C("empty.aiff")); - CPPUNIT_ASSERT(!f.isValid()); - } - - void testHasTag() - { - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasMP4Tag()); - } - - ScopedFileCopy copy("no-tags", ".m4a"); - - { - MP4::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(!f.hasMP4Tag()); - f.tag()->setTitle("TITLE"); - f.save(); - } - { - MP4::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasMP4Tag()); - } - } - - void testIsEmpty() - { - MP4::Tag t1; - CPPUNIT_ASSERT(t1.isEmpty()); - t1.setArtist("Foo"); - CPPUNIT_ASSERT(!t1.isEmpty()); - - MP4::Tag t2; - t2.setItem("foo", "bar"); - CPPUNIT_ASSERT(!t2.isEmpty()); - } - - void testUpdateStco() - { - ScopedFileCopy copy("no-tags", ".3g2"); - string filename = copy.fileName(); - - ByteVectorList data1; - - { - MP4::File f(filename.c_str()); - f.tag()->setArtist(ByteVector(3000, 'x')); - - MP4::Atoms a(&f); - MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; - f.seek(stco->offset + 12); - ByteVector data = f.readBlock(stco->length - 12); - unsigned int count = data.mid(0, 4).toUInt(); - int pos = 4; - while (count--) { - unsigned int offset = data.mid(pos, 4).toUInt(); - f.seek(offset); - data1.append(f.readBlock(20)); - pos += 4; - } - - f.save(); - } - - { - MP4::File f(filename.c_str()); - - MP4::Atoms a(&f); - MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; - f.seek(stco->offset + 12); - ByteVector data = f.readBlock(stco->length - 12); - unsigned int count = data.mid(0, 4).toUInt(); - int pos = 4, i = 0; - while (count--) { - unsigned int offset = data.mid(pos, 4).toUInt(); - f.seek(offset); - CPPUNIT_ASSERT_EQUAL(data1[i], f.readBlock(20)); - pos += 4; - i++; - } - } - } - - void testFreeForm() - { - ScopedFileCopy copy("has-tags", ".m4a"); - string filename = copy.fileName(); - - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("----:com.apple.iTunes:iTunNORM")); - f.tag()->setItem("----:org.kde.TagLib:Foo", StringList("Bar")); - f.save(); - } - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("----:org.kde.TagLib:Foo")); - CPPUNIT_ASSERT_EQUAL(String("Bar"), - f.tag()->item("----:org.kde.TagLib:Foo").toStringList().front()); - f.save(); - } - } - - void testSaveExisingWhenIlstIsLast() - { - ScopedFileCopy copy("ilst-is-last", ".m4a"); - string filename = copy.fileName(); - - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(String("82,164"), - f.tag()->item("----:com.apple.iTunes:replaygain_track_minmax").toStringList().front()); - CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f.tag()->artist()); - f.tag()->setComment("foo"); - f.save(); - } - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(String("82,164"), - f.tag()->item("----:com.apple.iTunes:replaygain_track_minmax").toStringList().front()); - CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(String("foo"), f.tag()->comment()); - } - } - - void test64BitAtom() - { - ScopedFileCopy copy("64bit", ".mp4"); - string filename = copy.fileName(); - - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->itemMap()["cpil"].toBool()); - - MP4::Atoms atoms(&f); - MP4::Atom *moov = atoms.atoms[0]; - CPPUNIT_ASSERT_EQUAL(long(77), moov->length); - - f.tag()->setItem("pgap", true); - f.save(); - } - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("cpil").toBool()); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("pgap").toBool()); - - MP4::Atoms atoms(&f); - MP4::Atom *moov = atoms.atoms[0]; - // original size + 'pgap' size + padding - CPPUNIT_ASSERT_EQUAL(long(77 + 25 + 974), moov->length); - } - } - - void testGnre() - { - MP4::File f(TEST_FILE_PATH_C("gnre.m4a")); - CPPUNIT_ASSERT_EQUAL(TagLib::String("Ska"), f.tag()->genre()); - } - - void testCovrRead() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - CPPUNIT_ASSERT(f.tag()->contains("covr")); - MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); - } - - void testCovrWrite() - { - ScopedFileCopy copy("has-tags", ".m4a"); - string filename = copy.fileName(); - - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("covr")); - MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - f.tag()->setItem("covr", l); - f.save(); - } - { - MP4::File f(filename.c_str()); - CPPUNIT_ASSERT(f.tag()->contains("covr")); - MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[2].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, l[2].data().size()); - } - } - - void testCovrRead2() - { - MP4::File f(TEST_FILE_PATH_C("covr-junk.m4a")); - CPPUNIT_ASSERT(f.tag()->contains("covr")); - MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); - } - - void testProperties() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - - PropertyMap tags = f.properties(); - - CPPUNIT_ASSERT_EQUAL(StringList("Test Artist"), tags["ARTIST"]); - - tags["TRACKNUMBER"] = StringList("2/4"); - tags["DISCNUMBER"] = StringList("3/5"); - tags["BPM"] = StringList("123"); - tags["ARTIST"] = StringList("Foo Bar"); - tags["COMPILATION"] = StringList("1"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->contains("trkn")); - CPPUNIT_ASSERT_EQUAL(2, f.tag()->item("trkn").toIntPair().first); - CPPUNIT_ASSERT_EQUAL(4, f.tag()->item("trkn").toIntPair().second); - CPPUNIT_ASSERT_EQUAL(StringList("2/4"), tags["TRACKNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->contains("disk")); - CPPUNIT_ASSERT_EQUAL(3, f.tag()->item("disk").toIntPair().first); - CPPUNIT_ASSERT_EQUAL(5, f.tag()->item("disk").toIntPair().second); - CPPUNIT_ASSERT_EQUAL(StringList("3/5"), tags["DISCNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->contains("tmpo")); - CPPUNIT_ASSERT_EQUAL(123, f.tag()->item("tmpo").toInt()); - CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); - - CPPUNIT_ASSERT(f.tag()->contains("\251ART")); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), f.tag()->item("\251ART").toStringList()); - CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); - - CPPUNIT_ASSERT(f.tag()->contains("cpil")); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("cpil").toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("1"), tags["COMPILATION"]); - - tags["COMPILATION"] = StringList("0"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->contains("cpil")); - CPPUNIT_ASSERT_EQUAL(false, f.tag()->item("cpil").toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("0"), tags["COMPILATION"]); - - // Empty properties do not result in access violations - // when converting integers - tags["TRACKNUMBER"] = StringList(); - tags["DISCNUMBER"] = StringList(); - tags["BPM"] = StringList(); - tags["COMPILATION"] = StringList(); - f.setProperties(tags); - } - - void testPropertiesMovement() - { - MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); - - PropertyMap tags = f.properties(); - - tags["WORK"] = StringList("Foo"); - tags["MOVEMENTNAME"] = StringList("Bar"); - tags["MOVEMENTNUMBER"] = StringList("2"); - tags["MOVEMENTCOUNT"] = StringList("3"); - tags["SHOWWORKMOVEMENT"] = StringList("1"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->contains("\251wrk")); - CPPUNIT_ASSERT_EQUAL(StringList("Foo"), f.tag()->item("\251wrk").toStringList()); - CPPUNIT_ASSERT_EQUAL(StringList("Foo"), tags["WORK"]); - - CPPUNIT_ASSERT(f.tag()->contains("\251mvn")); - CPPUNIT_ASSERT_EQUAL(StringList("Bar"), f.tag()->item("\251mvn").toStringList()); - CPPUNIT_ASSERT_EQUAL(StringList("Bar"), tags["MOVEMENTNAME"]); - - CPPUNIT_ASSERT(f.tag()->contains("\251mvi")); - CPPUNIT_ASSERT_EQUAL(2, f.tag()->item("\251mvi").toInt()); - CPPUNIT_ASSERT_EQUAL(StringList("2"), tags["MOVEMENTNUMBER"]); - - CPPUNIT_ASSERT(f.tag()->contains("\251mvc")); - CPPUNIT_ASSERT_EQUAL(3, f.tag()->item("\251mvc").toInt()); - CPPUNIT_ASSERT_EQUAL(StringList("3"), tags["MOVEMENTCOUNT"]); - - CPPUNIT_ASSERT(f.tag()->contains("shwm")); - CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("shwm").toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("1"), tags["SHOWWORKMOVEMENT"]); - - tags["SHOWWORKMOVEMENT"] = StringList("0"); - f.setProperties(tags); - - tags = f.properties(); - - CPPUNIT_ASSERT(f.tag()->contains("shwm")); - CPPUNIT_ASSERT_EQUAL(false, f.tag()->item("shwm").toBool()); - CPPUNIT_ASSERT_EQUAL(StringList("0"), tags["SHOWWORKMOVEMENT"]); - - tags["WORK"] = StringList(); - tags["MOVEMENTNAME"] = StringList(); - tags["MOVEMENTNUMBER"] = StringList(); - tags["MOVEMENTCOUNT"] = StringList(); - tags["SHOWWORKMOVEMENT"] = StringList(); - f.setProperties(tags); - } - - void testFuzzedFile() - { - MP4::File f(TEST_FILE_PATH_C("infloop.m4a")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testRepeatedSave() - { - ScopedFileCopy copy("no-tags", ".m4a"); - - MP4::File f(copy.fileName().c_str()); - f.tag()->setTitle("0123456789"); - f.save(); - f.save(); - CPPUNIT_ASSERT_EQUAL(2862L, f.find("0123456789")); - CPPUNIT_ASSERT_EQUAL(-1L, f.find("0123456789", 2863)); - } - - void testWithZeroLengthAtom() - { - MP4::File f(TEST_FILE_PATH_C("zero-length-mdat.m4a")); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(1115, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(22050, f.audioProperties()->sampleRate()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4coverart.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4coverart.cpp deleted file mode 100755 index 49ef04707..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4coverart.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4coverart.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4CoverArt : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4CoverArt); - CPPUNIT_TEST(testSimple); - CPPUNIT_TEST(testList); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSimple() - { - MP4::CoverArt c(MP4::CoverArt::PNG, "foo"); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c.data()); - - MP4::CoverArt c2(c); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c2.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c2.data()); - - MP4::CoverArt c3 = c; - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c3.format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c3.data()); - } - - void testList() - { - MP4::CoverArtList l; - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); - - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4CoverArt); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4item.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4item.cpp deleted file mode 100755 index a9a5c99ae..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mp4item.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <mp4coverart.h> -#include <mp4item.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMP4Item : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMP4Item); - CPPUNIT_TEST(testCoverArtList); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testCoverArtList() - { - MP4::CoverArtList l; - l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); - l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); - - MP4::Item i(l); - MP4::CoverArtList l2 = i.toCoverArtList(); - - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); - CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); - CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4Item); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpc.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpc.cpp deleted file mode 100755 index 059e521fd..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpc.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <apetag.h> -#include <id3v1tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <mpcfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMPC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMPC); - CPPUNIT_TEST(testPropertiesSV8); - CPPUNIT_TEST(testPropertiesSV7); - CPPUNIT_TEST(testPropertiesSV5); - CPPUNIT_TEST(testPropertiesSV4); - CPPUNIT_TEST(testFuzzedFile1); - CPPUNIT_TEST(testFuzzedFile2); - CPPUNIT_TEST(testFuzzedFile3); - CPPUNIT_TEST(testFuzzedFile4); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPropertiesSV8() - { - MPC::File f(TEST_FILE_PATH_C("sv8_header.mpc")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(1497, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(66014U, f.audioProperties()->sampleFrames()); - } - - void testPropertiesSV7() - { - MPC::File f(TEST_FILE_PATH_C("click.mpc")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(40, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(318, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(1760U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(14221, f.audioProperties()->trackGain()); - CPPUNIT_ASSERT_EQUAL(19848, f.audioProperties()->trackPeak()); - CPPUNIT_ASSERT_EQUAL(14221, f.audioProperties()->albumGain()); - CPPUNIT_ASSERT_EQUAL(19848, f.audioProperties()->albumPeak()); - } - - void testPropertiesSV5() - { - MPC::File f(TEST_FILE_PATH_C("sv5_header.mpc")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(5, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(26371, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(1162944U, f.audioProperties()->sampleFrames()); - } - - void testPropertiesSV4() - { - MPC::File f(TEST_FILE_PATH_C("sv4_header.mpc")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->mpcVersion()); - CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(26371, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(1162944U, f.audioProperties()->sampleFrames()); - } - - void testFuzzedFile1() - { - MPC::File f(TEST_FILE_PATH_C("zerodiv.mpc")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testFuzzedFile2() - { - MPC::File f(TEST_FILE_PATH_C("infloop.mpc")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testFuzzedFile3() - { - MPC::File f(TEST_FILE_PATH_C("segfault.mpc")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testFuzzedFile4() - { - MPC::File f(TEST_FILE_PATH_C("segfault2.mpc")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testStripAndProperties() - { - ScopedFileCopy copy("click", ".mpc"); - - { - MPC::File f(copy.fileName().c_str()); - f.APETag(true)->setTitle("APE"); - f.ID3v1Tag(true)->setTitle("ID3v1"); - f.save(); - } - { - MPC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); - f.strip(MPC::File::APE); - CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); - f.strip(MPC::File::ID3v1); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testRepeatedSave() - { - ScopedFileCopy copy("click", ".mpc"); - - { - MPC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasAPETag()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - - f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - - f.APETag()->setTitle("0"); - f.save(); - - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); - f.save(); - } - { - MPC::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasAPETag()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMPC); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpeg.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpeg.cpp deleted file mode 100755 index 240231a4d..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_mpeg.cpp +++ /dev/null @@ -1,435 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tstring.h> -#include <tpropertymap.h> -#include <mpegfile.h> -#include <id3v2tag.h> -#include <id3v1tag.h> -#include <apetag.h> -#include <mpegproperties.h> -#include <xingheader.h> -#include <mpegheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestMPEG : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestMPEG); - CPPUNIT_TEST(testAudioPropertiesXingHeaderCBR); - CPPUNIT_TEST(testAudioPropertiesXingHeaderVBR); - CPPUNIT_TEST(testAudioPropertiesVBRIHeader); - CPPUNIT_TEST(testAudioPropertiesNoVBRHeaders); - CPPUNIT_TEST(testSkipInvalidFrames1); - CPPUNIT_TEST(testSkipInvalidFrames2); - CPPUNIT_TEST(testSkipInvalidFrames3); - CPPUNIT_TEST(testVersion2DurationWithXingHeader); - CPPUNIT_TEST(testSaveID3v24); - CPPUNIT_TEST(testSaveID3v24WrongParam); - CPPUNIT_TEST(testSaveID3v23); - CPPUNIT_TEST(testDuplicateID3v2); - CPPUNIT_TEST(testFuzzedFile); - CPPUNIT_TEST(testFrameOffset); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testRepeatedSave1); - CPPUNIT_TEST(testRepeatedSave2); - CPPUNIT_TEST(testRepeatedSave3); - CPPUNIT_TEST(testEmptyID3v2); - CPPUNIT_TEST(testEmptyID3v1); - CPPUNIT_TEST(testEmptyAPE); - CPPUNIT_TEST(testIgnoreGarbage); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAudioPropertiesXingHeaderCBR() - { - MPEG::File f(TEST_FILE_PATH_C("lame_cbr.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(1887, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(1887164, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::Xing, f.audioProperties()->xingHeader()->type()); - } - - void testAudioPropertiesXingHeaderVBR() - { - MPEG::File f(TEST_FILE_PATH_C("lame_vbr.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(1887, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(1887164, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(70, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::Xing, f.audioProperties()->xingHeader()->type()); - } - - void testAudioPropertiesVBRIHeader() - { - MPEG::File f(TEST_FILE_PATH_C("rare_frames.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(222, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(222198, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(233, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::VBRI, f.audioProperties()->xingHeader()->type()); - } - - void testAudioPropertiesNoVBRHeaders() - { - MPEG::File f(TEST_FILE_PATH_C("bladeenc.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3553, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); - - const long last = f.lastFrameOffset(); - const MPEG::Header lastHeader(&f, last, false); - - CPPUNIT_ASSERT_EQUAL(28213L, last); - CPPUNIT_ASSERT_EQUAL(209, lastHeader.frameLength()); - } - - void testSkipInvalidFrames1() - { - MPEG::File f(TEST_FILE_PATH_C("invalid-frames1.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(392, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(160, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); - } - - void testSkipInvalidFrames2() - { - MPEG::File f(TEST_FILE_PATH_C("invalid-frames2.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(314, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); - } - - void testSkipInvalidFrames3() - { - MPEG::File f(TEST_FILE_PATH_C("invalid-frames3.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(183, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(320, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); - } - - void testVersion2DurationWithXingHeader() - { - MPEG::File f(TEST_FILE_PATH_C("mpeg2.mp3")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(5387, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(5387285, f.audioProperties()->lengthInMilliseconds()); - } - - void testSaveID3v24() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v4); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - } - { - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)4, f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - } - - void testSaveID3v24WrongParam() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - { - MPEG::File f(newname.c_str()); - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, true, 8); - } - { - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)4, f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - } - - void testSaveID3v23() - { - ScopedFileCopy copy("xing", ".mp3"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - { - MPEG::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v3); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - } - { - MPEG::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - } - - void testDuplicateID3v2() - { - MPEG::File f(TEST_FILE_PATH_C("duplicate_id3v2.mp3")); - - // duplicate_id3v2.mp3 has duplicate ID3v2 tags. - // Sample rate will be 32000 if can't skip the second tag. - - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testFuzzedFile() - { - MPEG::File f(TEST_FILE_PATH_C("excessive_alloc.mp3")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testFrameOffset() - { - { - MPEG::File f(TEST_FILE_PATH_C("ape.mp3")); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL((long)0x0000, f.firstFrameOffset()); - CPPUNIT_ASSERT_EQUAL((long)0x1FD6, f.lastFrameOffset()); - } - { - MPEG::File f(TEST_FILE_PATH_C("ape-id3v1.mp3")); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL((long)0x0000, f.firstFrameOffset()); - CPPUNIT_ASSERT_EQUAL((long)0x1FD6, f.lastFrameOffset()); - } - { - MPEG::File f(TEST_FILE_PATH_C("ape-id3v2.mp3")); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL((long)0x041A, f.firstFrameOffset()); - CPPUNIT_ASSERT_EQUAL((long)0x23F0, f.lastFrameOffset()); - } - } - - void testStripAndProperties() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("ID3v2"); - f.APETag(true)->setTitle("APE"); - f.ID3v1Tag(true)->setTitle("ID3v1"); - f.save(); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); - f.strip(MPEG::File::ID3v2); - CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); - f.strip(MPEG::File::APE); - CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); - f.strip(MPEG::File::ID3v1); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testRepeatedSave1() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle(std::string(4096, 'X').c_str()); - f.save(); - } - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle(""); - f.save(); - f.ID3v2Tag(true)->setTitle(std::string(4096, 'X').c_str()); - f.save(); - CPPUNIT_ASSERT_EQUAL(5141L, f.firstFrameOffset()); - } - } - - void testRepeatedSave2() - { - ScopedFileCopy copy("xing", ".mp3"); - - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("0123456789"); - f.save(); - f.save(); - CPPUNIT_ASSERT_EQUAL(-1L, f.find("ID3", 3)); - } - - void testRepeatedSave3() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasAPETag()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - - f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - f.APETag()->setTitle("0"); - f.save(); - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); - f.save(); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasAPETag()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - } - } - - void testEmptyID3v2() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("0123456789"); - f.save(MPEG::File::ID3v2); - } - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle(""); - f.save(MPEG::File::ID3v2, File::StripNone); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - } - } - - void testEmptyID3v1() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v1Tag(true)->setTitle("0123456789"); - f.save(MPEG::File::ID3v1); - } - { - MPEG::File f(copy.fileName().c_str()); - f.ID3v1Tag(true)->setTitle(""); - f.save(MPEG::File::ID3v1, File::StripNone); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - } - } - - void testEmptyAPE() - { - ScopedFileCopy copy("xing", ".mp3"); - - { - MPEG::File f(copy.fileName().c_str()); - f.APETag(true)->setTitle("0123456789"); - f.save(MPEG::File::APE); - } - { - MPEG::File f(copy.fileName().c_str()); - f.APETag(true)->setTitle(""); - f.save(MPEG::File::APE, File::StripNone); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasAPETag()); - } - } - - void testIgnoreGarbage() - { - const ScopedFileCopy copy("garbage", ".mp3"); - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(2255L, f.firstFrameOffset()); - CPPUNIT_ASSERT_EQUAL(6015L, f.lastFrameOffset()); - CPPUNIT_ASSERT_EQUAL(String("Title A"), f.ID3v2Tag()->title()); - f.ID3v2Tag()->setTitle("Title B"); - f.save(); - } - { - MPEG::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("Title B"), f.ID3v2Tag()->title()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestMPEG); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_ogg.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_ogg.cpp deleted file mode 100755 index 6564a2474..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_ogg.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <oggfile.h> -#include <vorbisfile.h> -#include <oggpageheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOGG : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOGG); - CPPUNIT_TEST(testSimple); - CPPUNIT_TEST(testSplitPackets1); - CPPUNIT_TEST(testSplitPackets2); - CPPUNIT_TEST(testDictInterface1); - CPPUNIT_TEST(testDictInterface2); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testPageChecksum); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testSimple() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - { - Vorbis::File f(newname.c_str()); - f.tag()->setArtist("The Artist"); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); - } - } - - void testSplitPackets1() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - const String text = longText(128 * 1024, true); - - { - Vorbis::File f(newname.c_str()); - f.tag()->setTitle(text); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(136383L, f.length()); - CPPUNIT_ASSERT_EQUAL(19, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(131127U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - - f.tag()->setTitle("ABCDE"); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(4370L, f.length()); - CPPUNIT_ASSERT_EQUAL(3, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(60U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - } - } - - void testSplitPackets2() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - const String text = longText(60890, true); - - { - Vorbis::File f(newname.c_str()); - f.tag()->setTitle(text); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); - - f.tag()->setTitle("ABCDE"); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); - } - } - - void testDictInterface1() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File f(newname.c_str()); - - CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.tag()->properties().size()); - - PropertyMap newTags; - StringList values("value 1"); - values.append("value 2"); - newTags["ARTIST"] = values; - f.tag()->setProperties(newTags); - - PropertyMap map = f.tag()->properties(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, map.size()); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, map["ARTIST"].size()); - CPPUNIT_ASSERT_EQUAL(String("value 1"), map["ARTIST"][0]); - } - - void testDictInterface2() - { - ScopedFileCopy copy("test", ".ogg"); - string newname = copy.fileName(); - - Vorbis::File f(newname.c_str()); - PropertyMap tags = f.tag()->properties(); - - CPPUNIT_ASSERT_EQUAL((unsigned int)2, tags["UNUSUALTAG"].size()); - CPPUNIT_ASSERT_EQUAL(String("usual value"), tags["UNUSUALTAG"][0]); - CPPUNIT_ASSERT_EQUAL(String("another value"), tags["UNUSUALTAG"][1]); - CPPUNIT_ASSERT_EQUAL( - String("\xC3\xB6\xC3\xA4\xC3\xBC\x6F\xCE\xA3\xC3\xB8", String::UTF8), - tags["UNICODETAG"][0]); - - tags["UNICODETAG"][0] = String( - "\xCE\xBD\xCE\xB5\xCF\x89\x20\xCE\xBD\xCE\xB1\xCE\xBB\xCF\x85\xCE\xB5", String::UTF8); - tags.erase("UNUSUALTAG"); - f.tag()->setProperties(tags); - CPPUNIT_ASSERT_EQUAL( - String("\xCE\xBD\xCE\xB5\xCF\x89\x20\xCE\xBD\xCE\xB1\xCE\xBB\xCF\x85\xCE\xB5", String::UTF8), - f.tag()->properties()["UNICODETAG"][0]); - CPPUNIT_ASSERT_EQUAL(false, f.tag()->properties().contains("UNUSUALTAG")); - } - - void testAudioProperties() - { - Ogg::Vorbis::File f(TEST_FILE_PATH_C("empty.ogg")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->vorbisVersion()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrateMaximum()); - CPPUNIT_ASSERT_EQUAL(112000, f.audioProperties()->bitrateNominal()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrateMinimum()); - } - - void testPageChecksum() - { - ScopedFileCopy copy("empty", ".ogg"); - - { - Vorbis::File f(copy.fileName().c_str()); - f.tag()->setArtist("The Artist"); - f.save(); - - f.seek(0x50); - CPPUNIT_ASSERT_EQUAL((unsigned int)0x3d3bd92d, f.readBlock(4).toUInt(0, true)); - } - { - Vorbis::File f(copy.fileName().c_str()); - f.tag()->setArtist("The Artist 2"); - f.save(); - - f.seek(0x50); - CPPUNIT_ASSERT_EQUAL((unsigned int)0xd985291c, f.readBlock(4).toUInt(0, true)); - } - - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOGG); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_oggflac.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_oggflac.cpp deleted file mode 100755 index 1d00d1231..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_oggflac.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tstringlist.h> -#include <tbytevectorlist.h> -#include <oggfile.h> -#include <oggflacfile.h> -#include <oggpageheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOggFLAC : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOggFLAC); - CPPUNIT_TEST(testFramingBit); - CPPUNIT_TEST(testFuzzedFile); - CPPUNIT_TEST(testSplitPackets); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testFramingBit() - { - ScopedFileCopy copy("empty_flac", ".oga"); - string newname = copy.fileName(); - - { - Ogg::FLAC::File f(newname.c_str()); - f.tag()->setArtist("The Artist"); - f.save(); - } - { - Ogg::FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); - - f.seek(0, File::End); - CPPUNIT_ASSERT_EQUAL(9134L, f.tell()); - } - } - - void testFuzzedFile() - { - Ogg::FLAC::File f(TEST_FILE_PATH_C("segfault.oga")); - CPPUNIT_ASSERT(!f.isValid()); - } - - void testSplitPackets() - { - ScopedFileCopy copy("empty_flac", ".oga"); - string newname = copy.fileName(); - - const String text = longText(128 * 1024, true); - - { - Ogg::FLAC::File f(newname.c_str()); - f.tag()->setTitle(text); - f.save(); - } - { - Ogg::FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(141141L, f.length()); - CPPUNIT_ASSERT_EQUAL(21, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(131126U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); - - f.tag()->setTitle("ABCDE"); - f.save(); - } - { - Ogg::FLAC::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(9128L, f.length()); - CPPUNIT_ASSERT_EQUAL(5, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(59U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOggFLAC); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_opus.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_opus.cpp deleted file mode 100755 index 9a49d239a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_opus.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <opusfile.h> -#include <oggpageheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestOpus : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestOpus); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testReadComments); - CPPUNIT_TEST(testWriteComments); - CPPUNIT_TEST(testSplitPackets); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAudioProperties() - { - Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(36, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->inputSampleRate()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->opusVersion()); - } - - void testReadComments() - { - Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); - CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f.tag()->fieldListMap()["ENCODER"]); - CPPUNIT_ASSERT(f.tag()->fieldListMap().contains("TESTDESCRIPTION")); - CPPUNIT_ASSERT(!f.tag()->fieldListMap().contains("ARTIST")); - CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f.tag()->vendorID()); - } - - void testWriteComments() - { - ScopedFileCopy copy("correctness_gain_silent_output", ".opus"); - string filename = copy.fileName(); - - { - Ogg::Opus::File f(filename.c_str()); - f.tag()->setArtist("Your Tester"); - f.save(); - } - { - Ogg::Opus::File f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f.tag()->fieldListMap()["ENCODER"]); - CPPUNIT_ASSERT(f.tag()->fieldListMap().contains("TESTDESCRIPTION")); - CPPUNIT_ASSERT_EQUAL(StringList("Your Tester"), f.tag()->fieldListMap()["ARTIST"]); - CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f.tag()->vendorID()); - } - } - - void testSplitPackets() - { - ScopedFileCopy copy("correctness_gain_silent_output", ".opus"); - string newname = copy.fileName(); - - const String text = longText(128 * 1024, true); - - { - Ogg::Opus::File f(newname.c_str()); - f.tag()->setTitle(text); - f.save(); - } - { - Ogg::Opus::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(167534L, f.length()); - CPPUNIT_ASSERT_EQUAL(27, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(131380U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); - - f.tag()->setTitle("ABCDE"); - f.save(); - } - { - Ogg::Opus::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(35521L, f.length()); - CPPUNIT_ASSERT_EQUAL(11, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(313U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestOpus); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_propertymap.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_propertymap.cpp deleted file mode 100755 index 855ff67e1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_propertymap.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/*************************************************************************** - copyright : (C) 2012 by Michael Helmling - email : helmling@mathematik.uni-kl.de - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tpropertymap.h> -#include <tag.h> -#include <id3v1tag.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace TagLib; - -class TestPropertyMap : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestPropertyMap); - CPPUNIT_TEST(testInvalidKeys); - CPPUNIT_TEST(testGetSet); - CPPUNIT_TEST_SUITE_END(); - -public: - void testInvalidKeys() - { - PropertyMap map1; - CPPUNIT_ASSERT(map1.isEmpty()); - map1[L"\x00c4\x00d6\x00dc"].append("test"); - CPPUNIT_ASSERT_EQUAL(map1.size(), 1u); - - PropertyMap map2; - map2[L"\x00c4\x00d6\x00dc"].append("test"); - CPPUNIT_ASSERT(map1 == map2); - CPPUNIT_ASSERT(map1.contains(map2)); - - map2["ARTIST"] = String("Test Artist"); - CPPUNIT_ASSERT(map1 != map2); - CPPUNIT_ASSERT(map2.contains(map1)); - - map2[L"\x00c4\x00d6\x00dc"].append("test 2"); - CPPUNIT_ASSERT(!map2.contains(map1)); - - } - - void testGetSet() - { - ID3v1::Tag tag; - - tag.setTitle("Test Title"); - tag.setArtist("Test Artist"); - tag.setAlbum("Test Album"); - tag.setYear(2015); - tag.setTrack(10); - - { - PropertyMap prop = tag.properties(); - CPPUNIT_ASSERT_EQUAL(String("Test Title"), prop["TITLE" ].front()); - CPPUNIT_ASSERT_EQUAL(String("Test Artist"), prop["ARTIST" ].front()); - CPPUNIT_ASSERT_EQUAL(String("Test Album"), prop["ALBUM" ].front()); - CPPUNIT_ASSERT_EQUAL(String("2015"), prop["DATE" ].front()); - CPPUNIT_ASSERT_EQUAL(String("10"), prop["TRACKNUMBER"].front()); - - prop["TITLE" ].front() = "Test Title 2"; - prop["ARTIST" ].front() = "Test Artist 2"; - prop["TRACKNUMBER"].front() = "5"; - - tag.setProperties(prop); - } - - CPPUNIT_ASSERT_EQUAL(String("Test Title 2"), tag.title()); - CPPUNIT_ASSERT_EQUAL(String("Test Artist 2"), tag.artist()); - CPPUNIT_ASSERT_EQUAL(5U, tag.track()); - - tag.setProperties(PropertyMap()); - - CPPUNIT_ASSERT_EQUAL(String(""), tag.title()); - CPPUNIT_ASSERT_EQUAL(String(""), tag.artist()); - CPPUNIT_ASSERT_EQUAL(0U, tag.track()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestPropertyMap); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_riff.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_riff.cpp deleted file mode 100755 index f9a20dfb1..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_riff.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <tag.h> -#include <tbytevectorlist.h> -#include <rifffile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class PublicRIFF : public RIFF::File -{ -public: - PublicRIFF(FileName file) : RIFF::File(file, BigEndian) {}; - unsigned int riffSize() { return RIFF::File::riffSize(); }; - unsigned int chunkCount() { return RIFF::File::chunkCount(); }; - unsigned int chunkOffset(unsigned int i) { return RIFF::File::chunkOffset(i); }; - unsigned int chunkPadding(unsigned int i) { return RIFF::File::chunkPadding(i); }; - unsigned int chunkDataSize(unsigned int i) { return RIFF::File::chunkDataSize(i); }; - ByteVector chunkName(unsigned int i) { return RIFF::File::chunkName(i); }; - ByteVector chunkData(unsigned int i) { return RIFF::File::chunkData(i); }; - void setChunkData(unsigned int i, const ByteVector &data) { - RIFF::File::setChunkData(i, data); - } - void setChunkData(const ByteVector &name, const ByteVector &data) { - RIFF::File::setChunkData(name, data); - }; - virtual TagLib::Tag* tag() const { return 0; }; - virtual TagLib::AudioProperties* audioProperties() const { return 0;}; - virtual bool save() { return false; }; - void removeChunk(unsigned int i) { RIFF::File::removeChunk(i); } - void removeChunk(const ByteVector &name) { RIFF::File::removeChunk(name); } -}; - -class TestRIFF : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestRIFF); - CPPUNIT_TEST(testPadding); - CPPUNIT_TEST(testLastChunkAtEvenPosition); - CPPUNIT_TEST(testLastChunkAtEvenPosition2); - CPPUNIT_TEST(testLastChunkAtEvenPosition3); - CPPUNIT_TEST(testChunkOffset); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPadding() - { - ScopedFileCopy copy("empty", ".aiff"); - string filename = copy.fileName(); - - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); - - f.setChunkData("TEST", "foo"); - } - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); - - f.setChunkData("SSND", "abcd"); - - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.chunkData(1)); - - f.seek(f.chunkOffset(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.readBlock(4)); - - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); - - f.seek(f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.readBlock(3)); - } - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.chunkData(1)); - - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); - } - } - - void testLastChunkAtEvenPosition() - { - ScopedFileCopy copy("noise", ".aif"); - string filename = copy.fileName(); - - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4400), f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); - f.setChunkData("TEST", "abcd"); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); - } - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); - } - } - - void testLastChunkAtEvenPosition2() - { - ScopedFileCopy copy("noise_odd", ".aif"); - string filename = copy.fileName(); - - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4399), f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); - f.setChunkData("TEST", "abcd"); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); - } - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); - } - } - - void testLastChunkAtEvenPosition3() - { - ScopedFileCopy copy("noise_odd", ".aif"); - string filename = copy.fileName(); - - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL(long(4399), f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); - f.setChunkData("TEST", "abc"); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); - } - { - PublicRIFF f(filename.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(3)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(3)); - CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); - } - } - - void testChunkOffset() - { - ScopedFileCopy copy("empty", ".aiff"); - string filename = copy.fileName(); - - PublicRIFF f(filename.c_str()); - - CPPUNIT_ASSERT_EQUAL(5928U, f.riffSize()); - CPPUNIT_ASSERT_EQUAL(5936L, f.length()); - CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.chunkName(0)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0026 + 8), f.chunkOffset(1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); - - const ByteVector data(0x400, ' '); - f.setChunkData("SSND", data); - CPPUNIT_ASSERT_EQUAL(1070U, f.riffSize()); - CPPUNIT_ASSERT_EQUAL(1078L, f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0026 + 8), f.chunkOffset(1)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x042E + 8), f.chunkOffset(2)); - - f.seek(f.chunkOffset(0) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); - f.seek(f.chunkOffset(1) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.readBlock(4)); - f.seek(f.chunkOffset(2) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); - - f.setChunkData(0, data); - CPPUNIT_ASSERT_EQUAL(2076U, f.riffSize()); - CPPUNIT_ASSERT_EQUAL(2084L, f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0414 + 8), f.chunkOffset(1)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x081C + 8), f.chunkOffset(2)); - - f.seek(f.chunkOffset(0) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); - f.seek(f.chunkOffset(1) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.readBlock(4)); - f.seek(f.chunkOffset(2) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); - - f.removeChunk("SSND"); - CPPUNIT_ASSERT_EQUAL(1044U, f.riffSize()); - CPPUNIT_ASSERT_EQUAL(1052L, f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0414 + 8), f.chunkOffset(1)); - - f.seek(f.chunkOffset(0) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); - f.seek(f.chunkOffset(1) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); - - f.removeChunk(0); - CPPUNIT_ASSERT_EQUAL(12U, f.riffSize()); - CPPUNIT_ASSERT_EQUAL(20L, f.length()); - CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); - - f.seek(f.chunkOffset(0) - 8); - CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestRIFF); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_s3m.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_s3m.cpp deleted file mode 100755 index fd211d220..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_s3m.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <s3mfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("test song name"); -static const String titleAfter("changed title"); - -static const String commentBefore( - "This is an instrument name.\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - " "); - -static const String newComment( - "This is an instrument name!\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - "-----------------------------------\n" - "This line will be dropped and the previous is truncated."); - -static const String commentAfter( - "This is an instrument name!\n" - "Module file formats\n" - "abuse instrument names\n" - "as multiline comments.\n" - "---------------------------"); - -class TestS3M : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestS3M); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testWriteTags); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.s3m"), titleBefore, commentBefore); - } - - void testWriteTags() - { - ScopedFileCopy copy("test", ".s3m"); - { - S3M::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(newComment); - file.tag()->setTrackerName("won't be saved"); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, commentAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.s3m"))); - } - -private: - void testRead(FileName fileName, const String &title, const String &comment) - { - S3M::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - S3M::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL( 0, p->length()); - CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, p->channels()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL(false, p->stereo()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 5, p->sampleCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->flags()); - CPPUNIT_ASSERT_EQUAL((unsigned short)4896, p->trackerVersion()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 2, p->fileFormatVersion()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 64, p->globalVolume()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 48, p->masterVolume()); - CPPUNIT_ASSERT_EQUAL((unsigned char)125, p->tempo()); - CPPUNIT_ASSERT_EQUAL((unsigned char) 6, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String(), t->artist()); - CPPUNIT_ASSERT_EQUAL(String(), t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String(), t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String("ScreamTracker III"), t->trackerName()); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestS3M); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_speex.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_speex.cpp deleted file mode 100755 index 1f5bb754a..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_speex.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/*************************************************************************** - copyright : (C) 2015 by Tsuda Kageyu - email : tsuda.kageyu@gmail.com - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <speexfile.h> -#include <oggpageheader.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestSpeex : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestSpeex); - CPPUNIT_TEST(testAudioProperties); - CPPUNIT_TEST(testSplitPackets); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testAudioProperties() - { - Ogg::Speex::File f(TEST_FILE_PATH_C("empty.spx")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(53, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(-1, f.audioProperties()->bitrateNominal()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - } - - void testSplitPackets() - { - ScopedFileCopy copy("empty", ".spx"); - string newname = copy.fileName(); - - const String text = longText(128 * 1024, true); - - { - Ogg::Speex::File f(newname.c_str()); - f.tag()->setTitle(text); - f.save(); - } - { - Ogg::Speex::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(156330L, f.length()); - CPPUNIT_ASSERT_EQUAL(23, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(131116U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - - f.tag()->setTitle("ABCDE"); - f.save(); - } - { - Ogg::Speex::File f(newname.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT_EQUAL(24317L, f.length()); - CPPUNIT_ASSERT_EQUAL(7, f.lastPageHeader()->pageSequenceNumber()); - CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size()); - CPPUNIT_ASSERT_EQUAL(49U, f.packet(1).size()); - CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size()); - CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size()); - CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); - - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestSpeex); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_string.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_string.cpp deleted file mode 100755 index 7b60b8147..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_string.cpp +++ /dev/null @@ -1,371 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <tstring.h> -#include <string.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestString : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestString); - CPPUNIT_TEST(testString); - CPPUNIT_TEST(testRfind); - CPPUNIT_TEST(testUTF16Encode); - CPPUNIT_TEST(testUTF16Decode); - CPPUNIT_TEST(testUTF16DecodeInvalidBOM); - CPPUNIT_TEST(testUTF16DecodeEmptyWithBOM); - CPPUNIT_TEST(testSurrogatePair); - CPPUNIT_TEST(testAppendCharDetach); - CPPUNIT_TEST(testAppendStringDetach); - CPPUNIT_TEST(testToInt); - CPPUNIT_TEST(testFromInt); - CPPUNIT_TEST(testSubstr); - CPPUNIT_TEST(testNewline); - CPPUNIT_TEST(testUpper); - CPPUNIT_TEST(testEncodeNonLatin1); - CPPUNIT_TEST(testEncodeEmpty); - CPPUNIT_TEST(testEncodeNonBMP); - CPPUNIT_TEST(testIterator); - CPPUNIT_TEST(testInvalidUTF8); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testString() - { - String s = "taglib string"; - ByteVector v = "taglib string"; - CPPUNIT_ASSERT(v == s.data(String::Latin1)); - - char str[] = "taglib string"; - CPPUNIT_ASSERT(strcmp(s.toCString(), str) == 0); - CPPUNIT_ASSERT(s == "taglib string"); - CPPUNIT_ASSERT(s != "taglib STRING"); - CPPUNIT_ASSERT(s != "taglib"); - CPPUNIT_ASSERT(s != "taglib string taglib"); - CPPUNIT_ASSERT(s == L"taglib string"); - CPPUNIT_ASSERT(s != L"taglib STRING"); - CPPUNIT_ASSERT(s != L"taglib"); - CPPUNIT_ASSERT(s != L"taglib string taglib"); - - s.clear(); - CPPUNIT_ASSERT(s.isEmpty()); - - String unicode("José Carlos", String::UTF8); - CPPUNIT_ASSERT(strcmp(unicode.toCString(), "Jos\xe9 Carlos") == 0); - - String latin = "Jos\xe9 Carlos"; - CPPUNIT_ASSERT(strcmp(latin.toCString(true), "José Carlos") == 0); - - String c; - c = "1"; - CPPUNIT_ASSERT(c == L"1"); - - c = L'\u4E00'; - CPPUNIT_ASSERT(c == L"\u4E00"); - - String unicode2(unicode.to8Bit(true), String::UTF8); - CPPUNIT_ASSERT(unicode == unicode2); - - String unicode3(L"\u65E5\u672C\u8A9E"); - CPPUNIT_ASSERT(*(unicode3.toCWString() + 1) == L'\u672C'); - - String unicode4(L"\u65e5\u672c\u8a9e", String::UTF16BE); - CPPUNIT_ASSERT(unicode4[1] == L'\u672c'); - - String unicode5(L"\u65e5\u672c\u8a9e", String::UTF16LE); - CPPUNIT_ASSERT(unicode5[1] == L'\u2c67'); - - std::wstring stduni = L"\u65e5\u672c\u8a9e"; - - String unicode6(stduni, String::UTF16BE); - CPPUNIT_ASSERT(unicode6[1] == L'\u672c'); - - String unicode7(stduni, String::UTF16LE); - CPPUNIT_ASSERT(unicode7[1] == L'\u2c67'); - - CPPUNIT_ASSERT(String(" foo ").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String("foo ").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String(" foo").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String("foo").stripWhiteSpace() == String("foo")); - CPPUNIT_ASSERT(String("f o o").stripWhiteSpace() == String("f o o")); - CPPUNIT_ASSERT(String(" f o o ").stripWhiteSpace() == String("f o o")); - - CPPUNIT_ASSERT(memcmp(String("foo").data(String::Latin1).data(), "foo", 3) == 0); - CPPUNIT_ASSERT(memcmp(String("f").data(String::Latin1).data(), "f", 1) == 0); - } - - void testUTF16Encode() - { - String a("foo"); - ByteVector b("\0f\0o\0o", 6); - ByteVector c("f\0o\0o\0", 6); - ByteVector d("\377\376f\0o\0o\0", 8); - CPPUNIT_ASSERT(a.data(String::UTF16BE) != a.data(String::UTF16LE)); - CPPUNIT_ASSERT(b == a.data(String::UTF16BE)); - CPPUNIT_ASSERT(c == a.data(String::UTF16LE)); - CPPUNIT_ASSERT_EQUAL(d, a.data(String::UTF16)); - } - - void testUTF16Decode() - { - String a("foo"); - ByteVector b("\0f\0o\0o", 6); - ByteVector c("f\0o\0o\0", 6); - ByteVector d("\377\376f\0o\0o\0", 8); - CPPUNIT_ASSERT_EQUAL(a, String(b, String::UTF16BE)); - CPPUNIT_ASSERT_EQUAL(a, String(c, String::UTF16LE)); - CPPUNIT_ASSERT_EQUAL(a, String(d, String::UTF16)); - } - - // this test is expected to print "TagLib: String::prepare() - - // Invalid UTF16 string." on the console 3 times - void testUTF16DecodeInvalidBOM() - { - ByteVector b(" ", 1); - ByteVector c(" ", 2); - ByteVector d(" \0f\0o\0o", 8); - CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(c, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(d, String::UTF16)); - } - - void testUTF16DecodeEmptyWithBOM() - { - ByteVector a("\377\376", 2); - ByteVector b("\376\377", 2); - CPPUNIT_ASSERT_EQUAL(String(), String(a, String::UTF16)); - CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); - } - - void testSurrogatePair() - { - // Make sure that a surrogate pair is converted into single UTF-8 char - // and vice versa. - - const ByteVector v1("\xff\xfe\x42\xd8\xb7\xdf\xce\x91\x4b\x5c"); - const ByteVector v2("\xf0\xa0\xae\xb7\xe9\x87\x8e\xe5\xb1\x8b"); - - const String s1(v1, String::UTF16); - CPPUNIT_ASSERT_EQUAL(s1.data(String::UTF8), v2); - - const String s2(v2, String::UTF8); - CPPUNIT_ASSERT_EQUAL(s2.data(String::UTF16), v1); - - const ByteVector v3("\xfe\xff\xd8\x01\x30\x42"); - CPPUNIT_ASSERT(String(v3, String::UTF16).data(String::UTF8).isEmpty()); - - const ByteVector v4("\xfe\xff\x30\x42\xdc\x01"); - CPPUNIT_ASSERT(String(v4, String::UTF16).data(String::UTF8).isEmpty()); - - const ByteVector v5("\xfe\xff\xdc\x01\xd8\x01"); - CPPUNIT_ASSERT(String(v5, String::UTF16).data(String::UTF8).isEmpty()); - } - - void testAppendStringDetach() - { - String a("a"); - String b = a; - a += "b"; - CPPUNIT_ASSERT_EQUAL(String("ab"), a); - CPPUNIT_ASSERT_EQUAL(String("a"), b); - } - - void testAppendCharDetach() - { - String a("a"); - String b = a; - a += 'b'; - CPPUNIT_ASSERT_EQUAL(String("ab"), a); - CPPUNIT_ASSERT_EQUAL(String("a"), b); - } - - void testRfind() - { - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 0)); - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 1)); - CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 2)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 3)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 4)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 5)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 6)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 7)); - CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".")); - } - - void testToInt() - { - bool ok; - CPPUNIT_ASSERT_EQUAL(String("123").toInt(&ok), 123); - CPPUNIT_ASSERT_EQUAL(ok, true); - - CPPUNIT_ASSERT_EQUAL(String("-123").toInt(&ok), -123); - CPPUNIT_ASSERT_EQUAL(ok, true); - - CPPUNIT_ASSERT_EQUAL(String("abc").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("1x").toInt(&ok), 1); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("-").toInt(&ok), 0); - CPPUNIT_ASSERT_EQUAL(ok, false); - - CPPUNIT_ASSERT_EQUAL(String("123").toInt(), 123); - CPPUNIT_ASSERT_EQUAL(String("-123").toInt(), -123); - CPPUNIT_ASSERT_EQUAL(String("123aa").toInt(), 123); - CPPUNIT_ASSERT_EQUAL(String("-123aa").toInt(), -123); - - CPPUNIT_ASSERT_EQUAL(String("0000").toInt(), 0); - CPPUNIT_ASSERT_EQUAL(String("0001").toInt(), 1); - - String("2147483648").toInt(&ok); - CPPUNIT_ASSERT_EQUAL(ok, false); - - String("-2147483649").toInt(&ok); - CPPUNIT_ASSERT_EQUAL(ok, false); - } - - void testFromInt() - { - CPPUNIT_ASSERT_EQUAL(String::number(0), String("0")); - CPPUNIT_ASSERT_EQUAL(String::number(12345678), String("12345678")); - CPPUNIT_ASSERT_EQUAL(String::number(-12345678), String("-12345678")); - } - - void testSubstr() - { - CPPUNIT_ASSERT_EQUAL(String("01"), String("0123456").substr(0, 2)); - CPPUNIT_ASSERT_EQUAL(String("12"), String("0123456").substr(1, 2)); - CPPUNIT_ASSERT_EQUAL(String("123456"), String("0123456").substr(1, 200)); - CPPUNIT_ASSERT_EQUAL(String("0123456"), String("0123456").substr(0, 7)); - CPPUNIT_ASSERT_EQUAL(String("0123456"), String("0123456").substr(0, 200)); - } - - void testNewline() - { - ByteVector cr("abc\x0dxyz", 7); - ByteVector lf("abc\x0axyz", 7); - ByteVector crlf("abc\x0d\x0axyz", 8); - - CPPUNIT_ASSERT_EQUAL((unsigned int)7, String(cr).size()); - CPPUNIT_ASSERT_EQUAL((unsigned int)7, String(lf).size()); - CPPUNIT_ASSERT_EQUAL((unsigned int)8, String(crlf).size()); - - CPPUNIT_ASSERT_EQUAL(L'\x0d', String(cr)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0a', String(lf)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0d', String(crlf)[3]); - CPPUNIT_ASSERT_EQUAL(L'\x0a', String(crlf)[4]); - } - - void testUpper() - { - String s1 = "tagLIB 012 strING"; - String s2 = s1.upper(); - CPPUNIT_ASSERT_EQUAL(String("tagLIB 012 strING"), s1); - CPPUNIT_ASSERT_EQUAL(String("TAGLIB 012 STRING"), s2); - } - - void testEncodeNonLatin1() - { - const String jpn(L"\u65E5\u672C\u8A9E"); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xE5\x2C\x9E"), jpn.data(String::Latin1)); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"), jpn.data(String::UTF8)); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xFF\xFE\xE5\x65\x2C\x67\x9E\x8A"), jpn.data(String::UTF16)); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xE5\x65\x2C\x67\x9E\x8A"), jpn.data(String::UTF16LE)); - CPPUNIT_ASSERT_EQUAL(ByteVector("\x65\xE5\x67\x2C\x8A\x9E"), jpn.data(String::UTF16BE)); - CPPUNIT_ASSERT_EQUAL(std::string("\xE5\x2C\x9E"), jpn.to8Bit(false)); - CPPUNIT_ASSERT_EQUAL(std::string("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"), jpn.to8Bit(true)); - } - - void testEncodeEmpty() - { - const String empty; - CPPUNIT_ASSERT(empty.data(String::Latin1).isEmpty()); - CPPUNIT_ASSERT(empty.data(String::UTF8).isEmpty()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xFF\xFE"), empty.data(String::UTF16)); - CPPUNIT_ASSERT(empty.data(String::UTF16LE).isEmpty()); - CPPUNIT_ASSERT(empty.data(String::UTF16BE).isEmpty()); - CPPUNIT_ASSERT(empty.to8Bit(false).empty()); - CPPUNIT_ASSERT(empty.to8Bit(true).empty()); - } - - void testEncodeNonBMP() - { - const ByteVector a("\xFF\xFE\x3C\xD8\x50\xDD\x40\xD8\xF5\xDC\x3C\xD8\x00\xDE", 14); - const ByteVector b("\xF0\x9F\x85\x90\xF0\xA0\x83\xB5\xF0\x9F\x88\x80"); - CPPUNIT_ASSERT_EQUAL(b, String(a, String::UTF16).data(String::UTF8)); - } - - void testIterator() - { - String s1 = "taglib string"; - String s2 = s1; - - String::Iterator it1 = s1.begin(); - String::Iterator it2 = s2.begin(); - - CPPUNIT_ASSERT_EQUAL(L't', *it1); - CPPUNIT_ASSERT_EQUAL(L't', *it2); - - std::advance(it1, 4); - std::advance(it2, 4); - *it2 = L'I'; - CPPUNIT_ASSERT_EQUAL(L'i', *it1); - CPPUNIT_ASSERT_EQUAL(L'I', *it2); - } - - void testInvalidUTF8() - { - CPPUNIT_ASSERT_EQUAL(String("/"), String(ByteVector("\x2F"), String::UTF8)); - CPPUNIT_ASSERT(String(ByteVector("\xC0\xAF"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xE0\x80\xAF"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xF0\x80\x80\xAF"), String::UTF8).isEmpty()); - - CPPUNIT_ASSERT(String(ByteVector("\xF8\x80\x80\x80\x80"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xFC\x80\x80\x80\x80\x80"), String::UTF8).isEmpty()); - - CPPUNIT_ASSERT(String(ByteVector("\xC2"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xE0\x80"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xF0\x80\x80"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xF8\x80\x80\x80"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xFC\x80\x80\x80\x80"), String::UTF8).isEmpty()); - - CPPUNIT_ASSERT(String('\x80', String::UTF8).isEmpty()); - - CPPUNIT_ASSERT(String(ByteVector("\xED\xA0\x80\xED\xB0\x80"), String::UTF8).isEmpty()); - CPPUNIT_ASSERT(String(ByteVector("\xED\xB0\x80\xED\xA0\x80"), String::UTF8).isEmpty()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestString); - diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_synchdata.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_synchdata.cpp deleted file mode 100755 index 08d650794..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_synchdata.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - - -#include <id3v2synchdata.h> -#include <cppunit/extensions/HelperMacros.h> - -using namespace std; -using namespace TagLib; - -class TestID3v2SynchData : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestID3v2SynchData); - CPPUNIT_TEST(test1); - CPPUNIT_TEST(test2); - CPPUNIT_TEST(test3); - CPPUNIT_TEST(testToUIntBroken); - CPPUNIT_TEST(testToUIntBrokenAndTooLarge); - CPPUNIT_TEST(testDecode1); - CPPUNIT_TEST(testDecode2); - CPPUNIT_TEST(testDecode3); - CPPUNIT_TEST(testDecode4); - CPPUNIT_TEST_SUITE_END(); - -public: - - void test1() - { - char data[] = { 0, 0, 0, 127 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)127); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(127), v); - } - - void test2() - { - char data[] = { 0, 0, 1, 0 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)128); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(128), v); - } - - void test3() - { - char data[] = { 0, 0, 1, 1 }; - ByteVector v(data, 4); - - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)129); - CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(129), v); - } - - void testToUIntBroken() - { - char data[] = { 0, 0, 0, (char)-1 }; - char data2[] = { 0, 0, (char)-1, (char)-1 }; - - CPPUNIT_ASSERT_EQUAL((unsigned int)255, ID3v2::SynchData::toUInt(ByteVector(data, 4))); - CPPUNIT_ASSERT_EQUAL((unsigned int)65535, ID3v2::SynchData::toUInt(ByteVector(data2, 4))); - } - - void testToUIntBrokenAndTooLarge() - { - char data[] = { 0, 0, 0, (char)-1, 0 }; - ByteVector v(data, 5); - - CPPUNIT_ASSERT_EQUAL((unsigned int)255, ID3v2::SynchData::toUInt(v)); - } - - void testDecode1() - { - ByteVector a("\xff\x00\x00", 3); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x00", 2), a); - } - - void testDecode2() - { - ByteVector a("\xff\x44", 2); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x44", 2), a); - } - - void testDecode3() - { - ByteVector a("\xff\xff\x00", 3); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xff", 2), a); - } - - void testDecode4() - { - ByteVector a("\xff\xff\xff", 3); - a = ID3v2::SynchData::decode(a); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, a.size()); - CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xff\xff", 3), a); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2SynchData); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_trueaudio.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_trueaudio.cpp deleted file mode 100755 index 2a0403673..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_trueaudio.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <id3v1tag.h> -#include <id3v2tag.h> -#include <tpropertymap.h> -#include <trueaudiofile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestTrueAudio : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestTrueAudio); - CPPUNIT_TEST(testReadPropertiesWithoutID3v2); - CPPUNIT_TEST(testReadPropertiesWithTags); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testReadPropertiesWithoutID3v2() - { - TrueAudio::File f(TEST_FILE_PATH_C("empty.tta")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(173, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->ttaVersion()); - } - - void testReadPropertiesWithTags() - { - TrueAudio::File f(TEST_FILE_PATH_C("tagged.tta")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(173, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->ttaVersion()); - } - - void testStripAndProperties() - { - ScopedFileCopy copy("empty", ".tta"); - - { - TrueAudio::File f(copy.fileName().c_str()); - f.ID3v2Tag(true)->setTitle("ID3v2"); - f.ID3v1Tag(true)->setTitle("ID3v1"); - f.save(); - } - { - TrueAudio::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); - f.strip(TrueAudio::File::ID3v2); - CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); - f.strip(TrueAudio::File::ID3v1); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testRepeatedSave() - { - ScopedFileCopy copy("empty", ".tta"); - - { - TrueAudio::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - - f.ID3v2Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - - f.ID3v2Tag()->setTitle("0"); - f.save(); - - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.ID3v2Tag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); - f.save(); - } - { - TrueAudio::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestTrueAudio); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_wav.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_wav.cpp deleted file mode 100755 index fd0c04f71..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_wav.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <id3v2tag.h> -#include <infotag.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <wavfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestWAV : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestWAV); - CPPUNIT_TEST(testPCMProperties); - CPPUNIT_TEST(testALAWProperties); - CPPUNIT_TEST(testFloatProperties); - CPPUNIT_TEST(testZeroSizeDataChunk); - CPPUNIT_TEST(testID3v2Tag); - CPPUNIT_TEST(testSaveID3v23); - CPPUNIT_TEST(testInfoTag); - CPPUNIT_TEST(testStripTags); - CPPUNIT_TEST(testDuplicateTags); - CPPUNIT_TEST(testFuzzedFile1); - CPPUNIT_TEST(testFuzzedFile2); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testPCMWithFactChunk); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testPCMProperties() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("empty.wav")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(32, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); - } - - void testALAWProperties() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("alaw.wav")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(128, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(8000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(28400U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(6, f.audioProperties()->format()); - } - - void testFloatProperties() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("float64.wav")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(97, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(5645, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(4281U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->format()); - } - - void testZeroSizeDataChunk() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("zero-size-chunk.wav")); - CPPUNIT_ASSERT(!f.isValid()); - } - - void testID3v2Tag() - { - ScopedFileCopy copy("empty", ".wav"); - string filename = copy.fileName(); - - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - - f.ID3v2Tag()->setTitle(L"Title"); - f.ID3v2Tag()->setArtist(L"Artist"); - f.save(); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String(L"Title"), f.ID3v2Tag()->title()); - CPPUNIT_ASSERT_EQUAL(String(L"Artist"), f.ID3v2Tag()->artist()); - - f.ID3v2Tag()->setTitle(L""); - f.ID3v2Tag()->setArtist(L""); - f.save(); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String(L""), f.ID3v2Tag()->title()); - CPPUNIT_ASSERT_EQUAL(String(L""), f.ID3v2Tag()->artist()); - } - } - - void testSaveID3v23() - { - ScopedFileCopy copy("empty", ".wav"); - string newname = copy.fileName(); - - String xxx = ByteVector(254, 'X'); - { - RIFF::WAV::File f(newname.c_str()); - CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); - - f.tag()->setTitle(xxx); - f.tag()->setArtist("Artist A"); - f.save(RIFF::WAV::File::AllTags, File::StripOthers, ID3v2::v3); - CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); - } - { - RIFF::WAV::File f2(newname.c_str()); - CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.ID3v2Tag()->header()->majorVersion()); - CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); - CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); - } - } - - void testInfoTag() - { - ScopedFileCopy copy("empty", ".wav"); - string filename = copy.fileName(); - - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(!f.hasInfoTag()); - - f.InfoTag()->setTitle(L"Title"); - f.InfoTag()->setArtist(L"Artist"); - f.save(); - CPPUNIT_ASSERT(f.hasInfoTag()); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(f.hasInfoTag()); - CPPUNIT_ASSERT_EQUAL(String(L"Title"), f.InfoTag()->title()); - CPPUNIT_ASSERT_EQUAL(String(L"Artist"), f.InfoTag()->artist()); - - f.InfoTag()->setTitle(L""); - f.InfoTag()->setArtist(L""); - f.save(); - CPPUNIT_ASSERT(!f.hasInfoTag()); - } - - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.isValid()); - CPPUNIT_ASSERT(!f.hasInfoTag()); - CPPUNIT_ASSERT_EQUAL(String(L""), f.InfoTag()->title()); - CPPUNIT_ASSERT_EQUAL(String(L""), f.InfoTag()->artist()); - } - } - - void testStripTags() - { - ScopedFileCopy copy("empty", ".wav"); - string filename = copy.fileName(); - - { - RIFF::WAV::File f(filename.c_str()); - f.ID3v2Tag()->setTitle("test title"); - f.InfoTag()->setTitle("test title"); - f.save(); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT(f.hasInfoTag()); - f.save(RIFF::WAV::File::ID3v2, File::StripOthers); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT(!f.hasInfoTag()); - f.ID3v2Tag()->setTitle("test title"); - f.InfoTag()->setTitle("test title"); - f.save(); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT(f.hasInfoTag()); - f.save(RIFF::WAV::File::Info, File::StripOthers); - } - { - RIFF::WAV::File f(filename.c_str()); - CPPUNIT_ASSERT(!f.hasID3v2Tag()); - CPPUNIT_ASSERT(f.hasInfoTag()); - } - } - - void testDuplicateTags() - { - ScopedFileCopy copy("duplicate_tags", ".wav"); - - RIFF::WAV::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(17052L, f.length()); - - // duplicate_tags.wav has duplicate ID3v2/INFO tags. - // title() returns "Title2" if can't skip the second tag. - - CPPUNIT_ASSERT(f.hasID3v2Tag()); - CPPUNIT_ASSERT_EQUAL(String("Title1"), f.ID3v2Tag()->title()); - - CPPUNIT_ASSERT(f.hasInfoTag()); - CPPUNIT_ASSERT_EQUAL(String("Title1"), f.InfoTag()->title()); - - f.save(); - CPPUNIT_ASSERT_EQUAL(15898L, f.length()); - CPPUNIT_ASSERT_EQUAL(-1L, f.find("Title2")); - } - - void testFuzzedFile1() - { - RIFF::WAV::File f1(TEST_FILE_PATH_C("infloop.wav")); - CPPUNIT_ASSERT(!f1.isValid()); - } - - void testFuzzedFile2() - { - RIFF::WAV::File f2(TEST_FILE_PATH_C("segfault.wav")); - CPPUNIT_ASSERT(f2.isValid()); - } - - void testStripAndProperties() - { - ScopedFileCopy copy("empty", ".wav"); - - { - RIFF::WAV::File f(copy.fileName().c_str()); - f.ID3v2Tag()->setTitle("ID3v2"); - f.InfoTag()->setTitle("INFO"); - f.save(); - } - { - RIFF::WAV::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); - f.strip(RIFF::WAV::File::ID3v2); - CPPUNIT_ASSERT_EQUAL(String("INFO"), f.properties()["TITLE"].front()); - f.strip(RIFF::WAV::File::Info); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testPCMWithFactChunk() - { - RIFF::WAV::File f(TEST_FILE_PATH_C("pcm_with_fact_chunk.wav")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(32, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestWAV); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_wavpack.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_wavpack.cpp deleted file mode 100755 index 6c64f08da..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_wavpack.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - copyright : (C) 2010 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <apetag.h> -#include <id3v1tag.h> -#include <tbytevectorlist.h> -#include <tpropertymap.h> -#include <wavpackfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestWavPack : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestWavPack); - CPPUNIT_TEST(testNoLengthProperties); - CPPUNIT_TEST(testMultiChannelProperties); - CPPUNIT_TEST(testTaggedProperties); - CPPUNIT_TEST(testFuzzedFile); - CPPUNIT_TEST(testStripAndProperties); - CPPUNIT_TEST(testRepeatedSave); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testNoLengthProperties() - { - WavPack::File f(TEST_FILE_PATH_C("no_length.wv")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isLossless()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(163392U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); - } - - void testMultiChannelProperties() - { - WavPack::File f(TEST_FILE_PATH_C("four_channels.wv")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3833, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(112, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isLossless()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(169031U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); - } - - void testTaggedProperties() - { - WavPack::File f(TEST_FILE_PATH_C("tagged.wv")); - CPPUNIT_ASSERT(f.audioProperties()); - CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); - CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); - CPPUNIT_ASSERT_EQUAL(172, f.audioProperties()->bitrate()); - CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); - CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); - CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isLossless()); - CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); - CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); - CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); - } - - void testFuzzedFile() - { - WavPack::File f(TEST_FILE_PATH_C("infloop.wv")); - CPPUNIT_ASSERT(f.isValid()); - } - - void testStripAndProperties() - { - ScopedFileCopy copy("click", ".wv"); - - { - WavPack::File f(copy.fileName().c_str()); - f.APETag(true)->setTitle("APE"); - f.ID3v1Tag(true)->setTitle("ID3v1"); - f.save(); - } - { - WavPack::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); - f.strip(WavPack::File::APE); - CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); - f.strip(WavPack::File::ID3v1); - CPPUNIT_ASSERT(f.properties().isEmpty()); - } - } - - void testRepeatedSave() - { - ScopedFileCopy copy("click", ".wv"); - - { - WavPack::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(!f.hasAPETag()); - CPPUNIT_ASSERT(!f.hasID3v1Tag()); - - f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.save(); - - f.APETag()->setTitle("0"); - f.save(); - - f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); - f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); - f.save(); - } - { - WavPack::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.hasAPETag()); - CPPUNIT_ASSERT(f.hasID3v1Tag()); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestWavPack); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_xiphcomment.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_xiphcomment.cpp deleted file mode 100755 index 386a3e67e..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_xiphcomment.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/*************************************************************************** - copyright : (C) 2009 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <string> -#include <stdio.h> -#include <xiphcomment.h> -#include <vorbisfile.h> -#include <tpropertymap.h> -#include <tdebug.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -class TestXiphComment : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestXiphComment); - CPPUNIT_TEST(testYear); - CPPUNIT_TEST(testSetYear); - CPPUNIT_TEST(testTrack); - CPPUNIT_TEST(testSetTrack); - CPPUNIT_TEST(testInvalidKeys1); - CPPUNIT_TEST(testInvalidKeys2); - CPPUNIT_TEST(testClearComment); - CPPUNIT_TEST(testRemoveFields); - CPPUNIT_TEST(testPicture); - CPPUNIT_TEST(testLowercaseFields); - CPPUNIT_TEST_SUITE_END(); - -public: - - void testYear() - { - Ogg::XiphComment cmt; - CPPUNIT_ASSERT_EQUAL((unsigned int)0, cmt.year()); - cmt.addField("YEAR", "2009"); - CPPUNIT_ASSERT_EQUAL((unsigned int)2009, cmt.year()); - cmt.addField("DATE", "2008"); - CPPUNIT_ASSERT_EQUAL((unsigned int)2008, cmt.year()); - } - - void testSetYear() - { - Ogg::XiphComment cmt; - cmt.addField("YEAR", "2009"); - cmt.addField("DATE", "2008"); - cmt.setYear(1995); - CPPUNIT_ASSERT(cmt.fieldListMap()["YEAR"].isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("1995"), cmt.fieldListMap()["DATE"].front()); - } - - void testTrack() - { - Ogg::XiphComment cmt; - CPPUNIT_ASSERT_EQUAL((unsigned int)0, cmt.track()); - cmt.addField("TRACKNUM", "7"); - CPPUNIT_ASSERT_EQUAL((unsigned int)7, cmt.track()); - cmt.addField("TRACKNUMBER", "8"); - CPPUNIT_ASSERT_EQUAL((unsigned int)8, cmt.track()); - } - - void testSetTrack() - { - Ogg::XiphComment cmt; - cmt.addField("TRACKNUM", "7"); - cmt.addField("TRACKNUMBER", "8"); - cmt.setTrack(3); - CPPUNIT_ASSERT(cmt.fieldListMap()["TRACKNUM"].isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("3"), cmt.fieldListMap()["TRACKNUMBER"].front()); - } - - void testInvalidKeys1() - { - PropertyMap map; - map[""] = String("invalid key: empty string"); - map["A=B"] = String("invalid key: contains '='"); - map["A~B"] = String("invalid key: contains '~'"); - map["A\x7F" "B"] = String("invalid key: contains '\x7F'"); - map[L"A\x3456" "B"] = String("invalid key: Unicode"); - - Ogg::XiphComment cmt; - PropertyMap unsuccessful = cmt.setProperties(map); - CPPUNIT_ASSERT_EQUAL((unsigned int)5, unsuccessful.size()); - CPPUNIT_ASSERT(cmt.properties().isEmpty()); - } - - void testInvalidKeys2() - { - Ogg::XiphComment cmt; - cmt.addField("", "invalid key: empty string"); - cmt.addField("A=B", "invalid key: contains '='"); - cmt.addField("A~B", "invalid key: contains '~'"); - cmt.addField("A\x7F" "B", "invalid key: contains '\x7F'"); - cmt.addField(L"A\x3456" "B", "invalid key: Unicode"); - CPPUNIT_ASSERT_EQUAL(0U, cmt.fieldCount()); - } - - void testClearComment() - { - ScopedFileCopy copy("empty", ".ogg"); - - { - Ogg::Vorbis::File f(copy.fileName().c_str()); - f.tag()->addField("COMMENT", "Comment1"); - f.save(); - } - { - Ogg::Vorbis::File f(copy.fileName().c_str()); - f.tag()->setComment(""); - CPPUNIT_ASSERT_EQUAL(String(""), f.tag()->comment()); - } - } - - void testRemoveFields() - { - Ogg::Vorbis::File f(TEST_FILE_PATH_C("empty.ogg")); - f.tag()->addField("title", "Title1"); - f.tag()->addField("Title", "Title1", false); - f.tag()->addField("titlE", "Title2", false); - f.tag()->addField("TITLE", "Title3", false); - f.tag()->addField("artist", "Artist1"); - f.tag()->addField("ARTIST", "Artist2", false); - CPPUNIT_ASSERT_EQUAL(String("Title1 Title1 Title2 Title3"), f.tag()->title()); - CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist()); - - f.tag()->removeFields("title", "Title1"); - CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title()); - CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist()); - - f.tag()->removeFields("Artist"); - CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title()); - CPPUNIT_ASSERT(f.tag()->artist().isEmpty()); - - f.tag()->removeAllFields(); - CPPUNIT_ASSERT(f.tag()->title().isEmpty()); - CPPUNIT_ASSERT(f.tag()->artist().isEmpty()); - CPPUNIT_ASSERT_EQUAL(String("Xiph.Org libVorbis I 20050304"), f.tag()->vendorID()); - } - - void testPicture() - { - ScopedFileCopy copy("empty", ".ogg"); - string newname = copy.fileName(); - - { - Vorbis::File f(newname.c_str()); - FLAC::Picture *newpic = new FLAC::Picture(); - newpic->setType(FLAC::Picture::BackCover); - newpic->setWidth(5); - newpic->setHeight(6); - newpic->setColorDepth(16); - newpic->setNumColors(7); - newpic->setMimeType("image/jpeg"); - newpic->setDescription("new image"); - newpic->setData("JPEG data"); - f.tag()->addPicture(newpic); - f.save(); - } - { - Vorbis::File f(newname.c_str()); - List<FLAC::Picture *> lst = f.tag()->pictureList(); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - CPPUNIT_ASSERT_EQUAL((int)5, lst[0]->width()); - CPPUNIT_ASSERT_EQUAL((int)6, lst[0]->height()); - CPPUNIT_ASSERT_EQUAL((int)16, lst[0]->colorDepth()); - CPPUNIT_ASSERT_EQUAL((int)7, lst[0]->numColors()); - CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), lst[0]->mimeType()); - CPPUNIT_ASSERT_EQUAL(String("new image"), lst[0]->description()); - CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), lst[0]->data()); - } - } - - void testLowercaseFields() - { - const ScopedFileCopy copy("lowercase-fields", ".ogg"); - { - Vorbis::File f(copy.fileName().c_str()); - List<FLAC::Picture *> lst = f.tag()->pictureList(); - CPPUNIT_ASSERT_EQUAL(String("TEST TITLE"), f.tag()->title()); - CPPUNIT_ASSERT_EQUAL(String("TEST ARTIST"), f.tag()->artist()); - CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); - f.save(); - } - { - Vorbis::File f(copy.fileName().c_str()); - CPPUNIT_ASSERT(f.find("METADATA_BLOCK_PICTURE") > 0); - } - } - -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestXiphComment); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/test_xm.cpp b/src/plugins/taglib_plugin/taglib-1.11/tests/test_xm.cpp deleted file mode 100755 index fcda4f568..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/test_xm.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/*************************************************************************** - copyright : (C) 2011 by Mathias Panzenböck - email : grosser.meister.morti@gmx.net - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#include <xmfile.h> -#include <cppunit/extensions/HelperMacros.h> -#include "utils.h" - -using namespace std; -using namespace TagLib; - -static const String titleBefore("title of song"); -static const String titleAfter("changed title"); - -static const String trackerNameBefore("MilkyTracker "); -static const String trackerNameAfter("TagLib"); - -static const String commentBefore( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "-+-+-+-+-+-+-+-+-+-+-+\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample\n" - "names\n" - "are sometimes\n" - "also abused as\n" - "comments."); - -static const String newCommentShort( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments."); - -static const String newCommentLong( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments.\n" - "\n\n\n\n\n\n\n" - "TEST"); - -static const String commentAfter( - "Instrument names\n" - "are abused as\n" - "comments in\n" - "module file formats.\n" - "======================\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" - "\n\n\n" - "Sample names\n" - "are sometimes\n" - "also abused as\n" - "comments.\n"); - -class TestXM : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE(TestXM); - CPPUNIT_TEST(testReadTags); - CPPUNIT_TEST(testReadStrippedTags); - CPPUNIT_TEST(testWriteTagsShort); - CPPUNIT_TEST(testWriteTagsLong); - CPPUNIT_TEST_SUITE_END(); - -public: - void testReadTags() - { - testRead(TEST_FILE_PATH_C("test.xm"), titleBefore, - commentBefore, trackerNameBefore); - } - - void testReadStrippedTags() - { - XM::File file(TEST_FILE_PATH_C("stripped.xm")); - CPPUNIT_ASSERT(file.isValid()); - - XM::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->version()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0 , p->restartPosition()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->flags()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 6, p->tempo()); - CPPUNIT_ASSERT_EQUAL((unsigned short)125, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(titleBefore, t->title()); - CPPUNIT_ASSERT_EQUAL(String(), t->artist()); - CPPUNIT_ASSERT_EQUAL(String(), t->album()); - CPPUNIT_ASSERT_EQUAL(String(), t->comment()); - CPPUNIT_ASSERT_EQUAL(String(), t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(String(), t->trackerName()); - } - - void testWriteTagsShort() - { - testWriteTags(newCommentShort); - } - - void testWriteTagsLong() - { - testWriteTags(newCommentLong); - } - -private: - void testRead(FileName fileName, const String &title, - const String &comment, const String &trackerName) - { - XM::File file(fileName); - - CPPUNIT_ASSERT(file.isValid()); - - XM::Properties *p = file.audioProperties(); - Mod::Tag *t = file.tag(); - - CPPUNIT_ASSERT(0 != p); - CPPUNIT_ASSERT(0 != t); - - CPPUNIT_ASSERT_EQUAL(0, p->length()); - CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); - CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); - CPPUNIT_ASSERT_EQUAL(8, p->channels()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->lengthInPatterns()); - CPPUNIT_ASSERT_EQUAL((unsigned short)260, p->version()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->restartPosition()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short)128, p->instrumentCount()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->flags()); - CPPUNIT_ASSERT_EQUAL((unsigned short) 6, p->tempo()); - CPPUNIT_ASSERT_EQUAL((unsigned short)125, p->bpmSpeed()); - CPPUNIT_ASSERT_EQUAL(title, t->title()); - CPPUNIT_ASSERT_EQUAL(String(), t->artist()); - CPPUNIT_ASSERT_EQUAL(String(), t->album()); - CPPUNIT_ASSERT_EQUAL(comment, t->comment()); - CPPUNIT_ASSERT_EQUAL(String(), t->genre()); - CPPUNIT_ASSERT_EQUAL(0U, t->year()); - CPPUNIT_ASSERT_EQUAL(0U, t->track()); - CPPUNIT_ASSERT_EQUAL(trackerName, t->trackerName()); - } - - void testWriteTags(const String &comment) - { - ScopedFileCopy copy("test", ".xm"); - { - XM::File file(copy.fileName().c_str()); - CPPUNIT_ASSERT(file.tag() != 0); - file.tag()->setTitle(titleAfter); - file.tag()->setComment(comment); - file.tag()->setTrackerName(trackerNameAfter); - CPPUNIT_ASSERT(file.save()); - } - testRead(copy.fileName().c_str(), titleAfter, - commentAfter, trackerNameAfter); - CPPUNIT_ASSERT(fileEqual( - copy.fileName(), - TEST_FILE_PATH_C("changed.xm"))); - } -}; - -CPPUNIT_TEST_SUITE_REGISTRATION(TestXM); diff --git a/src/plugins/taglib_plugin/taglib-1.11/tests/utils.h b/src/plugins/taglib_plugin/taglib-1.11/tests/utils.h deleted file mode 100755 index 51d8862b5..000000000 --- a/src/plugins/taglib_plugin/taglib-1.11/tests/utils.h +++ /dev/null @@ -1,150 +0,0 @@ -/*************************************************************************** - copyright : (C) 2007 by Lukas Lalinsky - email : lukas@oxygene.sk - ***************************************************************************/ - -/*************************************************************************** - * This library is free software; you can redistribute it and/or modify * - * it under the terms of the GNU Lesser General Public License version * - * 2.1 as published by the Free Software Foundation. * - * * - * This library is distributed in the hope that it will be useful, but * - * WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * - * Lesser General Public License for more details. * - * * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library; if not, write to the Free Software * - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * - * 02110-1301 USA * - * * - * Alternatively, this file is available under the Mozilla Public * - * License Version 1.1. You may obtain a copy of the License at * - * http://www.mozilla.org/MPL/ * - ***************************************************************************/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef _WIN32 -#include <windows.h> -#else -#include <unistd.h> -#include <fcntl.h> -#include <sys/fcntl.h> -#include <sys/stat.h> -#endif -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <string> -#include <fstream> - -using namespace std; - -inline string testFilePath(const string &filename) -{ - return string(TESTS_DIR "data/") + filename; -} - -#define TEST_FILE_PATH_C(f) testFilePath(f).c_str() - -inline string copyFile(const string &filename, const string &ext) -{ - char testFileName[1024]; - -#ifdef _WIN32 - char tempDir[MAX_PATH + 1]; - GetTempPathA(sizeof(tempDir), tempDir); - wsprintfA(testFileName, "%s\\taglib-test%s", tempDir, ext.c_str()); -#else - snprintf(testFileName, sizeof(testFileName), "/%s/taglib-test%s", P_tmpdir, ext.c_str()); -#endif - - string sourceFileName = testFilePath(filename) + ext; - ifstream source(sourceFileName.c_str(), std::ios::binary); - ofstream destination(testFileName, std::ios::binary); - destination << source.rdbuf(); - return string(testFileName); -} - -inline void deleteFile(const string &filename) -{ - remove(filename.c_str()); -} - -inline bool fileEqual(const string &filename1, const string &filename2) -{ - char buf1[BUFSIZ]; - char buf2[BUFSIZ]; - - ifstream stream1(filename1.c_str(), ios_base::in | ios_base::binary); - ifstream stream2(filename2.c_str(), ios_base::in | ios_base::binary); - - if(!stream1 && !stream2) return true; - if(!stream1 || !stream2) return false; - - for(;;) - { - stream1.read(buf1, BUFSIZ); - stream2.read(buf2, BUFSIZ); - - streamsize n1 = stream1.gcount(); - streamsize n2 = stream2.gcount(); - - if(n1 != n2) return false; - - if(n1 == 0) break; - - if(memcmp(buf1, buf2, static_cast<size_t>(n1)) != 0) return false; - } - - return stream1.good() == stream2.good(); -} - -#ifdef TAGLIB_STRING_H - -namespace TagLib { - - inline String longText(size_t length, bool random = false) - { - const wchar_t chars[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"; - - std::wstring text(length, L'X'); - - if(random) { - for(size_t i = 0; i < length; ++i) - text[i] = chars[rand() % 53]; - } - - return String(text); - } -} - -#endif - -class ScopedFileCopy -{ -public: - ScopedFileCopy(const string &filename, const string &ext, bool deleteFile=true) : - m_deleteFile(deleteFile), - m_filename(copyFile(filename, ext)) - { - } - - ~ScopedFileCopy() - { - if(m_deleteFile) - deleteFile(m_filename); - } - - string fileName() const - { - return m_filename; - } - -private: - const bool m_deleteFile; - const string m_filename; -}; diff --git a/src/plugins/taglib_plugin/taglib_plugin.vcxproj b/src/plugins/taglib_plugin/taglib_plugin.vcxproj index 7528f3741..e36f78996 100755 --- a/src/plugins/taglib_plugin/taglib_plugin.vcxproj +++ b/src/plugins/taglib_plugin/taglib_plugin.vcxproj @@ -259,7 +259,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -278,7 +278,7 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> @@ -286,12 +286,13 @@ <SubSystem>Windows</SubSystem> <TargetMachine>MachineX86</TargetMachine> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-DLL|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -310,7 +311,7 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> @@ -318,12 +319,13 @@ <SubSystem>Windows</SubSystem> <TargetMachine>MachineX86</TargetMachine> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-Con|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -342,7 +344,7 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> @@ -350,12 +352,13 @@ <SubSystem>Windows</SubSystem> <TargetMachine>MachineX86</TargetMachine> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -374,19 +377,20 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> <MapExports>true</MapExports> <SubSystem>Windows</SubSystem> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-DLL|x64'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -405,19 +409,20 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> <MapExports>true</MapExports> <SubSystem>Windows</SubSystem> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-Con|x64'"> <ClCompile> <Optimization>Disabled</Optimization> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>false</MinimalRebuild> <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> @@ -436,13 +441,14 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <GenerateMapFile>true</GenerateMapFile> <MapFileName>$(TargetDir)$(TargetName).map</MapFileName> <MapExports>true</MapExports> <SubSystem>Windows</SubSystem> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> + <AdditionalDependencies>tagD.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -450,7 +456,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -470,12 +476,13 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> <TargetMachine>MachineX86</TargetMachine> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-DLL|Win32'"> @@ -483,7 +490,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -503,12 +510,13 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> <TargetMachine>MachineX86</TargetMachine> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-Con|Win32'"> @@ -516,7 +524,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -536,12 +544,13 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> + <AdditionalLibraryDirectories>../../3rdparty/bin/win32/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> <TargetMachine>MachineX86</TargetMachine> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -549,7 +558,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -569,11 +578,12 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-DLL|x64'"> @@ -581,7 +591,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -601,11 +611,12 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-Con|x64'"> @@ -613,7 +624,7 @@ <InlineFunctionExpansion>Default</InlineFunctionExpansion> <IntrinsicFunctions>true</IntrinsicFunctions> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> - <AdditionalIncludeDirectories>../../;../../3rdparty/include/;taglib-1.11;taglib-1.11/taglib;taglib-1.11/taglib/ape;taglib-1.11/taglib/asf;taglib-1.11/taglib/flac;taglib-1.11/taglib/mpc;taglib-1.11/taglib/mpeg;taglib-1.11/taglib/mpeg/id3v1;taglib-1.11/taglib/mpeg/id3v2;taglib-1.11/taglib/mpeg/id3v2/frames;taglib-1.11/taglib/ogg;taglib-1.11/taglib/ogg/flac;taglib-1.11/taglib/ogg/opus;taglib-1.11/taglib/ogg/speex;taglib-1.11/taglib/ogg/vorbis;taglib-1.11/taglib/toolkit;taglib-1.11/taglib/trueaudio;taglib-1.11/taglib/wavpack;taglib-1.11/taglib/xm;taglib-1.11/taglib/riff;taglib-1.11/taglib/riff/aiff;taglib-1.11/taglib/riff/wav;taglib-1.11/taglib/mod;taglib-1.11/taglib/s3m;taglib-1.11/taglib/mp4;taglib-1.11/taglib/it;taglib-1.11/3rdparty;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>../../;../../3rdparty/include/;../../3rdparty/win32_include/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;TAGLIB_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <PrecompiledHeader> @@ -633,233 +644,20 @@ </ClCompile> <Link> <OutputFile>$(OutDir)$(ProjectName).dll</OutputFile> - <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>false</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalDependencies>tag.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>../../3rdparty/bin/win64/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup> - <ClCompile Include="taglib-1.11\taglib\ape\apefile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ape\apefooter.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ape\apeitem.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ape\apeproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ape\apetag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\asf\asfattribute.cpp" /> - <ClCompile Include="taglib-1.11\taglib\asf\asffile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\asf\asfpicture.cpp" /> - <ClCompile Include="taglib-1.11\taglib\asf\asfproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\asf\asftag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\audioproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\fileref.cpp" /> - <ClCompile Include="taglib-1.11\taglib\flac\flacfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\flac\flacmetadatablock.cpp" /> - <ClCompile Include="taglib-1.11\taglib\flac\flacpicture.cpp" /> - <ClCompile Include="taglib-1.11\taglib\flac\flacproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\flac\flacunknownmetadatablock.cpp" /> - <ClCompile Include="taglib-1.11\taglib\it\itfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\it\itproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mod\modfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mod\modfilebase.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mod\modproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mod\modtag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4atom.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4coverart.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4file.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4item.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4properties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4tag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpc\mpcfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpc\mpcproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v1\id3v1genres.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v1\id3v1tag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\attachedpictureframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\chapterframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\commentsframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\eventtimingcodesframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\generalencapsulatedobjectframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\ownershipframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\podcastframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\popularimeterframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\privateframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\relativevolumeframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\synchronizedlyricsframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\tableofcontentsframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\textidentificationframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\uniquefileidentifierframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\unknownframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\unsynchronizedlyricsframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\urllinkframe.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2extendedheader.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2footer.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2frame.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2framefactory.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2header.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2synchdata.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2tag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegheader.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\mpeg\xingheader.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\flac\oggflacfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\oggfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\oggpage.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\oggpageheader.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\opus\opusfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\opus\opusproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\speex\speexfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\speex\speexproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\vorbis\vorbisfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\vorbis\vorbisproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\ogg\xiphcomment.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\aiff\aifffile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\aiff\aiffproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\rifffile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\wav\infotag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\wav\wavfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\riff\wav\wavproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\s3m\s3mfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\s3m\s3mproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\tag.cpp" /> - <ClCompile Include="taglib-1.11\taglib\tagunion.cpp" /> - <ClCompile Include="taglib-1.11\taglib\tagutils.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevector.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevectorlist.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevectorstream.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tdebug.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tdebuglistener.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tfilestream.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tiostream.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tpropertymap.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\trefcounter.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tstring.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tstringlist.cpp" /> - <ClCompile Include="taglib-1.11\taglib\toolkit\tzlib.cpp" /> - <ClCompile Include="taglib-1.11\taglib\trueaudio\trueaudiofile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\trueaudio\trueaudioproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\wavpack\wavpackfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\wavpack\wavpackproperties.cpp" /> - <ClCompile Include="taglib-1.11\taglib\xm\xmfile.cpp" /> - <ClCompile Include="taglib-1.11\taglib\xm\xmproperties.cpp" /> <ClCompile Include="taglib_plugin.cpp" /> <ClCompile Include="TaglibMetadataReader.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="config.h" /> - <ClInclude Include="taglib-1.11\config.h" /> - <ClInclude Include="taglib-1.11\taglib\ape\apefile.h" /> - <ClInclude Include="taglib-1.11\taglib\ape\apefooter.h" /> - <ClInclude Include="taglib-1.11\taglib\ape\apeitem.h" /> - <ClInclude Include="taglib-1.11\taglib\ape\apeproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\ape\apetag.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asfattribute.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asffile.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asfpicture.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asfproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asftag.h" /> - <ClInclude Include="taglib-1.11\taglib\asf\asfutils.h" /> - <ClInclude Include="taglib-1.11\taglib\audioproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\fileref.h" /> - <ClInclude Include="taglib-1.11\taglib\flac\flacfile.h" /> - <ClInclude Include="taglib-1.11\taglib\flac\flacmetadatablock.h" /> - <ClInclude Include="taglib-1.11\taglib\flac\flacpicture.h" /> - <ClInclude Include="taglib-1.11\taglib\flac\flacproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\flac\flacunknownmetadatablock.h" /> - <ClInclude Include="taglib-1.11\taglib\it\itfile.h" /> - <ClInclude Include="taglib-1.11\taglib\it\itproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\mod\modfile.h" /> - <ClInclude Include="taglib-1.11\taglib\mod\modfilebase.h" /> - <ClInclude Include="taglib-1.11\taglib\mod\modfileprivate.h" /> - <ClInclude Include="taglib-1.11\taglib\mod\modproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\mod\modtag.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4atom.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4coverart.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4file.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4item.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4properties.h" /> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4tag.h" /> - <ClInclude Include="taglib-1.11\taglib\mpc\mpcfile.h" /> - <ClInclude Include="taglib-1.11\taglib\mpc\mpcproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v1\id3v1genres.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v1\id3v1tag.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\attachedpictureframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\chapterframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\commentsframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\eventtimingcodesframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\generalencapsulatedobjectframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\ownershipframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\podcastframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\popularimeterframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\privateframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\relativevolumeframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\synchronizedlyricsframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\tableofcontentsframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\textidentificationframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\uniquefileidentifierframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\unknownframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\unsynchronizedlyricsframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\urllinkframe.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2extendedheader.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2footer.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2frame.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2framefactory.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2header.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2synchdata.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2tag.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegfile.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegheader.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegutils.h" /> - <ClInclude Include="taglib-1.11\taglib\mpeg\xingheader.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\flac\oggflacfile.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\oggfile.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\oggpage.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\oggpageheader.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\opus\opusfile.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\opus\opusproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\speex\speexfile.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\speex\speexproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\vorbis\vorbisfile.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\vorbis\vorbisproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\ogg\xiphcomment.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\aiff\aifffile.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\aiff\aiffproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\rifffile.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\riffutils.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\wav\infotag.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\wav\wavfile.h" /> - <ClInclude Include="taglib-1.11\taglib\riff\wav\wavproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\s3m\s3mfile.h" /> - <ClInclude Include="taglib-1.11\taglib\s3m\s3mproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\tag.h" /> - <ClInclude Include="taglib-1.11\taglib\taglib_export.h" /> - <ClInclude Include="taglib-1.11\taglib\tagunion.h" /> - <ClInclude Include="taglib-1.11\taglib\tagutils.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\taglib.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevector.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevectorlist.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevectorstream.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tdebug.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tdebuglistener.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tfile.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tfilestream.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tiostream.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tlist.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tmap.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tpropertymap.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\trefcounter.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tstring.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tstringlist.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tutils.h" /> - <ClInclude Include="taglib-1.11\taglib\toolkit\tzlib.h" /> - <ClInclude Include="taglib-1.11\taglib\trueaudio\trueaudiofile.h" /> - <ClInclude Include="taglib-1.11\taglib\trueaudio\trueaudioproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\wavpack\wavpackfile.h" /> - <ClInclude Include="taglib-1.11\taglib\wavpack\wavpackproperties.h" /> - <ClInclude Include="taglib-1.11\taglib\xm\xmfile.h" /> - <ClInclude Include="taglib-1.11\taglib\xm\xmproperties.h" /> <ClInclude Include="TaglibMetadataReader.h" /> </ItemGroup> <ItemGroup> diff --git a/src/plugins/taglib_plugin/taglib_plugin.vcxproj.filters b/src/plugins/taglib_plugin/taglib_plugin.vcxproj.filters index 0c03b2340..2603834fa 100755 --- a/src/plugins/taglib_plugin/taglib_plugin.vcxproj.filters +++ b/src/plugins/taglib_plugin/taglib_plugin.vcxproj.filters @@ -5,661 +5,16 @@ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> </Filter> - <Filter Include="taglib-1.11"> - <UniqueIdentifier>{0cd98004-4fac-4cf9-a2d0-5ab57d97b209}</UniqueIdentifier> - </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="taglib_plugin.cpp"> <Filter>plugin</Filter> </ClCompile> - <ClCompile Include="taglib-1.11\taglib\audioproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\fileref.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\tag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\tagunion.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\tagutils.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ape\apefile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ape\apefooter.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ape\apeitem.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ape\apeproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ape\apetag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\asf\asfattribute.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\asf\asffile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\asf\asfpicture.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\asf\asfproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\asf\asftag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\flac\flacfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\flac\flacmetadatablock.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\flac\flacpicture.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\flac\flacproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\flac\flacunknownmetadatablock.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\it\itfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\it\itproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mod\modfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mod\modfilebase.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mod\modproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mod\modtag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4atom.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4coverart.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4file.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4item.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4properties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mp4\mp4tag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpc\mpcfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpc\mpcproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v1\id3v1genres.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v1\id3v1tag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\attachedpictureframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\chapterframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\commentsframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\eventtimingcodesframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\generalencapsulatedobjectframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\ownershipframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\podcastframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\popularimeterframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\privateframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\relativevolumeframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\synchronizedlyricsframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\tableofcontentsframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\textidentificationframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\uniquefileidentifierframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\unknownframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\unsynchronizedlyricsframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\frames\urllinkframe.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2extendedheader.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2footer.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2frame.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2framefactory.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2header.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2synchdata.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\id3v2\id3v2tag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegheader.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\mpegproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\mpeg\xingheader.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\flac\oggflacfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\oggfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\oggpage.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\oggpageheader.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\opus\opusfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\opus\opusproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\speex\speexfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\speex\speexproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\vorbis\vorbisfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\vorbis\vorbisproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\ogg\xiphcomment.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\aiff\aifffile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\aiff\aiffproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\rifffile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\wav\infotag.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\wav\wavfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\riff\wav\wavproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\s3m\s3mfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\s3m\s3mproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevector.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevectorlist.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tbytevectorstream.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tdebug.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tdebuglistener.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tfilestream.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tiostream.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tpropertymap.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\trefcounter.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tstring.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tstringlist.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\toolkit\tzlib.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\trueaudio\trueaudiofile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\trueaudio\trueaudioproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\wavpack\wavpackfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\wavpack\wavpackproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\xm\xmfile.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> - <ClCompile Include="taglib-1.11\taglib\xm\xmproperties.cpp"> - <Filter>taglib-1.11</Filter> - </ClCompile> <ClCompile Include="TaglibMetadataReader.cpp"> <Filter>plugin</Filter> </ClCompile> </ItemGroup> <ItemGroup> - <ClInclude Include="taglib-1.11\taglib\audioproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\fileref.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\tag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\taglib_export.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\tagunion.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\tagutils.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ape\apefile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ape\apefooter.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ape\apeitem.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ape\apeproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ape\apetag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asfattribute.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asffile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asfpicture.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asfproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asftag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\asf\asfutils.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\flac\flacfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\flac\flacmetadatablock.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\flac\flacpicture.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\flac\flacproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\flac\flacunknownmetadatablock.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\it\itfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\it\itproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mod\modfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mod\modfilebase.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mod\modfileprivate.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mod\modproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mod\modtag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4atom.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4coverart.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4file.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4item.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4properties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mp4\mp4tag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpc\mpcfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpc\mpcproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v1\id3v1genres.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v1\id3v1tag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\attachedpictureframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\chapterframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\commentsframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\eventtimingcodesframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\generalencapsulatedobjectframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\ownershipframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\podcastframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\popularimeterframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\privateframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\relativevolumeframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\synchronizedlyricsframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\tableofcontentsframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\textidentificationframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\uniquefileidentifierframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\unknownframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\unsynchronizedlyricsframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\frames\urllinkframe.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2extendedheader.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2footer.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2frame.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2framefactory.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2header.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2synchdata.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\id3v2\id3v2tag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegheader.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\mpegutils.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\mpeg\xingheader.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\flac\oggflacfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\oggfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\oggpage.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\oggpageheader.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\opus\opusfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\opus\opusproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\speex\speexfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\speex\speexproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\vorbis\vorbisfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\vorbis\vorbisproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\ogg\xiphcomment.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\aiff\aifffile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\aiff\aiffproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\rifffile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\riffutils.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\wav\infotag.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\wav\wavfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\riff\wav\wavproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\s3m\s3mfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\s3m\s3mproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\taglib.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevector.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevectorlist.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tbytevectorstream.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tdebug.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tdebuglistener.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tfilestream.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tiostream.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tlist.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tmap.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tpropertymap.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\trefcounter.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tstring.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tstringlist.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tutils.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\toolkit\tzlib.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\trueaudio\trueaudiofile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\trueaudio\trueaudioproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\wavpack\wavpackfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\wavpack\wavpackproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\xm\xmfile.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\taglib\xm\xmproperties.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> - <ClInclude Include="taglib-1.11\config.h"> - <Filter>taglib-1.11</Filter> - </ClInclude> <ClInclude Include="TaglibMetadataReader.h"> <Filter>plugin</Filter> </ClInclude>