From ace866a969cd438b9f1dc11b7d40a99f53a13009 Mon Sep 17 00:00:00 2001 From: Justin McPherson Date: Fri, 19 Mar 2010 14:25:45 +1000 Subject: Add autoLoad property to multimedia declarative elements. Task-number: QTBUG-8947 Reviewed-by: Andrew den Exter --- src/imports/multimedia/qdeclarativeaudio.cpp | 8 +++++ src/imports/multimedia/qdeclarativeaudio_p.h | 3 +- src/imports/multimedia/qdeclarativemediabase.cpp | 42 ++++++++++++++++++---- src/imports/multimedia/qdeclarativemediabase_p.h | 6 ++++ src/imports/multimedia/qdeclarativevideo.cpp | 8 +++++ src/imports/multimedia/qdeclarativevideo_p.h | 3 +- .../qdeclarativeaudio/tst_qdeclarativeaudio.cpp | 28 +++++++++++++++ 7 files changed, 90 insertions(+), 8 deletions(-) diff --git a/src/imports/multimedia/qdeclarativeaudio.cpp b/src/imports/multimedia/qdeclarativeaudio.cpp index 39223dc..dfe125f 100644 --- a/src/imports/multimedia/qdeclarativeaudio.cpp +++ b/src/imports/multimedia/qdeclarativeaudio.cpp @@ -142,6 +142,14 @@ void QDeclarativeAudio::stop() */ /*! + \qmlproperty url Audio:autoLoad + + This property indicates if loading of media should begin immediately. + + Defaults to true, if false media will not be loaded until playback is started. +*/ + +/*! \qmlproperty bool Audio::playing This property holds whether the media is playing. diff --git a/src/imports/multimedia/qdeclarativeaudio_p.h b/src/imports/multimedia/qdeclarativeaudio_p.h index 2e8ae30..24276ea 100644 --- a/src/imports/multimedia/qdeclarativeaudio_p.h +++ b/src/imports/multimedia/qdeclarativeaudio_p.h @@ -69,6 +69,7 @@ class QDeclarativeAudio : public QObject, public QDeclarativeMediaBase, public Q { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) + Q_PROPERTY(bool autoLoad READ isAutoLoad WRITE setAutoLoad NOTIFY autoLoadChanged) Q_PROPERTY(bool playing READ isPlaying WRITE setPlaying NOTIFY playingChanged) Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) @@ -123,7 +124,7 @@ public Q_SLOTS: Q_SIGNALS: void sourceChanged(); - + void autoLoadChanged(); void playingChanged(); void pausedChanged(); diff --git a/src/imports/multimedia/qdeclarativemediabase.cpp b/src/imports/multimedia/qdeclarativemediabase.cpp index 542c931..5bad969 100644 --- a/src/imports/multimedia/qdeclarativemediabase.cpp +++ b/src/imports/multimedia/qdeclarativemediabase.cpp @@ -228,6 +228,8 @@ void QDeclarativeMediaBase::_q_metaDataChanged() QDeclarativeMediaBase::QDeclarativeMediaBase() : m_paused(false) , m_playing(false) + , m_autoLoad(true) + , m_loaded(false) , m_muted(false) , m_position(0) , m_volume(1.0) @@ -315,13 +317,15 @@ void QDeclarativeMediaBase::setObject(QObject *object) m_playerControl->setMuted(m_muted); m_playerControl->setPlaybackRate(m_playbackRate); - if (!m_source.isEmpty()) + if (!m_source.isEmpty() && (m_autoLoad || m_playing)) // Override autoLoad if playing set m_playerControl->setMedia(m_source, 0); - if (m_playing) + if (m_paused) + m_playerControl->pause(); + else if (m_playing) m_playerControl->play(); - if (m_position > 0) + if ((m_playing || m_paused) && m_position > 0) m_playerControl->setPosition(m_position); } @@ -339,8 +343,8 @@ void QDeclarativeMediaBase::setSource(const QUrl &url) return; m_source = url; - - if (m_playerControl != 0) { + m_loaded = false; + if (m_playerControl != 0 && m_autoLoad) { if (m_error != QMediaPlayer::ServiceMissingError && m_error != QMediaPlayer::NoError) { m_error = QMediaPlayer::NoError; m_errorString = QString(); @@ -349,11 +353,26 @@ void QDeclarativeMediaBase::setSource(const QUrl &url) } m_playerControl->setMedia(m_source, 0); + m_loaded = true; } else emit sourceChanged(); } +bool QDeclarativeMediaBase::isAutoLoad() const +{ + return m_autoLoad; +} + +void QDeclarativeMediaBase::setAutoLoad(bool autoLoad) +{ + if (m_autoLoad == autoLoad) + return; + + m_autoLoad = autoLoad; + emit autoLoadChanged(); +} + bool QDeclarativeMediaBase::isPlaying() const { return m_playing; @@ -367,6 +386,12 @@ void QDeclarativeMediaBase::setPlaying(bool playing) m_playing = playing; if (m_playerControl != 0) { if (m_playing) { + if (!m_autoLoad && !m_loaded) { + m_playerControl->setMedia(m_source, 0); + m_playerControl->setPosition(m_position); + m_loaded = true; + } + if (!m_paused) m_playerControl->play(); else @@ -391,7 +416,12 @@ void QDeclarativeMediaBase::setPaused(bool paused) m_paused = paused; if (m_playerControl != 0) { - // Check if completed, change state + if (!m_autoLoad && !m_loaded) { + m_playerControl->setMedia(m_source, 0); + m_playerControl->setPosition(m_position); + m_loaded = true; + } + if (m_paused && m_state == QMediaPlayer::PlayingState) { m_playerControl->pause(); } diff --git a/src/imports/multimedia/qdeclarativemediabase_p.h b/src/imports/multimedia/qdeclarativemediabase_p.h index d279f4a..43df54d 100644 --- a/src/imports/multimedia/qdeclarativemediabase_p.h +++ b/src/imports/multimedia/qdeclarativemediabase_p.h @@ -76,6 +76,9 @@ public: QUrl source() const; void setSource(const QUrl &url); + bool isAutoLoad() const; + void setAutoLoad(bool autoLoad); + bool isPlaying() const; void setPlaying(bool playing); @@ -115,6 +118,7 @@ protected: void setObject(QObject *object); virtual void sourceChanged() = 0; + virtual void autoLoadChanged() = 0; virtual void playingChanged() = 0; virtual void pausedChanged() = 0; @@ -146,6 +150,8 @@ protected: bool m_paused; bool m_playing; + bool m_autoLoad; + bool m_loaded; bool m_muted; int m_position; qreal m_volume; diff --git a/src/imports/multimedia/qdeclarativevideo.cpp b/src/imports/multimedia/qdeclarativevideo.cpp index 67d9aef..6aff9bd 100644 --- a/src/imports/multimedia/qdeclarativevideo.cpp +++ b/src/imports/multimedia/qdeclarativevideo.cpp @@ -116,6 +116,14 @@ QDeclarativeVideo::~QDeclarativeVideo() */ /*! + \qmlproperty url Audio:autoLoad + + This property indicates if loading of media should begin immediately. + + Defaults to true, if false media will not be loaded until playback is started. +*/ + +/*! \qmlproperty bool Video::playing This property holds whether the media is playing. diff --git a/src/imports/multimedia/qdeclarativevideo_p.h b/src/imports/multimedia/qdeclarativevideo_p.h index 2dead2e..29e1090 100644 --- a/src/imports/multimedia/qdeclarativevideo_p.h +++ b/src/imports/multimedia/qdeclarativevideo_p.h @@ -73,6 +73,7 @@ class QDeclarativeVideo : public QDeclarativeItem, public QDeclarativeMediaBase { Q_OBJECT Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged) + Q_PROPERTY(bool autoLoad READ isAutoLoad WRITE setAutoLoad NOTIFY autoLoadChanged) Q_PROPERTY(bool playing READ isPlaying WRITE setPlaying NOTIFY playingChanged) Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged) Q_PROPERTY(Status status READ status NOTIFY statusChanged) @@ -145,7 +146,7 @@ public Q_SLOTS: Q_SIGNALS: void sourceChanged(); - + void autoLoadChanged(); void playingChanged(); void pausedChanged(); diff --git a/tests/auto/qdeclarativeaudio/tst_qdeclarativeaudio.cpp b/tests/auto/qdeclarativeaudio/tst_qdeclarativeaudio.cpp index a604854..a215bd5 100644 --- a/tests/auto/qdeclarativeaudio/tst_qdeclarativeaudio.cpp +++ b/tests/auto/qdeclarativeaudio/tst_qdeclarativeaudio.cpp @@ -61,6 +61,7 @@ private slots: void nullService(); void source(); + void autoLoad(); void playing(); void paused(); void duration(); @@ -430,6 +431,33 @@ void tst_QmlAudio::source() QCOMPARE(spy.count(), 3); } +void tst_QmlAudio::autoLoad() +{ + QtTestMediaServiceProvider provider; + QDeclarativeAudio audio; + audio.componentComplete(); + + QSignalSpy spy(&audio, SIGNAL(autoLoadChanged())); + + QCOMPARE(audio.isAutoLoad(), true); + + audio.setAutoLoad(false); + QCOMPARE(audio.isAutoLoad(), false); + QCOMPARE(spy.count(), 1); + + audio.setSource(QUrl("http://example.com")); + QCOMPARE(audio.source(), QUrl("http://example.com")); + audio.play(); + QCOMPARE(audio.isPlaying(), true); + audio.stop(); + + audio.setAutoLoad(true); + audio.setSource(QUrl("http://example.com")); + audio.setPaused(true); + QCOMPARE(spy.count(), 2); + QCOMPARE(audio.isPaused(), true); +} + void tst_QmlAudio::playing() { QtTestMediaServiceProvider provider; -- cgit v0.12