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]);
#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;
#include <textidentificationframe.h>
#include <attachedpictureframe.h>
#include <generalencapsulatedobjectframe.h>
+#include <relativevolumeframe.h>
using namespace std;
using namespace TagLib;
CPPUNIT_TEST(testReadStringField);
CPPUNIT_TEST(testParseAPIC);
CPPUNIT_TEST(testParseGEOB);
+ CPPUNIT_TEST(testParseRelativeVolumeFrame);
CPPUNIT_TEST(testBrokenFrame1);
//CPPUNIT_TEST(testItunes24FrameSize);
CPPUNIT_TEST_SUITE_END();
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()
{