From 59166f675737ef3a7c3bd3942ed8e767ff081005 Mon Sep 17 00:00:00 2001 From: Urs Fleisch Date: Sat, 18 Nov 2023 20:57:19 +0100 Subject: [PATCH] ID3v2: Always pass correct FrameFactory from File to Tag --- taglib/dsdiff/dsdifffile.cpp | 6 +++--- taglib/dsf/dsffile.cpp | 2 +- taglib/flac/flacfile.cpp | 3 ++- taglib/mpeg/mpegfile.cpp | 2 +- taglib/riff/aiff/aifffile.cpp | 2 +- taglib/riff/wav/wavfile.cpp | 4 ++-- taglib/tagunion.h | 9 +++++++++ taglib/trueaudio/trueaudiofile.cpp | 3 ++- 8 files changed, 21 insertions(+), 10 deletions(-) diff --git a/taglib/dsdiff/dsdifffile.cpp b/taglib/dsdiff/dsdifffile.cpp index 107d3921..dbbb8f7c 100644 --- a/taglib/dsdiff/dsdifffile.cpp +++ b/taglib/dsdiff/dsdifffile.cpp @@ -166,7 +166,7 @@ TagLib::Tag *DSDIFF::File::tag() const ID3v2::Tag *DSDIFF::File::ID3v2Tag(bool create) const { - return d->tag.access(ID3v2Index, create); + return d->tag.access(ID3v2Index, create, d->ID3v2FrameFactory); } bool DSDIFF::File::hasID3v2Tag() const @@ -294,7 +294,7 @@ void DSDIFF::File::strip(int tags) removeChildChunk("ID3 ", PROPChunk); removeChildChunk("id3 ", PROPChunk); d->hasID3v2 = false; - d->tag.set(ID3v2Index, new ID3v2::Tag); + d->tag.set(ID3v2Index, new ID3v2::Tag(nullptr, 0, d->ID3v2FrameFactory)); d->duplicateID3V2chunkIndex = -1; d->isID3InPropChunk = false; d->id3v2TagChunkID.setData("ID3 "); @@ -909,7 +909,7 @@ void DSDIFF::File::read(bool readProperties, Properties::ReadStyle propertiesSty } if(!ID3v2Tag()) { - d->tag.access(ID3v2Index, true); + d->tag.access(ID3v2Index, true, d->ID3v2FrameFactory); // By default, ID3 chunk is at root level d->isID3InPropChunk = false; d->hasID3v2 = false; diff --git a/taglib/dsf/dsffile.cpp b/taglib/dsf/dsffile.cpp index 9f4f8c8a..384f4a3b 100644 --- a/taglib/dsf/dsffile.cpp +++ b/taglib/dsf/dsffile.cpp @@ -225,7 +225,7 @@ void DSF::File::read(AudioProperties::ReadStyle propertiesStyle) // A metadata offset of 0 indicates the absence of an ID3v2 tag if(d->metadataOffset == 0) - d->tag = std::make_unique(); + d->tag = std::make_unique(nullptr, 0, d->ID3v2FrameFactory); else d->tag = std::make_unique(this, d->metadataOffset, d->ID3v2FrameFactory); diff --git a/taglib/flac/flacfile.cpp b/taglib/flac/flacfile.cpp index 13a4de89..82a57f47 100644 --- a/taglib/flac/flacfile.cpp +++ b/taglib/flac/flacfile.cpp @@ -360,7 +360,8 @@ bool FLAC::File::save() ID3v2::Tag *FLAC::File::ID3v2Tag(bool create) { - return d->tag.access(FlacID3v2Index, create); + return d->tag.access(FlacID3v2Index, create, + d->ID3v2FrameFactory); } ID3v1::Tag *FLAC::File::ID3v1Tag(bool create) diff --git a/taglib/mpeg/mpegfile.cpp b/taglib/mpeg/mpegfile.cpp index 9c4166d2..8b1c5be3 100644 --- a/taglib/mpeg/mpegfile.cpp +++ b/taglib/mpeg/mpegfile.cpp @@ -297,7 +297,7 @@ bool MPEG::File::save(int tags, StripTags strip, ID3v2::Version version, Duplica ID3v2::Tag *MPEG::File::ID3v2Tag(bool create) { - return d->tag.access(ID3v2Index, create); + return d->tag.access(ID3v2Index, create, d->ID3v2FrameFactory); } ID3v1::Tag *MPEG::File::ID3v1Tag(bool create) diff --git a/taglib/riff/aiff/aifffile.cpp b/taglib/riff/aiff/aifffile.cpp index f31efd59..8d513f17 100644 --- a/taglib/riff/aiff/aifffile.cpp +++ b/taglib/riff/aiff/aifffile.cpp @@ -167,7 +167,7 @@ void RIFF::AIFF::File::read(bool readProperties) } if(!d->tag) - d->tag = std::make_unique(); + d->tag = std::make_unique(nullptr, 0, d->ID3v2FrameFactory); if(readProperties) d->properties = std::make_unique(this, Properties::Average); diff --git a/taglib/riff/wav/wavfile.cpp b/taglib/riff/wav/wavfile.cpp index a3e21b88..570fbd94 100644 --- a/taglib/riff/wav/wavfile.cpp +++ b/taglib/riff/wav/wavfile.cpp @@ -113,7 +113,7 @@ void RIFF::WAV::File::strip(TagTypes tags) removeTagChunks(tags); if(tags & ID3v2) - d->tag.set(ID3v2Index, new ID3v2::Tag()); + d->tag.set(ID3v2Index, new ID3v2::Tag(nullptr, 0, d->ID3v2FrameFactory)); if(tags & Info) d->tag.set(InfoIndex, new RIFF::Info::Tag()); @@ -224,7 +224,7 @@ void RIFF::WAV::File::read(bool readProperties) } if(!d->tag[ID3v2Index]) - d->tag.set(ID3v2Index, new ID3v2::Tag()); + d->tag.set(ID3v2Index, new ID3v2::Tag(nullptr, 0, d->ID3v2FrameFactory)); if(!d->tag[InfoIndex]) d->tag.set(InfoIndex, new RIFF::Info::Tag()); diff --git a/taglib/tagunion.h b/taglib/tagunion.h index d6301a34..165933f9 100644 --- a/taglib/tagunion.h +++ b/taglib/tagunion.h @@ -92,6 +92,15 @@ namespace TagLib { return static_cast(tag(index)); } + template T *access(int index, bool create, const F *factory) + { + if(!create || tag(index)) + return static_cast(tag(index)); + + set(index, new T(nullptr, 0, factory)); + return static_cast(tag(index)); + } + private: TagUnion(const Tag &); TagUnion &operator=(const Tag &); diff --git a/taglib/trueaudio/trueaudiofile.cpp b/taglib/trueaudio/trueaudiofile.cpp index 9757342b..bd47edb8 100644 --- a/taglib/trueaudio/trueaudiofile.cpp +++ b/taglib/trueaudio/trueaudiofile.cpp @@ -217,7 +217,8 @@ ID3v1::Tag *TrueAudio::File::ID3v1Tag(bool create) ID3v2::Tag *TrueAudio::File::ID3v2Tag(bool create) { - return d->tag.access(TrueAudioID3v2Index, create); + return d->tag.access(TrueAudioID3v2Index, create, + d->ID3v2FrameFactory); } void TrueAudio::File::strip(int tags)