diff options
author | Alexandre Moreno <alexmorenocano@gmail.com> | 2015-11-01 16:30:43 +0800 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-11-01 11:25:27 +0200 |
commit | e8c010a411a7eec1a4cf7a182ca6163e5d3f6885 (patch) | |
tree | aabf7b33a6c50349c57c172e1df8a74732da6f32 | |
parent | 055a51de80d790529651ee05553b5d5a8e76903d (diff) |
qt: add simple playlist support and wire buttons
-rw-r--r-- | qt/main.qml | 12 | ||||
-rw-r--r-- | qt/qgstplayer.cpp | 68 | ||||
-rw-r--r-- | qt/qgstplayer.h | 14 |
3 files changed, 90 insertions, 4 deletions
diff --git a/qt/main.qml b/qt/main.qml index 322bd01..15a8292 100644 --- a/qt/main.qml +++ b/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/qt/qgstplayer.cpp b/qt/qgstplayer.cpp index 8117b74..8c350d5 100644 --- a/qt/qgstplayer.cpp +++ b/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<QUrl> Player::playlist() const +{ + return playlist_; +} + +void Player::setPlaylist(const QList<QUrl> &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/qt/qgstplayer.h b/qt/qgstplayer.h index afbefd4..c41f66c 100644 --- a/qt/qgstplayer.h +++ b/qt/qgstplayer.h @@ -25,7 +25,8 @@ #include <QUrl> #include <QSize> //#include <QtGui/qwindowdefs.h> -#include <QtQml/QQmlPropertyMap> +#include <QVariant> +#include <QList> #include <gst/player/player.h> 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<QUrl> playlist READ playlist WRITE setPlaylist) Q_ENUMS(State) @@ -91,10 +93,12 @@ public: bool isSubtitleEnabled() const; quint32 positionUpdateInterval() const; bool autoPlay() const; + QList<QUrl> 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<QUrl> &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<QUrl> playlist_; + QList<QUrl>::iterator iter_; }; class VideoRenderer |