]> granicus.if.org Git - taglib/commitdiff
Add methods RelativeVolumeFrame::identification and RelativeVolumeFrame::setIdentific...
authorLukáš Lalinský <lalinsky@gmail.com>
Sat, 10 Nov 2007 21:32:32 +0000 (21:32 +0000)
committerLukáš Lalinský <lalinsky@gmail.com>
Sat, 10 Nov 2007 21:32:32 +0000 (21:32 +0000)
BUG:150481

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

taglib/mpeg/id3v2/frames/relativevolumeframe.cpp
taglib/mpeg/id3v2/frames/relativevolumeframe.h
tests/test_id3v2.cpp

index 2dac623ad68b4402d63967fd5a622bd00cd47e0f..8b9f85bf2ad01fc20baccf700e2da91a6420cc97 100644 (file)
@@ -162,20 +162,28 @@ void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak)
   setPeakVolume(peak, MasterVolume);
 }
 
+String RelativeVolumeFrame::identification() const
+{
+  return d->identification;
+}
+
+void RelativeVolumeFrame::setIdentification(const String &s)
+{
+  d->identification = s;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // protected members
 ////////////////////////////////////////////////////////////////////////////////
 
 void RelativeVolumeFrame::parseFields(const ByteVector &data)
 {
-  ByteVector delimiter = textDelimiter(String::Latin1);
-  uint pos = data.find(delimiter);
-  d->identification = String(data.mid(0, pos), String::Latin1);
-  pos += delimiter.size();
+  int pos = 0;
+  d->identification = readStringField(data, String::Latin1, &pos);
 
   // Each channel is at least 4 bytes.
 
-  while(pos <= data.size() - 4) {
+  while(pos <= (int)data.size() - 4) {
 
 
     ChannelType type = ChannelType(data[pos]);
index fbba54bc2704669a33c6149d9584877d0a18e105..29c7d9e871d098008b652cac8e0ac3d14fa686fe 100644 (file)
@@ -244,6 +244,18 @@ namespace TagLib {
 
 #endif
 
+      /*!
+       * Returns the identification for this frame.
+       */
+      String identification() const;
+
+      /*!
+       * Sets the identification of the frame to \a s. The string
+       * is used to identify the situation and/or device where this
+       * adjustment should apply.
+       */
+      void setIdentification(const String &s);
+
     protected:
       virtual void parseFields(const ByteVector &data);
       virtual ByteVector renderFields() const;
index 9a07765d6f841b95b8d2d6a1a90728fe8b320621..e4ead22af68755bb6f8b3ea70cf1cf358620dff5 100644 (file)
@@ -7,6 +7,7 @@
 #include <textidentificationframe.h>
 #include <attachedpictureframe.h>
 #include <generalencapsulatedobjectframe.h>
+#include <relativevolumeframe.h>
 
 using namespace std;
 using namespace TagLib;
@@ -32,6 +33,7 @@ class TestID3v2 : public CppUnit::TestFixture
   CPPUNIT_TEST(testReadStringField);
   CPPUNIT_TEST(testParseAPIC);
   CPPUNIT_TEST(testParseGEOB);
+  CPPUNIT_TEST(testParseRelativeVolumeFrame);
   CPPUNIT_TEST(testBrokenFrame1);
   //CPPUNIT_TEST(testItunes24FrameSize);
   CPPUNIT_TEST_SUITE_END();
@@ -112,6 +114,26 @@ public:
     CPPUNIT_ASSERT_EQUAL(String("d"), f.description());
   }
 
+  // http://bugs.kde.org/show_bug.cgi?id=150481
+  void testParseRelativeVolumeFrame()
+  {
+    ID3v2::RelativeVolumeFrame f(
+      ByteVector("RVA2"              // Frame ID
+                 "\x00\x00\x00\x0B"  // Frame size
+                 "\x00\x00"          // Frame flags
+                 "ident\x00"         // Identification
+                 "\x02"              // Type of channel
+                 "\x00\x0F"          // Volume adjustment
+                 "\x08"              // Bits representing peak
+                 "\x45", 21));       // Peak volume
+    CPPUNIT_ASSERT_EQUAL(String("ident"), f.identification());
+    CPPUNIT_ASSERT_EQUAL(15.0f / 512.0f,
+                         f.volumeAdjustment(ID3v2::RelativeVolumeFrame::FrontRight));
+    CPPUNIT_ASSERT_EQUAL((uchar)8,
+                         f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).bitsRepresentingPeak);
+    CPPUNIT_ASSERT_EQUAL(ByteVector("\x45"),
+                         f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).peakVolume);
+  }
 
   /*void testItunes24FrameSize()
   {