diff --git a/src/database.cpp b/src/database.cpp index 2d4305f..cf98051 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -329,6 +329,17 @@ Book * Database::getLibraryItem(QString &xPath) return nullptr; } +Book *Database::getNextLibraryItem(QString &xPath) +{ + for(int i=0; i getLibraryItems(); Book * getLibraryItem(QString &xPath); + Book * getNextLibraryItem(QString &xPath); signals: void pathChanged(); diff --git a/src/player.cpp b/src/player.cpp index a767318..2504995 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -13,12 +13,13 @@ Player::Player(QMediaPlayer *parent) // TODO: use parent playlist? parent->playlist() QMediaPlaylist *playlist = new QMediaPlaylist; setPlaylist(playlist); - - // connects connect(playlist, &QMediaPlaylist::currentIndexChanged, this, &Player::playlistIndexChanged); + + connect(this, &QMediaPlayer::mediaStatusChanged, this, &Player::updateMediaStatus); connect(this, &QMediaPlayer::positionChanged, this, &Player::positionChanged); connect(this, &QMediaPlayer::volumeChanged, this, &Player::volumeChanged); connect(this, &QMediaPlayer::playbackRateChanged, this, &Player::speedChanged); + //connect(this, &QMediaPlayer::seekableChanged, this, &Player::seekableChanged); // broken on android //connect(this, &QMediaPlayer::bufferStatusChanged, this, &Player::bufferChanged); // broken @@ -40,6 +41,10 @@ Player::Player(QMediaPlayer *parent) int sleep_time = Settings::value("sleep_time", 3600000).toInt(); // 1hr in msec setSleepTime(sleep_time); + + + Repeat repeat_mode = static_cast(Settings::value("repeat_mode", Repeat::LIBRARY).toInt()); + setRepeatMode(repeat_mode); } @@ -97,6 +102,12 @@ QString Player::sleepTimeText() const } +Player::Repeat Player::repeatMode() const +{ + return mRepeatMode; +} + + int Player::chapterIndex() const { return playlist()->currentIndex(); @@ -314,6 +325,26 @@ void Player::setSleepTimerEnabled(bool xEnabled) } +void Player::updateMediaStatus(QMediaPlayer::MediaStatus xStatus) +{ + if (xStatus == QMediaPlayer::NoMedia && chapterIndex() == -1 && mRepeatMode == Repeat::LIBRARY) { + QString next_book = Database::instance()->getNextLibraryItem(mCurrentBook->path)->path; + setCurrentItem(next_book); + qDebug() << "load next book from lib" << next_book; + } +} + + +void Player::setRepeatMode(Player::Repeat xMode) +{ + if (mRepeatMode == xMode) + return; + + mRepeatMode = xMode; + emit repeatModeChanged(mRepeatMode); +} + + void Player::setCurrentItem(QString &xIndex) { if (xIndex.isEmpty()) @@ -346,6 +377,9 @@ void Player::setCurrentItem(QString &xIndex) playlist()->addMedia(url); } + // changing book requires this + emit playlistChanged(); + // set a default item in the playlist //setChapterIndex(0); diff --git a/src/player.h b/src/player.h index e876b0e..fc88d5e 100644 --- a/src/player.h +++ b/src/player.h @@ -13,6 +13,7 @@ class QJSEngine; class Player : public QMediaPlayer { Q_OBJECT + Q_PROPERTY(QString currentItem WRITE setCurrentItem NOTIFY currentItemChanged) Q_PROPERTY(qint64 sliderValue READ sliderValue NOTIFY progressChanged) Q_PROPERTY(int chapterIndex READ chapterIndex WRITE setChapterIndex NOTIFY progressChanged) @@ -26,8 +27,17 @@ class Player : public QMediaPlayer Q_PROPERTY(int sleepTime READ sleepTime WRITE setSleepTime NOTIFY sleepTimeChanged) Q_PROPERTY(QString sleepTimeText READ sleepTimeText NOTIFY sleepTimeChanged) Q_PROPERTY(bool sleepTimerEnabled READ sleepTimerEnabled WRITE setSleepTimerEnabled NOTIFY sleepTimerEnabledChanged) + //Q_PROPERTY(RepeatMode RepeatMode READ RepeatMode WRITE setRepeatMode NOTIFY repeatModeChanged) public: + enum Repeat { + LIBRARY = 0, + BOOK, + CHAPTER, + NONE, + }; + Q_ENUM(Repeat); + ~Player(); Player(const Player&) = delete; // disable copy for singleton static Player *instance(); @@ -40,6 +50,7 @@ class Player : public QMediaPlayer QString chapterText() const; QString chapterProgressText() const; QString sleepTimeText() const; + Player::Repeat repeatMode() const; int chapterIndex() const; int volume() const; int speed() const; @@ -54,6 +65,7 @@ class Player : public QMediaPlayer Book * getCurrentItem(); public slots: + void setRepeatMode(Player::Repeat xMode); void positionChanged(qint64 xPosition); void playlistIndexChanged(int xIndex); void setProgress(qint64 xPosition); @@ -69,6 +81,7 @@ public slots: void setSpeed(int xSpeed); void setSleepTime(int xTime); void setSleepTimerEnabled(bool xEnabled); + void updateMediaStatus(QMediaPlayer::MediaStatus xStatus); signals: void progressChanged(); @@ -78,9 +91,11 @@ public slots: void speedChanged(int xSpeed); void sleepTimeChanged(int xTime); void sleepTimerEnabledChanged(bool xEnabled); + void repeatModeChanged(enum Player::Repeat xMode); private: + enum Player::Repeat mRepeatMode; Book * mCurrentBook = nullptr; int mSkip = 30000; // 30 sec float mProgressScale; // decimal