Skip to content

Commit

Permalink
added repeat mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Bronson Mathews committed Jul 29, 2020
1 parent 45bb26e commit bece9b7
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 2 deletions.
11 changes: 11 additions & 0 deletions src/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,17 @@ Book * Database::getLibraryItem(QString &xPath)
return nullptr;
}

Book *Database::getNextLibraryItem(QString &xPath)
{
for(int i=0; i<mLibraryItems.size(); ++i) {
Book &b = mLibraryItems[i];
if (b.path == xPath) {
return &mLibraryItems[(i + 1) % mLibraryItems.size()];
}
}
return nullptr;
}


bool caseInsensitiveLessThan(const Book &s1, const Book &s2) {
return s1.title.toLower() < s2.title.toLower();
Expand Down
1 change: 1 addition & 0 deletions src/database.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ class Database : public QObject
bool isEmpty() const;
QVector<Book> getLibraryItems();
Book * getLibraryItem(QString &xPath);
Book * getNextLibraryItem(QString &xPath);

signals:
void pathChanged();
Expand Down
38 changes: 36 additions & 2 deletions src/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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<Repeat>(Settings::value("repeat_mode", Repeat::LIBRARY).toInt());
setRepeatMode(repeat_mode);
}


Expand Down Expand Up @@ -97,6 +102,12 @@ QString Player::sleepTimeText() const
}


Player::Repeat Player::repeatMode() const
{
return mRepeatMode;
}


int Player::chapterIndex() const
{
return playlist()->currentIndex();
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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);

Expand Down
15 changes: 15 additions & 0 deletions src/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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();
Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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();
Expand All @@ -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
Expand Down

0 comments on commit bece9b7

Please sign in to comment.