diff --git a/.cvsignore b/.cvsignore
index 61b11a4..d5a5c3d 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1 +1 @@
-taglib-1.5.tar.gz
+taglib-1.6.tar.gz
diff --git a/sources b/sources
index 064762a..f71d0c5 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-7b557dde7425c6deb7bbedd65b4f2717  taglib-1.5.tar.gz
+5ecad0816e586a954bd676a86237d054  taglib-1.6.tar.gz
diff --git a/taglib-1.5-1.6-ape.patch b/taglib-1.5-1.6-ape.patch
deleted file mode 100644
index 4455ea4..0000000
--- a/taglib-1.5-1.6-ape.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-diff -Nur taglib-1.5/taglib/ape/apeitem.cpp taglib/taglib/ape/apeitem.cpp
---- taglib-1.5/taglib/ape/apeitem.cpp	2008-02-12 17:30:25.000000000 +0100
-+++ taglib/taglib/ape/apeitem.cpp	2009-01-11 00:15:33.000000000 +0100
-@@ -160,14 +160,14 @@
- bool APE::Item::isEmpty() const
- {
-   switch(d->type) {
--    case 0:
--    case 1:
-+    case Text:
-+    case Binary:
-       if(d->text.isEmpty())
-         return true;
-       if(d->text.size() == 1 && d->text.front().isEmpty())
-         return true;
-       return false;
--    case 2:
-+    case Locator:
-       return d->value.isEmpty();
-     default:
-       return false;
-@@ -206,8 +206,9 @@
-   if(isEmpty())
-     return data;
- 
--  if(d->type != Item::Binary) {
-+  if(d->type == Text) {
-     StringList::ConstIterator it = d->text.begin();
-+
-     value.append(it->data(String::UTF8));
-     it++;
-     for(; it != d->text.end(); ++it) {
diff --git a/taglib-1.5-1.6-flac.patch b/taglib-1.5-1.6-flac.patch
deleted file mode 100644
index 5b6fe5b..0000000
--- a/taglib-1.5-1.6-flac.patch
+++ /dev/null
@@ -1,133 +0,0 @@
-diff -Nur taglib-1.5/taglib/flac/flacfile.cpp taglib/taglib/flac/flacfile.cpp
---- taglib-1.5/taglib/flac/flacfile.cpp	2008-01-31 06:19:03.000000000 +0100
-+++ taglib/taglib/flac/flacfile.cpp	2009-07-12 23:53:18.000000000 +0200
-@@ -42,6 +42,7 @@
- {
-   enum { XiphIndex = 0, ID3v2Index = 1, ID3v1Index = 2 };
-   enum { StreamInfo = 0, Padding, Application, SeekTable, VorbisComment, CueSheet };
-+  enum { MinPaddingLength = 4096 };
- }
- 
- class FLAC::File::FilePrivate
-@@ -167,9 +168,49 @@
-       uint blockLength = header.mid(1, 3).toUInt();
- 
-       if(blockType == VorbisComment) {
--        data[0] = header[0];
--        insert(data, nextBlockOffset, blockLength + 4);
--        break;
-+
-+        long paddingBreak = 0;
-+
-+        if(!isLastBlock) {
-+          paddingBreak = findPaddingBreak(nextBlockOffset + blockLength + 4,
-+                                          nextBlockOffset + d->xiphCommentData.size() + 8,
-+                                          &isLastBlock);
-+        }
-+
-+        uint paddingLength = 0;
-+
-+         if(paddingBreak) {
-+
-+           // There is space for comment and padding blocks without rewriting the
-+           // whole file.  Note: This cannot overflow.
-+
-+           paddingLength = paddingBreak - (nextBlockOffset + d->xiphCommentData.size() + 8);
-+         }
-+         else {
-+
-+           // Not enough space, so we will have to rewrite the whole file
-+           // following this block
-+
-+           paddingLength = d->xiphCommentData.size();
-+
-+           if(paddingLength < MinPaddingLength)
-+             paddingLength = MinPaddingLength;
-+
-+           paddingBreak = nextBlockOffset + blockLength + 4;
-+         }
-+
-+         ByteVector padding = ByteVector::fromUInt(paddingLength);
-+
-+         padding[0] = 1;
-+
-+         if(isLastBlock)
-+           padding[0] |= 0x80;
-+
-+         padding.resize(paddingLength + 4);
-+         ByteVector pair(data);
-+         pair.append(padding);
-+         insert(pair, nextBlockOffset, paddingBreak - nextBlockOffset);
-+         break;
-       }
- 
-       nextBlockOffset += blockLength + 4;
-@@ -373,11 +414,8 @@
-     isLastBlock = (header[0] & 0x80) != 0;
-     length = header.mid(1, 3).toUInt();
- 
--    if(blockType == Padding) {
--      // debug("FLAC::File::scan() -- Padding found");
--    }
-     // Found the vorbis-comment
--    else if(blockType == VorbisComment) {
-+    if(blockType == VorbisComment) {
-       d->xiphCommentData = readBlock(length);
-       d->hasXiphComment = true;
-     }
-@@ -429,3 +467,34 @@
- 
-   return -1;
- }
-+
-+long FLAC::File::findPaddingBreak(long nextBlockOffset, long targetOffset, bool *isLast)
-+{
-+  // Starting from nextBlockOffset, step over padding blocks to find the
-+  // address of a block which is after targetOffset. Return zero if
-+  // a non-padding block occurs before that point.
-+
-+  while(true) {
-+    seek(nextBlockOffset);
-+
-+    ByteVector header = readBlock(4);
-+    char blockType = header[0] & 0x7f;
-+    bool isLastBlock = header[0] & 0x80;
-+    uint length = header.mid(1, 3).toUInt();
-+
-+    if(blockType != Padding)
-+      break;
-+
-+    nextBlockOffset += 4 + length;
-+
-+    if(nextBlockOffset >= targetOffset) {
-+      *isLast = isLastBlock;
-+      return nextBlockOffset;
-+    }
-+
-+    if(isLastBlock)
-+      break;
-+  }
-+
-+  return 0;
-+}
-diff -Nur taglib-1.5/taglib/flac/flacfile.h taglib/taglib/flac/flacfile.h
---- taglib-1.5/taglib/flac/flacfile.h	2008-01-31 05:07:29.000000000 +0100
-+++ taglib/taglib/flac/flacfile.h	2009-07-12 23:53:18.000000000 +0200
-@@ -191,6 +191,7 @@
-       long findID3v2();
-       long findID3v1();
-       ByteVector xiphCommentData() const;
-+      long findPaddingBreak(long nextPageOffset, long targetOffset, bool *isLast);
- 
-       class FilePrivate;
-       FilePrivate *d;
-diff -Nur taglib-1.5/taglib/flac/flacproperties.cpp taglib/taglib/flac/flacproperties.cpp
---- taglib-1.5/taglib/flac/flacproperties.cpp	2008-01-11 01:55:09.000000000 +0100
-+++ taglib/taglib/flac/flacproperties.cpp	2008-04-08 14:15:20.000000000 +0200
-@@ -146,5 +146,5 @@
- 
-   // Real bitrate:
- 
--  d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0;
-+  d->bitrate = d->length > 0 ? ((d->streamLength * 8UL) / d->length) / 1000 : 0;
- }
diff --git a/taglib-1.5-1.6-mpeg-cmake.patch b/taglib-1.5-1.6-mpeg-cmake.patch
deleted file mode 100644
index 957f3c2..0000000
--- a/taglib-1.5-1.6-mpeg-cmake.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Nur taglib-1.5-orig/taglib/CMakeLists.txt taglib-1.5/taglib/CMakeLists.txt
---- taglib-1.5-orig/taglib/CMakeLists.txt	2008-02-12 05:15:20.000000000 +0100
-+++ taglib-1.5/taglib/CMakeLists.txt	2009-08-22 12:18:40.000000000 +0200
-@@ -62,6 +62,8 @@
- mpeg/id3v2/frames/attachedpictureframe.cpp
- mpeg/id3v2/frames/commentsframe.cpp
- mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp
-+mpeg/id3v2/frames/popularimeterframe.cpp
-+mpeg/id3v2/frames/privateframe.cpp
- mpeg/id3v2/frames/relativevolumeframe.cpp
- mpeg/id3v2/frames/textidentificationframe.cpp
- mpeg/id3v2/frames/uniquefileidentifierframe.cpp
diff --git a/taglib-1.5-1.6-mpeg.patch b/taglib-1.5-1.6-mpeg.patch
deleted file mode 100644
index aa4f1d9..0000000
--- a/taglib-1.5-1.6-mpeg.patch
+++ /dev/null
@@ -1,887 +0,0 @@
-diff -Nur taglib-1.5/taglib/mpeg/mpegheader.cpp taglib/taglib/mpeg/mpegheader.cpp
---- taglib-1.5/taglib/mpeg/mpegheader.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/mpegheader.cpp	2009-01-16 06:16:48.000000000 +0100
-@@ -164,7 +164,7 @@
- void MPEG::Header::parse(const ByteVector &data)
- {
-   if(data.size() < 4 || uchar(data[0]) != 0xff) {
--    debug("MPEG::Header::parse() -- First byte did not mactch MPEG synch.");
-+    debug("MPEG::Header::parse() -- First byte did not match MPEG synch.");
-     return;
-   }
- 
-@@ -173,7 +173,7 @@
-   // Check for the second byte's part of the MPEG synch
- 
-   if(!flags[23] || !flags[22] || !flags[21]) {
--    debug("MPEG::Header::parse() -- Second byte did not mactch MPEG synch.");
-+    debug("MPEG::Header::parse() -- Second byte did not match MPEG synch.");
-     return;
-   }
- 
-diff -Nur taglib-1.5/taglib/mpeg/mpegproperties.cpp taglib/taglib/mpeg/mpegproperties.cpp
---- taglib-1.5/taglib/mpeg/mpegproperties.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/mpegproperties.cpp	2009-07-10 16:34:04.000000000 +0200
-@@ -218,8 +218,10 @@
-       double timePerFrame =
-         double(firstHeader.samplesPerFrame()) / firstHeader.sampleRate();
- 
--      d->length = int(timePerFrame * d->xingHeader->totalFrames());
--      d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / d->length / 1000 : 0;
-+      double length = timePerFrame * d->xingHeader->totalFrames();
-+
-+      d->length = int(length);
-+      d->bitrate = d->length > 0 ? d->xingHeader->totalSize() * 8 / length / 1000 : 0;
-   }
-   else {
-     // Since there was no valid Xing header found, we hope that we're in a constant
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp
---- taglib-1.5/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp	2009-07-11 16:27:17.000000000 +0200
-@@ -50,7 +50,7 @@
- 
- AttachedPictureFrame::AttachedPictureFrame() : Frame("APIC")
- {
--    d = new AttachedPictureFramePrivate;
-+  d = new AttachedPictureFramePrivate;
- }
- 
- AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data) : Frame(data)
-@@ -136,6 +136,12 @@
-   int pos = 1;
- 
-   d->mimeType = readStringField(data, String::Latin1, &pos);
-+  /* Now we need at least two more bytes available */	
-+  if (pos + 1 >= data.size()) {
-+    debug("Truncated picture frame.");
-+    return;
-+  }
-+
-   d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++];
-   d->description = readStringField(data, d->textEncoding, &pos);
- 
-@@ -168,3 +174,51 @@
-   d = new AttachedPictureFramePrivate;
-   parseFields(fieldData(data));
- }
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// support for ID3v2.2 PIC frames
-+////////////////////////////////////////////////////////////////////////////////
-+
-+void AttachedPictureFrameV22::parseFields(const ByteVector &data)
-+{
-+  if(data.size() < 5) {
-+    debug("A picture frame must contain at least 5 bytes.");
-+    return;
-+  }
-+
-+  d->textEncoding = String::Type(data[0]);
-+
-+  int pos = 1;
-+
-+  String fixedString = String(data.mid(pos, 3), String::Latin1);
-+  pos += 3;
-+  // convert fixed string image type to mime string
-+  if (fixedString.upper() == "JPG") {
-+    d->mimeType = "image/jpeg";
-+  } else if (fixedString.upper() == "PNG") {
-+    d->mimeType = "image/png";
-+  } else {
-+    debug("probably unsupported image type");
-+    d->mimeType = "image/" + fixedString;
-+  }
-+
-+  d->type = (TagLib::ID3v2::AttachedPictureFrame::Type)data[pos++];
-+  d->description = readStringField(data, d->textEncoding, &pos);
-+
-+  d->data = data.mid(pos);
-+}
-+
-+AttachedPictureFrameV22::AttachedPictureFrameV22(const ByteVector &data, Header *h)
-+{
-+  d = new AttachedPictureFramePrivate;
-+
-+  // set v2.2 header to make fieldData work correctly
-+  setHeader(h, true);
-+
-+  parseFields(fieldData(data));
-+
-+  // now set the v2.4 header
-+  Frame::Header *newHeader = new Frame::Header("APIC");
-+  newHeader->setFrameSize(h->frameSize());
-+  setHeader(newHeader, false);
-+}
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/attachedpictureframe.h taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h
---- taglib-1.5/taglib/mpeg/id3v2/frames/attachedpictureframe.h	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/attachedpictureframe.h	2009-07-11 16:27:17.000000000 +0200
-@@ -205,14 +205,24 @@
-     protected:
-       virtual void parseFields(const ByteVector &data);
-       virtual ByteVector renderFields() const;
-+      class AttachedPictureFramePrivate;
-+      AttachedPictureFramePrivate *d;
- 
-     private:
--      AttachedPictureFrame(const ByteVector &data, Header *h);
-       AttachedPictureFrame(const AttachedPictureFrame &);
-       AttachedPictureFrame &operator=(const AttachedPictureFrame &);
-+      AttachedPictureFrame(const ByteVector &data, Header *h);
- 
--      class AttachedPictureFramePrivate;
--      AttachedPictureFramePrivate *d;
-+    };
-+
-+    //! support for ID3v2.2 PIC frames
-+    class TAGLIB_EXPORT AttachedPictureFrameV22 : public AttachedPictureFrame
-+    {
-+    protected:
-+      virtual void parseFields(const ByteVector &data);
-+    private:
-+      AttachedPictureFrameV22(const ByteVector &data, Header *h);
-+      friend class FrameFactory;
-     };
-   }
- }
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/CMakeLists.txt taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt
---- taglib-1.5/taglib/mpeg/id3v2/frames/CMakeLists.txt	2008-01-31 22:48:39.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/CMakeLists.txt	2008-06-26 17:06:20.000000000 +0200
-@@ -2,6 +2,8 @@
- 	attachedpictureframe.h
- 	commentsframe.h
- 	generalencapsulatedobjectframe.h
-+	popularimeterframe.h
-+	privateframe.h
- 	relativevolumeframe.h
- 	textidentificationframe.h
- 	uniquefileidentifierframe.h
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h
---- taglib-1.5/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h	2008-06-19 22:44:39.000000000 +0200
-@@ -61,6 +61,10 @@
- 
-       /*!
-        * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data.
-+       *
-+       * \warning This is \em not data for the encapsulated object, for that use
-+       * setObject().  This constructor is used when reading the frame from the
-+       * disk.
-        */
-       explicit GeneralEncapsulatedObjectFrame(const ByteVector &data);
- 
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/Makefile.am taglib/taglib/mpeg/id3v2/frames/Makefile.am
---- taglib-1.5/taglib/mpeg/id3v2/frames/Makefile.am	2008-01-31 22:48:28.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/Makefile.am	2008-06-26 17:06:20.000000000 +0200
-@@ -10,6 +10,8 @@
- 	attachedpictureframe.cpp \
- 	commentsframe.cpp \
- 	generalencapsulatedobjectframe.cpp \
-+	popularimeterframe.cpp \
-+	privateframe.cpp \
- 	relativevolumeframe.cpp \
- 	textidentificationframe.cpp \
- 	uniquefileidentifierframe.cpp \
-@@ -21,6 +23,8 @@
- 	attachedpictureframe.h \
- 	commentsframe.h \
- 	generalencapsulatedobjectframe.h \
-+	popularimeterframe.h \
-+	privateframe.h \
- 	relativevolumeframe.h \
- 	textidentificationframe.h \
- 	uniquefileidentifierframe.h \
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/popularimeterframe.cpp taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp
---- taglib-1.5/taglib/mpeg/id3v2/frames/popularimeterframe.cpp	1970-01-01 01:00:00.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/popularimeterframe.cpp	2008-05-22 22:40:14.000000000 +0200
-@@ -0,0 +1,137 @@
-+/***************************************************************************
-+    copyright            : (C) 2008 by Lukas Lalinsky
-+    email                : lalinsky@gmail.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ *   This library is free software; you can redistribute it and/or modify  *
-+ *   it under the terms of the GNU Lesser General Public License version   *
-+ *   2.1 as published by the Free Software Foundation.                     *
-+ *                                                                         *
-+ *   This library is distributed in the hope that it will be useful, but   *
-+ *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
-+ *   Lesser General Public License for more details.                       *
-+ *                                                                         *
-+ *   You should have received a copy of the GNU Lesser General Public      *
-+ *   License along with this library; if not, write to the Free Software   *
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
-+ *   USA                                                                   *
-+ *                                                                         *
-+ *   Alternatively, this file is available under the Mozilla Public        *
-+ *   License Version 1.1.  You may obtain a copy of the License at         *
-+ *   http://www.mozilla.org/MPL/                                           *
-+ ***************************************************************************/
-+
-+#include <tdebug.h>
-+
-+#include "popularimeterframe.h"
-+
-+using namespace TagLib;
-+using namespace ID3v2;
-+
-+class PopularimeterFrame::PopularimeterFramePrivate
-+{
-+public:
-+  PopularimeterFramePrivate() : rating(0), counter(0) {}
-+  String email;
-+  int rating;
-+  TagLib::uint counter;
-+};
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// public members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+PopularimeterFrame::PopularimeterFrame() : Frame("POPM")
-+{
-+  d = new PopularimeterFramePrivate;
-+}
-+
-+PopularimeterFrame::PopularimeterFrame(const ByteVector &data) : Frame(data)
-+{
-+  d = new PopularimeterFramePrivate;
-+  setData(data);
-+}
-+
-+PopularimeterFrame::~PopularimeterFrame()
-+{
-+  delete d;
-+}
-+
-+String PopularimeterFrame::toString() const
-+{
-+  return d->email + " rating=" + String::number(d->rating) + " counter=" + String::number(d->counter);
-+}
-+
-+String PopularimeterFrame::email() const
-+{
-+  return d->email;
-+}
-+
-+void PopularimeterFrame::setEmail(const String &s)
-+{
-+  d->email = s;
-+}
-+
-+int PopularimeterFrame::rating() const
-+{
-+  return d->rating;
-+}
-+
-+void PopularimeterFrame::setRating(int s)
-+{
-+  d->rating = s;
-+}
-+
-+TagLib::uint PopularimeterFrame::counter() const
-+{
-+  return d->counter;
-+}
-+
-+void PopularimeterFrame::setCounter(TagLib::uint s)
-+{
-+  d->counter = s;
-+}
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// protected members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+void PopularimeterFrame::parseFields(const ByteVector &data)
-+{
-+  int pos = 0, size = int(data.size());
-+
-+  d->email = readStringField(data, String::Latin1, &pos);
-+
-+  d->rating = 0;
-+  d->counter = 0;
-+  if(pos < size) {
-+    d->rating = (unsigned char)(data[pos++]);
-+    if(pos < size) {
-+      d->counter = data.mid(pos, 4).toUInt();
-+    }
-+  }
-+}
-+
-+ByteVector PopularimeterFrame::renderFields() const
-+{
-+  ByteVector data;
-+
-+  data.append(d->email.data(String::Latin1));
-+  data.append(textDelimiter(String::Latin1));
-+  data.append(char(d->rating));
-+  data.append(ByteVector::fromUInt(d->counter));
-+
-+  return data;
-+}
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// private members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+PopularimeterFrame::PopularimeterFrame(const ByteVector &data, Header *h) : Frame(h)
-+{
-+  d = new PopularimeterFramePrivate;
-+  parseFields(fieldData(data));
-+}
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/popularimeterframe.h taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h
---- taglib-1.5/taglib/mpeg/id3v2/frames/popularimeterframe.h	1970-01-01 01:00:00.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/popularimeterframe.h	2008-05-22 14:06:45.000000000 +0200
-@@ -0,0 +1,132 @@
-+/***************************************************************************
-+    copyright            : (C) 2008 by Lukas Lalinsky
-+    email                : lalinsky@gmail.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ *   This library is free software; you can redistribute it and/or modify  *
-+ *   it under the terms of the GNU Lesser General Public License version   *
-+ *   2.1 as published by the Free Software Foundation.                     *
-+ *                                                                         *
-+ *   This library is distributed in the hope that it will be useful, but   *
-+ *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
-+ *   Lesser General Public License for more details.                       *
-+ *                                                                         *
-+ *   You should have received a copy of the GNU Lesser General Public      *
-+ *   License along with this library; if not, write to the Free Software   *
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
-+ *   USA                                                                   *
-+ *                                                                         *
-+ *   Alternatively, this file is available under the Mozilla Public        *
-+ *   License Version 1.1.  You may obtain a copy of the License at         *
-+ *   http://www.mozilla.org/MPL/                                           *
-+ ***************************************************************************/
-+
-+#ifndef TAGLIB_POPULARIMETERFRAME_H
-+#define TAGLIB_POPULARIMETERFRAME_H
-+
-+#include <id3v2frame.h>
-+#include "taglib_export.h"
-+
-+namespace TagLib {
-+
-+  namespace ID3v2 {
-+
-+    //! An implementation of ID3v2 "popularimeter"
-+
-+    /*!
-+     * This implements the ID3v2 popularimeter (POPM frame).  It concists of
-+     * an email, a rating and an optional counter.
-+     */
-+
-+    class TAGLIB_EXPORT PopularimeterFrame : public Frame
-+    {
-+      friend class FrameFactory;
-+
-+    public:
-+      /*!
-+       * Construct an empty popularimeter frame.
-+       */
-+      explicit PopularimeterFrame();
-+
-+      /*!
-+       * Construct a popularimeter based on the data in \a data.
-+       */
-+      explicit PopularimeterFrame(const ByteVector &data);
-+
-+      /*!
-+       * Destroys this PopularimeterFrame instance.
-+       */
-+      virtual ~PopularimeterFrame();
-+
-+      /*!
-+       * Returns the text of this popularimeter.
-+       *
-+       * \see text()
-+       */
-+      virtual String toString() const;
-+
-+      /*!
-+       * Returns the email.
-+       *
-+       * \see setEmail()
-+       */
-+      String email() const;
-+
-+      /*!
-+       * Set the email.
-+       *
-+       * \see email()
-+       */
-+      void setEmail(const String &email);
-+
-+      /*!
-+       * Returns the rating.
-+       *
-+       * \see setRating()
-+       */
-+      int rating() const;
-+
-+      /*!
-+       * Set the rating.
-+       *
-+       * \see rating()
-+       */
-+      void setRating(int rating);
-+
-+      /*!
-+       * Returns the counter.
-+       *
-+       * \see setCounter()
-+       */
-+      uint counter() const;
-+
-+      /*!
-+       * Set the counter.
-+       *
-+       * \see counter()
-+       */
-+      void setCounter(uint counter);
-+
-+    protected:
-+      // Reimplementations.
-+
-+      virtual void parseFields(const ByteVector &data);
-+      virtual ByteVector renderFields() const;
-+
-+    private:
-+      /*!
-+       * The constructor used by the FrameFactory.
-+       */
-+      PopularimeterFrame(const ByteVector &data, Header *h);
-+      PopularimeterFrame(const PopularimeterFrame &);
-+      PopularimeterFrame &operator=(const PopularimeterFrame &);
-+
-+      class PopularimeterFramePrivate;
-+      PopularimeterFramePrivate *d;
-+    };
-+
-+  }
-+}
-+#endif
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/privateframe.cpp taglib/taglib/mpeg/id3v2/frames/privateframe.cpp
---- taglib-1.5/taglib/mpeg/id3v2/frames/privateframe.cpp	1970-01-01 01:00:00.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/privateframe.cpp	2008-06-27 00:11:11.000000000 +0200
-@@ -0,0 +1,128 @@
-+/***************************************************************************
-+    copyright            : (C) 2008 by Serkan Kalyoncu
-+    copyright            : (C) 2008 by Scott Wheeler
-+    email                : wheeler@kde.org
-+***************************************************************************/
-+
-+/***************************************************************************
-+ *   This library is free software; you can redistribute it and/or modify  *
-+ *   it under the terms of the GNU Lesser General Public License version   *
-+ *   2.1 as published by the Free Software Foundation.                     *
-+ *                                                                         *
-+ *   This library is distributed in the hope that it will be useful, but   *
-+ *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
-+ *   Lesser General Public License for more details.                       *
-+ *                                                                         *
-+ *   You should have received a copy of the GNU Lesser General Public      *
-+ *   License along with this library; if not, write to the Free Software   *
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
-+ *   USA                                                                   *
-+ *                                                                         *
-+ *   Alternatively, this file is available under the Mozilla Public        *
-+ *   License Version 1.1.  You may obtain a copy of the License at         *
-+ *   http://www.mozilla.org/MPL/                                           *
-+ ***************************************************************************/
-+
-+#include <tbytevectorlist.h>
-+#include <id3v2tag.h>
-+#include <tdebug.h>
-+
-+#include "privateframe.h"
-+
-+using namespace TagLib;
-+using namespace ID3v2;
-+
-+
-+class PrivateFrame::PrivateFramePrivate
-+{
-+public:
-+  ByteVector data;
-+  String owner;
-+};
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// public members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+PrivateFrame::PrivateFrame() : Frame("PRIV")
-+{
-+  d = new PrivateFramePrivate;
-+}
-+
-+PrivateFrame::PrivateFrame(const ByteVector &data) : Frame(data)
-+{
-+  d = new PrivateFramePrivate;
-+  setData(data);
-+}
-+
-+PrivateFrame::~PrivateFrame()
-+{
-+  delete d;
-+}
-+
-+String PrivateFrame::toString() const
-+{
-+  return d->owner;
-+}
-+
-+String PrivateFrame::owner() const
-+{
-+  return d->owner;
-+}
-+
-+ByteVector PrivateFrame::data() const
-+{
-+  return d->data;
-+}
-+
-+void PrivateFrame::setOwner(const String &s)
-+{
-+  d->owner = s;
-+}
-+
-+void PrivateFrame::setData(const ByteVector & data)
-+{
-+  d->data = data;
-+}
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// protected members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+void PrivateFrame::parseFields(const ByteVector &data)
-+{
-+  if(data.size() < 2) {
-+    debug("A private frame must contain at least 2 bytes.");
-+    return;
-+  }
-+
-+  // Owner identifier is assumed to be Latin1
-+  
-+  const int byteAlign =  1;
-+  const int endOfOwner = data.find(textDelimiter(String::Latin1), 0, byteAlign);
-+
-+  d->owner =  String(data.mid(0, endOfOwner));
-+  d->data = data.mid(endOfOwner + 1);
-+}
-+
-+ByteVector PrivateFrame::renderFields() const
-+{
-+  ByteVector v;
-+
-+  v.append(d->owner.data(String::Latin1));
-+  v.append(textDelimiter(String::Latin1));
-+  v.append(d->data);
-+
-+  return v;
-+}
-+
-+////////////////////////////////////////////////////////////////////////////////
-+// private members
-+////////////////////////////////////////////////////////////////////////////////
-+
-+PrivateFrame::PrivateFrame(const ByteVector &data, Header *h) : Frame(h)
-+{
-+  d = new PrivateFramePrivate();
-+  parseFields(fieldData(data));
-+}
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/frames/privateframe.h taglib/taglib/mpeg/id3v2/frames/privateframe.h
---- taglib-1.5/taglib/mpeg/id3v2/frames/privateframe.h	1970-01-01 01:00:00.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/frames/privateframe.h	2008-06-27 00:11:11.000000000 +0200
-@@ -0,0 +1,111 @@
-+/***************************************************************************
-+    copyright            : (C) 2008 by Serkan Kalyoncu
-+    copyright            : (C) 2008 by Scott Wheeler
-+    email                : wheeler@kde.org
-+***************************************************************************/
-+
-+/***************************************************************************
-+ *   This library is free software; you can redistribute it and/or modify  *
-+ *   it under the terms of the GNU Lesser General Public License version   *
-+ *   2.1 as published by the Free Software Foundation.                     *
-+ *                                                                         *
-+ *   This library is distributed in the hope that it will be useful, but   *
-+ *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
-+ *   Lesser General Public License for more details.                       *
-+ *                                                                         *
-+ *   You should have received a copy of the GNU Lesser General Public      *
-+ *   License along with this library; if not, write to the Free Software   *
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
-+ *   USA                                                                   *
-+ *                                                                         *
-+ *   Alternatively, this file is available under the Mozilla Public        *
-+ *   License Version 1.1.  You may obtain a copy of the License at         *
-+ *   http://www.mozilla.org/MPL/                                           *
-+ ***************************************************************************/
-+
-+#ifndef TAGLIB_PRIVATEFRAME_H
-+#define TAGLIB_PRIVATEFRAME_H
-+
-+#include "id3v2frame.h"
-+#include "taglib_export.h"
-+
-+namespace TagLib {
-+
-+  namespace ID3v2 {
-+
-+    //! An implementation of ID3v2 privateframe
-+
-+    class TAGLIB_EXPORT PrivateFrame : public Frame
-+    {
-+      friend class FrameFactory;
-+
-+    public:
-+      /*!
-+       * Construct an empty private frame.
-+       */
-+      PrivateFrame();
-+
-+      /*!
-+       * Construct a private frame based on the data in \a data.
-+       *
-+       * \note This is the constructor used when parsing the frame from a file.
-+       */
-+      explicit PrivateFrame(const ByteVector &data);
-+
-+      /*!
-+       * Destroys this private frame instance.
-+       */
-+      virtual ~PrivateFrame();
-+
-+      /*!
-+       * Returns the text of this private frame, currently just the owner.
-+       *
-+       * \see text()
-+       */
-+      virtual String toString() const;
-+
-+      /*!
-+       * \return The owner of the private frame.
-+       * \note This should contain an email address or link to a website.
-+       */
-+      String owner() const;
-+
-+      /*!
-+       *
-+       */
-+      ByteVector data() const;
-+
-+      /*!
-+       * Sets the owner of the frame to \a s.
-+       * \note This should contain an email address or link to a website.
-+       */
-+      void setOwner(const String &s);
-+
-+      /*!
-+       *
-+       */
-+      void setData(const ByteVector &v);
-+
-+    protected:
-+      // Reimplementations.
-+
-+      virtual void parseFields(const ByteVector &data);
-+      virtual ByteVector renderFields() const;
-+
-+    private:
-+      /*!
-+       * The constructor used by the FrameFactory.
-+       */
-+      PrivateFrame(const ByteVector &data, Header *h);
-+
-+      PrivateFrame(const PrivateFrame &);
-+      PrivateFrame &operator=(const PrivateFrame &);
-+
-+      class PrivateFramePrivate;
-+      PrivateFramePrivate *d;
-+    };
-+
-+  }
-+}
-+#endif
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/id3v2footer.cpp taglib/taglib/mpeg/id3v2/id3v2footer.cpp
---- taglib-1.5/taglib/mpeg/id3v2/id3v2footer.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/id3v2footer.cpp	2008-12-05 17:43:38.000000000 +0100
-@@ -45,7 +45,7 @@
- 
- }
- 
--const unsigned int Footer::size()
-+TagLib::uint Footer::size()
- {
-   return FooterPrivate::size;
- }
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/id3v2footer.h taglib/taglib/mpeg/id3v2/id3v2footer.h
---- taglib-1.5/taglib/mpeg/id3v2/id3v2footer.h	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/id3v2footer.h	2008-12-05 01:37:39.000000000 +0100
-@@ -62,7 +62,7 @@
-       /*!
-        * Returns the size of the footer.  Presently this is always 10 bytes.
-        */
--      static const unsigned int size();
-+      static uint size();
- 
-       /*!
-        * Renders the footer based on the data in \a header.
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/id3v2framefactory.cpp taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp
---- taglib-1.5/taglib/mpeg/id3v2/id3v2framefactory.cpp	2008-02-21 01:43:14.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/id3v2framefactory.cpp	2009-07-11 16:27:17.000000000 +0200
-@@ -31,6 +31,7 @@
- 
- #include "id3v2framefactory.h"
- #include "id3v2synchdata.h"
-+#include "id3v1genres.h"
- 
- #include "frames/attachedpictureframe.h"
- #include "frames/commentsframe.h"
-@@ -41,6 +42,8 @@
- #include "frames/generalencapsulatedobjectframe.h"
- #include "frames/urllinkframe.h"
- #include "frames/unsynchronizedlyricsframe.h"
-+#include "frames/popularimeterframe.h"
-+#include "frames/privateframe.h"
- 
- using namespace TagLib;
- using namespace ID3v2;
-@@ -180,7 +183,15 @@
-     return f;
-   }
- 
--  // Relative Volume Adjustment (frames 4.11)
-+  // ID3v2.2 Attached Picture
-+
-+	if(frameID == "PIC") {
-+    AttachedPictureFrame *f = new AttachedPictureFrameV22(data, header);
-+    d->setTextEncoding(f);
-+    return f;
-+  }
-+
-+	// Relative Volume Adjustment (frames 4.11)
- 
-   if(frameID == "RVA2")
-     return new RelativeVolumeFrame(data, header);
-@@ -220,6 +231,16 @@
-     return f;
-   }
- 
-+  // Popularimeter (frames 4.17)
-+
-+  if(frameID == "POPM")
-+    return new PopularimeterFrame(data, header);
-+
-+  // Private (frames 4.27)
-+
-+  if(frameID == "PRIV")
-+    return new PrivateFrame(data, header);
-+
-   return new UnknownFrame(data, header);
- }
- 
-@@ -280,7 +301,6 @@
-     convertFrame("IPL", "TIPL", header);
-     convertFrame("MCI", "MCDI", header);
-     convertFrame("MLL", "MLLT", header);
--    convertFrame("PIC", "APIC", header);
-     convertFrame("POP", "POPM", header);
-     convertFrame("REV", "RVRB", header);
-     convertFrame("SLT", "SYLT", header);
-@@ -382,26 +402,31 @@
- 
- void FrameFactory::updateGenre(TextIdentificationFrame *frame) const
- {
--  StringList fields;
--  String s = frame->toString();
-+  StringList fields = frame->fieldList();
-+  StringList newfields;
- 
--  while(s.startsWith("(")) {
--
--    int closing = s.find(")");
--
--    if(closing < 0)
--      break;
--
--    fields.append(s.substr(1, closing - 1));
--
--    s = s.substr(closing + 1);
-+  for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) {
-+    String s = *it;
-+    int end = s.find(")");
-+
-+    if(s.startsWith("(") && end > 0) {
-+      // "(12)Genre"
-+      String text = s.substr(end + 1);
-+      int number = s.substr(1, end - 1).toInt();
-+      if (number > 0 && number <= 255 && !(ID3v1::genre(number) == text))
-+        newfields.append(s.substr(1, end - 1));
-+      if (!text.isEmpty())
-+        newfields.append(text);
-+    }
-+    else {
-+      // "Genre" or "12"
-+      newfields.append(s);
-+    }
-   }
- 
--  if(!s.isEmpty())
--    fields.append(s);
--
--  if(fields.isEmpty())
-+  if(newfields.isEmpty())
-     fields.append(String::null);
- 
--  frame->setText(fields);
-+  frame->setText(newfields);
-+
- }
-diff -Nur taglib-1.5/taglib/mpeg/id3v2/id3v2tag.cpp taglib/taglib/mpeg/id3v2/id3v2tag.cpp
---- taglib-1.5/taglib/mpeg/id3v2/id3v2tag.cpp	2008-02-04 21:33:54.000000000 +0100
-+++ taglib/taglib/mpeg/id3v2/id3v2tag.cpp	2009-07-11 16:43:58.000000000 +0200
-@@ -125,7 +125,9 @@
- 
-   for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it)
-   {
--    if(static_cast<CommentsFrame *>(*it)->description().isEmpty())
-+    CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it);
-+
-+    if(frame && frame->description().isEmpty())
-       return (*it)->toString();
-   }
- 
-@@ -159,6 +161,9 @@
- 
-   for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) {
- 
-+    if((*it).isEmpty())
-+      continue;
-+
-     bool isNumber = true;
- 
-     for(String::ConstIterator charIt = (*it).begin();
-@@ -347,6 +352,11 @@
-   // Loop through the frames rendering them and adding them to the tagData.
- 
-   for(FrameList::Iterator it = d->frameList.begin(); it != d->frameList.end(); it++) {
-+    if ((*it)->header()->frameID().size() != 4) {
-+      debug("A frame of unsupported or unknown type \'"
-+          + String((*it)->header()->frameID()) + "\' has been discarded");
-+      continue;
-+    }
-     if(!(*it)->header()->tagAlterPreservation())
-       tagData.append((*it)->render());
-   }
diff --git a/taglib-1.5-1.6-ogg.patch b/taglib-1.5-1.6-ogg.patch
deleted file mode 100644
index 73d6c3f..0000000
--- a/taglib-1.5-1.6-ogg.patch
+++ /dev/null
@@ -1,330 +0,0 @@
-diff -Nur taglib-1.5/taglib/ogg/xiphcomment.cpp taglib/taglib/ogg/xiphcomment.cpp
---- taglib-1.5/taglib/ogg/xiphcomment.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib/taglib/ogg/xiphcomment.cpp	2009-07-11 15:17:06.000000000 +0200
-@@ -103,16 +103,20 @@
- 
- TagLib::uint Ogg::XiphComment::year() const
- {
--  if(d->fieldListMap["DATE"].isEmpty())
--    return 0;
--  return d->fieldListMap["DATE"].front().toInt();
-+  if(!d->fieldListMap["DATE"].isEmpty())
-+    return d->fieldListMap["DATE"].front().toInt();
-+  if(!d->fieldListMap["YEAR"].isEmpty())
-+    return d->fieldListMap["YEAR"].front().toInt();
-+  return 0;
- }
- 
- TagLib::uint Ogg::XiphComment::track() const
- {
--  if(d->fieldListMap["TRACKNUMBER"].isEmpty())
--    return 0;
--  return d->fieldListMap["TRACKNUMBER"].front().toInt();
-+  if(!d->fieldListMap["TRACKNUMBER"].isEmpty())
-+    return d->fieldListMap["TRACKNUMBER"].front().toInt();
-+  if(!d->fieldListMap["TRACKNUM"].isEmpty())
-+    return d->fieldListMap["TRACKNUM"].front().toInt();
-+  return 0;
- }
- 
- void Ogg::XiphComment::setTitle(const String &s)
-@@ -142,6 +146,7 @@
- 
- void Ogg::XiphComment::setYear(uint i)
- {
-+  removeField("YEAR");
-   if(i == 0)
-     removeField("DATE");
-   else
-@@ -150,6 +155,7 @@
- 
- void Ogg::XiphComment::setTrack(uint i)
- {
-+  removeField("TRACKNUM");
-   if(i == 0)
-     removeField("TRACKNUMBER");
-   else
-diff -Nur taglib-1.5-orig/taglib/ogg/oggfile.cpp taglib-1.5/taglib/ogg/oggfile.cpp
---- taglib-1.5-orig/taglib/ogg/oggfile.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib-1.5/taglib/ogg/oggfile.cpp	2009-09-04 11:46:54.859122796 +0200
-@@ -270,11 +270,28 @@
-   return true;
- }
- 
--void Ogg::File::writePageGroup(const List<int> &pageGroup)
-+void Ogg::File::writePageGroup(const List<int> &thePageGroup)
- {
--  if(pageGroup.isEmpty())
-+  if(thePageGroup.isEmpty())
-     return;
- 
-+
-+  // pages in the pageGroup and packets must be equivalent 
-+  // (originalSize and size of packets would not work together), 
-+  // therefore we sometimes have to add pages to the group
-+  List<int> pageGroup(thePageGroup);
-+  while (!d->pages[pageGroup.back()]->header()->lastPacketCompleted()) {
-+    if (d->currentPage->header()->pageSequenceNumber() == pageGroup.back()) {
-+      if (nextPage() == false) {
-+        debug("broken ogg file");
-+        return;
-+      }
-+      pageGroup.append(d->currentPage->header()->pageSequenceNumber());
-+    } else {
-+      pageGroup.append(pageGroup.back() + 1);
-+    }
-+  }
-+
-   ByteVectorList packets;
- 
-   // If the first page of the group isn't dirty, append its partial content here.
-@@ -313,6 +330,52 @@
-                                       d->streamSerialNumber, pageGroup.front(),
-                                       continued, completed);
- 
-+  List<Page *> renumberedPages;
-+
-+  // Correct the page numbering of following pages
-+
-+  if (pages.back()->header()->pageSequenceNumber() != pageGroup.back()) {
-+
-+    // TODO: change the internal data structure so that we don't need to hold the 
-+    // complete file in memory (is unavoidable at the moment)
-+
-+    // read the complete stream
-+    while(!d->currentPage->header()->lastPageOfStream()) {
-+      if(nextPage() == false) {
-+        debug("broken ogg file");
-+        break;
-+      }
-+    }
-+
-+    // create a gap for the new pages
-+    int numberOfNewPages = pages.back()->header()->pageSequenceNumber() - pageGroup.back();
-+    List<Page *>::Iterator pageIter = d->pages.begin();
-+    for(int i = 0; i < pageGroup.back(); i++) {
-+      if(pageIter != d->pages.end()) {
-+        ++pageIter;
-+      }
-+      else {
-+        debug("Ogg::File::writePageGroup() -- Page sequence is broken in original file.");
-+        break;
-+      }
-+    }
-+
-+    ++pageIter;
-+    for(; pageIter != d->pages.end(); ++pageIter) {
-+      Ogg::Page *newPage =
-+        (*pageIter)->getCopyWithNewPageSequenceNumber(
-+            (*pageIter)->header()->pageSequenceNumber() + numberOfNewPages);
-+
-+      ByteVector data;
-+      data.append(newPage->render());
-+      insert(data, newPage->fileOffset(), data.size());
-+
-+      renumberedPages.append(newPage);
-+    }
-+  }
-+
-+  // insert the new data
-+
-   ByteVector data;
-   for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it)
-     data.append((*it)->render());
-@@ -328,9 +391,37 @@
-   // Update the page index to include the pages we just created and to delete the
-   // old pages.
- 
-+  // First step: Pages that contain the comment data
-+
-   for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it) {
-     const int index = (*it)->header()->pageSequenceNumber();
--    delete d->pages[index];
--    d->pages[index] = *it;
-+    if(index < static_cast<int>(d->pages.size())) {
-+      delete d->pages[index];
-+      d->pages[index] = *it;
-+    }
-+    else if(index == d->pages.size()) {
-+      d->pages.append(*it);
-+    }
-+    else {
-+      // oops - there's a hole in the sequence
-+      debug("Ogg::File::writePageGroup() -- Page sequence is broken.");
-+    }
-+  }
-+
-+  // Second step: the renumbered pages
-+
-+  for(List<Page *>::ConstIterator it = renumberedPages.begin(); it != renumberedPages.end(); ++it) {
-+    const int index = (*it)->header()->pageSequenceNumber();
-+    if(index < static_cast<int>(d->pages.size())) {
-+      delete d->pages[index];
-+      d->pages[index] = *it;
-+    }
-+    else if(index == d->pages.size()) {
-+      d->pages.append(*it);
-+    }
-+    else {
-+      // oops - there's a hole in the sequence
-+      debug("Ogg::File::writePageGroup() -- Page sequence is broken.");
-+    }
-   }
- }
-diff -Nur taglib-1.5-orig/taglib/ogg/oggpage.cpp taglib-1.5/taglib/ogg/oggpage.cpp
---- taglib-1.5-orig/taglib/ogg/oggpage.cpp	2008-02-04 16:14:46.000000000 +0100
-+++ taglib-1.5/taglib/ogg/oggpage.cpp	2009-09-04 11:47:00.527115729 +0200
-@@ -116,12 +116,14 @@
-     flags = ContainsPacketFlags(flags | CompletePacket);
-   }
- 
--  // Or if the page is (a) the first page and it's complete or (b) the last page
--  // and it's complete or (c) a page in the middle.
--
--  else if((flags & BeginsWithPacket && !d->header.firstPacketContinued()) ||
--          (flags & EndsWithPacket && d->header.lastPacketCompleted()) ||
--          (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket)))
-+  // Or if there is more than one page and the page is 
-+  // (a) the first page and it's complete or 
-+  // (b) the last page and it's complete or 
-+  // (c) a page in the middle.
-+  else if(packetCount() > 1 &&
-+          ((flags & BeginsWithPacket && !d->header.firstPacketContinued()) ||
-+           (flags & EndsWithPacket && d->header.lastPacketCompleted()) ||
-+           (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket))))
-   {
-     flags = ContainsPacketFlags(flags | CompletePacket);
-   }
-@@ -208,20 +210,101 @@
-   for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it)
-     totalSize += (*it).size();
- 
--  if(strategy == Repaginate || totalSize + packets.size() > 255 * 256) {
--    debug("Ogg::Page::paginate() -- Sorry!  Repagination is not yet implemented.");
--    return l;
--  }
-+  // Handle creation of multiple pages with appropriate pagination.
-+  if(strategy == Repaginate || totalSize + packets.size() > 255 * 255) {
- 
--  // TODO: Handle creation of multiple pages here with appropriate pagination.
-+    // SPLITSIZE must be a multiple of 255 in order to get the lacing values right
-+    // create pages of about 8KB each
-+#define SPLITSIZE (32*255)
-+
-+    int pageIndex = 0;
-+
-+    for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) {
-+      bool continued = false;
-+
-+      // mark very first packet?
-+      if(firstPacketContinued && it==packets.begin()) {
-+        continued = true;
-+      }
-+
-+      // append to buf
-+      ByteVector packetBuf;
-+      packetBuf.append(*it);
-+
-+      while(packetBuf.size() > SPLITSIZE) {
-+        // output a Page
-+        ByteVector packetForOnePage;
-+        packetForOnePage.resize(SPLITSIZE);
-+        std::copy(packetBuf.begin(), packetBuf.begin() + SPLITSIZE, packetForOnePage.begin());
-+
-+        ByteVectorList packetList;
-+        packetList.append(packetForOnePage);
-+        Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued, false, false);
-+        l.append(p);
-+
-+        pageIndex++;
-+        continued = true;
-+        packetBuf = packetBuf.mid(SPLITSIZE);
-+      }
-+
-+      ByteVectorList::ConstIterator jt = it;
-+      ++jt;
-+      bool lastPacketInList = (jt == packets.end());
-+
-+      // output a page for the rest (we output one packet per page, so this one should be completed)
-+      ByteVectorList packetList;
-+      packetList.append(packetBuf);
-+
-+      bool isVeryLastPacket = false;
-+      if(containsLastPacket) {
-+        // mark the very last output page as last of stream
-+        ByteVectorList::ConstIterator jt = it;
-+        ++jt;
-+        if(jt == packets.end()) {
-+          isVeryLastPacket = true;
-+        }
-+      }
-+
-+      Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued,
-+                         lastPacketInList ? lastPacketCompleted : true, 
-+                         isVeryLastPacket);
-+      pageIndex++;
- 
--  Page *p = new Page(packets, streamSerialNumber, firstPage, firstPacketContinued,
--                     lastPacketCompleted, containsLastPacket);
--  l.append(p);
-+      l.append(p);
-+    }
-+  }
-+  else {
-+    Page *p = new Page(packets, streamSerialNumber, firstPage, firstPacketContinued,
-+                       lastPacketCompleted, containsLastPacket);
-+    l.append(p);
-+  }
- 
-   return l;
- }
- 
-+Ogg::Page* Ogg::Page::getCopyWithNewPageSequenceNumber(int sequenceNumber)
-+{
-+  Page *pResultPage = NULL;
-+
-+  // TODO: a copy constructor would be helpful
-+
-+  if(d->file == 0) {
-+    pResultPage = new Page(
-+        d->packets,
-+        d->header.streamSerialNumber(),
-+        sequenceNumber,
-+        d->header.firstPacketContinued(),
-+        d->header.lastPacketCompleted(),
-+        d->header.lastPageOfStream());
-+  }
-+  else
-+  {
-+    pResultPage = new Page(d->file, d->fileOffset);
-+    pResultPage->d->header.setPageSequenceNumber(sequenceNumber);
-+  }
-+  return pResultPage;
-+}
-+
- ////////////////////////////////////////////////////////////////////////////////
- // protected members
- ////////////////////////////////////////////////////////////////////////////////
-@@ -254,3 +337,4 @@
-   d->packets = packets;
-   d->header.setPacketSizes(packetSizes);
- }
-+
-diff -Nur taglib-1.5-orig/taglib/ogg/oggpage.h taglib-1.5/taglib/ogg/oggpage.h
---- taglib-1.5-orig/taglib/ogg/oggpage.h	2008-02-04 16:14:46.000000000 +0100
-+++ taglib-1.5/taglib/ogg/oggpage.h	2009-09-04 11:47:06.387120297 +0200
-@@ -70,6 +70,14 @@
-        */
-       const PageHeader *header() const;
- 
-+      /*! 
-+       * Returns a copy of the page with \a sequenceNumber set as sequence number.
-+       * 
-+       * \see header()
-+       * \see PageHeader::setPageSequenceNumber()
-+       */
-+      Page* getCopyWithNewPageSequenceNumber(int sequenceNumber);
-+
-       /*!
-        * Returns the index of the first packet wholly or partially contained in
-        * this page.
diff --git a/taglib-1.5-1.6-toolkit.patch b/taglib-1.5-1.6-toolkit.patch
deleted file mode 100644
index a3e5e10..0000000
--- a/taglib-1.5-1.6-toolkit.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-diff -Nur taglib-1.5/taglib/toolkit/tbytevector.cpp taglib/taglib/toolkit/tbytevector.cpp
---- taglib-1.5/taglib/toolkit/tbytevector.cpp	2008-02-12 04:18:52.000000000 +0100
-+++ taglib/taglib/toolkit/tbytevector.cpp	2008-12-04 13:37:36.000000000 +0100
-@@ -147,12 +147,12 @@
-   public:
-     ByteVectorMirror(const ByteVector &source) : v(source) {}
- 
--    const char operator[](int index) const
-+    char operator[](int index) const
-     {
-       return v[v.size() - index - 1];
-     }
- 
--    const char at(int index) const
-+    char at(int index) const
-     {
-       return v.at(v.size() - index - 1);
-     }
-diff -Nur taglib-1.5/taglib/toolkit/tbytevector.h taglib/taglib/toolkit/tbytevector.h
---- taglib-1.5/taglib/toolkit/tbytevector.h	2008-02-05 19:51:48.000000000 +0100
-+++ taglib/taglib/toolkit/tbytevector.h	2009-07-02 22:54:32.000000000 +0200
-@@ -30,7 +30,7 @@
- #include "taglib_export.h"
- 
- #include <vector>
--#include <ostream>
-+#include <iostream>
- 
- namespace TagLib {
- 
-diff -Nur taglib-1.5/taglib/toolkit/tbytevectorlist.cpp taglib/taglib/toolkit/tbytevectorlist.cpp
---- taglib-1.5/taglib/toolkit/tbytevectorlist.cpp	2008-02-04 16:14:45.000000000 +0100
-+++ taglib/taglib/toolkit/tbytevectorlist.cpp	2009-07-11 15:24:21.000000000 +0200
-@@ -52,7 +52,7 @@
-       offset != -1 && (max == 0 || max > int(l.size()) + 1);
-       offset = v.find(pattern, offset + pattern.size(), byteAlign))
-   {
--    if(offset - previousOffset > 1)
-+    if(offset - previousOffset >= 1)
-       l.append(v.mid(previousOffset, offset - previousOffset));
-     else
-       l.append(ByteVector::null);
-diff -Nur taglib-1.5-orig/taglib/toolkit/tstring.cpp taglib-1.5/taglib/toolkit/tstring.cpp
---- taglib-1.5-orig/taglib/toolkit/tstring.cpp	2008-02-04 16:14:45.000000000 +0100
-+++ taglib-1.5/taglib/toolkit/tstring.cpp	2009-09-04 12:07:00.506121756 +0200
-@@ -35,7 +35,7 @@
- 
-   inline unsigned short byteSwap(unsigned short x)
-   {
--    return ((x) >> 8) & 0xff | ((x) & 0xff) << 8;
-+    return (((x) >> 8) & 0xff) | (((x) & 0xff) << 8);
-   }
- 
-   inline unsigned short combine(unsigned char c1, unsigned char c2)
-@@ -510,6 +510,8 @@
- 
- TagLib::wchar &String::operator[](int i)
- {
-+  detach();
-+
-   return d->data[i];
- }
- 
-@@ -558,6 +560,8 @@
- 
- String &String::operator+=(char c)
- {
-+  detach();
-+
-   d->data += uchar(c);
-   return *this;
- }
-diff -Nur taglib-1.5-orig/taglib/toolkit/tstring.h taglib-1.5/taglib/toolkit/tstring.h
---- taglib-1.5-orig/taglib/toolkit/tstring.h	2008-02-04 16:14:45.000000000 +0100
-+++ taglib-1.5/taglib/toolkit/tstring.h	2009-09-04 12:07:03.465121011 +0200
-@@ -31,7 +31,7 @@
- #include "tbytevector.h"
- 
- #include <string>
--#include <ostream>
-+#include <iostream>
- 
- /*!
-  * \relates TagLib::String
diff --git a/taglib-1.5-tests.patch b/taglib-1.5-tests.patch
deleted file mode 100644
index acb65b8..0000000
--- a/taglib-1.5-tests.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -Nur taglib-1.5-orig/tests/test_string.cpp taglib-1.5/tests/test_string.cpp
---- taglib-1.5-orig/tests/test_string.cpp	2008-01-26 11:57:06.000000000 +0100
-+++ taglib-1.5/tests/test_string.cpp	2009-08-22 11:17:55.000000000 +0200
-@@ -24,6 +24,7 @@
- 
- #include <cppunit/extensions/HelperMacros.h>
- #include <tstring.h>
-+#include <cstring>
- 
- using namespace std;
- using namespace TagLib;
diff --git a/taglib.spec b/taglib.spec
index f93c395..4d89317 100644
--- a/taglib.spec
+++ b/taglib.spec
@@ -11,14 +11,16 @@
 %global apidocdir __api-doc_fedora
 
 Name:       taglib	
-Version:    1.5
-Release:    8%{?dist}
+Version:    1.6
+Release:    1%{?dist}
 Summary:    Audio Meta-Data Library
 
 Group: 	    System Environment/Libraries
 License:    LGPLv2
 URL:        http://developer.kde.org/~wheeler/taglib.html
-Source0:    http://developer.kde.org/~wheeler/files/src/taglib-%{version}.tar.gz
+# the temporary url from the 1.6 announcement
+Source0:    http://ftp.musicbrainz.org/pub/musicbrainz/users/luks/taglib/taglib-1.6.tar.gz
+#Source0:    http://developer.kde.org/~wheeler/files/src/taglib-%{version}.tar.gz
 #Source0:    taglib-%{svn}.tar.gz
 # The svn tarball is generated with the following script
 Source1:    taglib-svn.sh
@@ -30,16 +32,6 @@ Patch1:     taglib-1.5b1-multilib.patch
 # try 2, kiss omit -L%_libdir
 Patch2:     taglib-1.5rc1-multilib.patch
 
-Patch3: taglib-1.5-tests.patch
-
-## upstream patches
-Patch101: taglib-1.5-1.6-ape.patch
-Patch102: taglib-1.5-1.6-ogg.patch
-Patch103: taglib-1.5-1.6-flac.patch
-Patch104: taglib-1.5-1.6-toolkit.patch
-Patch105: taglib-1.5-1.6-mpeg.patch
-Patch106: taglib-1.5-1.6-mpeg-cmake.patch
-
 BuildRequires: cmake
 BuildRequires: pkgconfig
 BuildRequires: zlib-devel
@@ -92,19 +84,11 @@ Files needed when building software with %{name}.
 ## omit for now
 %patch2 -p1 -b .multilib
 
-%patch3 -p1 -b .tests
-%patch101 -p1 -b .ape
-%patch102 -p1 -b .ogg
-%patch103 -p1 -b .flac
-%patch104 -p1 -b .toolkit
-%patch105 -p1 -b .mpeg
-%patch106 -p1 -b .mpeg-build
-
 
 %build
 mkdir -p %{_target_platform}
 pushd %{_target_platform}
-%{cmake} %{?buildtests} ..
+%{cmake} %{?buildtests} -DWITH_ASF=1 -DWITH_MP4=1 ..
 popd
 
 make %{?_smp_mflags} -C %{_target_platform}
@@ -171,6 +155,13 @@ rm -rf %{buildroot}
 
 
 %changelog
+* Mon Sep 14 2009 Michael Schwendt <mschwendt@fedoraproject.org> - 1.6-1
+- Update to 1.6 final.
+
+* Sun Sep  6 2009 Michael Schwendt <mschwendt@fedoraproject.org> - 1.6-0.1.rc1
+- Update to 1.6rc1 (further bug-fixes and support for AIFF and WAV).
+- Build optional support for MP4 and ASF/WMA files.
+
 * Fri Sep  4 2009 Michael Schwendt <mschwendt@fedoraproject.org> - 1.5-8
 - Merge another bug-fix from 1.6rc1 (this adds 3 symbols) and
   really add tstring bug-fix: