From 1cebdf926c8f9a06f31fc7dc8a6f5cee9d4bc392 Mon Sep 17 00:00:00 2001 From: Alexandre Moreno Date: Sun, 1 Nov 2015 16:30:43 +0800 Subject: [PATCH] playback/player: qt: add simple playlist support and wire buttons --- playback/player/qt/main.qml | 12 ++++++ playback/player/qt/qgstplayer.cpp | 68 +++++++++++++++++++++++++++++-- playback/player/qt/qgstplayer.h | 14 ++++++- 3 files changed, 90 insertions(+), 4 deletions(-) diff --git a/playback/player/qt/main.qml b/playback/player/qt/main.qml index 322bd01444..15a8292b2f 100644 --- a/playback/player/qt/main.qml +++ b/playback/player/qt/main.qml @@ -43,6 +43,8 @@ ApplicationWindow { objectName: "player" volume: 0.5 positionUpdateInterval: 100 + autoPlay: false + onStateChanged: { if (state === Player.STOPPED) { playbutton.state = "play" @@ -375,6 +377,11 @@ ApplicationWindow { font.family: "FontAwesome" text: FontAwesome.Icon.StepBackward } + + MouseArea { + anchors.fill: parent + onPressed: player.previous() + } } Item { @@ -432,6 +439,11 @@ ApplicationWindow { font.family: "FontAwesome" text: FontAwesome.Icon.StepForward } + + MouseArea { + anchors.fill: parent + onPressed: player.next() + } } Item { diff --git a/playback/player/qt/qgstplayer.cpp b/playback/player/qt/qgstplayer.cpp index 8117b7439b..8c350d55d3 100644 --- a/playback/player/qt/qgstplayer.cpp +++ b/playback/player/qt/qgstplayer.cpp @@ -354,7 +354,8 @@ Player::Player(QObject *parent, VideoRenderer *renderer) "swapped-signal::video-dimensions-changed", G_CALLBACK (Player::onVideoDimensionsChanged), this, "swapped-signal::volume-changed", G_CALLBACK (Player::onVolumeChanged), this, "swapped-signal::mute-changed", G_CALLBACK (Player::onMuteChanged), this, - "swapped-signal::media-info-updated", G_CALLBACK (Player::onMediaInfoUpdated), this, NULL); + "swapped-signal::media-info-updated", G_CALLBACK (Player::onMediaInfoUpdated), this, + "swapped-signal::end-of-stream", G_CALLBACK (Player::onEndOfStreamReached), this, NULL); mediaInfo_ = new MediaInfo(this); gst_player_set_subtitle_track_enabled(player_, false); @@ -444,6 +445,63 @@ Player::onMediaInfoUpdated(Player *player, GstPlayerMediaInfo *media_info) emit player->mediaInfoChanged(); } +void Player::onEndOfStreamReached(Player *player) +{ + Q_ASSERT(player != 0); + + emit player->endOfStream(); +} + +void Player::setUri(QUrl url) +{ + Q_ASSERT(player_ != 0); + QByteArray uri = url.toString().toLocal8Bit(); + + gst_player_set_uri(player_, uri.data()); + + autoPlay_ ? play() : pause(); + + emit sourceChanged(url); +} + +QList Player::playlist() const +{ + return playlist_; +} + +void Player::setPlaylist(const QList &playlist) +{ + if (!playlist_.isEmpty()) { + playlist_.erase(playlist_.begin(), playlist_.end()); + } + + playlist_ = playlist; + + iter_ = playlist_.begin(); + setUri(*iter_); +} + +void Player::next() +{ + if (playlist_.isEmpty()) + return; + + if (iter_ == playlist_.end()) + return; + + setUri(*++iter_); +} + +void Player::previous() +{ + if (playlist_.isEmpty()) + return; + + if (iter_ == playlist_.begin()) + return; + + setUri(*--iter_); +} bool Player::autoPlay() const { @@ -554,9 +612,13 @@ void Player::seek(qint64 position) void Player::setSource(QUrl const& url) { Q_ASSERT(player_ != 0); - QByteArray uri = url.toString().toLocal8Bit(); - gst_player_set_uri(player_, uri.data()); + // discard playlist + if (!playlist_.isEmpty()) { + playlist_.erase(playlist_.begin(), playlist_.end()); + } + + setUri(url); emit sourceChanged(url); } diff --git a/playback/player/qt/qgstplayer.h b/playback/player/qt/qgstplayer.h index afbefd43fc..c41f66c3bb 100644 --- a/playback/player/qt/qgstplayer.h +++ b/playback/player/qt/qgstplayer.h @@ -25,7 +25,8 @@ #include #include //#include -#include +#include +#include #include namespace QGstPlayer { @@ -58,6 +59,7 @@ class Player : public QObject Q_PROPERTY(bool subtitleEnabled READ isSubtitleEnabled WRITE setSubtitleEnabled NOTIFY subtitleEnabledChanged) Q_PROPERTY(bool autoPlay READ autoPlay WRITE setAutoPlay) + Q_PROPERTY(QList playlist READ playlist WRITE setPlaylist) Q_ENUMS(State) @@ -91,10 +93,12 @@ public: bool isSubtitleEnabled() const; quint32 positionUpdateInterval() const; bool autoPlay() const; + QList playlist() const; signals: void stateChanged(State new_state); void bufferingChanged(int percent); + void endOfStream(); void positionUpdated(qint64 new_position); void durationChanged(qint64 duration); void resolutionChanged(QSize resolution); @@ -119,6 +123,9 @@ public slots: void setCurrentSubtitle(QVariant track); void setSubtitleEnabled(bool enabled); void setPositionUpdateInterval(quint32 interval); + void setPlaylist(const QList &playlist); + void next(); + void previous(); void setAutoPlay(bool auto_play); private: @@ -131,6 +138,9 @@ private: static void onVolumeChanged(Player *); static void onMuteChanged(Player *); static void onMediaInfoUpdated(Player *, GstPlayerMediaInfo *media_info); + static void onEndOfStreamReached(Player *); + + void setUri(QUrl url); GstPlayer *player_; State state_; @@ -139,6 +149,8 @@ private: bool videoAvailable_; bool subtitleEnabled_; bool autoPlay_; + QList playlist_; + QList::iterator iter_; }; class VideoRenderer