Progressbar fix
[groove] / splayer.cpp
1 #include "splayer.h"
2 #include <QFile>
3 sPlayer::sPlayer(QObject *parent) :
4     QObject(parent)
5 {
6     manager = new QNetworkAccessManager();
7     buffer = new QBuffer();
8     audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory,this);
9     media = new Phonon::MediaObject(this);
10     Phonon::createPath(media, audioOutput);
11     playing = false;
12     //reply = new QNetworkReply();
13     internal = parent;
14     //buffer->open(QIODevice::ReadWrite);
15 }
16 sPlayer::~sPlayer()
17 {
18     manager->~QNetworkAccessManager();
19     //reply->~QIODevice();
20     buffer->~QBuffer();
21     media->~MediaNode();
22 }
23 void sPlayer::abortDownload()
24 {
25     //pd->hide();
26     //reply->abort();
27 }
28
29 void sPlayer::play(QString StreamKey,QUrl server)
30 {
31     if(playing)
32     {
33         //reply->abort();
34     }
35     pd = new grooveProgressBar();
36     //pd->setAttribute();
37
38 #ifdef Q_WS_MAEMO_5
39     pd->setAttribute(Qt::WA_Maemo5AutoOrientation,true);
40     //pd->setModal(false);
41 #endif
42     pd->show();
43     pd->setValue(0);
44     QNetworkRequest req;
45     req.setUrl(server);
46     qDebug() << server;
47     req.setHeader(req.ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
48     reply = manager->post(req,QString("streamKey=" + StreamKey.toAscii()).toAscii());
49     buffer->open(buffer->ReadWrite | buffer->Truncate);
50     connect(reply,SIGNAL(finished()),this,SLOT(start()));
51     connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
52     //connect(pd,SIGNAL(canceled()),this,SLOT(abortDownload()));
53     media->stop();
54     playing = false;
55     startStreamT = QTime::currentTime();
56 }
57 void sPlayer::start()
58 {
59     QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
60     if(url.toUrl().isValid())
61     {
62         QNetworkRequest req;
63         req.setUrl(url.toUrl());
64         qDebug() << url;
65         reply = manager->get(req);
66         connect(reply,SIGNAL(finished()),this,SLOT(start()));
67         connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
68     }
69     else
70     {
71         if(!playing)
72         {
73             playing = true;
74             media->setCurrentSource(Phonon::MediaSource(buffer));
75             media->play();
76             qDebug() << "Playing";
77         }
78     }
79     /*else
80     {
81         media->stop();
82         buffer->close();
83         buffer->open(QIODevice::ReadWrite | QIODevice::Truncate);
84         buffer->write(reply->readAll());
85         reply->close();
86         media->setCurrentSource(Phonon::MediaSource(buffer));
87         media->play();
88     }*/
89 }
90 void sPlayer::stop()
91 {
92     media->stop();
93 }
94
95 void sPlayer::putb(qint64 b, qint64 t)
96 {
97     //qDebug() << "Download: " << b << "Total: " << t;
98     if(b == 0 && t == 0)
99     {
100         QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
101         if(url.toUrl().isValid())
102         {
103             QNetworkRequest req;
104             req.setUrl(url.toUrl());
105             qDebug() << url;
106             reply = manager->get(req);
107             connect(reply,SIGNAL(finished()),this,SLOT(start()));
108             connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
109         }
110         else
111         {
112             //buffer->close();
113             reply->close();
114         }
115     }
116     else
117     {
118         if(pd->maximum() != t)
119             pd->setMaximum(t);
120         pd->setValue(b);
121
122         buffer->buffer().append(reply->readAll());
123         //qDebug() << buffer->bytesAvailable();
124         if(playing)
125         {
126             StreamIO* stream = (StreamIO*) media->currentSource().stream();
127             stream->setStreamSize(buffer->size());
128         }
129
130         /*
131         //buffer->seek(b);
132         qint64 last = buffer->pos();
133         buffer->seek(buffer->bytesAvailable()+buffer->pos());
134         qDebug() << buffer->write(reply->readAll());
135         qDebug() << buffer->pos();
136         //buffer->putChar()
137         buffer->seek(last);
138         //buffer->data().append(reply->readAll());*/
139         //qDebug() << "Download speed (KB/S): " << b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024;
140         if ( b >= t*0.05 && !playing && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 25)
141         {
142             pd->hide();
143             playing = true;
144             //Start playback at 25% download
145             media->setCurrentSource(Phonon::MediaSource(buffer));
146             media->play();
147             qDebug() << "Playing";
148         }
149     }
150 }