public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/amarok] epel10.2: - --with-mp4v2 (rh#346011)
@ 2026-07-06 18:30 Rex Dieter
0 siblings, 0 replies; only message in thread
From: Rex Dieter @ 2026-07-06 18:30 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/amarok
Branch : epel10.2
Commit : a4c9e68eb6f5cb9921774ff034d83c9f591a96ad
Author : Rex Dieter <rdieter@fedoraproject.org>
Date : 2007-11-29T20:30:13+00:00
Stats : +3558/-9 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/amarok/c/a4c9e68eb6f5cb9921774ff034d83c9f591a96ad?branch=epel10.2
Log:
- --with-mp4v2 (rh#346011)
- fix asf/wma support (rh#346011,kde#151733)
---
diff --git a/amarok-asf.patch b/amarok-asf.patch
new file mode 100644
index 0000000..ffca2b9
--- /dev/null
+++ b/amarok-asf.patch
@@ -0,0 +1,3533 @@
+
+Property changes on: amarok/src/metadata/asf
+___________________________________________________________________
+Name: svn:ignore
+ + .libs
+.deps
+Makefile
+Makefile.in
+
+
+Index: amarok/src/metadata/asf/asffile.h
+===================================================================
+--- amarok/src/metadata/asf/asffile.h (revision 0)
++++ amarok/src/metadata/asf/asffile.h (revision 743005)
+@@ -0,0 +1,114 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#ifndef TAGLIB_ASFFILE_H
++#define TAGLIB_ASFFILE_H
++
++#include <tag.h>
++#include <tfile.h>
++#include "asfproperties.h"
++#include "asftag.h"
++
++namespace TagLib {
++
++ //! An implementation of ASF (WMA) metadata
++ namespace ASF {
++
++ /*!
++ * This implements and provides an interface for ASF files to the
++ * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing
++ * the abstract TagLib::File API as well as providing some additional
++ * information specific to ASF files.
++ */
++ class File : public TagLib::File
++ {
++ public:
++
++ /*!
++ * Contructs an ASF file from \a file. If \a readProperties is true the
++ * file's audio properties will also be read using \a propertiesStyle. If
++ * false, \a propertiesStyle is ignored.
++ *
++ * \note In the current implementation, both \a readProperties and
++ * \a propertiesStyle are ignored.
++ */
++ File(const char *file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average);
++
++ /*!
++ * Destroys this instance of the File.
++ */
++ virtual ~File();
++
++ /*!
++ * Returns a pointer to the ASF tag of the file.
++ *
++ * ASF::Tag implements the tag interface, so this serves as the
++ * reimplementation of TagLib::File::tag().
++ *
++ * \note The Tag <b>is still</b> owned by the ASF::File and should not be
++ * deleted by the user. It will be deleted when the file (object) is
++ * destroyed.
++ */
++ virtual Tag *tag() const;
++
++ /*!
++ * Returns the ASF audio properties for this file.
++ */
++ virtual Properties *audioProperties() const;
++
++ /*!
++ * Save the file.
++ *
++ * This returns true if the save was successful.
++ */
++ virtual bool save();
++
++ private:
++
++ int readBYTE();
++ int readWORD();
++ unsigned int readDWORD();
++ long long readQWORD();
++ static ByteVector renderString(const String &str, bool includeLength = false);
++ String readString(int len);
++ void read(bool readProperties, Properties::ReadStyle propertiesStyle);
++
++ friend class Attribute;
++
++ class BaseObject;
++ class UnknownObject;
++ class FilePropertiesObject;
++ class StreamPropertiesObject;
++ class ContentDescriptionObject;
++ class ExtendedContentDescriptionObject;
++ class HeaderExtensionObject;
++ class MetadataObject;
++ class MetadataLibraryObject;
++
++ class FilePrivate;
++ FilePrivate *d;
++ };
++
++ }
++
++}
++
++#endif
+
+Property changes on: amarok/src/metadata/asf/asffile.h
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/asf/taglib_asffiletyperesolver.cpp
+===================================================================
+--- amarok/src/metadata/asf/taglib_asffiletyperesolver.cpp (revision 0)
++++ amarok/src/metadata/asf/taglib_asffiletyperesolver.cpp (revision 743005)
+@@ -0,0 +1,47 @@
++/***************************************************************************
++ copyright : (C) 2005 by Martin Aumueller
++ email : aumuell@reserv.at
++ ***************************************************************************/
++
++/***************************************************************************
++ * 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., 51 Franklin Street, Fifth Floor, Boston, *
++ * MA 02110-1301 USA *
++ ***************************************************************************/
++
++// (c) 2005 Martin Aumueller <aumuell@reserv.at>
++// See COPYING file for licensing information
++
++#include "taglib_asffiletyperesolver.h"
++#include "asffile.h"
++
++#include <string.h>
++
++TagLib::File *ASFFileTypeResolver::createFile(const char *fileName,
++ bool readProperties,
++ TagLib::AudioProperties::ReadStyle propertiesStyle) const
++{
++ const char *ext = strrchr(fileName, '.');
++ if(ext && (!strcasecmp(ext, ".wma") || !strcasecmp(ext, ".asf")))
++ {
++ TagLib::ASF::File *f = new TagLib::ASF::File(fileName, readProperties, propertiesStyle);
++ if(f->isValid())
++ return f;
++ else
++ {
++ delete f;
++ }
++ }
++
++ return 0;
++}
+Index: amarok/src/metadata/asf/asfattribute.h
+===================================================================
+--- amarok/src/metadata/asf/asfattribute.h (revision 0)
++++ amarok/src/metadata/asf/asfattribute.h (revision 743005)
+@@ -0,0 +1,176 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#ifndef TAGLIB_ASFATTRIBUTE_H
++#define TAGLIB_ASFATTRIBUTE_H
++
++#include <tstring.h>
++#include <tbytevector.h>
++
++namespace TagLib
++{
++
++ namespace ASF
++ {
++
++ class File;
++
++ class Attribute
++ {
++ public:
++
++ /*!
++ * Enum of types an Attribute can have.
++ */
++ enum AttributeTypes {
++ UnicodeType = 0,
++ BytesType = 1,
++ BoolType = 2,
++ DWordType = 3,
++ QWordType = 4,
++ WordType = 5,
++ GuidType = 6
++ };
++
++ /*!
++ * Constructs an empty attribute.
++ */
++ Attribute();
++
++ /*!
++ * Constructs an attribute with \a key and a UnicodeType \a value.
++ */
++ Attribute(const String &value);
++
++ /*!
++ * Constructs an attribute with \a key and a BytesType \a value.
++ */
++ Attribute(const ByteVector &value);
++
++ /*!
++ * Constructs an attribute with \a key and a DWordType \a value.
++ */
++ Attribute(unsigned int value);
++
++ /*!
++ * Constructs an attribute with \a key and a QWordType \a value.
++ */
++ Attribute(unsigned long long value);
++
++ /*!
++ * Constructs an attribute with \a key and a WordType \a value.
++ */
++ Attribute(unsigned short value);
++
++ /*!
++ * Constructs an attribute with \a key and a BoolType \a value.
++ */
++ Attribute(bool value);
++
++ /*!
++ * Construct an attribute as a copy of \a other.
++ */
++ Attribute(const Attribute &item);
++
++ /*!
++ * Copies the contents of \a other into this item.
++ */
++ ASF::Attribute &operator=(const Attribute &other);
++
++ /*!
++ * Destroys the attribute.
++ */
++ virtual ~Attribute();
++
++ /*!
++ * Returns type of the value.
++ */
++ AttributeTypes type() const;
++
++ /*!
++ * Returns the BoolType \a value.
++ */
++ unsigned short toBool() const;
++
++ /*!
++ * Returns the WordType \a value.
++ */
++ unsigned short toUShort() const;
++
++ /*!
++ * Returns the DWordType \a value.
++ */
++ unsigned int toUInt() const;
++
++ /*!
++ * Returns the QWordType \a value.
++ */
++ unsigned long long toULongLong() const;
++
++ /*!
++ * Returns the UnicodeType \a value.
++ */
++ String toString() const;
++
++ /*!
++ * Returns the BytesType \a value.
++ */
++ ByteVector toByteVector() const;
++
++ /*!
++ * Returns the language number, or 0 is no stream number was set.
++ */
++ int language() const;
++
++ /*!
++ * Sets the language number.
++ */
++ void setLanguage(int value);
++
++ /*!
++ * Returns the stream number, or 0 is no stream number was set.
++ */
++ int stream() const;
++
++ /*!
++ * Sets the stream number.
++ */
++ void setStream(int value);
++
++#ifndef DO_NOT_DOCUMENT
++ /* THIS IS PRIVATE, DON'T TOUCH IT! */
++ String parse(ASF::File &file, int kind = 0);
++#endif
++
++ private:
++ friend class File;
++
++ ByteVector render(const String &name, int kind = 0) const;
++
++ class AttributePrivate;
++ AttributePrivate *d;
++ };
++
++ }
++
++}
++
++#endif
+
+Property changes on: amarok/src/metadata/asf/asfattribute.h
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/asf/taglib_asffiletyperesolver.h
+===================================================================
+--- amarok/src/metadata/asf/taglib_asffiletyperesolver.h (revision 0)
++++ amarok/src/metadata/asf/taglib_asffiletyperesolver.h (revision 743005)
+@@ -0,0 +1,39 @@
++/***************************************************************************
++ copyright : (C) 2005 by Martin Aumueller
++ email : aumuell@reserv.at
++ ***************************************************************************/
++
++/***************************************************************************
++ * 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., 51 Franklin Street, Fifth Floor, Boston, *
++ * MA 02110-1301 USA *
++ ***************************************************************************/
++
++// (c) 2005 Martin Aumueller <aumuell@reserv.at>
++// See COPYING file for licensing information
++
++#ifndef TAGLIB_ASFFILETYPERESOLVER_H
++#define TAGLIB_ASFFILETYPERESOLVER_H
++
++#include <taglib/tfile.h>
++#include <taglib/fileref.h>
++
++
++class ASFFileTypeResolver : public TagLib::FileRef::FileTypeResolver
++{
++ TagLib::File *createFile(const char *fileName,
++ bool readAudioProperties,
++ TagLib::AudioProperties::ReadStyle audioPropertiesStyle) const;
++};
++
++#endif
+Index: amarok/src/metadata/asf/asftag.cpp
+===================================================================
+--- amarok/src/metadata/asf/asftag.cpp (revision 0)
++++ amarok/src/metadata/asf/asftag.cpp (revision 743005)
+@@ -0,0 +1,202 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#include "asftag.h"
++
++using namespace TagLib;
++
++class ASF::Tag::TagPrivate
++{
++public:
++ String title;
++ String artist;
++ String copyright;
++ String comment;
++ String rating;
++ AttributeListMap attributeListMap;
++};
++
++ASF::Tag::Tag()
++: TagLib::Tag()
++{
++ d = new TagPrivate;
++}
++
++ASF::Tag::~Tag()
++{
++ if(d)
++ delete d;
++}
++
++String
++ASF::Tag::title() const
++{
++ return d->title;
++}
++
++String
++ASF::Tag::artist() const
++{
++ return d->artist;
++}
++
++String
++ASF::Tag::album() const
++{
++ if(d->attributeListMap.contains("WM/AlbumTitle"))
++ return d->attributeListMap["WM/AlbumTitle"][0].toString();
++ return String::null;
++}
++
++String
++ASF::Tag::copyright() const
++{
++ return d->copyright;
++}
++
++String
++ASF::Tag::comment() const
++{
++ return d->comment;
++}
++
++String
++ASF::Tag::rating() const
++{
++ return d->rating;
++}
++
++unsigned int
++ASF::Tag::year() const
++{
++ if(d->attributeListMap.contains("WM/Year"))
++ return d->attributeListMap["WM/Year"][0].toString().toInt();
++ return 0;
++}
++
++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/Track"))
++ return d->attributeListMap["WM/Track"][0].toUInt();
++ return 0;
++}
++
++String
++ASF::Tag::genre() const
++{
++ if(d->attributeListMap.contains("WM/Genre"))
++ return d->attributeListMap["WM/Genre"][0].toString();
++ return String::null;
++}
++
++void
++ASF::Tag::setTitle(const String &value)
++{
++ d->title = value;
++}
++
++void
++ASF::Tag::setArtist(const String &value)
++{
++ d->artist = value;
++}
++
++void
++ASF::Tag::setCopyright(const String &value)
++{
++ d->copyright = value;
++}
++
++void
++ASF::Tag::setComment(const String &value)
++{
++ d->comment = value;
++}
++
++void
++ASF::Tag::setRating(const String &value)
++{
++ d->rating = value;
++}
++
++void
++ASF::Tag::setAlbum(const String &value)
++{
++ setAttribute("WM/AlbumTitle", value);
++}
++
++void
++ASF::Tag::setGenre(const String &value)
++{
++ setAttribute("WM/Genre", value);
++}
++
++void
++ASF::Tag::setYear(uint value)
++{
++ setAttribute("WM/Year", String::number(value));
++}
++
++void
++ASF::Tag::setTrack(uint value)
++{
++ setAttribute("WM/TrackNumber", String::number(value));
++}
++
++ASF::AttributeListMap&
++ASF::Tag::attributeListMap()
++{
++ return d->attributeListMap;
++}
++
++void ASF::Tag::removeItem(const String &key)
++{
++ AttributeListMap::Iterator it = d->attributeListMap.find(key);
++ if(it != d->attributeListMap.end())
++ d->attributeListMap.erase(it);
++}
++
++void ASF::Tag::setAttribute(const String &name, const Attribute &attribute)
++{
++ AttributeList value;
++ value.append(attribute);
++ d->attributeListMap.insert(name, value);
++}
++
++void ASF::Tag::addAttribute(const String &name, const Attribute &attribute)
++{
++ if(d->attributeListMap.contains(name)) {
++ d->attributeListMap[name].append(attribute);
++ }
++ else {
++ setAttribute(name, attribute);
++ }
++}
++
++bool ASF::Tag::isEmpty() const {
++ return TagLib::Tag::isEmpty() &&
++ copyright().isEmpty() &&
++ rating().isEmpty() &&
++ d->attributeListMap.isEmpty();
++}
+Index: amarok/src/metadata/asf/asfproperties.cpp
+===================================================================
+--- amarok/src/metadata/asf/asfproperties.cpp (revision 0)
++++ amarok/src/metadata/asf/asfproperties.cpp (revision 743005)
+@@ -0,0 +1,95 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#include <tstring.h>
++#include "asfproperties.h"
++
++using namespace TagLib;
++
++class ASF::Properties::PropertiesPrivate
++{
++public:
++ PropertiesPrivate(): length(0), bitrate(0), sampleRate(0), channels(0) {}
++ int length;
++ int bitrate;
++ int sampleRate;
++ int channels;
++};
++
++////////////////////////////////////////////////////////////////////////////////
++// public members
++////////////////////////////////////////////////////////////////////////////////
++
++ASF::Properties::Properties() : AudioProperties(AudioProperties::Average)
++{
++ d = new PropertiesPrivate;
++}
++
++ASF::Properties::~Properties()
++{
++ if(d)
++ delete d;
++}
++
++int ASF::Properties::length() const
++{
++ return d->length;
++}
++
++int ASF::Properties::bitrate() const
++{
++ return d->bitrate;
++}
++
++int ASF::Properties::sampleRate() const
++{
++ return d->sampleRate;
++}
++
++int ASF::Properties::channels() const
++{
++ return d->channels;
++}
++
++////////////////////////////////////////////////////////////////////////////////
++// private members
++////////////////////////////////////////////////////////////////////////////////
++
++void ASF::Properties::setLength(int length)
++{
++ d->length = length;
++}
++
++void ASF::Properties::setBitrate(int length)
++{
++ d->bitrate = length;
++}
++
++void ASF::Properties::setSampleRate(int length)
++{
++ d->sampleRate = length;
++}
++
++void ASF::Properties::setChannels(int length)
++{
++ d->channels = length;
++}
++
+
+Property changes on: amarok/src/metadata/asf/asfproperties.cpp
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/asf/Makefile.am
+===================================================================
+--- amarok/src/metadata/asf/Makefile.am (revision 0)
++++ amarok/src/metadata/asf/Makefile.am (revision 743005)
+@@ -0,0 +1,20 @@
++SUBDIRS =
++
++INCLUDES = $(all_includes) $(taglib_includes)
++METASOURCES = AUTO
++libtagasf_la_LDFLAGS = $(all_libraries)
++noinst_LTLIBRARIES = libtagasf.la
++
++libtagasf_la_SOURCES = \
++ asfattribute.cpp \
++ asfproperties.cpp \
++ asftag.cpp \
++ asffile.cpp \
++ taglib_asffiletyperesolver.cpp
++
++noinst_HEADERS = \
++ asfattribute.h \
++ asfproperties.h \
++ asftag.h \
++ asffile.h \
++ taglib_asffiletyperesolver.h
+Index: amarok/src/metadata/asf/asffile.cpp
+===================================================================
+--- amarok/src/metadata/asf/asffile.cpp (revision 0)
++++ amarok/src/metadata/asf/asffile.cpp (revision 743005)
+@@ -0,0 +1,547 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#include <tbytevectorlist.h>
++#include <tstring.h>
++#include "asffile.h"
++#include "asftag.h"
++#include "asfproperties.h"
++
++using namespace TagLib;
++
++class ASF::File::FilePrivate
++{
++public:
++ FilePrivate():
++ size(0),
++ tag(0),
++ properties(0),
++ contentDescriptionObject(0),
++ extendedContentDescriptionObject(0),
++ headerExtensionObject(0),
++ metadataObject(0),
++ metadataLibraryObject(0) {}
++ unsigned long long size;
++ ASF::Tag *tag;
++ ASF::Properties *properties;
++ List<ASF::File::BaseObject *> objects;
++ ASF::File::ContentDescriptionObject *contentDescriptionObject;
++ ASF::File::ExtendedContentDescriptionObject *extendedContentDescriptionObject;
++ ASF::File::HeaderExtensionObject *headerExtensionObject;
++ ASF::File::MetadataObject *metadataObject;
++ ASF::File::MetadataLibraryObject *metadataLibraryObject;
++};
++
++static ByteVector headerGuid("\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16);
++static ByteVector filePropertiesGuid("\xA1\xDC\xAB\x8C\x47\xA9\xCF\x11\x8E\xE4\x00\xC0\x0C\x20\x53\x65", 16);
++static ByteVector streamPropertiesGuid("\x91\x07\xDC\xB7\xB7\xA9\xCF\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65", 16);
++static ByteVector contentDescriptionGuid("\x33\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16);
++static ByteVector extendedContentDescriptionGuid("\x40\xA4\xD0\xD2\x07\xE3\xD2\x11\x97\xF0\x00\xA0\xC9\x5E\xA8\x50", 16);
++static ByteVector headerExtensionGuid("\xb5\x03\xbf_.\xa9\xcf\x11\x8e\xe3\x00\xc0\x0c Se", 16);
++static ByteVector metadataGuid("\xEA\xCB\xF8\xC5\xAF[wH\204g\xAA\214D\xFAL\xCA", 16);
++static ByteVector metadataLibraryGuid("\224\034#D\230\224\321I\241A\x1d\x13NEpT", 16);
++
++class ASF::File::BaseObject
++{
++public:
++ ByteVector data;
++ virtual ~BaseObject() {}
++ virtual ByteVector guid() = 0;
++ virtual void parse(ASF::File *file, unsigned int size);
++ virtual ByteVector render(ASF::File *file);
++};
++
++class ASF::File::UnknownObject : public ASF::File::BaseObject
++{
++ ByteVector myGuid;
++public:
++ UnknownObject(const ByteVector &guid);
++ ByteVector guid();
++};
++
++class ASF::File::FilePropertiesObject : public ASF::File::BaseObject
++{
++public:
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++};
++
++class ASF::File::StreamPropertiesObject : public ASF::File::BaseObject
++{
++public:
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++};
++
++class ASF::File::ContentDescriptionObject : public ASF::File::BaseObject
++{
++public:
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++ ByteVector render(ASF::File *file);
++};
++
++class ASF::File::ExtendedContentDescriptionObject : public ASF::File::BaseObject
++{
++public:
++ ByteVectorList attributeData;
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++ ByteVector render(ASF::File *file);
++};
++
++class ASF::File::MetadataObject : public ASF::File::BaseObject
++{
++public:
++ ByteVectorList attributeData;
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++ ByteVector render(ASF::File *file);
++};
++
++class ASF::File::MetadataLibraryObject : public ASF::File::BaseObject
++{
++public:
++ ByteVectorList attributeData;
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++ ByteVector render(ASF::File *file);
++};
++
++class ASF::File::HeaderExtensionObject : public ASF::File::BaseObject
++{
++public:
++ List<ASF::File::BaseObject *> objects;
++ ByteVector guid();
++ void parse(ASF::File *file, uint size);
++ ByteVector render(ASF::File *file);
++};
++
++void
++ASF::File::BaseObject::parse(ASF::File *file, unsigned int size)
++{
++ data = file->readBlock(size - 24);
++}
++
++ByteVector
++ASF::File::BaseObject::render(ASF::File * /*file*/)
++{
++ return guid() + ByteVector::fromLongLong(data.size() + 24, false) + data;
++}
++
++ASF::File::UnknownObject::UnknownObject(const ByteVector &guid) : myGuid(guid)
++{
++}
++
++ByteVector
++ASF::File::UnknownObject::guid()
++{
++ return myGuid;
++}
++
++ByteVector
++ASF::File::FilePropertiesObject::guid()
++{
++ return filePropertiesGuid;
++}
++
++void
++ASF::File::FilePropertiesObject::parse(ASF::File *file, uint size)
++{
++ BaseObject::parse(file, size);
++ file->d->properties->setLength((int)(data.mid(40, 8).toLongLong(false) / 10000000L - data.mid(56, 8).toLongLong(false) / 1000L));
++}
++
++ByteVector
++ASF::File::StreamPropertiesObject::guid()
++{
++ return streamPropertiesGuid;
++}
++
++void
++ASF::File::StreamPropertiesObject::parse(ASF::File *file, uint size)
++{
++ BaseObject::parse(file, size);
++ file->d->properties->setChannels(data.mid(56, 2).toShort(false));
++ file->d->properties->setSampleRate(data.mid(58, 4).toUInt(false));
++ file->d->properties->setBitrate(data.mid(62, 4).toUInt(false) * 8 / 1000);
++}
++
++ByteVector
++ASF::File::ContentDescriptionObject::guid()
++{
++ return contentDescriptionGuid;
++}
++
++void
++ASF::File::ContentDescriptionObject::parse(ASF::File *file, uint /*size*/)
++{
++ file->d->contentDescriptionObject = this;
++ int titleLength = file->readWORD();
++ int artistLength = file->readWORD();
++ int copyrightLength = file->readWORD();
++ int commentLength = file->readWORD();
++ int ratingLength = file->readWORD();
++ file->d->tag->setTitle(file->readString(titleLength));
++ file->d->tag->setArtist(file->readString(artistLength));
++ file->d->tag->setCopyright(file->readString(copyrightLength));
++ file->d->tag->setComment(file->readString(commentLength));
++ file->d->tag->setRating(file->readString(ratingLength));
++}
++
++ByteVector
++ASF::File::ContentDescriptionObject::render(ASF::File *file)
++{
++ ByteVector v1 = file->renderString(file->d->tag->title());
++ ByteVector v2 = file->renderString(file->d->tag->artist());
++ ByteVector v3 = file->renderString(file->d->tag->copyright());
++ ByteVector v4 = file->renderString(file->d->tag->comment());
++ ByteVector v5 = file->renderString(file->d->tag->rating());
++ data.clear();
++ data.append(ByteVector::fromShort(v1.size(), false));
++ data.append(ByteVector::fromShort(v2.size(), false));
++ data.append(ByteVector::fromShort(v3.size(), false));
++ data.append(ByteVector::fromShort(v4.size(), false));
++ data.append(ByteVector::fromShort(v5.size(), false));
++ data.append(v1);
++ data.append(v2);
++ data.append(v3);
++ data.append(v4);
++ data.append(v5);
++ return BaseObject::render(file);
++}
++
++ByteVector
++ASF::File::ExtendedContentDescriptionObject::guid()
++{
++ return extendedContentDescriptionGuid;
++}
++
++void
++ASF::File::ExtendedContentDescriptionObject::parse(ASF::File *file, uint /*size*/)
++{
++ file->d->extendedContentDescriptionObject = this;
++ int count = file->readWORD();
++ while(count--) {
++ ASF::Attribute attribute;
++ String name = attribute.parse(*file);
++ file->d->tag->addAttribute(name, attribute);
++ }
++}
++
++ByteVector
++ASF::File::ExtendedContentDescriptionObject::render(ASF::File *file)
++{
++ data.clear();
++ data.append(ByteVector::fromShort(attributeData.size(), false));
++ data.append(attributeData.toByteVector(ByteVector::null));
++ return BaseObject::render(file);
++}
++
++ByteVector
++ASF::File::MetadataObject::guid()
++{
++ return metadataGuid;
++}
++
++void
++ASF::File::MetadataObject::parse(ASF::File *file, uint /*size*/)
++{
++ file->d->metadataObject = this;
++ int count = file->readWORD();
++ while(count--) {
++ ASF::Attribute attribute;
++ String name = attribute.parse(*file, 1);
++ file->d->tag->addAttribute(name, attribute);
++ }
++}
++
++ByteVector
++ASF::File::MetadataObject::render(ASF::File *file)
++{
++ data.clear();
++ data.append(ByteVector::fromShort(attributeData.size(), false));
++ data.append(attributeData.toByteVector(ByteVector::null));
++ return BaseObject::render(file);
++}
++
++ByteVector
++ASF::File::MetadataLibraryObject::guid()
++{
++ return metadataLibraryGuid;
++}
++
++void
++ASF::File::MetadataLibraryObject::parse(ASF::File *file, uint /*size*/)
++{
++ file->d->metadataLibraryObject = this;
++ int count = file->readWORD();
++ while(count--) {
++ ASF::Attribute attribute;
++ String name = attribute.parse(*file, 2);
++ file->d->tag->addAttribute(name, attribute);
++ }
++}
++
++ByteVector
++ASF::File::MetadataLibraryObject::render(ASF::File *file)
++{
++ data.clear();
++ data.append(ByteVector::fromShort(attributeData.size(), false));
++ data.append(attributeData.toByteVector(ByteVector::null));
++ return BaseObject::render(file);
++}
++
++ByteVector
++ASF::File::HeaderExtensionObject::guid()
++{
++ return headerExtensionGuid;
++}
++
++void
++ASF::File::HeaderExtensionObject::parse(ASF::File *file, uint /*size*/)
++{
++ file->d->headerExtensionObject = this;
++ file->seek(18, File::Current);
++ long long dataSize = file->readDWORD();
++ long long dataPos = 0;
++ while(dataPos < dataSize) {
++ ByteVector guid = file->readBlock(16);
++ long long size = file->readQWORD();
++ BaseObject *obj;
++ if(guid == metadataGuid) {
++ obj = new MetadataObject();
++ }
++ else if(guid == metadataLibraryGuid) {
++ obj = new MetadataLibraryObject();
++ }
++ else {
++ obj = new UnknownObject(guid);
++ }
++ obj->parse(file, size);
++ objects.append(obj);
++ dataPos += size;
++ }
++}
++
++ByteVector
++ASF::File::HeaderExtensionObject::render(ASF::File *file)
++{
++ data.clear();
++ for(unsigned int i = 0; i < objects.size(); i++) {
++ data.append(objects[i]->render(file));
++ }
++ data = ByteVector("\x11\xD2\xD3\xAB\xBA\xA9\xcf\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65\x06\x00", 18) + ByteVector::fromUInt(data.size(), false) + data;
++ return BaseObject::render(file);
++}
++
++////////////////////////////////////////////////////////////////////////////////
++// public members
++////////////////////////////////////////////////////////////////////////////////
++
++ASF::File::File(const char *file, bool readProperties, Properties::ReadStyle propertiesStyle)
++ : TagLib::File(file)
++{
++ d = new FilePrivate;
++ read(readProperties, propertiesStyle);
++}
++
++ASF::File::~File()
++{
++ for(unsigned int i = 0; i < d->objects.size(); i++) {
++ delete d->objects[i];
++ }
++ if(d->tag) {
++ delete d->tag;
++ }
++ if(d->properties) {
++ delete d->properties;
++ }
++ delete d;
++}
++
++ASF::Tag *ASF::File::tag() const
++{
++ return d->tag;
++}
++
++ASF::Properties *ASF::File::audioProperties() const
++{
++ return d->properties;
++}
++
++void ASF::File::read(bool /*readProperties*/, Properties::ReadStyle /*propertiesStyle*/)
++{
++ if(!isValid())
++ return;
++
++ ByteVector guid = readBlock(16);
++ if(guid != headerGuid) {
++ return;
++ }
++
++ d->tag = new ASF::Tag();
++ d->properties = new ASF::Properties();
++
++ d->size = readQWORD();
++ int numObjects = readDWORD();
++ seek(2, Current);
++
++ for(int i = 0; i < numObjects; i++) {
++ ByteVector guid = readBlock(16);
++ long size = (long)readQWORD();
++ BaseObject *obj;
++ if(guid == filePropertiesGuid) {
++ obj = new FilePropertiesObject();
++ }
++ else if(guid == streamPropertiesGuid) {
++ obj = new StreamPropertiesObject();
++ }
++ else if(guid == contentDescriptionGuid) {
++ obj = new ContentDescriptionObject();
++ }
++ else if(guid == extendedContentDescriptionGuid) {
++ obj = new ExtendedContentDescriptionObject();
++ }
++ else if(guid == headerExtensionGuid) {
++ obj = new HeaderExtensionObject();
++ }
++ else {
++ obj = new UnknownObject(guid);
++ }
++ obj->parse(this, size);
++ d->objects.append(obj);
++ }
++}
++
++bool ASF::File::save()
++{
++ if(readOnly()) {
++ return false;
++ }
++
++ if(!d->contentDescriptionObject) {
++ d->contentDescriptionObject = new ContentDescriptionObject();
++ d->objects.append(d->contentDescriptionObject);
++ }
++ if(!d->extendedContentDescriptionObject) {
++ d->extendedContentDescriptionObject = new ExtendedContentDescriptionObject();
++ d->objects.append(d->extendedContentDescriptionObject);
++ }
++ if(!d->headerExtensionObject) {
++ d->headerExtensionObject = new HeaderExtensionObject();
++ d->objects.append(d->headerExtensionObject);
++ }
++ if(!d->metadataObject) {
++ d->metadataObject = new MetadataObject();
++ d->headerExtensionObject->objects.append(d->metadataObject);
++ }
++ if(!d->metadataLibraryObject) {
++ d->metadataLibraryObject = new MetadataLibraryObject();
++ d->headerExtensionObject->objects.append(d->metadataLibraryObject);
++ }
++
++ ASF::AttributeListMap::ConstIterator it = d->tag->attributeListMap().begin();
++ for(; it != d->tag->attributeListMap().end(); it++) {
++ const String &name = it->first;
++ const AttributeList &attributes = it->second;
++ bool inExtendedContentDescriptionObject = false;
++ bool inMetadataObject = false;
++ for(unsigned int j = 0; j < attributes.size(); j++) {
++ const Attribute &attribute = attributes[j];
++ if(!inExtendedContentDescriptionObject && attribute.language() == 0 && attribute.stream() == 0) {
++ d->extendedContentDescriptionObject->attributeData.append(attribute.render(name));
++ inExtendedContentDescriptionObject = true;
++ }
++ else if(!inMetadataObject && attribute.language() == 0 && attribute.stream() != 0) {
++ d->metadataObject->attributeData.append(attribute.render(name, 1));
++ inMetadataObject = true;
++ }
++ else {
++ d->metadataLibraryObject->attributeData.append(attribute.render(name, 2));
++ }
++ }
++ }
++
++ ByteVector data;
++ for(unsigned int i = 0; i < d->objects.size(); i++) {
++ data.append(d->objects[i]->render(this));
++ }
++ data = headerGuid + ByteVector::fromLongLong(data.size() + 30, false) + ByteVector::fromUInt(d->objects.size(), false) + ByteVector("\x01\x02", 2) + data;
++ insert(data, 0, d->size);
++
++ return true;
++}
++
++////////////////////////////////////////////////////////////////////////////////
++// protected members
++////////////////////////////////////////////////////////////////////////////////
++
++int ASF::File::readBYTE()
++{
++ ByteVector v = readBlock(1);
++ return v[0];
++}
++
++int ASF::File::readWORD()
++{
++ ByteVector v = readBlock(2);
++ return v.toShort(false);
++}
++
++unsigned int ASF::File::readDWORD()
++{
++ ByteVector v = readBlock(4);
++ return v.toUInt(false);
++}
++
++long long ASF::File::readQWORD()
++{
++ ByteVector v = readBlock(8);
++ return v.toLongLong(false);
++}
++
++String
++ASF::File::readString(int length)
++{
++ ByteVector data = readBlock(length);
++ unsigned int size = data.size();
++ while (size >= 2) {
++ if(data[size - 1] != '\0' || data[size - 2] != '\0') {
++ break;
++ }
++ size -= 2;
++ }
++ if(size != data.size()) {
++ data.resize(size);
++ }
++ return String(data, String::UTF16LE);
++}
++
++ByteVector
++ASF::File::renderString(const String &str, bool includeLength)
++{
++ ByteVector data = str.data(String::UTF16LE) + ByteVector::fromShort(0, false);
++ if(includeLength) {
++ data = ByteVector::fromShort(data.size(), false) + data;
++ }
++ return data;
++}
+
+Property changes on: amarok/src/metadata/asf/asffile.cpp
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/asf/asftag.h
+===================================================================
+--- amarok/src/metadata/asf/asftag.h (revision 0)
++++ amarok/src/metadata/asf/asftag.h (revision 743005)
+@@ -0,0 +1,181 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#ifndef TAGLIB_ASFTAG_H
++#define TAGLIB_ASFTAG_H
++
++#include <tag.h>
++#include <tlist.h>
++#include <tmap.h>
++#include "asfattribute.h"
++
++namespace TagLib {
++
++ namespace ASF {
++
++ typedef List<Attribute> AttributeList;
++ typedef Map<String, AttributeList> AttributeListMap;
++
++ class Tag : public TagLib::Tag {
++
++ friend class File;
++
++ public:
++
++ Tag();
++
++ virtual ~Tag();
++
++ /*!
++ * Returns the track name.
++ */
++ virtual String title() const;
++
++ /*!
++ * Returns the artist name.
++ */
++ virtual String artist() const;
++
++ /*!
++ * Returns the album name; if no album name is present in the tag
++ * String::null will be returned.
++ */
++ virtual String album() const;
++
++ /*!
++ * Returns the track comment.
++ */
++ virtual String comment() const;
++
++ /*!
++ * Returns the genre name; if no genre is present in the tag String::null
++ * will be returned.
++ */
++ virtual String genre() const;
++
++ /*!
++ * Returns the rating.
++ */
++ virtual String rating() const;
++
++ /*!
++ * Returns the genre name; if no genre is present in the tag String::null
++ * will be returned.
++ */
++ virtual String copyright() const;
++
++ /*!
++ * Returns the year; if there is no year set, this will return 0.
++ */
++ virtual uint year() const;
++
++ /*!
++ * Returns the track number; if there is no track number set, this will
++ * return 0.
++ */
++ virtual uint track() const;
++
++ /*!
++ * Sets the title to \a s.
++ */
++ virtual void setTitle(const String &s);
++
++ /*!
++ * Sets the artist to \a s.
++ */
++ virtual void setArtist(const String &s);
++
++ /*!
++ * Sets the album to \a s. If \a s is String::null then this value will be
++ * cleared.
++ */
++ virtual void setAlbum(const String &s);
++
++ /*!
++ * Sets the comment to \a s.
++ */
++ virtual void setComment(const String &s);
++
++ /*!
++ * Sets the rating to \a s.
++ */
++ virtual void setRating(const String &s);
++
++ /*!
++ * Sets the copyright to \a s.
++ */
++ virtual void setCopyright(const String &s);
++
++ /*!
++ * Sets the genre to \a s.
++ */
++ virtual void setGenre(const String &s);
++
++ /*!
++ * Sets the year to \a i. If \a s is 0 then this value will be cleared.
++ */
++ virtual void setYear(uint i);
++
++ /*!
++ * Sets the track to \a i. If \a s is 0 then this value will be cleared.
++ */
++ virtual void setTrack(uint i);
++
++ /*!
++ * Returns true if the tag does not contain any data. This should be
++ * reimplemented in subclasses that provide more than the basic tagging
++ * abilities in this class.
++ */
++ virtual bool isEmpty() const;
++
++ /*!
++ * Returns a reference to the item list map. This is an AttributeListMap of
++ * all of the items in the tag.
++ *
++ * This is the most powerfull structure for accessing the items of the tag.
++ */
++ AttributeListMap &attributeListMap();
++
++ /*!
++ * Removes the \a key attribute from the tag
++ */
++ void removeItem(const String &name);
++
++ /*!
++ * Sets the \a key attribute to the value of \a attribute. If an attribute
++ * with the \a key is already present, it will be replaced.
++ */
++ void setAttribute(const String &name, const Attribute &attribute);
++
++ /*!
++ * Sets the \a key attribute to the value of \a attribute. If an attribute
++ * with the \a key is already present, it will be added to the list.
++ */
++ void addAttribute(const String &name, const Attribute &attribute);
++
++ private:
++
++ class TagPrivate;
++ TagPrivate *d;
++ };
++ }
++}
++#endif
+Index: amarok/src/metadata/asf/asfproperties.h
+===================================================================
+--- amarok/src/metadata/asf/asfproperties.h (revision 0)
++++ amarok/src/metadata/asf/asfproperties.h (revision 743005)
+@@ -0,0 +1,69 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#ifndef TAGLIB_ASFPROPERTIES_H
++#define TAGLIB_ASFPROPERTIES_H
++
++#include <audioproperties.h>
++#include <tstring.h>
++
++namespace TagLib {
++
++ namespace ASF {
++
++ //! An implementation of ASF audio properties
++ class Properties : public AudioProperties
++ {
++ public:
++
++ /*!
++ * Create an instance of ASF::Properties.
++ */
++ Properties();
++
++ /*!
++ * Destroys this ASF::Properties instance.
++ */
++ virtual ~Properties();
++
++ // Reimplementations.
++ virtual int length() const;
++ virtual int bitrate() const;
++ virtual int sampleRate() const;
++ virtual int channels() const;
++
++#ifndef DO_NOT_DOCUMENT
++ void setLength(int value);
++ void setBitrate(int value);
++ void setSampleRate(int value);
++ void setChannels(int value);
++#endif
++
++ private:
++ class PropertiesPrivate;
++ PropertiesPrivate *d;
++ };
++
++ }
++
++}
++
++#endif
+
+Property changes on: amarok/src/metadata/asf/asfproperties.h
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/asf/asfattribute.cpp
+===================================================================
+--- amarok/src/metadata/asf/asfattribute.cpp (revision 0)
++++ amarok/src/metadata/asf/asfattribute.cpp (revision 743005)
+@@ -0,0 +1,304 @@
++/**************************************************************************
++ copyright : (C) 2005-2007 by Lukáš Lalinský
++ 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 *
++ ***************************************************************************/
++
++#include <taglib.h>
++#include "asfattribute.h"
++#include "asffile.h"
++
++using namespace TagLib;
++
++class ASF::Attribute::AttributePrivate : public RefCounter
++{
++public:
++ AttributePrivate()
++ : stream(0),
++ language(0) {}
++ AttributeTypes type;
++ String stringValue;
++ ByteVector byteVectorValue;
++ union {
++ unsigned int intValue;
++ unsigned short shortValue;
++ unsigned long long longLongValue;
++ bool boolValue;
++ };
++ int stream;
++ int language;
++};
++
++////////////////////////////////////////////////////////////////////////////////
++// public members
++////////////////////////////////////////////////////////////////////////////////
++
++ASF::Attribute::Attribute()
++{
++ d = new AttributePrivate;
++ d->type = UnicodeType;
++}
++
++ASF::Attribute::Attribute(const ASF::Attribute &other)
++ : d(other.d)
++{
++ d->ref();
++}
++
++ASF::Attribute &
++ASF::Attribute::operator=(const ASF::Attribute &other)
++{
++ if(d->deref())
++ delete d;
++ d = other.d;
++ d->ref();
++ return *this;
++}
++
++ASF::Attribute::~Attribute()
++{
++ if(d->deref())
++ delete d;
++}
++
++ASF::Attribute::Attribute(const String &value)
++{
++ d = new AttributePrivate;
++ d->type = UnicodeType;
++ d->stringValue = value;
++}
++
++ASF::Attribute::Attribute(const ByteVector &value)
++{
++ d = new AttributePrivate;
++ d->type = BytesType;
++ d->byteVectorValue = value;
++}
++
++ASF::Attribute::Attribute(unsigned int value)
++{
++ d = new AttributePrivate;
++ d->type = DWordType;
++ d->intValue = value;
++}
++
++ASF::Attribute::Attribute(unsigned long long value)
++{
++ d = new AttributePrivate;
++ d->type = QWordType;
++ d->longLongValue = value;
++}
++
++ASF::Attribute::Attribute(unsigned short value)
++{
++ d = new AttributePrivate;
++ d->type = WordType;
++ d->shortValue = value;
++}
++
++ASF::Attribute::Attribute(bool value)
++{
++ d = new AttributePrivate;
++ d->type = BoolType;
++ d->boolValue = value;
++}
++
++ASF::Attribute::AttributeTypes
++ASF::Attribute::type() const
++{
++ return d->type;
++}
++
++String
++ASF::Attribute::toString() const
++{
++ return d->stringValue;
++}
++
++ByteVector
++ASF::Attribute::toByteVector() const
++{
++ return d->byteVectorValue;
++}
++
++unsigned short
++ASF::Attribute::toBool() const
++{
++ return d->shortValue;
++}
++
++unsigned short
++ASF::Attribute::toUShort() const
++{
++ return d->shortValue;
++}
++
++unsigned int
++ASF::Attribute::toUInt() const
++{
++ return d->intValue;
++}
++
++unsigned long long
++ASF::Attribute::toULongLong() const
++{
++ return d->longLongValue;
++}
++
++String
++ASF::Attribute::parse(ASF::File &f, int kind)
++{
++ int size, nameLength;
++ String name;
++
++ // extended content descriptor
++ if(kind == 0) {
++ nameLength = f.readWORD();
++ name = f.readString(nameLength);
++ d->type = ASF::Attribute::AttributeTypes(f.readWORD());
++ size = f.readWORD();
++ }
++ // metadata & metadata library
++ else {
++ int temp = f.readWORD();
++ // metadata library
++ if(kind == 2) {
++ d->language = temp;
++ }
++ d->stream = f.readWORD();
++ nameLength = f.readWORD();
++ d->type = ASF::Attribute::AttributeTypes(f.readWORD());
++ size = f.readDWORD();
++ name = f.readString(nameLength);
++ }
++
++ switch(d->type) {
++ case WordType:
++ d->shortValue = f.readWORD();
++ break;
++
++ case BoolType:
++ if(kind == 0) {
++ d->boolValue = f.readDWORD() == 1;
++ }
++ else {
++ d->boolValue = f.readWORD() == 1;
++ }
++ break;
++
++ case DWordType:
++ d->intValue = f.readDWORD();
++ break;
++
++ case QWordType:
++ d->longLongValue = f.readQWORD();
++ break;
++
++ case UnicodeType:
++ d->stringValue = f.readString(size);
++ break;
++
++ case BytesType:
++ case GuidType:
++ d->byteVectorValue = f.readBlock(size);
++ break;
++ }
++
++ return name;
++}
++
++ByteVector
++ASF::Attribute::render(const String &name, int kind) const
++{
++ ByteVector data;
++
++ switch (d->type) {
++ case WordType:
++ data.append(ByteVector::fromShort(d->shortValue, false));
++ break;
++
++ case BoolType:
++ if(kind == 0) {
++ data.append(ByteVector::fromUInt(d->boolValue ? 1 : 0, false));
++ }
++ else {
++ data.append(ByteVector::fromShort(d->boolValue ? 1 : 0, false));
++ }
++ break;
++
++ case DWordType:
++ data.append(ByteVector::fromUInt(d->intValue, false));
++ break;
++
++ case QWordType:
++ data.append(ByteVector::fromLongLong(d->longLongValue, false));
++ break;
++
++ case UnicodeType:
++ data.append(File::renderString(d->stringValue));
++ break;
++
++ case BytesType:
++ case GuidType:
++ data.append(d->byteVectorValue);
++ break;
++ }
++
++ if(kind == 0) {
++ data = File::renderString(name, true) +
++ ByteVector::fromShort((int)d->type, false) +
++ ByteVector::fromShort(data.size(), false) +
++ data;
++ }
++ else {
++ ByteVector nameData = File::renderString(name);
++ data = ByteVector::fromShort(kind == 2 ? d->language : 0, false) +
++ ByteVector::fromShort(d->stream, false) +
++ ByteVector::fromShort(nameData.size(), false) +
++ ByteVector::fromShort((int)d->type, false) +
++ ByteVector::fromUInt(data.size(), false) +
++ nameData +
++ data;
++ }
++
++ return data;
++}
++
++int
++ASF::Attribute::language() const
++{
++ return d->language;
++}
++
++void
++ASF::Attribute::setLanguage(int value)
++{
++ d->language = value;
++}
++
++int
++ASF::Attribute::stream() const
++{
++ return d->stream;
++}
++
++void
++ASF::Attribute::setStream(int value)
++{
++ d->stream = value;
++}
+
+Property changes on: amarok/src/metadata/asf/asfattribute.cpp
+___________________________________________________________________
+Name: svn:eol-style
+ + native
+
+Index: amarok/src/metadata/mp4/mp4file.cpp
+===================================================================
+--- amarok/src/metadata/mp4/mp4file.cpp (revision 705231)
++++ amarok/src/metadata/mp4/mp4file.cpp (working copy)
+@@ -156,10 +156,7 @@
+ }
+ #endif
+
+- if(!MP4Close(handle))
+- {
+- fprintf(stderr, "close failed\n");
+- }
++ MP4Close(handle);
+
+ mp4file = MP4Read(name());
+ if(mp4file == MP4_INVALID_FILE_HANDLE)
+Index: amarok/src/metadata/wma/taglib_wmafiletyperesolver.h
+===================================================================
+--- amarok/src/metadata/wma/taglib_wmafiletyperesolver.h (revision 705231)
++++ amarok/src/metadata/wma/taglib_wmafiletyperesolver.h (working copy)
+@@ -1,39 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 by Martin Aumueller
+- email : aumuell@reserv.at
+- ***************************************************************************/
+-
+-/***************************************************************************
+- * 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-// (c) 2005 Martin Aumueller <aumuell@reserv.at>
+-// See COPYING file for licensing information
+-
+-#ifndef TAGLIB_WMAFILETYPERESOLVER_H
+-#define TAGLIB_WMAFILETYPERESOLVER_H
+-
+-#include <taglib/tfile.h>
+-#include <taglib/fileref.h>
+-
+-
+-class WMAFileTypeResolver : public TagLib::FileRef::FileTypeResolver
+-{
+- TagLib::File *createFile(const char *fileName,
+- bool readAudioProperties,
+- TagLib::AudioProperties::ReadStyle audioPropertiesStyle) const;
+-};
+-
+-#endif
+Index: amarok/src/metadata/wma/wmatag.cpp
+===================================================================
+--- amarok/src/metadata/wma/wmatag.cpp (revision 705231)
++++ amarok/src/metadata/wma/wmatag.cpp (working copy)
+@@ -1,210 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#include <wmatag.h>
+-
+-using namespace TagLib;
+-
+-class WMA::Tag::TagPrivate
+-{
+-public:
+- String title;
+- String artist;
+- String copyright;
+- String comment;
+- String rating;
+- AttributeMap attributeMap;
+-};
+-
+-WMA::Tag::Tag()
+-: TagLib::Tag()
+-{
+- d = new TagPrivate;
+-}
+-
+-WMA::Tag::~Tag()
+-{
+- if(d)
+- delete d;
+-}
+-
+-String
+-WMA::Tag::title() const
+-{
+- return d->title;
+-}
+-
+-String
+-WMA::Tag::artist() const
+-{
+- return d->artist;
+-}
+-
+-String
+-WMA::Tag::album() const
+-{
+- if(d->attributeMap.contains("WM/AlbumTitle"))
+- return d->attributeMap["WM/AlbumTitle"].toString();
+- return String::null;
+-}
+-
+-String
+-WMA::Tag::copyright() const
+-{
+- return d->copyright;
+-}
+-
+-String
+-WMA::Tag::comment() const
+-{
+- return d->comment;
+-}
+-
+-String
+-WMA::Tag::rating() const
+-{
+- return d->rating;
+-}
+-
+-unsigned int
+-WMA::Tag::year() const
+-{
+- if(d->attributeMap.contains("WM/Year"))
+- return d->attributeMap["WM/Year"].toInt();
+- return 0;
+-}
+-
+-unsigned int
+-WMA::Tag::track() const
+-{
+- if(d->attributeMap.contains("WM/TrackNumber"))
+- return d->attributeMap["WM/TrackNumber"].toInt();
+- if(d->attributeMap.contains("WM/Track"))
+- return d->attributeMap["WM/Track"].toInt();
+- return 0;
+-}
+-
+-String
+-WMA::Tag::genre() const
+-{
+- if(d->attributeMap.contains("WM/Genre"))
+- return d->attributeMap["WM/Genre"].toString();
+- return String::null;
+-}
+-
+-void
+-WMA::Tag::setTitle(const String &value)
+-{
+- d->title = value;
+-}
+-
+-void
+-WMA::Tag::setArtist(const String &value)
+-{
+- d->artist = value;
+-}
+-
+-void
+-WMA::Tag::setCopyright(const String &value)
+-{
+- d->copyright = value;
+-}
+-
+-void
+-WMA::Tag::setComment(const String &value)
+-{
+- d->comment = value;
+-}
+-
+-void
+-WMA::Tag::setRating(const String &value)
+-{
+- d->rating = value;
+-}
+-
+-void
+-WMA::Tag::setAlbum(const String &value)
+-{
+- setAttribute("WM/AlbumTitle", value);
+-}
+-
+-void
+-WMA::Tag::setGenre(const String &value)
+-{
+- setAttribute("WM/Genre", value);
+-}
+-
+-void
+-WMA::Tag::setYear(uint value)
+-{
+- setAttribute("WM/Year", String::number(value));
+-}
+-
+-void
+-WMA::Tag::setTrack(uint value)
+-{
+- setAttribute("WM/TrackNumber", String::number(value));
+-}
+-
+-const WMA::AttributeMap& WMA::Tag::attributeMap() const
+-{
+- return d->attributeMap;
+-}
+-
+-void WMA::Tag::removeItem(const ByteVector &key)
+-{
+- AttributeMap::Iterator it = d->attributeMap.find(key);
+- if(it != d->attributeMap.end())
+- d->attributeMap.erase(it);
+-}
+-
+-void WMA::Tag::setAttribute(const ByteVector &key, const String &value)
+-{
+- setAttribute(key, WMA::Attribute(key, value));
+-}
+-
+-void WMA::Tag::setAttribute(const ByteVector &key, const Attribute &attribute)
+-{
+- removeItem(key);
+- d->attributeMap.insert(key, attribute);
+-}
+-
+-bool WMA::Tag::isEmpty() const {
+- return TagLib::Tag::isEmpty() &&
+- copyright().isEmpty() &&
+- rating().isEmpty() &&
+- d->attributeMap.isEmpty();
+-}
+-
+-void WMA::Tag::duplicate(const Tag *source, Tag *target, bool overwrite) {
+- TagLib::Tag::duplicate(source, target, overwrite);
+- if(overwrite) {
+- target->setCopyright(source->copyright());
+- target->setRating(source->rating());
+- }
+- else {
+- if (target->copyright().isEmpty())
+- target->setCopyright(source->copyright());
+- if (target->rating().isEmpty())
+- target->setRating(source->rating());
+- }
+-}
+-
+Index: amarok/src/metadata/wma/wmaproperties.cpp
+===================================================================
+--- amarok/src/metadata/wma/wmaproperties.cpp (revision 705231)
++++ amarok/src/metadata/wma/wmaproperties.cpp (working copy)
+@@ -1,83 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#include <tstring.h>
+-#include <wmaproperties.h>
+-
+-using namespace TagLib;
+-
+-class WMA::Properties::PropertiesPrivate
+-{
+-public:
+- PropertiesPrivate(): length(0), bitrate(0), sampleRate(0), channels(0) {}
+- int length;
+- int bitrate;
+- int sampleRate;
+- int channels;
+-};
+-
+-////////////////////////////////////////////////////////////////////////////////
+-// public members
+-////////////////////////////////////////////////////////////////////////////////
+-
+-WMA::Properties::Properties() : AudioProperties(AudioProperties::Average)
+-{
+- d = new PropertiesPrivate;
+-}
+-
+-WMA::Properties::~Properties()
+-{
+- if(d)
+- delete d;
+-}
+-
+-int WMA::Properties::length() const
+-{
+- return d->length;
+-}
+-
+-int WMA::Properties::bitrate() const
+-{
+- return d->bitrate;
+-}
+-
+-int WMA::Properties::sampleRate() const
+-{
+- return d->sampleRate;
+-}
+-
+-int WMA::Properties::channels() const
+-{
+- return d->channels;
+-}
+-
+-////////////////////////////////////////////////////////////////////////////////
+-// private members
+-////////////////////////////////////////////////////////////////////////////////
+-
+-void WMA::Properties::set(int length, int bitrate, int sampleRate, int channels)
+-{
+- d->length = length;
+- d->bitrate = bitrate;
+- d->sampleRate = sampleRate;
+- d->channels = channels;
+-}
+-
+Index: amarok/src/metadata/wma/wmafile.cpp
+===================================================================
+--- amarok/src/metadata/wma/wmafile.cpp (revision 705231)
++++ amarok/src/metadata/wma/wmafile.cpp (working copy)
+@@ -1,388 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#include <tstring.h>
+-#include <wmafile.h>
+-#include <wmatag.h>
+-#include <wmaproperties.h>
+-
+-#include <string.h>
+-
+-using namespace TagLib;
+-
+-class WMA::File::FilePrivate
+-{
+-public:
+- FilePrivate(): size(0), offset1(0), offset2(0), size1(0), size2(0),
+- numObjects(0), tag(0), properties(0) {}
+- unsigned long long size;
+- unsigned long offset1, offset2, size1, size2, numObjects;
+- WMA::Tag *tag;
+- WMA::Properties *properties;
+-};
+-
+-// GUIDs
+-
+-struct WMA::GUID
+-{
+- WMA::DWORD v1;
+- WMA::WORD v2;
+- WMA::WORD v3;
+- WMA::BYTE v4[8];
+- bool operator==(const GUID &g) const { return memcmp(this, &g, sizeof(WMA::GUID)) == 0; }
+- bool operator!=(const GUID &g) const { return memcmp(this, &g, sizeof(WMA::GUID)) != 0; }
+- static GUID header;
+- static GUID fileProperties;
+- static GUID streamProperties;
+- static GUID contentDescription;
+- static GUID extendedContentDescription;
+- static GUID audioMedia;
+-};
+-
+-WMA::GUID WMA::GUID::header = {
+- 0x75B22630, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }
+-};
+-
+-WMA::GUID WMA::GUID::fileProperties = {
+- 0x8CABDCA1, 0xA947, 0x11CF, { 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 },
+-};
+-
+-WMA::GUID WMA::GUID::streamProperties = {
+- 0xB7DC0791, 0xA9B7, 0x11CF, { 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65 },
+-};
+-
+-WMA::GUID WMA::GUID::contentDescription = {
+- 0x75b22633, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c },
+-};
+-
+-WMA::GUID WMA::GUID::extendedContentDescription = {
+- 0xD2D0A440, 0xE307, 0x11D2, { 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50 },
+-};
+-
+-WMA::GUID WMA::GUID::audioMedia = {
+- 0xF8699E40, 0x5B4D, 0x11CF, { 0xA8, 0xFD, 0x00, 0x80, 0x5F, 0x5C, 0x44, 0x2B },
+-};
+-
+-////////////////////////////////////////////////////////////////////////////////
+-// public members
+-////////////////////////////////////////////////////////////////////////////////
+-
+-WMA::File::File(const char *file, bool readProperties, Properties::ReadStyle propertiesStyle)
+- : TagLib::File(file)
+-{
+- d = new FilePrivate;
+- read(readProperties, propertiesStyle);
+-}
+-
+-WMA::File::~File()
+-{
+- if(d) {
+- if (d->tag)
+- delete d->tag;
+- if (d->properties)
+- delete d->properties;
+- delete d;
+- }
+-}
+-
+-TagLib::Tag *WMA::File::tag() const
+-{
+- return d->tag;
+-}
+-
+-WMA::Tag *WMA::File::WMATag() const
+-{
+- return d->tag;
+-}
+-
+-WMA::Properties *WMA::File::audioProperties() const
+-{
+- return d->properties;
+-}
+-
+-void WMA::File::read(bool readProperties, Properties::ReadStyle /* propertiesStyle */)
+-{
+- WMA::GUID guid;
+-
+- readGUID(guid);
+- if(guid != GUID::header) {
+- return;
+- }
+-
+- int length = 0;
+- int bitrate = 0;
+- int sampleRate = 0;
+- int channels = 0;
+-
+- d->tag = new WMA::Tag();
+- if(!d->tag)
+- return;
+-
+- d->size = readQWORD();
+- d->numObjects = readDWORD();
+- seek(2, Current);
+-
+- for(int i = 0; i < (int)d->numObjects; i++) {
+-
+- readGUID(guid);
+- long objectSize = (long)readQWORD();
+-
+- if(readProperties && guid == GUID::fileProperties) {
+-
+- seek(16+8+8+8, Current);
+- length = (int)(readQWORD() / 10000000L);
+- seek(8+8+4+4+4+4, Current);
+-
+- }
+-
+- else if(readProperties && guid == GUID::streamProperties) {
+-
+- long pos = tell();
+-
+- readGUID(guid);
+- if(guid != GUID::audioMedia) {
+- return;
+- }
+-
+- seek(16+8+4+4+2+4+2, Current);
+- channels = readWORD();
+- sampleRate = readDWORD();
+- bitrate = readDWORD() * 8 / 1000;
+-
+- seek(pos + (long)objectSize - 24);
+- }
+-
+- else if(guid == GUID::extendedContentDescription) {
+-
+- d->offset2 = tell() - 16 - 8;
+- d->size2 = (long)objectSize;
+-
+- int numDescriptors = readWORD();
+-
+- for(int j = 0; j < numDescriptors; j++) {
+- WMA::Attribute attr(*this);
+- d->tag->setAttribute(attr.name().toCString(false), attr);
+- }
+-
+- }
+-
+- else if(guid == GUID::contentDescription) {
+-
+- d->offset1 = tell() - 16 - 8;
+- d->size1 = (long)objectSize;
+-
+- int titleLength = readWORD();
+- int artistLength = readWORD();
+- int copyrightLength = readWORD();
+- int commentLength = readWORD();
+- int ratingLength = readWORD();
+-
+- String value;
+-
+- readString(titleLength, value);
+- d->tag->setTitle(value);
+-
+- readString(artistLength, value);
+- d->tag->setArtist(value);
+-
+- readString(copyrightLength, value);
+- d->tag->setCopyright(value);
+-
+- readString(commentLength, value);
+- d->tag->setComment(value);
+-
+- readString(ratingLength, value);
+- d->tag->setRating(value);
+- }
+-
+- else {
+- seek((long)objectSize - 24, Current);
+- }
+-
+- }
+-
+- if(readProperties) {
+- d->properties = new WMA::Properties();
+- if(d->properties)
+- d->properties->set(length, bitrate, sampleRate, channels);
+- }
+-
+-}
+-
+-bool WMA::File::save()
+-{
+- if(readOnly()) {
+- return false;
+- }
+-
+- if(d->offset1 == 0) {
+- d->offset1 = 16 + 8 + 4 + 2;
+- d->numObjects++;
+- }
+-
+- if(d->offset2 == 0) {
+- d->offset2 = 16 + 8 + 4 + 2;
+- d->numObjects++;
+- }
+-
+- ByteVector chunk1 = renderContentDescription();
+- ByteVector chunk2 = renderExtendedContentDescription();
+-
+- if(d->offset1 > d->offset2) {
+- insert(chunk1, d->offset1, d->size1);
+- insert(chunk2, d->offset2, d->size2);
+- }
+- else {
+- insert(chunk2, d->offset2, d->size2);
+- insert(chunk1, d->offset1, d->size1);
+- }
+-
+- insert(ByteVector::fromLongLong(d->size +
+- (int)(chunk1.size() - d->size1) +
+- (int)(chunk2.size() - d->size2), false) +
+- ByteVector::fromUInt(d->numObjects, false), 16, 8 + 4);
+-
+- return true;
+-}
+-
+-////////////////////////////////////////////////////////////////////////////////
+-// protected members
+-////////////////////////////////////////////////////////////////////////////////
+-
+-int WMA::File::readBYTE()
+-{
+- ByteVector v = readBlock(1);
+- return v[0];
+-}
+-
+-int WMA::File::readWORD()
+-{
+- ByteVector v = readBlock(2);
+- return v.toShort(false);
+-}
+-
+-unsigned int WMA::File::readDWORD()
+-{
+- ByteVector v = readBlock(4);
+- return v.toUInt(false);
+-}
+-
+-long long WMA::File::readQWORD()
+-{
+- ByteVector v = readBlock(8);
+- return v.toLongLong(false);
+-}
+-
+-void WMA::File::readGUID(GUID &g)
+-{
+- g.v1 = readDWORD();
+- g.v2 = readWORD();
+- g.v3 = readWORD();
+- for(int i = 0; i < 8; i++)
+- g.v4[i] = readBYTE();
+-}
+-
+-void WMA::File::readString(int len, String &s)
+-{
+- ByteVector v = readBlock(len);
+- if(len < 2 || v[len-1] != 0 || v[len-2] != 0)
+- v.append(ByteVector::fromShort(0));
+- s = String(v, String::UTF16LE);
+-}
+-
+-ByteVector WMA::File::renderContentDescription()
+-{
+- String s;
+-
+- s = d->tag->title();
+- ByteVector v1 = s.data(String::UTF16LE);
+- if(s.size()) {
+- v1.append((char)0);
+- v1.append((char)0);
+- }
+-
+- s = d->tag->artist();
+- ByteVector v2 = s.data(String::UTF16LE);
+- if(s.size()) {
+- v2.append((char)0);
+- v2.append((char)0);
+- }
+-
+- s = d->tag->copyright();
+- ByteVector v3 = s.data(String::UTF16LE);
+- if(s.size()) {
+- v3.append((char)0);
+- v3.append((char)0);
+- }
+-
+- s = d->tag->comment();
+- ByteVector v4 = s.data(String::UTF16LE);
+- if(s.size()) {
+- v4.append((char)0);
+- v4.append((char)0);
+- }
+-
+- s = d->tag->rating();
+- ByteVector v5 = s.data(String::UTF16LE);
+- if(s.size()) {
+- v5.append((char)0);
+- v5.append((char)0);
+- }
+-
+- ByteVector data;
+-
+- data.append(ByteVector::fromShort(v1.size(), false));
+- data.append(ByteVector::fromShort(v2.size(), false));
+- data.append(ByteVector::fromShort(v3.size(), false));
+- data.append(ByteVector::fromShort(v4.size(), false));
+- data.append(ByteVector::fromShort(v5.size(), false));
+-
+- data.append(v1);
+- data.append(v2);
+- data.append(v3);
+- data.append(v4);
+- data.append(v5);
+-
+- data = ByteVector(reinterpret_cast<const char *>(&GUID::contentDescription), sizeof(GUID))
+- + ByteVector::fromLongLong(data.size() + 16 + 8, false)
+- + data;
+-
+- return data;
+-}
+-
+-ByteVector WMA::File::renderExtendedContentDescription()
+-{
+- ByteVector data;
+-
+- data.append(ByteVector::fromShort(d->tag->attributeMap().size(), false));
+-
+- WMA::AttributeMap::ConstIterator it = d->tag->attributeMap().begin();
+- for(; it != d->tag->attributeMap().end(); it++)
+- data.append(it->second.render());
+-
+- data = ByteVector(reinterpret_cast<const char *>(&GUID::extendedContentDescription), sizeof(GUID))
+- + ByteVector::fromLongLong(data.size() + 16 + 8, false)
+- + data;
+-
+- return data;
+-}
+-
+-
+Index: amarok/src/metadata/wma/wmatag.h
+===================================================================
+--- amarok/src/metadata/wma/wmatag.h (revision 705231)
++++ amarok/src/metadata/wma/wmatag.h (working copy)
+@@ -1,188 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#ifndef TAGLIB_WMATAG_H
+-#define TAGLIB_WMATAG_H
+-
+-#include <tmap.h>
+-#include <tag.h>
+-#include "wmafile.h"
+-#include "wmaattribute.h"
+-
+-namespace TagLib {
+-
+- namespace WMA {
+-
+- typedef Map<const ByteVector, Attribute> AttributeMap;
+-
+- class Tag : public TagLib::Tag {
+-
+- friend class File;
+-
+- public:
+-
+- Tag();
+-
+- virtual ~Tag();
+-
+- /*!
+- * Returns the track name.
+- */
+- virtual String title() const;
+-
+- /*!
+- * Returns the artist name.
+- */
+- virtual String artist() const;
+-
+- /*!
+- * Returns the album name; if no album name is present in the tag
+- * String::null will be returned.
+- */
+- virtual String album() const;
+-
+- /*!
+- * Returns the track comment.
+- */
+- virtual String comment() const;
+-
+- /*!
+- * Returns the genre name; if no genre is present in the tag String::null
+- * will be returned.
+- */
+- virtual String genre() const;
+-
+- /*!
+- * Returns the rating.
+- */
+- virtual String rating() const;
+-
+- /*!
+- * Returns the genre name; if no genre is present in the tag String::null
+- * will be returned.
+- */
+- virtual String copyright() const;
+-
+- /*!
+- * Returns the year; if there is no year set, this will return 0.
+- */
+- virtual uint year() const;
+-
+- /*!
+- * Returns the track number; if there is no track number set, this will
+- * return 0.
+- */
+- virtual uint track() const;
+-
+- /*!
+- * Sets the title to \a s.
+- */
+- virtual void setTitle(const String &s);
+-
+- /*!
+- * Sets the artist to \a s.
+- */
+- virtual void setArtist(const String &s);
+-
+- /*!
+- * Sets the album to \a s. If \a s is String::null then this value will be
+- * cleared.
+- */
+- virtual void setAlbum(const String &s);
+-
+- /*!
+- * Sets the comment to \a s.
+- */
+- virtual void setComment(const String &s);
+-
+- /*!
+- * Sets the rating to \a s.
+- */
+- virtual void setRating(const String &s);
+-
+- /*!
+- * Sets the copyright to \a s.
+- */
+- virtual void setCopyright(const String &s);
+-
+- /*!
+- * Sets the genre to \a s.
+- */
+- virtual void setGenre(const String &s);
+-
+- /*!
+- * Sets the year to \a i. If \a s is 0 then this value will be cleared.
+- */
+- virtual void setYear(uint i);
+-
+- /*!
+- * Sets the track to \a i. If \a s is 0 then this value will be cleared.
+- */
+- virtual void setTrack(uint i);
+-
+- /*!
+- * Returns true if the tag does not contain any data. This should be
+- * reimplemented in subclasses that provide more than the basic tagging
+- * abilities in this class.
+- */
+- virtual bool isEmpty() const;
+-
+- /*!
+- * Copies the generic data from one tag to another.
+- *
+- * If \a overwrite is true then the values will be unconditionally copied.
+- * If false only empty values will be overwritten.
+- */
+- static void duplicate(const Tag *source, Tag *target, bool overwrite = true);
+-
+- /*!
+- * Returns a reference to the item list map. This is an ItemListMap of
+- * all of the items in the tag.
+- *
+- * This is the most powerfull structure for accessing the items of the tag.
+- *
+- * \warning You should not modify this data structure directly, instead
+- * use setItem() and removeItem().
+- */
+- const AttributeMap &attributeMap() const;
+-
+- /*!
+- * Removes the \a key attribute from the tag
+- */
+- void removeItem(const ByteVector &key);
+-
+- void setAttribute(const ByteVector &key, const String &value);
+-
+- /*!
+- * Sets the \a key attribute to the value of \a attribute. If an attribute
+- * with the \a key is already present, it will be replaced.
+- */
+- void setAttribute(const ByteVector &key, const Attribute &attribute);
+-
+- private:
+-
+- class TagPrivate;
+- TagPrivate *d;
+-
+- };
+- }
+-}
+-#endif
+Index: amarok/src/metadata/wma/wmaproperties.h
+===================================================================
+--- amarok/src/metadata/wma/wmaproperties.h (revision 705231)
++++ amarok/src/metadata/wma/wmaproperties.h (working copy)
+@@ -1,71 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#ifndef TAGLIB_WMAPROPERTIES_H
+-#define TAGLIB_WMAPROPERTIES_H
+-
+-#include <audioproperties.h>
+-#include <tstring.h>
+-
+-namespace TagLib {
+-
+- namespace WMA {
+-
+- class File;
+-
+- class Properties : public AudioProperties
+- {
+-
+- friend class WMA::File;
+-
+- public:
+-
+- /*!
+- * Create an instance of WMA::Properties.
+- */
+- Properties();
+-
+- /*!
+- * Destroys this WMA::Properties instance.
+- */
+- virtual ~Properties();
+-
+- // Reimplementations.
+-
+- virtual int length() const;
+- virtual int bitrate() const;
+- virtual int sampleRate() const;
+- virtual int channels() const;
+-
+- private:
+-
+- class PropertiesPrivate;
+- PropertiesPrivate *d;
+-
+- void set(int length, int bitrate, int sampleRate, int channels);
+-
+- };
+-
+- }
+-
+-}
+-
+-#endif
+Index: amarok/src/metadata/wma/Makefile.am
+===================================================================
+--- amarok/src/metadata/wma/Makefile.am (revision 705231)
++++ amarok/src/metadata/wma/Makefile.am (working copy)
+@@ -1,20 +0,0 @@
+-SUBDIRS =
+-
+-INCLUDES = $(all_includes) $(taglib_includes)
+-METASOURCES = AUTO
+-libtagwma_la_LDFLAGS = $(all_libraries)
+-noinst_LTLIBRARIES = libtagwma.la
+-
+-libtagwma_la_SOURCES = \
+- wmaattribute.cpp \
+- wmaproperties.cpp \
+- wmatag.cpp \
+- wmafile.cpp \
+- taglib_wmafiletyperesolver.cpp
+-
+-noinst_HEADERS = \
+- wmaattribute.h \
+- wmaproperties.h \
+- wmatag.h \
+- wmafile.h \
+- taglib_wmafiletyperesolver.h
+Index: amarok/src/metadata/wma/wmaattribute.cpp
+===================================================================
+--- amarok/src/metadata/wma/wmaattribute.cpp (revision 705231)
++++ amarok/src/metadata/wma/wmaattribute.cpp (working copy)
+@@ -1,231 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#include <wmaattribute.h>
+-#include <wmafile.h>
+-
+-using namespace TagLib;
+-
+-class WMA::Attribute::AttributePrivate
+-{
+-public:
+- AttributeTypes type;
+- String name;
+- String value_string;
+- ByteVector value_bytes;
+- union {
+- int value_int;
+- long long value_longlong;
+- };
+-};
+-
+-////////////////////////////////////////////////////////////////////////////////
+-// public members
+-////////////////////////////////////////////////////////////////////////////////
+-
+-WMA::Attribute::Attribute()
+-{
+- d = new AttributePrivate;
+- d->name = String::null;
+- d->type = UnicodeType;
+-}
+-
+-WMA::Attribute::Attribute(WMA::File &file)
+-{
+- d = new AttributePrivate;
+- parse(file);
+-}
+-
+-WMA::Attribute::Attribute(const String &name, const String &value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = UnicodeType;
+- d->value_string = value;
+-}
+-
+-WMA::Attribute::Attribute(const String &name, const ByteVector &value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = BytesType;
+- d->value_bytes = value;
+-}
+-
+-WMA::Attribute::Attribute(const String &name, unsigned int value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = DWordType;
+- d->value_int = value;
+-}
+-
+-WMA::Attribute::Attribute(const String &name, unsigned long long value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = QWordType;
+- d->value_longlong = value;
+-}
+-
+-WMA::Attribute::Attribute(const String &name, unsigned short value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = WordType;
+- d->value_int = value;
+-}
+-
+-WMA::Attribute::Attribute(const String &name, bool value)
+-{
+- d = new AttributePrivate;
+- d->name = name;
+- d->type = BoolType;
+- d->value_int = value;
+-}
+-
+-WMA::Attribute::Attribute(const Attribute &attr)
+-{
+- d = new AttributePrivate(*attr.d);
+-}
+-
+-WMA::Attribute::~Attribute()
+-{
+- if(d)
+- delete d;
+-}
+-
+-String WMA::Attribute::name() const
+-{
+- return d->name;
+-}
+-
+-WMA::Attribute::AttributeTypes WMA::Attribute::type() const
+-{
+- return d->type;
+-}
+-
+-String WMA::Attribute::toString() const
+-{
+- return d->value_string;
+-}
+-
+-ByteVector WMA::Attribute::toByteVector() const
+-{
+- return d->value_bytes;
+-}
+-
+-int WMA::Attribute::toInt() const
+-{
+- if (d->type == UnicodeType)
+- return d->value_string.toInt();
+- else
+- return d->value_int;
+-}
+-
+-long long WMA::Attribute::toLongLong() const
+-{
+- return d->value_longlong;
+-}
+-
+-bool WMA::Attribute::parse(WMA::File &f)
+-{
+- int size = f.readWORD();
+- f.readString(size, d->name);
+-
+- d->type = (WMA::Attribute::AttributeTypes)f.readWORD();
+- size = f.readWORD();
+-
+- switch(d->type) {
+- case WordType:
+- d->value_int = f.readWORD();
+- break;
+-
+- case BoolType:
+- case DWordType:
+- d->value_int = f.readDWORD();
+- break;
+-
+- case QWordType:
+- d->value_longlong = f.readQWORD();
+- break;
+-
+- case UnicodeType:
+- f.readString(size, d->value_string);
+- break;
+-
+- case BytesType:
+- d->value_bytes = f.readBlock(size);
+- break;
+-
+- default:
+- return false;
+- }
+-
+- return true;
+-}
+-
+-ByteVector WMA::Attribute::render() const
+-{
+- ByteVector data;
+-
+- ByteVector v = d->name.data(String::UTF16LE);
+- data.append(ByteVector::fromShort(v.size() + 2, false));
+- data.append(v + ByteVector::fromShort(0, false));
+-
+- data.append(ByteVector::fromShort((int)d->type, false));
+-
+- switch (d->type) {
+- case WordType:
+- data.append(ByteVector::fromShort(2, false));
+- data.append(ByteVector::fromShort(d->value_int, false));
+- break;
+-
+- case BoolType:
+- case DWordType:
+- data.append(ByteVector::fromShort(4, false));
+- data.append(ByteVector::fromUInt(d->value_int, false));
+- break;
+-
+- case QWordType:
+- data.append(ByteVector::fromShort(8, false));
+- data.append(ByteVector::fromLongLong(d->value_longlong, false));
+- break;
+-
+- case UnicodeType:
+- v = d->value_string.data(String::UTF16LE);
+- data.append(ByteVector::fromShort(v.size() + 2, false));
+- data.append(v + ByteVector::fromShort(0, false));
+- break;
+-
+- case BytesType:
+- data.append(ByteVector::fromShort(d->value_bytes.size(), false));
+- data.append(d->value_bytes);
+- break;
+-
+- default:
+- return ByteVector::null;
+- }
+-
+- return data;
+-}
+-
+-
+Index: amarok/src/metadata/wma/wmafile.h
+===================================================================
+--- amarok/src/metadata/wma/wmafile.h (revision 705231)
++++ amarok/src/metadata/wma/wmafile.h (working copy)
+@@ -1,100 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#ifndef TAGLIB_WMAFILE_H
+-#define TAGLIB_WMAFILE_H
+-
+-#include <tfile.h>
+-#include <tag.h>
+-#include "wmaproperties.h"
+-#include "wmatag.h"
+-
+-namespace TagLib {
+-
+- namespace WMA {
+-
+- struct GUID;
+-
+- typedef unsigned char BYTE;
+- typedef unsigned short WORD;
+- typedef unsigned int DWORD;
+- typedef unsigned long long QWORD;
+-
+- class File : public TagLib::File
+- {
+-
+- friend class Attribute;
+-
+- public:
+-
+- File(const char *file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average);
+-
+- virtual ~File();
+-
+- /*!
+- * Returns the TagLib::Tag for this file.
+- */
+- virtual TagLib::Tag *tag() const;
+-
+- /*!
+- * Returns the WMA::Tag for this file.
+- */
+- virtual Tag *WMATag() const;
+-
+- /*!
+- * Returns the WMA::Properties for this file.
+- */
+- virtual Properties *audioProperties() const;
+-
+-
+- /*!
+- * Save the file.
+- *
+- * This returns true if the save was successful.
+- */
+- virtual bool save();
+-
+- protected:
+-
+- int readBYTE();
+- int readWORD();
+- unsigned int readDWORD();
+- long long readQWORD();
+- void readGUID(GUID &g);
+- void readString(int len, String &s);
+-
+- ByteVector renderContentDescription();
+- ByteVector renderExtendedContentDescription();
+-
+- void read(bool readProperties, Properties::ReadStyle propertiesStyle);
+-
+- private:
+-
+- class FilePrivate;
+- FilePrivate *d;
+-
+- };
+-
+- }
+-
+-}
+-
+-#endif
+Index: amarok/src/metadata/wma/taglib_wmafiletyperesolver.cpp
+===================================================================
+--- amarok/src/metadata/wma/taglib_wmafiletyperesolver.cpp (revision 705231)
++++ amarok/src/metadata/wma/taglib_wmafiletyperesolver.cpp (working copy)
+@@ -1,47 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 by Martin Aumueller
+- email : aumuell@reserv.at
+- ***************************************************************************/
+-
+-/***************************************************************************
+- * 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-// (c) 2005 Martin Aumueller <aumuell@reserv.at>
+-// See COPYING file for licensing information
+-
+-#include "taglib_wmafiletyperesolver.h"
+-#include "wmafile.h"
+-
+-#include <string.h>
+-
+-TagLib::File *WMAFileTypeResolver::createFile(const char *fileName,
+- bool readProperties,
+- TagLib::AudioProperties::ReadStyle propertiesStyle) const
+-{
+- const char *ext = strrchr(fileName, '.');
+- if(ext && (!strcasecmp(ext, ".wma") || !strcasecmp(ext, ".asf")))
+- {
+- TagLib::WMA::File *f = new TagLib::WMA::File(fileName, readProperties, propertiesStyle);
+- if(f->isValid())
+- return f;
+- else
+- {
+- delete f;
+- }
+- }
+-
+- return 0;
+-}
+Index: amarok/src/metadata/wma/wmaattribute.h
+===================================================================
+--- amarok/src/metadata/wma/wmaattribute.h (revision 705231)
++++ amarok/src/metadata/wma/wmaattribute.h (working copy)
+@@ -1,125 +0,0 @@
+-/***************************************************************************
+- copyright : (C) 2005 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., 51 Franklin Street, Fifth Floor, Boston, *
+- * MA 02110-1301 USA *
+- ***************************************************************************/
+-
+-#ifndef TAGLIB_WMAATTRIBUTE_H
+-#define TAGLIB_WMAATTRIBUTE_H
+-
+-#include <tstring.h>
+-#include <tbytevector.h>
+-
+-namespace TagLib {
+-
+- namespace WMA {
+-
+- class File;
+-
+- class Attribute {
+-
+- friend class File;
+-
+- public:
+-
+- /*!
+- * Enum of types an Attribute can have.
+- */
+- enum AttributeTypes {
+- UnicodeType = 0,
+- BytesType = 1,
+- BoolType = 2,
+- DWordType = 3,
+- QWordType = 4,
+- WordType = 5
+- };
+-
+- /*!
+- * Constructs an empty attribute.
+- */
+- Attribute();
+-
+- /*!
+- * Constructs an attribute with \a key and \a value.
+- */
+- Attribute(const String &key, const String &value);
+- Attribute(const String &key, const ByteVector &value);
+- Attribute(const String &key, unsigned int value);
+- Attribute(const String &key, unsigned long long value);
+- Attribute(const String &key, unsigned short value);
+- Attribute(const String &key, bool value);
+-
+- /*!
+- * Construct an attribute as a copy of \a item.
+- */
+- Attribute(const Attribute &item);
+-
+- /*!
+- * Destroys the attribute.
+- */
+- virtual ~Attribute();
+-
+- /*!
+- * Returns the name.
+- */
+- String name() const;
+-
+- /*!
+- * Returns type of the value.
+- */
+- AttributeTypes type() const;
+-
+- /*!
+- * Returns the value as a String.
+- */
+- String toString() const;
+-
+- /*!
+- * Returns the value as a ByteVector.
+- */
+- ByteVector toByteVector() const;
+-
+- /*!
+- * Returns the value as an integer.
+- */
+- int toInt() const;
+-
+- /*!
+- * Returns the value as a long long.
+- */
+- long long toLongLong() const;
+-
+- ByteVector render() const;
+-
+- protected:
+-
+- Attribute(WMA::File &file);
+- bool parse(WMA::File &file);
+-
+- private:
+-
+- class AttributePrivate;
+- AttributePrivate *d;
+-
+- };
+-
+- }
+-
+-}
+-
+-#endif
+
+Property changes on: amarok/src/metadata/wma
+___________________________________________________________________
+Name: svn:ignore
+ - .libs
+.deps
+Makefile
+Makefile.in
+
+
+Index: amarok/src/metadata/tplugins.cpp
+===================================================================
+--- amarok/src/metadata/tplugins.cpp (revision 705231)
++++ amarok/src/metadata/tplugins.cpp (working copy)
+@@ -42,8 +42,8 @@
+ #include "wavpack/wvfile.h"
+ #include "speex/taglib_speexfiletyperesolver.h"
+ #include "speex/speexfile.h"
+-#include "wma/taglib_wmafiletyperesolver.h"
+-#include "wma/wmafile.h"
++#include "asf/taglib_asffiletyperesolver.h"
++#include "asf/asffile.h"
+ #include "rmff/taglib_realmediafiletyperesolver.h"
+ #include "rmff/taglib_realmediafile.h"
+ #include "audible/taglib_audiblefiletyperesolver.h"
+@@ -95,7 +95,7 @@
+ || mimetype->is( "video/x-msvideo" )
+ || mimetype->is( "video/x-ms-wmv" ) )
+ {
+- return new TagLib::WMA::File(fileName, readProperties, propertiesStyle);
++ return new TagLib::ASF::File(fileName, readProperties, propertiesStyle);
+ }
+ else if( mimetype->is( "audio/vnd.rn-realaudio" )
+ || mimetype->is( "audio/x-pn-realaudio" )
+@@ -130,7 +130,7 @@
+ {
+ //TagLib::FileRef::addFileTypeResolver(new MimeTypeFileTypeResolver);
+ TagLib::FileRef::addFileTypeResolver(new MP4FileTypeResolver);
+- TagLib::FileRef::addFileTypeResolver(new WMAFileTypeResolver);
++ TagLib::FileRef::addFileTypeResolver(new ASFFileTypeResolver);
+ TagLib::FileRef::addFileTypeResolver(new RealMediaFileTypeResolver);
+ TagLib::FileRef::addFileTypeResolver(new AudibleFileTypeResolver);
+ TagLib::FileRef::addFileTypeResolver(new AACFileTypeResolver);
+Index: amarok/src/metadata/Makefile.am
+===================================================================
+--- amarok/src/metadata/Makefile.am (revision 705231)
++++ amarok/src/metadata/Makefile.am (working copy)
+@@ -6,7 +6,7 @@
+ MP4_LDADD = m4a/libtagm4a.la
+ endif
+
+-SUBDIRS = speex wavpack trueaudio wma audible rmff $(MP4_SUBDIR) aac wav
++SUBDIRS = speex wavpack trueaudio asf audible rmff $(MP4_SUBDIR) aac wav
+
+
+ INCLUDES = -I$(top_srcdir)/amarok/src $(all_includes) $(taglib_includes)
+@@ -24,7 +24,7 @@
+ speex/libtagspeex.la \
+ trueaudio/libtagtrueaudio.la \
+ wavpack/libtagwavpack.la \
+- wma/libtagwma.la \
++ asf/libtagasf.la \
+ wav/libtagwav.la \
+ rmff/libtagrealmedia.la \
+ $(MP4_LDADD) \
diff --git a/amarok.spec b/amarok.spec
index e47641d..66b5ba3 100644
--- a/amarok.spec
+++ b/amarok.spec
@@ -1,10 +1,12 @@
# TODO:
# Rio Karma support : libkarma
+%define _with_mp4v2 --with-mp4v2
+
Name: amarok
Summary: Media player
Version: 1.4.7
-Release: 11%{?dist}
+Release: 12%{?dist}
Group: Applications/Multimedia
License: GPLv2+
@@ -21,8 +23,12 @@ Patch2: amarok-1.4.7-xdg.patch
# http://bugs.kde.org/148317 - dynamic mode floods playlist ...
# http://websvn.kde.org/branches/stable/extragear/multimedia/amarok/src/playlist.cpp?r1=705494&r2=705493&pathrev=705494&view=patch
Patch3: amarok-1.4.7-148317.patch
+# fix asf/wma support (with recent taglib)
+# svn diff amarok/src/metadata --revision 705231
+Patch4: amarok-asf.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildRequires: automake libtool
BuildRequires: alsa-lib-devel
BuildRequires: desktop-file-utils
BuildRequires: esound-devel
@@ -40,6 +46,7 @@ BuildRequires: taglib-devel
BuildRequires: libifp-devel
# Ipod
BuildRequires: libgpod-devel
+%{?_with_mp4v2:BuildRequires: libmp4v2-devel}
# MTP players
BuildRequires: libmtp-devel
BuildRequires: libmusicbrainz-devel
@@ -99,12 +106,16 @@ use any of xmms' visualisation plugins with Amarok.
%prep
-%setup -q
+%setup -q
+
%patch0 -p0 -b .147126
%patch1 -p1 -b .utf8
%patch2 -p1 -b .xdg
%patch3 -p4 -b .148317
+%patch4 -p0 -b .asf
+# for patch4
+make -f admin/Makefile.common
%build
@@ -120,7 +131,8 @@ unset QTDIR && . %{_sysconfdir}/profile.d/qt.sh
%ifnarch ppc64 x86_64 s390 s390x ia64 sparc sparc64 alpha
--with-helix=%{_libdir}/helix \
%endif
- %{?_with_gstreamer}
+ %{?_with_gstreamer} \
+ %{?_with_livm4v2}
# --enable-final \
# --with-nmm \
@@ -148,12 +160,14 @@ desktop-file-install --vendor "" \
rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
-%find_lang %{name}
+%find_lang %{name}
# HTML
for lang_dir in $RPM_BUILD_ROOT%{_docdir}/HTML/* ; do
- lang=$(basename $lang_dir)
- [ "$lang" == "en" ] && d=en/%{name} || d=$lang
- echo "%lang($lang) %doc %{_docdir}/HTML/$d" >> %{name}.lang
+ if [ -d $lang_dir ]; then
+ lang=$(basename $lang_dir)
+ [ "$lang" == "en" ] && d=en/%{name} || d=$lang
+ echo "%lang($lang) %doc %{_docdir}/HTML/$d" >> %{name}.lang
+ fi
done
@@ -248,14 +262,16 @@ rm -fr $RPM_BUILD_ROOT
%{_datadir}/services/amarok_helixengine_plugin.desktop
%endif
-
%files visualisation
%defattr(-,root,root,-)
%{_bindir}/amarok_libvisual
-
%changelog
+* Thu Nov 29 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.4.7-12
+- --with-mp4v2 (rh#346011)
+- fix asf/wma support (rh#346011,kde#151733)
+
* Wed Nov 21 2007 Rex Dieter <rdieter[AT]fedoraproject.org> 1.4.7-11
- dynamic mode floods playlist ... (kde #148317)
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-06 18:30 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-06 18:30 [rpms/amarok] epel10.2: - --with-mp4v2 (rh#346011) Rex Dieter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox