Merge pull request #421 from TsudaKageyu/fix-wav-strip

Fixed a bug on stripping tags when saving .WAV files.
This commit is contained in:
Lukáš Lalinský
2014-08-20 10:12:43 +02:00
4 changed files with 129 additions and 26 deletions

View File

@ -219,22 +219,24 @@ void RIFF::File::removeChunk(uint i)
{
if(i >= d->chunks.size())
return;
removeBlock(d->chunks[i].offset - 8, d->chunks[i].size + 8);
d->chunks.erase(d->chunks.begin() + i);
std::vector<Chunk>::iterator it = d->chunks.begin();
std::advance(it, i);
const uint 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;
}
void RIFF::File::removeChunk(const ByteVector &name)
{
std::vector<Chunk> newChunks;
for(size_t i = 0; i < d->chunks.size(); ++i) {
for(int i = d->chunks.size() - 1; i >= 0; --i) {
if(d->chunks[i].name == name)
removeBlock(d->chunks[i].offset - 8, d->chunks[i].size + 8);
else
newChunks.push_back(d->chunks[i]);
removeChunk(i);
}
d->chunks.swap(newChunks);
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -147,24 +147,20 @@ bool RIFF::WAV::File::save(TagTypes tags, bool stripOthers, int id3v2Version)
strip(static_cast<TagTypes>(AllTags & ~tags));
ID3v2::Tag *id3v2tag = d->tag.access<ID3v2::Tag>(ID3v2Index, false);
if(!id3v2tag->isEmpty()) {
if(tags & ID3v2) {
setChunkData(d->tagChunkID, id3v2tag->render(id3v2Version));
d->hasID3v2 = true;
}
if((tags & ID3v2) && !id3v2tag->isEmpty()) {
setChunkData(d->tagChunkID, id3v2tag->render(id3v2Version));
d->hasID3v2 = true;
}
Info::Tag *infotag = d->tag.access<Info::Tag>(InfoIndex, false);
if(!infotag->isEmpty()) {
if(tags & Info) {
int chunkId = findInfoTagChunk();
if(chunkId != -1)
setChunkData(chunkId, infotag->render());
else
setChunkData("LIST", infotag->render(), true);
if((tags & Info) && !infotag->isEmpty()) {
int chunkId = findInfoTagChunk();
if(chunkId != -1)
setChunkData(chunkId, infotag->render());
else
setChunkData("LIST", infotag->render(), true);
d->hasInfo = true;
}
d->hasInfo = true;
}
return true;
@ -222,13 +218,17 @@ void RIFF::WAV::File::read(bool readProperties, Properties::ReadStyle properties
void RIFF::WAV::File::strip(TagTypes tags)
{
if(tags & ID3v2)
if(tags & ID3v2) {
removeChunk(d->tagChunkID);
d->hasID3v2 = false;
}
if(tags & Info){
TagLib::uint chunkId = findInfoTagChunk();
if(chunkId != TagLib::uint(-1))
if(chunkId != TagLib::uint(-1)) {
removeChunk(chunkId);
d->hasInfo = false;
}
}
}