]> granicus.if.org Git - taglib/commitdiff
Handle WM/TrackNumber with DWORD content
authorLukáš Lalinský <lalinsky@gmail.com>
Sun, 13 Dec 2009 15:32:55 +0000 (15:32 +0000)
committerLukáš Lalinský <lalinsky@gmail.com>
Sun, 13 Dec 2009 15:32:55 +0000 (15:32 +0000)
The default type for this attribute is String, but even MSDN suggests to
support also DWORD, because some applications write such files.

BUG:218526

git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1062026 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

taglib/asf/asftag.cpp
tests/test_asf.cpp

index 6bea247f2d710f7d3e81675b2e714d940050c05c..f910ccb06b1bcb750164708bf7ee41103d836f0d 100644 (file)
@@ -105,8 +105,13 @@ ASF::Tag::year() const
 unsigned int
 ASF::Tag::track() const
 {
-  if(d->attributeListMap.contains("WM/TrackNumber"))
-    return d->attributeListMap["WM/TrackNumber"][0].toString().toInt();
+  if(d->attributeListMap.contains("WM/TrackNumber")) {
+    const ASF::Attribute attr = d->attributeListMap["WM/TrackNumber"][0];
+    if(attr.type() == ASF::Attribute::DWordType)
+      return attr.toUInt();
+    else
+      return attr.toString().toInt();
+  }
   if(d->attributeListMap.contains("WM/Track"))
     return d->attributeListMap["WM/Track"][0].toUInt();
   return 0;
index 8de44ea4aca295b2e9ac47ec01d7c36acae41da3..16fae66372b67c3b3e35fa15f1d5ad501c23b942 100644 (file)
@@ -18,6 +18,7 @@ class TestASF : public CppUnit::TestFixture
   CPPUNIT_TEST(testSaveMultipleValues);
   CPPUNIT_TEST(testSaveStream);
   CPPUNIT_TEST(testSaveLanguage);
+  CPPUNIT_TEST(testDWordTrackNumber);
   CPPUNIT_TEST_SUITE_END();
 
 public:
@@ -55,6 +56,32 @@ public:
     delete f;
   }
 
+  void testDWordTrackNumber()
+  {
+    ScopedFileCopy copy("silence-1", ".wma");
+    string newname = copy.fileName();
+
+    ASF::File *f = new ASF::File(newname.c_str());
+    CPPUNIT_ASSERT(!f->tag()->attributeListMap().contains("WM/TrackNumber"));
+    f->tag()->setAttribute("WM/TrackNumber", (unsigned int)(123));
+    f->save();
+    delete f;
+
+    f = new ASF::File(newname.c_str());
+    CPPUNIT_ASSERT(f->tag()->attributeListMap().contains("WM/TrackNumber"));
+    CPPUNIT_ASSERT_EQUAL(ASF::Attribute::DWordType, f->tag()->attributeListMap()["WM/TrackNumber"].front().type());
+    CPPUNIT_ASSERT_EQUAL(TagLib::uint(123), f->tag()->track());
+    f->tag()->setTrack(234);
+    f->save();
+    delete f;
+
+    f = new ASF::File(newname.c_str());
+    CPPUNIT_ASSERT(f->tag()->attributeListMap().contains("WM/TrackNumber"));
+    CPPUNIT_ASSERT_EQUAL(ASF::Attribute::UnicodeType, f->tag()->attributeListMap()["WM/TrackNumber"].front().type());
+    CPPUNIT_ASSERT_EQUAL(TagLib::uint(234), f->tag()->track());
+    delete f;
+  }
+
   void testSaveStream()
   {
     ScopedFileCopy copy("silence-1", ".wma");