From 81d758b4200251605846e2b99f9fc254b435232a Mon Sep 17 00:00:00 2001 From: emeric Date: Wed, 5 Nov 2014 12:57:10 +0100 Subject: [PATCH] WIP. Basic Prev/Next support in play queue --- src/ui/audio/Audio.cpp | 2 ++ src/ui/audio/AudioMediaPlayer.cpp | 30 ++++++++++++------------------ src/ui/audio/AudioMediaPlayer.hpp | 14 +++++++------- src/ui/audio/PlayQueue.cpp | 24 +++++++++++++++++++++--- src/ui/audio/PlayQueue.hpp | 6 ++++-- 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/ui/audio/Audio.cpp b/src/ui/audio/Audio.cpp index 02623358..ec6e4b6e 100644 --- a/src/ui/audio/Audio.cpp +++ b/src/ui/audio/Audio.cpp @@ -159,6 +159,8 @@ _mediaPlayer(nullptr) playQueue->playTrack().connect(this, &Audio::playTrack); _mediaPlayer->playbackEnded().connect(playQueue, &PlayQueue::handlePlaybackComplete); + _mediaPlayer->playNext().connect(playQueue, &PlayQueue::playNext); + _mediaPlayer->playPrevious().connect(playQueue, &PlayQueue::playPrevious); } void diff --git a/src/ui/audio/AudioMediaPlayer.cpp b/src/ui/audio/AudioMediaPlayer.cpp index badf06e1..e53111ef 100644 --- a/src/ui/audio/AudioMediaPlayer.cpp +++ b/src/ui/audio/AudioMediaPlayer.cpp @@ -39,10 +39,10 @@ AudioMediaPlayer::AudioMediaPlayer( Wt::WContainerWidget *parent) { Wt::WContainerWidget *container = new Wt::WContainerWidget(this); - _prevBtn = new Wt::WPushButton("<<", container ); + Wt::WPushButton *prevBtn = new Wt::WPushButton("<<", container ); _playBtn = new Wt::WPushButton("Play", container ); _pauseBtn = new Wt::WPushButton("Pause", container ); - _nextBtn = new Wt::WPushButton(">>", container ); + Wt::WPushButton *nextBtn = new Wt::WPushButton(">>", container ); _curTime = new Wt::WText(container); _timeSlider = new Wt::WSlider( container ); @@ -60,6 +60,16 @@ AudioMediaPlayer::AudioMediaPlayer( Wt::WContainerWidget *parent) _mediaPlayer->setText( Wt::WMediaPlayer::Duration, _duration); _mediaPlayer->timeUpdated().connect(this, &AudioMediaPlayer::handleTimeUpdated); + + nextBtn->clicked().connect(std::bind([=] () + { + _playNext.emit(); + })); + + prevBtn->clicked().connect(std::bind([=] () + { + _playPrevious.emit(); + })); } _timeSlider->valueChanged().connect(this, &AudioMediaPlayer::handlePlayOffset); @@ -68,8 +78,6 @@ AudioMediaPlayer::AudioMediaPlayer( Wt::WContainerWidget *parent) _volumeSlider->sliderMoved().connect(this, &AudioMediaPlayer::handleVolumeSliderMoved); - _nextBtn->clicked().connect(this, &AudioMediaPlayer::handlePlayNext); - _prevBtn->clicked().connect(this, &AudioMediaPlayer::handlePlayPrev); } @@ -120,20 +128,6 @@ AudioMediaPlayer::handlePlayOffset(int offsetSecs) _mediaPlayer->play(); } - -void -AudioMediaPlayer::handlePlayNext(void) -{ - // TODO -} - -void -AudioMediaPlayer::handlePlayPrev(void) -{ - // TODO -} - - void AudioMediaPlayer::handleTrackEnded(void) { diff --git a/src/ui/audio/AudioMediaPlayer.hpp b/src/ui/audio/AudioMediaPlayer.hpp index 96ebd5a0..60f34874 100644 --- a/src/ui/audio/AudioMediaPlayer.hpp +++ b/src/ui/audio/AudioMediaPlayer.hpp @@ -42,16 +42,16 @@ class AudioMediaPlayer : public Wt::WContainerWidget void load(const Transcode::Parameters& parameters); - // Signal slot Next - Wt::Signal& playbackEnded() {return _playbackEnded;} - // Signal Slot Previous // Signal slot Ended + Wt::Signal& playbackEnded() {return _playbackEnded;} + // Signal slot Next + Wt::Signal& playNext() {return _playNext;} + // Signal Slot Previous + Wt::Signal& playPrevious() {return _playPrevious;} private: void handlePlayOffset(int offsetSecs); - void handlePlayNext(void); - void handlePlayPrev(void); void handleTrackEnded(void); void handleValueChanged(double); @@ -64,6 +64,8 @@ class AudioMediaPlayer : public Wt::WContainerWidget // Signals Wt::Signal _playbackEnded; + Wt::Signal _playNext; + Wt::Signal _playPrevious; // Core Wt::WMediaPlayer* _mediaPlayer; @@ -74,8 +76,6 @@ class AudioMediaPlayer : public Wt::WContainerWidget std::shared_ptr _currentParameters; Wt::WPushButton* _playBtn; Wt::WPushButton* _pauseBtn; - Wt::WPushButton* _nextBtn; - Wt::WPushButton* _prevBtn; Wt::WSlider* _timeSlider; Wt::WSlider* _volumeSlider; Wt::WText* _curTime; diff --git a/src/ui/audio/PlayQueue.cpp b/src/ui/audio/PlayQueue.cpp index 76ea1907..53c5ab96 100644 --- a/src/ui/audio/PlayQueue.cpp +++ b/src/ui/audio/PlayQueue.cpp @@ -25,7 +25,7 @@ namespace UserInterface { PlayQueue::PlayQueue(Database::Handler& db, Wt::WContainerWidget* parent) : Wt::WTableView(parent), _db(db), -_playingTrackId(0) +_playedId(-1) { _model = new Wt::WStandardItemModel(0, 4, this); @@ -97,13 +97,31 @@ void PlayQueue::clear(void) { _model->removeRows(0, _model->rowCount()); + + // Reset play id + _playedId = -1; } void PlayQueue::handlePlaybackComplete(void) { // Play the next track - readTrack(_playingTrackId + 1); + if (_playedId != -1) + { + readTrack(_playedId + 1); + } +} + +void +PlayQueue::playNext(void) +{ + readTrack( _playedId != -1 ? _playedId + 1 : 0); +} + +void +PlayQueue::playPrevious(void) +{ + readTrack( _playedId >= 1 ? _playedId - 1 : 0); } void @@ -118,7 +136,7 @@ PlayQueue::readTrack(int rowId) Database::Track::pointer track = Database::Track::getById(_db.getSession(), trackId); if (track) { - _playingTrackId = rowId; + _playedId = rowId; _sigTrackPlay.emit(track->getPath()); break; } diff --git a/src/ui/audio/PlayQueue.hpp b/src/ui/audio/PlayQueue.hpp index 93db861f..49a040a2 100644 --- a/src/ui/audio/PlayQueue.hpp +++ b/src/ui/audio/PlayQueue.hpp @@ -37,7 +37,9 @@ class PlayQueue : public Wt::WTableView void clear(void); - void play(void); + void play(void); // Play the queue from the beginning + void playNext(void); // Play the next track + void playPrevious(void); // Play the previous track // Signals Wt::Signal< boost::filesystem::path >& playTrack() { return _sigTrackPlay; } @@ -57,7 +59,7 @@ class PlayQueue : public Wt::WTableView Wt::WStandardItemModel* _model; - int _playingTrackId; + int _playedId; };