Player::Player(QObject *parent) :
QObject(parent)
{
+ _awaiting_seek = false;
_player = new Phonon::MediaObject(this);
_output = new Phonon::AudioOutput(Phonon::MusicCategory, this);
_player->setTickInterval(1000);
qsrand(seed);
_random = _config.getValue("playback/random").toBool();
_repeat = (RepeatRule) _config.getValue("playback/repeat").toInt();
+ _state = PLAYER_DONE;
}
void Player::setTrackId(int id) {
+ id = id < 0 ? 0 : id;
+ id = id >= _playlist.tracks().size() ? _playlist.tracks().size()-1 : id;
_to_history(_track);
_track = _playlist.tracks().at(id);
_set_source();
}
void Player::stop() {
+ if (_state == PLAYER_STOPPED) {
+ return;
+ }
+ LastPlayed lp;
+ lp.position = _player->currentTime() / 1000 - 2;
+ lp.position = lp.position < 0 ? 0 : lp.position;
+ lp.trackId = _playlist.tracks().indexOf(_track);
+ lp.trackId = lp.trackId < 0 ? 0 : lp.trackId;
+ emit saveLastPlayed(lp);
_player->stop();
_state = PLAYER_STOPPED;
emit stateChanged(_state);
if (pos >= _playlist.tracks().count()) {
if (_repeat == REPEAT_NO) {
stop();
+ return;
}
pos %= _playlist.tracks().count();
}
void Player::prev() {
if (_history.isEmpty()) {
- _set_source();
- play();
return;
}
_queue.push_front(_track);
case Phonon::PlayingState:
_state = PLAYER_PLAYING;
emit stateChanged(_state);
+ if (_awaiting_seek) {
+ _awaiting_seek = false;
+ seek(_awaiting_seek_pos);
+ }
break;
case Phonon::ErrorState:
play(); // force
if (_playlist.tracks().isEmpty())
return;
if (_track.source().isEmpty()) {
- next();
+ emit startPlaylist();
return;
}
_state = PLAYER_PLAYING;
_history.removeLast();
}
}
+
+Player::~Player() {
+ stop();
+}
+
+QString Player::stateText() {
+ QString return_val;
+ switch (_state) {
+ case PLAYER_PLAYING:
+ return_val = "playing";
+ break;
+ case PLAYER_STOPPED:
+ return_val = "stopped";
+ break;
+ case PLAYER_PAUSED:
+ return_val = "paused";
+ break;
+ case PLAYER_DONE:
+ return_val = "idle";
+ break;
+ case PLAYER_LOADING:
+ return_val = "idle";
+ break;
+ case PLAYER_ERROR:
+ return_val = "error";
+ break;
+ default:
+ return_val = "unhandled";
+ break;
+ }
+ return return_val;
+}