58 lines
1.0 KiB
C++
58 lines
1.0 KiB
C++
|
#include "aud_file.h"
|
||
|
|
||
|
AudFile::AudFile(QObject *parent) : QFile(parent)
|
||
|
{
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
AudFile::~AudFile()
|
||
|
{
|
||
|
close();
|
||
|
}
|
||
|
|
||
|
bool AudFile::openFile(const QString &path)
|
||
|
{
|
||
|
setFileName(path);
|
||
|
|
||
|
bool ret = open(QFile::ReadOnly);
|
||
|
|
||
|
if (ret)
|
||
|
{
|
||
|
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;
|
||
|
|
||
|
seek(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
bool AudFile::seek(qint64 pos)
|
||
|
{
|
||
|
return QFile::seek(pos + offset);
|
||
|
}
|