#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(); }