3
#include <noatun/playlist.h>
6
#include "titleproxy.h"
8
#include <klibloader.h>
9
#include <knotifyclient.h>
13
enum ArtsPOS { posIdle=0, posPlaying, posPaused };
17
Player::Player(QObject *parent) : QObject(parent, "Player"),
18
position(-1), mLoopStyle(None), firstTimeout(true)
21
connect(&filePos, SIGNAL(timeout()), SLOT(posTimeout()));
22
connect(mEngine, SIGNAL(aboutToPlay()), this, SLOT(aboutToPlay()));
24
SIGNAL(receivedStreamMeta(const QString &, const QString &,
25
const QString &, const QString &,
26
const QString &, const QString &)),
28
slotUpdateStreamMeta(const QString &, const QString &,
29
const QString &, const QString &,
30
const QString &, const QString &))
32
connect(mEngine, SIGNAL(playingFailed()), this, SLOT(forward()));
42
bool Player::isPlaying()
44
return mEngine->state()==posPlaying;
47
bool Player::isPaused()
49
return mEngine->state()==posPaused;
52
bool Player::isStopped()
54
return mEngine->state()==posIdle;
57
void Player::toggleListView()
59
napp->playlist()->toggleList();
62
void Player::handleButtons()
64
switch (mEngine->state())
79
if (napp->playlist()->previous())
97
napp->processEvents();
101
if (mEngine->state()==posPlaying) // do nothing if already playing
104
if (mEngine->state()==posPaused)
106
work=mEngine->play();
111
mCurrent = napp->playlist()->current();
119
work=mEngine->open(mCurrent);
137
void Player::play(const PlaylistItem &item)
139
napp->playlist()->setCurrent(item);
142
void Player::playpause()
144
if (mEngine->state()==posPlaying)
148
// emit paused(); NOT necessary because emitted in handleButtons() (mETz)
155
void Player::forward(bool allowLoop)
158
if (napp->playlist()->next())
160
else if (allowLoop && napp->loopList())
161
if (napp->playlist()->reset(), napp->playlist()->current())
165
void Player::skipTo(int msec) // skip to a certain time in the track
167
if( (current()) && (msec>=0) )
170
position = mEngine->position(); // make sure position is recent
171
emit timeout(); // update the UI
177
void Player::playCurrent()
179
if (!mEngine->initialized()) return;
182
if (napp->playlist()->current())
186
void Player::newCurrent()
188
// the second half of the following
189
if (!napp->playlist() || !mEngine->initialized())
190
return; // no playlist, or squelch playing as an optimization
191
if ((mEngine->state()!=posPlaying) && napp->autoPlay())
195
void Player::posTimeout()
197
if (mEngine->state()==posIdle)
201
// If you're supposed to loop the song, don't go next
202
// otherwise, do go next
203
if (loopStyle()==Song || napp->playlist()->next())
205
else if (loopStyle()==Playlist)
207
napp->playlist()->reset();
210
else if (napp->loopList())
211
napp->playlist()->reset();
215
position = mEngine->position();
219
current().setLength(mEngine->length());
220
if (current().length() && firstTimeout)
222
int minutes = (int) ( current().length() / 60 );
223
int seconds = current().length() - minutes * 60;
224
emit newSongLen ( minutes, seconds );
225
firstTimeout = false;
233
QString Player::lengthString(int _position)
236
return QString("--:--/--:--");
240
int secs, seconds, minutes;
243
_position = position;
250
{ // get the position
251
bool remain = napp->displayRemaining() && current();
252
if (remain && current().length()<0)
259
_position = current().length() - _position;
262
secs = _position / 1000; // convert milliseconds -> seconds
264
minutes = (secs - seconds) / 60;
266
// the string has to look like '00:00/00:00'
267
posString.sprintf("%.2d:%.2d/", minutes, seconds);
268
if (remain) posString.prepend('-');
271
if (!current() || current().length()<0)
277
secs = current().length() / 1000; // convert milliseconds -> seconds
279
minutes = (secs - seconds) / 60;
281
// the string has to look like '00:00/00:00'
282
lenString.sprintf("%.2d:%.2d", minutes, seconds);
283
posString += lenString;
289
int Player::getLength()
293
return current().length(); // return track-length in milliseconds
296
void Player::openFile(const KURL &f, bool purge, bool autoplay)
299
napp->playlist()->clear();
300
napp->playlist()->addFile(f, autoplay);
303
void Player::openFile(const KURL::List &f, bool purge, bool autoplay)
306
napp->playlist()->clear();
307
for (KURL::List::ConstIterator i(f.begin()); i != f.end(); ++i)
309
napp->playlist()->addFile(*i, autoplay);
318
if (mLoopStyle>Random)
320
emit loopTypeChange(mLoopStyle);
322
void Player::loop(int i)
325
emit loopTypeChange(mLoopStyle);
328
void Player::removeCurrent()
330
if (napp->playlist()->current())
331
napp->playlist()->current().remove();
334
void Player::setVolume(int v)
338
mEngine->setVolume(v);
340
emit volumeChanged(v);
343
int Player::volume() const
345
return mEngine->volume();
348
void Player::aboutToPlay()
350
emit aboutToOpen( mCurrent );
353
void Player::slotUpdateStreamMeta(
354
const QString &streamName, const QString &streamGenre,
355
const QString &streamUrl, const QString &streamBitrate,
356
const QString &trackTitle, const QString &trackUrl)
358
PlaylistItem currentItem = napp->playlist()->current();
361
currentItem.setProperty("title", trackTitle);
362
currentItem.setProperty("bitrate", streamBitrate);
364
if(!streamName.isEmpty())
365
currentItem.setProperty("author", streamName);
366
if(!streamGenre.isEmpty())
367
currentItem.setProperty("genre", streamGenre);
368
if(!trackUrl.isEmpty())
369
currentItem.setProperty("comment", trackUrl);
370
else if(!streamUrl.isEmpty())
371
currentItem.setProperty("comment", streamUrl);
373
currentItem.clearProperty("comment");
378
#include "player.moc"