|
|
| |
void MPC::Properties::read() | void MPC::Properties::read() |
{ | { |
if(d->data.mid(0, 3) != "MP+") |
if(!d->data.startsWith("MP+")) |
return; | return; |
| |
d->version = d->data[3] & 15; | d->version = d->data[3] & 15; |
|
|
if(d->version >= 7) { | if(d->version >= 7) { |
frames = d->data.mid(4, 4).toUInt(false); | frames = d->data.mid(4, 4).toUInt(false); |
| |
std::bitset<32> flags = d->data.mid(8, 4).toUInt(true); |
std::bitset<32> flags = d->data.mid(8, 4).toUInt(false); |
d->sampleRate = sftable[flags[17] * 2 + flags[16]]; | d->sampleRate = sftable[flags[17] * 2 + flags[16]]; |
d->channels = 2; | d->channels = 2; |
} | } |
|
|
| |
~FilePrivate() | ~FilePrivate() |
{ | { |
|
if (tag != ID3v1Tag && tag != APETag) delete tag; |
delete ID3v1Tag; | delete ID3v1Tag; |
|
delete APETag; |
|
delete ID3v2Header; |
delete properties; | delete properties; |
} | } |
| |
|
|
if(d->APETag) | if(d->APETag) |
d->tag = d->APETag; | d->tag = d->APETag; |
else | else |
d->tag = d->APETag = new APE::Tag(); |
d->tag = d->APETag = new APE::Tag; |
} | } |
| |
if(tags & ID3v2) { | if(tags & ID3v2) { |
|
|
if(d->ID3v1Tag) | if(d->ID3v1Tag) |
d->tag = d->ID3v1Tag; | d->tag = d->ID3v1Tag; |
else | else |
d->tag = d->APETag = new APE::Tag(); |
d->tag = d->APETag = new APE::Tag; |
} | } |
} | } |
| |
|
|
if(d->hasAPE) | if(d->hasAPE) |
d->tag = d->APETag; | d->tag = d->APETag; |
else | else |
d->tag = d->APETag = new APE::Tag(); |
d->tag = d->APETag = new APE::Tag; |
} | } |
} | } |
| |
|
|
Item(const Item &item); | Item(const Item &item); |
| |
/*! | /*! |
|
* Destroys the item. |
|
*/ |
|
virtual ~Item(); |
|
|
|
/*! |
* Copies the contents of \a item into this item. | * Copies the contents of \a item into this item. |
*/ | */ |
Item &operator=(const Item &item); | Item &operator=(const Item &item); |
|
|
d = new ItemPrivate(*item.d); | d = new ItemPrivate(*item.d); |
} | } |
| |
|
APE::Item::~Item() |
|
{ |
|
delete d; |
|
} |
|
|
Item &APE::Item::operator=(const Item &item) | Item &APE::Item::operator=(const Item &item) |
{ | { |
delete d; | delete d; |
|
|
case 1: | case 1: |
if(d->text.isEmpty()) | if(d->text.isEmpty()) |
return true; | return true; |
if(d->text.size() == 1 && d->text.front() == "") |
if(d->text.size() == 1 && d->text.front().isEmpty()) |
return true; | return true; |
return false; | return false; |
case 2: | case 2: |