diff --git a/mpeg/mpegfile.cpp b/mpeg/mpegfile.cpp index 56c1b487..cf126ce8 100644 --- a/mpeg/mpegfile.cpp +++ b/mpeg/mpegfile.cpp @@ -263,12 +263,17 @@ bool MPEG::File::save() bool MPEG::File::save(int tags) { - if(tags == NoTags) + return save(tags, true); +} + +bool MPEG::File::save(int tags, bool stripOthers) +{ + if(tags == NoTags && stripOthers) return strip(AllTags); if(!d->ID3v2Tag && !d->ID3v1Tag && !d->APETag) { - if(d->hasID3v1 || d->hasID3v2 || d->hasAPE) + if((d->hasID3v1 || d->hasID3v2 || d->hasAPE) && stripOthers) return strip(AllTags); return true; @@ -299,10 +304,10 @@ bool MPEG::File::save(int tags) insert(d->ID3v2Tag->render(), d->ID3v2Location, d->ID3v2OriginalSize); } - else + else if(stripOthers) success = strip(ID3v2, false) && success; } - else if(d->hasID3v2) + else if(d->hasID3v2 && stripOthers) success = strip(ID3v2) && success; if(ID3v1 & tags) { @@ -311,13 +316,14 @@ bool MPEG::File::save(int tags) seek(offset, End); writeBlock(d->ID3v1Tag->render()); } - else + else if(stripOthers) success = strip(ID3v1) && success; } - else if(d->hasID3v1) + else if(d->hasID3v1 && stripOthers) success = strip(ID3v1, false) && success; // Dont save an APE-tag unless one has been created + if((APE & tags) && d->APETag) { if(d->hasAPE) insert(d->APETag->render(), d->APELocation, d->APEOriginalSize); @@ -338,7 +344,7 @@ bool MPEG::File::save(int tags) } } } - else if(d->hasAPE) + else if(d->hasAPE && stripOthers) success = strip(APE, false) && success; return success; diff --git a/mpeg/mpegfile.h b/mpeg/mpegfile.h index 431523e0..dca5ae12 100644 --- a/mpeg/mpegfile.h +++ b/mpeg/mpegfile.h @@ -144,6 +144,18 @@ namespace TagLib { */ bool save(int tags); + /*! + * Save the file. This will attempt to save all of the tag types that are + * specified by OR-ing together TagTypes values. The save() method above + * uses AllTags. This returns true if saving was successful. + * + * If \a stripOthers is true this strips all tags not included in the mask, + * but does not modify them in memory, so later calls to save() which make + * use of these tags will remain valid. This also strips empty tags. + */ + // BIC: combine with the above method + bool save(int tags, bool stripOthers); + /*! * Returns a pointer to the ID3v2 tag of the file. *