X-Git-Url: http://git.maemo.org/git/?p=groove;a=blobdiff_plain;f=playlist.cpp;h=3d437a517f9b3b0d948cbab46dbda135b82396b4;hp=10f7d498439d06ceda5713f59467aa1c43d8cc78;hb=810ad0d7cae54b293ddebe4e3874fd2f0e6e38a1;hpb=256f3e93e093f74932bbf2ac33d9aa74d24a9134 diff --git a/playlist.cpp b/playlist.cpp index 10f7d49..3d437a5 100644 --- a/playlist.cpp +++ b/playlist.cpp @@ -8,6 +8,7 @@ playlist::playlist(QObject *parent) : pList = new QList; this->currentplayingitem = -1; this->currentSkeyItem = -1; + this->reply = NULL; } void playlist::markPlayed(int position) { @@ -16,11 +17,15 @@ void playlist::markPlayed(int position) } void playlist::freeMemory(int position) { - pList->at(position)->buffer->~QBuffer(); + pList->at(position)->downloaded = false; + pList->at(position)->bufferready = false; + delete pList->at(position)->buffer; pList->at(position)->buffer = new QBuffer(); } bool playlist::existAt(int position) { + if(position < 0) + return false; return (pList->size() > position); } @@ -41,9 +46,11 @@ void playlist::setBufferRdy(int b) } bool playlist::setCurrentPlaying(int position) { - if(pList->size() > position) + if(this->existAt(position)) { this->currentplayingitem = position; + if(!pList->at(position)->downloaded && this->currentdownloaditem != this->currentplayingitem) + this->beginDownload(position); /*if(pList->at(position)->bufferready == false &&) { if(!pList->at(position)->downloaded) @@ -55,7 +62,14 @@ bool playlist::setCurrentPlaying(int position) return true; } else + { + if(position = -1) + { + this->currentplayingitem = -1; + } + else return false; + } } QIODevice * playlist::getBuffer(int position) { @@ -70,14 +84,26 @@ void playlist::beginDownload(int position) req.setUrl(*pList->at(currentdownloaditem)->server); qDebug() << pList->at(currentdownloaditem)->server; req.setHeader(req.ContentTypeHeader,QVariant("application/x-www-form-urlencoded")); - delete reply; + if(reply) + { + reply->disconnect(); + reply->deleteLater(); + } reply = manager->post(req,QString("streamKey=" + pList->at(this->currentdownloaditem)->streamkey->toAscii()).toAscii()); pList->at(this->currentdownloaditem)->buffer->open(QBuffer::ReadWrite | QBuffer::Truncate); connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64))); connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish())); connect(this,SIGNAL(downloadComplete(int)),this,SLOT(downloadDone(int))); + connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError))); startStreamT = QTime::currentTime(); } +void playlist::getNError(QNetworkReply::NetworkError error) +{ + qDebug() << "Network Error (if this is 99 then it will retry" << error; + if(error == QNetworkReply::UnknownNetworkError && this->currentdownloaditem != -1) + beginDownload(this->currentdownloaditem); + +} void playlist::setGscom(gscom *comm) { @@ -86,7 +112,7 @@ void playlist::setGscom(gscom *comm) } void playlist::skeyFound() { - emit this->unfreeze(); + emit this->freeze(false); pList->at(this->currentSkeyItem)->streamkey = new QString(gs->streamID); pList->at(this->currentSkeyItem)->server = new QUrl(gs->sku); if(this->currentdownloaditem == -1) @@ -110,14 +136,15 @@ int playlist::addSong(QStandardItem *item) newelement->type = playlist::EStream; pList->append(newelement); gs->getSong(item->text()); - emit this->freeze(); + this->currentSkeyItem = pList->size()-1; + emit this->freeze(true); return pList->size()-1; } void playlist::downloadDone(int position) { - if(this->existAt(position+1) && this->currentSkeyItem == -1) + if(this->existAt(position+1) && this->currentSkeyItem == -1 && !pList->at(position+1)->downloaded && this->currentdownloaditem != position+1) beginDownload(position+1); else this->currentdownloaditem = -1; @@ -132,10 +159,17 @@ void playlist::networkReplyFinish() QNetworkRequest req; req.setUrl(url.toUrl()); qDebug() << url; + if(reply) + { + reply->disconnect(); + reply->deleteLater(); + } reply = manager->get(req); startStreamT = QTime::currentTime(); //connect(reply,SIGNAL(finished()),this,SLOT(start())); connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64))); + connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish())); + connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError))); } } @@ -145,20 +179,23 @@ void playlist::downloadSlot(qint64 b, qint64 t) if(t != 0) { emit this->downloadProgress(this->currentdownloaditem,b,t); - pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll()); - //qDebug() << !pList->at(this->currentdownloaditem)->bufferready << this->currentdownloaditem; - if ( b >= t*0.05 && !pList->at(this->currentdownloaditem)->bufferready) - //if(!pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10) + if(existAt(this->currentdownloaditem)) { - this->setBufferRdy(this->currentdownloaditem); - emit this->bufferReady(this->currentdownloaditem); + pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll()); + //qDebug() << !pList->at(this->currentdownloaditem)->bufferready << this->currentdownloaditem; + if ( b >= t*0.05 && !pList->at(this->currentdownloaditem)->bufferready) + //if(!pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10) + { + this->setBufferRdy(this->currentdownloaditem); + emit this->bufferReady(this->currentdownloaditem); - qDebug() << "Buffer Ready"; - } - if (b==t) - { + qDebug() << "Buffer Ready"; + } + if (b==t) + { emit this->downloadComplete(this->currentdownloaditem); //emit this->bufferReady(this->currentdownloaditem); + } } } }