Add portrait support, download progress
[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     reply->abort();
26 }
27
28 void sPlayer::play(QString StreamKey,QUrl server)
29 {
30     if(playing)
31     {
32         //reply->abort();
33     }
34     pd = new QProgressDialog("Downloading / Buffering.", "Cancel", 0, 100);
35     pd->setValue(0);
36 #ifdef Q_WS_MAEMO_5
37     pd->setAttribute(Qt::WA_Maemo5AutoOrientation,true);
38 #endif
39     QNetworkRequest req;
40     req.setUrl(server);
41     qDebug() << server;
42     req.setHeader(req.ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
43     reply = manager->post(req,QString("streamKey=" + StreamKey.toAscii()).toAscii());
44     buffer->open(buffer->ReadWrite | buffer->Truncate);
45     connect(reply,SIGNAL(finished()),this,SLOT(start()));
46     connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
47     connect(pd,SIGNAL(canceled()),this,SLOT(abortDownload()));
48     media->stop();
49     playing = false;
50     startStreamT = QTime::currentTime();
51 }
52 void sPlayer::start()
53 {
54     QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
55     if(url.toUrl().isValid())
56     {
57         QNetworkRequest req;
58         req.setUrl(url.toUrl());
59         qDebug() << url;
60         reply = manager->get(req);
61         connect(reply,SIGNAL(finished()),this,SLOT(start()));
62         connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
63     }
64     else
65     {
66         if(!playing)
67         {
68             playing = true;
69             media->setCurrentSource(Phonon::MediaSource(buffer));
70             media->play();
71             qDebug() << "Playing";
72         }
73     }
74     /*else
75     {
76         media->stop();
77         buffer->close();
78         buffer->open(QIODevice::ReadWrite | QIODevice::Truncate);
79         buffer->write(reply->readAll());
80         reply->close();
81         media->setCurrentSource(Phonon::MediaSource(buffer));
82         media->play();
83     }*/
84 }
85 void sPlayer::stop()
86 {
87     media->stop();
88 }
89
90 void sPlayer::putb(qint64 b, qint64 t)
91 {
92     //qDebug() << "Download: " << b << "Total: " << t;
93     if(b == 0 && t == 0)
94     {
95         QVariant url = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
96         if(url.toUrl().isValid())
97         {
98             QNetworkRequest req;
99             req.setUrl(url.toUrl());
100             qDebug() << url;
101             reply = manager->get(req);
102             connect(reply,SIGNAL(finished()),this,SLOT(start()));
103             connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(putb(qint64,qint64)));
104         }
105         else
106         {
107             //buffer->close();
108             reply->close();
109         }
110     }
111     else
112     {
113         if(pd->maximum() != t)
114             pd->setMaximum(t);
115         pd->setValue(b);
116
117         buffer->buffer().append(reply->readAll());
118         //qDebug() << buffer->bytesAvailable();
119         if(playing)
120         {
121             StreamIO* stream = (StreamIO*) media->currentSource().stream();
122             stream->setStreamSize(buffer->size());
123         }
124
125         /*
126         //buffer->seek(b);
127         qint64 last = buffer->pos();
128         buffer->seek(buffer->bytesAvailable()+buffer->pos());
129         qDebug() << buffer->write(reply->readAll());
130         qDebug() << buffer->pos();
131         //buffer->putChar()
132         buffer->seek(last);
133         //buffer->data().append(reply->readAll());*/
134         //qDebug() << "Download speed (KB/S): " << b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024;
135         if ( b >= t*0.05 && !playing && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 25)
136         {
137             pd->hide();
138             playing = true;
139             //Start playback at 25% download
140             media->setCurrentSource(Phonon::MediaSource(buffer));
141             media->play();
142             qDebug() << "Playing";
143         }
144     }
145 }