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