New DBus functions and mediaartlocal support
[someplayer] / src / player / player.cpp
index 67bf4bc..3bb3039 100644 (file)
@@ -43,6 +43,7 @@ inline QList<Track> __sub(QList<Track> one, QList<Track> two, Track three) {
 Player::Player(QObject *parent) :
     QObject(parent)
 {
+       _awaiting_seek = false;
        _player = new Phonon::MediaObject(this);
        _output = new Phonon::AudioOutput(Phonon::MusicCategory, this);
        _player->setTickInterval(1000);
@@ -70,9 +71,12 @@ Player::Player(QObject *parent) :
        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();
@@ -90,6 +94,15 @@ void Player::toggle() {
 }
 
 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);
@@ -122,6 +135,7 @@ void Player::next() {
                if (pos >= _playlist.tracks().count()) {
                        if (_repeat == REPEAT_NO) {
                                stop();
+                               return;
                        }
                        pos %= _playlist.tracks().count();
                }
@@ -154,8 +168,6 @@ void Player::_set_source() {
 
 void Player::prev() {
        if (_history.isEmpty()) {
-               _set_source();
-               play();
                return;
        }
        _queue.push_front(_track);
@@ -169,6 +181,10 @@ void Player::_stateChanged(Phonon::State newState, Phonon::State /*oldState*/) {
        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
@@ -204,7 +220,7 @@ void Player::play() {
        if (_playlist.tracks().isEmpty())
                return;
        if (_track.source().isEmpty()) {
-               next();
+               emit startPlaylist();
                return;
        }
        _state = PLAYER_PLAYING;
@@ -322,3 +338,35 @@ void Player::_truncate_history() {
                _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;
+}