Fixed a bug on stripping tags when saving .WAV files.

This commit is contained in:
Tsuda Kageyu
2014-08-07 18:49:53 +09:00
parent c23ee5331f
commit 31a74927e4
4 changed files with 129 additions and 26 deletions

View File

@ -20,12 +20,17 @@ public:
TagLib::uint chunkDataSize(TagLib::uint i) { return RIFF::File::chunkDataSize(i); };
ByteVector chunkName(TagLib::uint i) { return RIFF::File::chunkName(i); };
ByteVector chunkData(TagLib::uint i) { return RIFF::File::chunkData(i); };
void setChunkData(uint 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(uint i) { RIFF::File::removeChunk(i); }
void removeChunk(const ByteVector &name) { RIFF::File::removeChunk(name); }
};
class TestRIFF : public CppUnit::TestFixture
@ -35,6 +40,7 @@ class TestRIFF : public CppUnit::TestFixture
CPPUNIT_TEST(testLastChunkAtEvenPosition);
CPPUNIT_TEST(testLastChunkAtEvenPosition2);
CPPUNIT_TEST(testLastChunkAtEvenPosition3);
CPPUNIT_TEST(testChunkOffset);
CPPUNIT_TEST_SUITE_END();
public:
@ -193,6 +199,63 @@ public:
delete f;
}
void testChunkOffset()
{
ScopedFileCopy copy("empty", ".aiff");
string filename = copy.fileName();
PublicRIFF *f = new PublicRIFF(filename.c_str());
CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f->chunkName(0));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x000C + 8), f->chunkOffset(0));
CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f->chunkName(1));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x0026 + 8), f->chunkOffset(1));
CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->chunkName(2));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x1728 + 8), f->chunkOffset(2));
const ByteVector data(0x400, ' ');
f->setChunkData("SSND", data);
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x000C + 8), f->chunkOffset(0));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x0026 + 8), f->chunkOffset(1));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(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(TagLib::uint(0x000C + 8), f->chunkOffset(0));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(0x0414 + 8), f->chunkOffset(1));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(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(TagLib::uint(0x000C + 8), f->chunkOffset(0));
CPPUNIT_ASSERT_EQUAL(TagLib::uint(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(TagLib::uint(0x000C + 8), f->chunkOffset(0));
f->seek(f->chunkOffset(0) - 8);
CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f->readBlock(4));
delete f;
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestRIFF);

View File

@ -14,6 +14,7 @@ class TestWAV : public CppUnit::TestFixture
CPPUNIT_TEST_SUITE(TestWAV);
CPPUNIT_TEST(testLength);
CPPUNIT_TEST(testZeroSizeDataChunk);
CPPUNIT_TEST(testStripTags);
CPPUNIT_TEST_SUITE_END();
public:
@ -31,6 +32,43 @@ public:
CPPUNIT_ASSERT_EQUAL(false, f.isValid());
}
void testStripTags()
{
ScopedFileCopy copy("empty", ".wav");
string filename = copy.fileName();
RIFF::WAV::File *f = new RIFF::WAV::File(filename.c_str());
f->ID3v2Tag()->setTitle("test title");
f->InfoTag()->setTitle("test title");
f->save();
delete f;
f = new RIFF::WAV::File(filename.c_str());
CPPUNIT_ASSERT(f->hasID3v2Tag());
CPPUNIT_ASSERT(f->hasInfoTag());
f->save(RIFF::WAV::File::ID3v2, true);
delete f;
f = new RIFF::WAV::File(filename.c_str());
CPPUNIT_ASSERT(f->hasID3v2Tag());
CPPUNIT_ASSERT(!f->hasInfoTag());
f->ID3v2Tag()->setTitle("test title");
f->InfoTag()->setTitle("test title");
f->save();
delete f;
f = new RIFF::WAV::File(filename.c_str());
CPPUNIT_ASSERT(f->hasID3v2Tag());
CPPUNIT_ASSERT(f->hasInfoTag());
f->save(RIFF::WAV::File::Info, true);
delete f;
f = new RIFF::WAV::File(filename.c_str());
CPPUNIT_ASSERT(!f->hasID3v2Tag());
CPPUNIT_ASSERT(f->hasInfoTag());
delete f;
}
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestWAV);