void MediaDownload::requestReady(unsigned fileSize) { /* This may happen multiple times, with new requests, and the file size * may change as a result (for active events) */ QMutexLocker l(&m_bufferLock); bool emitSizeChanged = false; if (fileSize > m_fileSize) { m_fileSize = fileSize; emitSizeChanged = true; Q_ASSERT(m_bufferFile.isOpen()); if (!m_bufferFile.resize(m_fileSize)) { sendError(QLatin1String("Buffer resize failed: ") + m_bufferFile.errorString()); return; } } l.unlock(); if (emitSizeChanged) emit fileSizeChanged(fileSize); }
void Transfer::setFileSize(quint64 fileSize) { if (_fileSize != fileSize) { _fileSize = fileSize; SYNC(ARG(fileSize)); emit fileSizeChanged(fileSize); } }
bool VideoHttpBuffer::startBuffering() { Q_ASSERT(!media); media = bcApp->mediaDownloadManager()->acquireMediaDownload(m_url); connect(media, SIGNAL(fileSizeChanged(uint)), SLOT(fileSizeChanged(uint)), Qt::DirectConnection); connect(media, SIGNAL(finished()), SIGNAL(bufferingFinished())); connect(media, SIGNAL(stopped()), SIGNAL(bufferingStopped())); connect(media, SIGNAL(error(QString)), SLOT(sendStreamError(QString))); media->start(); qDebug("VideoHttpBuffer: started"); emit bufferingStarted(); return true; }
void MediaDownload::incomingData(const QByteArray &data, unsigned position) { QMutexLocker l(&m_bufferLock); bool emitFileSize = false; if (position+data.size() > m_fileSize) { qDebug() << "MediaDownload: file size is less than write position, adjusting size"; m_fileSize = position + data.size(); if (!m_bufferFile.resize(m_fileSize)) { sendError(QLatin1String("Buffering failed: ") + m_bufferFile.errorString()); return; } emitFileSize = true; } Q_ASSERT(m_bufferFile.size() == m_fileSize); if (!m_bufferFile.seek(position)) { sendError(QLatin1String("Buffer write failed: ") + m_bufferFile.errorString()); return; } qint64 re = m_bufferFile.write(data); if (re < 0) { sendError(QLatin1String("Buffer write failed: ") + m_bufferFile.errorString()); return; } if (!m_bufferFile.flush()) qDebug() << "MediaDownload: Buffer flush after write failed (non-critical):" << m_bufferFile.errorString(); Q_ASSERT(re == data.size()); m_bufferRanges.insert(Range::fromStartSize(position, re)); if (m_writePos == position) m_writePos += re; m_downloadedSize += re; l.unlock(); if (emitFileSize) emit fileSizeChanged(m_fileSize); m_bufferWait.wakeAll(); }