FilePrivate() :
properties(0),
tag(0),
- tagChunkID("ID3 ")
+ tagChunkID("ID3 "),
+ hasID3v2(false)
{
}
Properties *properties;
ID3v2::Tag *tag;
ByteVector tagChunkID;
+
+ bool hasID3v2;
};
////////////////////////////////////////////////////////////////////////////////
return d->tag->setProperties(properties);
}
-
RIFF::AIFF::Properties *RIFF::AIFF::File::audioProperties() const
{
return d->properties;
}
setChunkData(d->tagChunkID, d->tag->render());
+ d->hasID3v2 = true;
return true;
}
+bool RIFF::AIFF::File::hasID3v2Tag() const
+{
+ return d->hasID3v2;
+}
////////////////////////////////////////////////////////////////////////////////
// private members
if(chunkName(i) == "ID3 " || chunkName(i) == "id3 ") {
d->tagChunkID = chunkName(i);
d->tag = new ID3v2::Tag(this, chunkOffset(i));
+ d->hasID3v2 = true;
}
else if(chunkName(i) == "COMM" && readProperties)
d->properties = new Properties(chunkData(i), propertiesStyle);
{
CPPUNIT_TEST_SUITE(TestAIFF);
CPPUNIT_TEST(testReading);
+ CPPUNIT_TEST(testSaveID3v2);
CPPUNIT_TEST(testAiffCProperties);
CPPUNIT_TEST(testFuzzedFile1);
CPPUNIT_TEST(testFuzzedFile2);
CPPUNIT_ASSERT_EQUAL(705, f.audioProperties()->bitrate());
}
+ 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();
+ }
+
+ {
+ RIFF::AIFF::File f(newname.c_str());
+ CPPUNIT_ASSERT(f.hasID3v2Tag());
+ CPPUNIT_ASSERT_EQUAL(String(L"TitleXXX"), f.tag()->title());
+ }
+ }
+
void testAiffCProperties()
{
RIFF::AIFF::File f(TEST_FILE_PATH_C("alaw.aifc"));