JustAudio/io/aud_file.cpp

108 lines
1.8 KiB
C++
Raw Normal View History

#include "aud_file.h"
AudFile::AudFile(QObject *parent) : QFile(parent)
{
offset = 0;
buffRate = 0;
init = true;
}
AudFile::~AudFile()
{
close();
}
bool AudFile::openFile(const QString &path)
{
close();
init = true;
buffRate = 0;
setFileName(path);
bool ret = open(QFile::ReadOnly);
if (ret)
{
offset = 0;
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 off)
{
qint64 newPos = offset + off;
if (init)
{
if ((off) && (!buffRate))
{
buffRate = off;
emit duration(getDuration());
}
if (newPos >= size())
{
init = false;
}
}
else
{
emit posChanged(pos());
if (newPos >= size())
{
QTimer::singleShot(2000, this, SLOT(delayFinished()));
}
}
return QFile::seek(newPos);
}
qint64 AudFile::getOffset()
{
return offset;
}
qint64 AudFile::getDuration()
{
return ((size() - offset) / buffRate) * 1000;
}
void AudFile::delayFinished()
{
emit endOfPlayback();
}