2016-10-10 13:29:41 -04:00
|
|
|
#include "aud_file.h"
|
|
|
|
|
|
|
|
AudFile::AudFile(QObject *parent) : QFile(parent)
|
|
|
|
{
|
|
|
|
offset = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
AudFile::~AudFile()
|
|
|
|
{
|
|
|
|
close();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AudFile::openFile(const QString &path)
|
|
|
|
{
|
2016-10-16 17:04:21 -04:00
|
|
|
close();
|
|
|
|
|
2016-10-10 13:29:41 -04:00
|
|
|
setFileName(path);
|
|
|
|
|
|
|
|
bool ret = open(QFile::ReadOnly);
|
|
|
|
|
|
|
|
if (ret)
|
|
|
|
{
|
2016-10-16 17:04:21 -04:00
|
|
|
offset = 0;
|
|
|
|
|
2016-10-10 13:29:41 -04:00
|
|
|
if (peek(3) == "ID3")
|
|
|
|
{
|
|
|
|
QByteArray header = read(10);
|
|
|
|
QByteArray intBytes = header.mid(6);
|
|
|
|
quint64 num = 0;
|
|
|
|
quint64 bit = 1;
|
|
|
|
|
|
|
|
offset += 10;
|
|
|
|
|
|
|
|
if (header[5] & 16) //Footer flag check
|
|
|
|
{
|
|
|
|
offset += 10;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = intBytes.size() - 1; i >= 0; --i)
|
|
|
|
{
|
|
|
|
int byte = intBytes[i];
|
|
|
|
|
|
|
|
for (int inBit = 1; inBit <= 64; inBit *= 2, bit *= 2)
|
|
|
|
{
|
|
|
|
if ((byte & inBit) != 0) num |= bit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
offset += num;
|
|
|
|
}
|
2016-10-16 17:04:21 -04:00
|
|
|
|
|
|
|
seek(0);
|
2016-10-10 13:29:41 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2016-10-16 17:04:21 -04:00
|
|
|
bool AudFile::seek(qint64 off)
|
|
|
|
{
|
|
|
|
return QFile::seek(offset + off);
|
|
|
|
}
|
|
|
|
|
|
|
|
qint64 AudFile::size() const
|
2016-10-10 13:29:41 -04:00
|
|
|
{
|
2016-10-16 17:04:21 -04:00
|
|
|
return QFile::size() - offset;
|
2016-10-10 13:29:41 -04:00
|
|
|
}
|