diff options
Diffstat (limited to 'tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp')
-rw-r--r-- | tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp | 1257 |
1 files changed, 0 insertions, 1257 deletions
diff --git a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp b/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp deleted file mode 100644 index adcd9cc38..000000000 --- a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp +++ /dev/null @@ -1,1257 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -//TESTED_COMPONENT=plugins/declarative/multimedia - -#include <QtTest/QtTest> - -#include "qdeclarativeaudio_p.h" -#include "qdeclarativemediametadata_p.h" - -#include "mockmediaserviceprovider.h" -#include "mockmediaplayerservice.h" - -#include <QtMultimedia/qmediametadata.h> -#include <qmediaplayercontrol.h> -#include <qmediaservice.h> -#include <private/qmediaserviceprovider_p.h> -#include <private/qdeclarativevideooutput_p.h> -#include <qmetadatareadercontrol.h> -#include <QAbstractVideoSurface> - -#include <QtGui/qguiapplication.h> -#include <QtQml/qqmlengine.h> -#include <QtQml/qqmlcomponent.h> - -class tst_QDeclarativeAudio : public QObject -{ - Q_OBJECT -public slots: - void initTestCase(); - -private slots: - void nullPlayerControl(); - void nullMetaDataControl(); - void nullService(); - - void source(); - void autoLoad(); - void playing(); - void paused(); - void duration(); - void position(); - void volume(); - void muted(); - void bufferProgress(); - void seekable(); - void playbackRate(); - void status(); - void metaData_data(); - void metaData(); - void error(); - void loops(); - void audioRole(); - void customAudioRole(); - void videoOutput(); - -private: - void enumerator(const QMetaObject *object, const char *name, QMetaEnum *result); - QMetaEnum enumerator(const QMetaObject *object, const char *name); - void keyToValue(const QMetaEnum &enumeration, const char *key, int *result); - int keyToValue(const QMetaEnum &enumeration, const char *key); -}; - -Q_DECLARE_METATYPE(QDeclarativeAudio::Error); -Q_DECLARE_METATYPE(QDeclarativeAudio::AudioRole); - -class QtTestMediaPlayerControl : public QMediaPlayerControl -{ - Q_OBJECT -public: - QtTestMediaPlayerControl(QObject *parent = 0) - : QMediaPlayerControl(parent) - , m_state(QMediaPlayer::StoppedState) - , m_mediaStatus(QMediaPlayer::NoMedia) - , m_duration(0) - , m_position(0) - , m_playbackRate(1.0) - , m_volume(100) - , m_bufferStatus(0) - , m_muted(false) - , m_audioAvailable(false) - , m_videoAvailable(false) - , m_seekable(false) - { - } - - QMediaPlayer::State state() const { return m_state; } - void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); } - - QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; } - void updateMediaStatus(QMediaPlayer::MediaStatus status) { - emit mediaStatusChanged(m_mediaStatus = status); } - void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state) - { - m_mediaStatus = status; - m_state = state; - - emit mediaStatusChanged(m_mediaStatus); - emit stateChanged(m_state); - } - - qint64 duration() const { return m_duration; } - void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); } - - qint64 position() const { return m_position; } - void setPosition(qint64 position) { emit positionChanged(m_position = position); } - - int volume() const { return m_volume; } - void setVolume(int volume) { emit volumeChanged(m_volume = volume); } - - bool isMuted() const { return m_muted; } - void setMuted(bool muted) { emit mutedChanged(m_muted = muted); } - - int bufferStatus() const { return m_bufferStatus; } - void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); } - - bool isAudioAvailable() const { return m_audioAvailable; } - void setAudioAvailable(bool available) { - emit audioAvailableChanged(m_audioAvailable = available); } - bool isVideoAvailable() const { return m_videoAvailable; } - void setVideoAvailable(bool available) { - emit videoAvailableChanged(m_videoAvailable = available); } - - bool isSeekable() const { return m_seekable; } - void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); } - - QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); } - - qreal playbackRate() const { return m_playbackRate; } - void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); } - - QMediaContent media() const { return m_media; } - const QIODevice *mediaStream() const { return 0; } - void setMedia(const QMediaContent &media, QIODevice *) - { - m_media = media; - - m_mediaStatus = m_media.isNull() - ? QMediaPlayer::NoMedia - : QMediaPlayer::LoadingMedia; - - emit mediaChanged(m_media); - emit mediaStatusChanged(m_mediaStatus); - } - - void play() - { - m_state = QMediaPlayer::PlayingState; - if (m_mediaStatus == QMediaPlayer::EndOfMedia) - updateMediaStatus(QMediaPlayer::LoadedMedia); - emit stateChanged(m_state); - } - void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); } - void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); } - - void emitError(QMediaPlayer::Error err, const QString &errorString) { - emit error(err, errorString); } - -private: - QMediaPlayer::State m_state; - QMediaPlayer::MediaStatus m_mediaStatus; - qint64 m_duration; - qint64 m_position; - qreal m_playbackRate; - int m_volume; - int m_bufferStatus; - bool m_muted; - bool m_audioAvailable; - bool m_videoAvailable; - bool m_seekable; - QMediaContent m_media; -}; - -class QtTestMetaDataControl : public QMetaDataReaderControl -{ - Q_OBJECT -public: - QtTestMetaDataControl(QObject *parent = 0) - : QMetaDataReaderControl(parent) - { - } - - bool isMetaDataAvailable() const { return true; } - - QVariant metaData(const QString &key) const { return m_metaData.value(key); } - void setMetaData(const QString &key, const QVariant &value) { - m_metaData.insert(key, value); emit metaDataChanged(); } - - QStringList availableMetaData() const { return m_metaData.keys(); } - -private: - QMap<QString, QVariant> m_metaData; -}; - -class QtTestMediaService : public QMediaService -{ - Q_OBJECT -public: - QtTestMediaService( - QtTestMediaPlayerControl *playerControl, - QtTestMetaDataControl *metaDataControl, - QObject *parent) - : QMediaService(parent) - , playerControl(playerControl) - , metaDataControl(metaDataControl) - { - } - - QMediaControl *requestControl(const char *name) - { - if (qstrcmp(name, QMediaPlayerControl_iid) == 0) - return playerControl; - else if (qstrcmp(name, QMetaDataReaderControl_iid) == 0) - return metaDataControl; - else - return 0; - } - - void releaseControl(QMediaControl *) {} - - QtTestMediaPlayerControl *playerControl; - QtTestMetaDataControl *metaDataControl; -}; - -class QtTestMediaServiceProvider : public QMediaServiceProvider -{ - Q_OBJECT -public: - QtTestMediaServiceProvider() - : service(new QtTestMediaService( - new QtTestMediaPlayerControl(this), new QtTestMetaDataControl(this), this)) - { - setDefaultServiceProvider(this); - } - - QtTestMediaServiceProvider(QtTestMediaService *service) - : service(service) - { - setDefaultServiceProvider(this); - } - - QtTestMediaServiceProvider( - QtTestMediaPlayerControl *playerControl, QtTestMetaDataControl *metaDataControl) - : service(new QtTestMediaService(playerControl, metaDataControl, this)) - { - setDefaultServiceProvider(this); - } - - ~QtTestMediaServiceProvider() - { - setDefaultServiceProvider(0); - } - - QMediaService *requestService( - const QByteArray &type, - const QMediaServiceProviderHint & = QMediaServiceProviderHint()) - { - requestedService = type; - - return service; - } - - void releaseService(QMediaService *) {} - - inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; } - inline QtTestMetaDataControl *metaDataControl() { return service->metaDataControl; } - - QtTestMediaService *service; - QByteArray requestedService; -}; - -void tst_QDeclarativeAudio::initTestCase() -{ - qRegisterMetaType<QDeclarativeAudio::Error>(); - qRegisterMetaType<QDeclarativeAudio::AudioRole>(); -} - -void tst_QDeclarativeAudio::nullPlayerControl() -{ - QtTestMetaDataControl metaDataControl; - QtTestMediaServiceProvider provider(0, &metaDataControl); - - QDeclarativeAudio audio; - audio.classBegin(); - - QCOMPARE(audio.source(), QUrl()); - audio.setSource(QUrl("http://example.com")); - QCOMPARE(audio.source(), QUrl("http://example.com")); - - QCOMPARE(audio.playbackState(), audio.StoppedState); - audio.play(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - audio.pause(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - - QCOMPARE(audio.duration(), 0); - - QCOMPARE(audio.position(), 0); - audio.seek(10000); - QCOMPARE(audio.position(), 10000); - - QCOMPARE(audio.volume(), qreal(1.0)); - audio.setVolume(0.5); - QCOMPARE(audio.volume(), qreal(0.5)); - - QCOMPARE(audio.isMuted(), false); - audio.setMuted(true); - QCOMPARE(audio.isMuted(), true); - - QCOMPARE(audio.bufferProgress(), qreal(0)); - - QCOMPARE(audio.isSeekable(), false); - - QCOMPARE(audio.playbackRate(), qreal(1.0)); - - QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); - - QCOMPARE(audio.error(), QDeclarativeAudio::ServiceMissing); -} - -void tst_QDeclarativeAudio::nullMetaDataControl() -{ - QtTestMediaPlayerControl playerControl; - QtTestMediaServiceProvider provider(&playerControl, 0); - - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QVERIFY(audio.metaData()); -} - -void tst_QDeclarativeAudio::nullService() -{ - QtTestMediaServiceProvider provider(0); - - QDeclarativeAudio audio; - audio.classBegin(); - - QCOMPARE(audio.source(), QUrl()); - audio.setSource(QUrl("http://example.com")); - QCOMPARE(audio.source(), QUrl("http://example.com")); - - QCOMPARE(audio.playbackState(), audio.StoppedState); - audio.play(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - audio.pause(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - - QCOMPARE(audio.duration(), 0); - - QCOMPARE(audio.position(), 0); - audio.seek(10000); - QCOMPARE(audio.position(), 10000); - - QCOMPARE(audio.volume(), qreal(1.0)); - audio.setVolume(0.5); - QCOMPARE(audio.volume(), qreal(0.5)); - - QCOMPARE(audio.isMuted(), false); - audio.setMuted(true); - QCOMPARE(audio.isMuted(), true); - - QCOMPARE(audio.bufferProgress(), qreal(0)); - - QCOMPARE(audio.isSeekable(), false); - - QCOMPARE(audio.playbackRate(), qreal(1.0)); - - QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); - - QCOMPARE(audio.error(), QDeclarativeAudio::ServiceMissing); - - QVERIFY(audio.metaData()); -} - -void tst_QDeclarativeAudio::source() -{ - const QUrl url1("http://example.com"); - const QUrl url2("file:///local/path"); - const QUrl url3; - - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(sourceChanged())); - - audio.setSource(url1); - QCOMPARE(audio.source(), url1); - QCOMPARE(provider.playerControl()->media().request().url(), url1); - QCOMPARE(spy.count(), 1); - - audio.setSource(url2); - QCOMPARE(audio.source(), url2); - QCOMPARE(provider.playerControl()->media().request().url(), url2); - QCOMPARE(spy.count(), 2); - - audio.setSource(url3); - QCOMPARE(audio.source(), url3); - QCOMPARE(provider.playerControl()->media().request().url(), url3); - QCOMPARE(spy.count(), 3); -} - -void tst_QDeclarativeAudio::autoLoad() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - 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.playbackState(), audio.PlayingState); - audio.stop(); - - audio.setAutoLoad(true); - audio.setSource(QUrl("http://example.com")); - audio.pause(); - QCOMPARE(spy.count(), 2); - QCOMPARE(audio.playbackState(), audio.PausedState); -} - -void tst_QDeclarativeAudio::playing() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - - QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); - QSignalSpy playingSpy(&audio, SIGNAL(playing())); - QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); - - int stateChanged = 0; - int playing = 0; - int stopped = 0; - - audio.componentComplete(); - audio.setSource(QUrl("http://example.com")); - - QCOMPARE(audio.playbackState(), audio.StoppedState); - - // play() when stopped. - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(playingSpy.count(), ++playing); - QCOMPARE(stoppedSpy.count(), stopped); - - // stop() when playing. - audio.stop(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(playingSpy.count(), playing); - QCOMPARE(stoppedSpy.count(), ++stopped); - - // stop() when stopped. - audio.stop(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - QCOMPARE(playingSpy.count(), playing); - QCOMPARE(stoppedSpy.count(), stopped); - - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(playingSpy.count(), ++playing); - QCOMPARE(stoppedSpy.count(), stopped); - - // play() when playing. - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - QCOMPARE(playingSpy.count(), playing); - QCOMPARE(stoppedSpy.count(), stopped); -} - -void tst_QDeclarativeAudio::paused() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - - QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); - QSignalSpy pausedSpy(&audio, SIGNAL(paused())); - int stateChanged = 0; - int pausedCount = 0; - - audio.componentComplete(); - audio.setSource(QUrl("http://example.com")); - - QCOMPARE(audio.playbackState(), audio.StoppedState); - - // play() when stopped. - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(pausedSpy.count(), pausedCount); - - // pause() when playing. - audio.pause(); - QCOMPARE(audio.playbackState(), audio.PausedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(pausedSpy.count(), ++pausedCount); - - // pause() when paused. - audio.pause(); - QCOMPARE(audio.playbackState(), audio.PausedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - QCOMPARE(pausedSpy.count(), pausedCount); - - // stop() when paused. - audio.stop(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(pausedSpy.count(), pausedCount); - - // pause() when stopped. - audio.pause(); - QCOMPARE(audio.playbackState(), audio.PausedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(pausedSpy.count(), ++pausedCount); - - // play() when paused. - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(pausedSpy.count(), pausedCount); -} - -void tst_QDeclarativeAudio::duration() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(durationChanged())); - - QCOMPARE(audio.duration(), 0); - - provider.playerControl()->setDuration(4040); - QCOMPARE(audio.duration(), 4040); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setDuration(-129); - QCOMPARE(audio.duration(), -129); - QCOMPARE(spy.count(), 2); - - provider.playerControl()->setDuration(0); - QCOMPARE(audio.duration(), 0); - QCOMPARE(spy.count(), 3); - - // Unnecessary duration changed signals aren't filtered. - provider.playerControl()->setDuration(0); - QCOMPARE(audio.duration(), 0); - QCOMPARE(spy.count(), 4); -} - -void tst_QDeclarativeAudio::position() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(positionChanged())); - - QCOMPARE(audio.position(), 0); - - // QDeclarativeAudio won't bound set positions to the duration. A media service may though. - QCOMPARE(audio.duration(), 0); - - audio.seek(450); - QCOMPARE(audio.position(), 450); - QCOMPARE(provider.playerControl()->position(), qint64(450)); - QCOMPARE(spy.count(), 1); - - audio.seek(-5403); - QCOMPARE(audio.position(), 0); - QCOMPARE(provider.playerControl()->position(), qint64(0)); - QCOMPARE(spy.count(), 2); - - audio.seek(-5403); - QCOMPARE(audio.position(), 0); - QCOMPARE(provider.playerControl()->position(), qint64(0)); - QCOMPARE(spy.count(), 2); - - // Check the signal change signal is emitted if the change originates from the media service. - provider.playerControl()->setPosition(450); - QCOMPARE(audio.position(), 450); - QCOMPARE(spy.count(), 3); - - connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); - - provider.playerControl()->updateState(QMediaPlayer::PlayingState); - QTestEventLoop::instance().enterLoop(2); - QVERIFY(spy.count() > 3 && spy.count() < 6); // 4 or 5 - - provider.playerControl()->updateState(QMediaPlayer::PausedState); - QTestEventLoop::instance().enterLoop(1); - QVERIFY(spy.count() < 6); -} - -void tst_QDeclarativeAudio::volume() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(volumeChanged())); - - QCOMPARE(audio.volume(), qreal(1.0)); - - audio.setVolume(0.7); - QCOMPARE(audio.volume(), qreal(0.7)); - QCOMPARE(provider.playerControl()->volume(), 70); - QCOMPARE(spy.count(), 1); - - audio.setVolume(0.7); - QCOMPARE(audio.volume(), qreal(0.7)); - QCOMPARE(provider.playerControl()->volume(), 70); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setVolume(30); - QCOMPARE(audio.volume(), qreal(0.3)); - QCOMPARE(spy.count(), 2); -} - -void tst_QDeclarativeAudio::muted() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(mutedChanged())); - - QCOMPARE(audio.isMuted(), false); - - audio.setMuted(true); - QCOMPARE(audio.isMuted(), true); - QCOMPARE(provider.playerControl()->isMuted(), true); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setMuted(false); - QCOMPARE(audio.isMuted(), false); - QCOMPARE(spy.count(), 2); - - audio.setMuted(false); - QCOMPARE(audio.isMuted(), false); - QCOMPARE(provider.playerControl()->isMuted(), false); - QCOMPARE(spy.count(), 2); -} - -void tst_QDeclarativeAudio::bufferProgress() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(bufferProgressChanged())); - - QCOMPARE(audio.bufferProgress(), qreal(0.0)); - - provider.playerControl()->setBufferStatus(20); - QCOMPARE(audio.bufferProgress(), qreal(0.2)); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setBufferStatus(20); - QCOMPARE(audio.bufferProgress(), qreal(0.2)); - QCOMPARE(spy.count(), 2); - - provider.playerControl()->setBufferStatus(40); - QCOMPARE(audio.bufferProgress(), qreal(0.4)); - QCOMPARE(spy.count(), 3); - - connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); - - provider.playerControl()->updateMediaStatus( - QMediaPlayer::BufferingMedia, QMediaPlayer::PlayingState); - QTestEventLoop::instance().enterLoop(2); - QVERIFY(spy.count() > 3 && spy.count() < 6); // 4 or 5 - - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); - QTestEventLoop::instance().enterLoop(1); - QVERIFY(spy.count() < 6); -} - -void tst_QDeclarativeAudio::seekable() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(seekableChanged())); - - QCOMPARE(audio.isSeekable(), false); - - provider.playerControl()->setSeekable(true); - QCOMPARE(audio.isSeekable(), true); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setSeekable(true); - QCOMPARE(audio.isSeekable(), true); - QCOMPARE(spy.count(), 2); - - provider.playerControl()->setSeekable(false); - QCOMPARE(audio.isSeekable(), false); - QCOMPARE(spy.count(), 3); -} - -void tst_QDeclarativeAudio::playbackRate() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(&audio, SIGNAL(playbackRateChanged())); - - QCOMPARE(audio.playbackRate(), qreal(1.0)); - - audio.setPlaybackRate(0.5); - QCOMPARE(audio.playbackRate(), qreal(0.5)); - QCOMPARE(provider.playerControl()->playbackRate(), qreal(0.5)); - QCOMPARE(spy.count(), 1); - - provider.playerControl()->setPlaybackRate(2.0); - QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); - QCOMPARE(spy.count(), 2); - - audio.setPlaybackRate(2.0); - QCOMPARE(audio.playbackRate(), qreal(2.0)); - QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); - QCOMPARE(spy.count(), 2); -} - -void tst_QDeclarativeAudio::status() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy statusChangedSpy(&audio, SIGNAL(statusChanged())); - - QCOMPARE(audio.status(), QDeclarativeAudio::NoMedia); - - // Set media, start loading. - provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadingMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Loading); - QCOMPARE(statusChangedSpy.count(), 1); - - // Finish loading. - provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadedMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Loaded); - QCOMPARE(statusChangedSpy.count(), 2); - - // Play, start buffering. - provider.playerControl()->updateMediaStatus( - QMediaPlayer::StalledMedia, QMediaPlayer::PlayingState); - QCOMPARE(audio.status(), QDeclarativeAudio::Stalled); - QCOMPARE(statusChangedSpy.count(), 3); - - // Enough data buffered to proceed. - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); - QCOMPARE(statusChangedSpy.count(), 4); - - // Errant second buffering status changed. - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); - QCOMPARE(statusChangedSpy.count(), 4); - - // Buffer full. - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Buffered); - QCOMPARE(statusChangedSpy.count(), 5); - - // Buffer getting low. - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Buffering); - QCOMPARE(statusChangedSpy.count(), 6); - - // Buffer full. - provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); - QCOMPARE(audio.status(), QDeclarativeAudio::Buffered); - QCOMPARE(statusChangedSpy.count(), 7); - - // Finished. - provider.playerControl()->updateMediaStatus( - QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - QCOMPARE(audio.status(), QDeclarativeAudio::EndOfMedia); - QCOMPARE(statusChangedSpy.count(), 8); -} - -void tst_QDeclarativeAudio::metaData_data() -{ - QTest::addColumn<QByteArray>("propertyName"); - QTest::addColumn<QString>("propertyKey"); - QTest::addColumn<QVariant>("value"); - - QTest::newRow("title") - << QByteArray("title") - << QMediaMetaData::Title - << QVariant(QString::fromLatin1("This is a title")); - - QTest::newRow("genre") - << QByteArray("genre") - << QMediaMetaData::Genre - << QVariant(QString::fromLatin1("rock")); - - QTest::newRow("trackNumber") - << QByteArray("trackNumber") - << QMediaMetaData::TrackNumber - << QVariant(8); -} - -void tst_QDeclarativeAudio::metaData() -{ - QFETCH(QByteArray, propertyName); - QFETCH(QString, propertyKey); - QFETCH(QVariant, value); - - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy spy(audio.metaData(), SIGNAL(metaDataChanged())); - - const int index = audio.metaData()->metaObject()->indexOfProperty(propertyName.constData()); - QVERIFY(index != -1); - - QMetaProperty property = audio.metaData()->metaObject()->property(index); - QCOMPARE(property.read(&audio), QVariant()); - - property.write(audio.metaData(), value); - QCOMPARE(property.read(audio.metaData()), QVariant()); - QCOMPARE(provider.metaDataControl()->metaData(propertyKey), QVariant()); - QCOMPARE(spy.count(), 0); - - provider.metaDataControl()->setMetaData(propertyKey, value); - QCOMPARE(property.read(audio.metaData()), value); - QCOMPARE(spy.count(), 1); -} - -void tst_QDeclarativeAudio::error() -{ - const QString errorString = QLatin1String("Failed to open device."); - - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - audio.classBegin(); - audio.componentComplete(); - - QSignalSpy errorSpy(&audio, SIGNAL(error(QDeclarativeAudio::Error,QString))); - QSignalSpy errorChangedSpy(&audio, SIGNAL(errorChanged())); - - QCOMPARE(audio.error(), QDeclarativeAudio::NoError); - QCOMPARE(audio.errorString(), QString()); - - provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString); - - QCOMPARE(audio.error(), QDeclarativeAudio::ResourceError); - QCOMPARE(audio.errorString(), errorString); - QCOMPARE(errorSpy.count(), 1); - QCOMPARE(errorChangedSpy.count(), 1); - - // Changing the source resets the error properties. - audio.setSource(QUrl("http://example.com")); - QCOMPARE(audio.error(), QDeclarativeAudio::NoError); - QCOMPARE(audio.errorString(), QString()); - QCOMPARE(errorSpy.count(), 1); - QCOMPARE(errorChangedSpy.count(), 2); - - // But isn't noisy. - audio.setSource(QUrl("file:///file/path")); - QCOMPARE(audio.error(), QDeclarativeAudio::NoError); - QCOMPARE(audio.errorString(), QString()); - QCOMPARE(errorSpy.count(), 1); - QCOMPARE(errorChangedSpy.count(), 2); -} - -void tst_QDeclarativeAudio::loops() -{ - QtTestMediaServiceProvider provider; - QDeclarativeAudio audio; - - QSignalSpy loopsChangedSpy(&audio, SIGNAL(loopCountChanged())); - QSignalSpy stateChangedSpy(&audio, SIGNAL(playbackStateChanged())); - QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); - - int stateChanged = 0; - int loopsChanged = 0; - int stoppedCount = 0; - - audio.classBegin(); - audio.componentComplete(); - - QCOMPARE(audio.playbackState(), audio.StoppedState); - - //setLoopCount(3) when stopped. - audio.setLoopCount(3); - QCOMPARE(audio.loopCount(), 3); - QCOMPARE(loopsChangedSpy.count(), ++loopsChanged); - - //play till end - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(stoppedSpy.count(), stoppedCount); - - // play() when playing. - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - QCOMPARE(stoppedSpy.count(), stoppedCount); - - provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - QCOMPARE(stoppedSpy.count(), stoppedCount); - - //play to end - provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - QCOMPARE(stoppedSpy.count(), stoppedCount); - //play to end - provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(stoppedSpy.count(), ++stoppedCount); - - // stop when playing - audio.play(); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(stoppedSpy.count(), stoppedCount); - provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - audio.stop(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(stoppedSpy.count(), ++stoppedCount); - - //play() with infinite loop - audio.setLoopCount(-1); - QCOMPARE(audio.loopCount(), -1); - QCOMPARE(loopsChangedSpy.count(), ++loopsChanged); - audio.play(); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - provider.playerControl()->updateMediaStatus(QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); - QCOMPARE(audio.playbackState(), audio.PlayingState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); - QCOMPARE(stateChangedSpy.count(), stateChanged); - - // stop() when playing in infinite loop. - audio.stop(); - QCOMPARE(audio.playbackState(), audio.StoppedState); - QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); - QCOMPARE(stateChangedSpy.count(), ++stateChanged); - QCOMPARE(stoppedSpy.count(), ++stoppedCount); - - qDebug() << "Testing version 5"; -} - -void tst_QDeclarativeAudio::audioRole() -{ - MockMediaPlayerService mockService; - MockMediaServiceProvider mockProvider(&mockService); - QMediaServiceProvider::setDefaultServiceProvider(&mockProvider); - - QQmlEngine engine; - QQmlComponent component(&engine); - component.setData("import QtQuick 2.0 \n import QtMultimedia 5.6 \n Audio { }", QUrl()); - - { - mockService.setHasAudioRole(false); - QDeclarativeAudio *audio = static_cast<QDeclarativeAudio*>(component.create()); - - QCOMPARE(audio->audioRole(), QDeclarativeAudio::UnknownRole); - QVERIFY(audio->supportedAudioRoles().isArray()); - QVERIFY(audio->supportedAudioRoles().toVariant().toList().isEmpty()); - - QSignalSpy spy(audio, SIGNAL(audioRoleChanged())); - audio->setAudioRole(QDeclarativeAudio::MusicRole); - QCOMPARE(audio->audioRole(), QDeclarativeAudio::UnknownRole); - QCOMPARE(spy.count(), 0); - } - - { - mockService.reset(); - mockService.setHasAudioRole(true); - QDeclarativeAudio *audio = static_cast<QDeclarativeAudio*>(component.create()); - QSignalSpy spy(audio, SIGNAL(audioRoleChanged())); - - QCOMPARE(audio->audioRole(), QDeclarativeAudio::UnknownRole); - QVERIFY(audio->supportedAudioRoles().isArray()); - QVERIFY(!audio->supportedAudioRoles().toVariant().toList().isEmpty()); - - audio->setAudioRole(QDeclarativeAudio::MusicRole); - QCOMPARE(audio->audioRole(), QDeclarativeAudio::MusicRole); - QCOMPARE(mockService.mockAudioRoleControl->audioRole(), QAudio::MusicRole); - QCOMPARE(spy.count(), 1); - } -} - -void tst_QDeclarativeAudio::customAudioRole() -{ - MockMediaPlayerService mockService; - MockMediaServiceProvider mockProvider(&mockService); - QMediaServiceProvider::setDefaultServiceProvider(&mockProvider); - - QQmlEngine engine; - QQmlComponent component(&engine); - component.setData("import QtQuick 2.0 \n import QtMultimedia 5.11 \n Audio { }", QUrl()); - - { - mockService.setHasCustomAudioRole(false); - QObject *audio = component.create(); - QVERIFY(audio); - - QMetaEnum audioRoleEnum = enumerator(audio->metaObject(), "AudioRole"); - int AudioRole_UnknownRoleValue = keyToValue(audioRoleEnum, "UnknownRole"); - QVERIFY(!QTest::currentTestFailed()); - - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - - QSignalSpy spyRole(audio, SIGNAL(audioRoleChanged())); - QSignalSpy spyCustomRole(audio, SIGNAL(customAudioRoleChanged())); - audio->setProperty("customAudioRole", QStringLiteral("customRole")); - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_UnknownRoleValue); - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - QCOMPARE(spyRole.count(), 0); - QCOMPARE(spyCustomRole.count(), 0); - } - - { - mockService.reset(); - mockService.setHasAudioRole(false); - - QObject *audio = component.create(); - QVERIFY(audio); - - QMetaEnum audioRoleEnum = enumerator(audio->metaObject(), "AudioRole"); - int AudioRole_UnknownRoleValue = keyToValue(audioRoleEnum, "UnknownRole"); - QVERIFY(!QTest::currentTestFailed()); - - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - - QSignalSpy spyRole(audio, SIGNAL(audioRoleChanged())); - QSignalSpy spyCustomRole(audio, SIGNAL(customAudioRoleChanged())); - audio->setProperty("customAudioRole", QStringLiteral("customRole")); - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_UnknownRoleValue); - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - QCOMPARE(spyRole.count(), 0); - QCOMPARE(spyCustomRole.count(), 0); - } - - { - mockService.reset(); - - QObject *audio = component.create(); - QVERIFY(audio); - - QMetaEnum audioRoleEnum = enumerator(audio->metaObject(), "AudioRole"); - int AudioRole_UnknownRoleValue = keyToValue(audioRoleEnum, "UnknownRole"); - int AudioRole_CustomRoleValue = keyToValue(audioRoleEnum, "CustomRole"); - int AudioRole_MusicRoleValue = keyToValue(audioRoleEnum, "MusicRole"); - QVERIFY(!QTest::currentTestFailed()); - - QSignalSpy spyRole(audio, SIGNAL(audioRoleChanged())); - QSignalSpy spyCustomRole(audio, SIGNAL(customAudioRoleChanged())); - - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_UnknownRoleValue); - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - - QString customRole(QStringLiteral("customRole")); - audio->setProperty("customAudioRole", customRole); - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_CustomRoleValue); - QCOMPARE(audio->property("customAudioRole").toString(), customRole); - QCOMPARE(mockService.mockAudioRoleControl->audioRole(), QAudio::CustomRole); - QCOMPARE(mockService.mockCustomAudioRoleControl->customAudioRole(), customRole); - QCOMPARE(spyRole.count(), 1); - QCOMPARE(spyCustomRole.count(), 1); - - spyRole.clear(); - spyCustomRole.clear(); - - QString customRole2(QStringLiteral("customRole2")); - audio->setProperty("customAudioRole", customRole2); - QCOMPARE(audio->property("customAudioRole").toString(), customRole2); - QCOMPARE(mockService.mockCustomAudioRoleControl->customAudioRole(), customRole2); - QCOMPARE(spyRole.count(), 0); - QCOMPARE(spyCustomRole.count(), 1); - - spyRole.clear(); - spyCustomRole.clear(); - - audio->setProperty("audioRole", AudioRole_MusicRoleValue); - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_MusicRoleValue); - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - QCOMPARE(mockService.mockAudioRoleControl->audioRole(), QAudio::MusicRole); - QVERIFY(mockService.mockCustomAudioRoleControl->customAudioRole().isEmpty()); - QCOMPARE(spyRole.count(), 1); - QCOMPARE(spyCustomRole.count(), 1); - - spyRole.clear(); - spyCustomRole.clear(); - - audio->setProperty("audioRole", AudioRole_CustomRoleValue); - QCOMPARE(audio->property("audioRole").toInt(), AudioRole_CustomRoleValue); - QVERIFY(audio->property("customAudioRole").toString().isEmpty()); - QCOMPARE(mockService.mockAudioRoleControl->audioRole(), QAudio::CustomRole); - QVERIFY(mockService.mockCustomAudioRoleControl->customAudioRole().isEmpty()); - QCOMPARE(spyRole.count(), 1); - QCOMPARE(spyCustomRole.count(), 0); - } -} - -void tst_QDeclarativeAudio::enumerator(const QMetaObject *object, - const char *name, - QMetaEnum *result) -{ - int index = object->indexOfEnumerator(name); - QVERIFY(index >= 0); - *result = object->enumerator(index); -} - -QMetaEnum tst_QDeclarativeAudio::enumerator(const QMetaObject *object, const char *name) -{ - QMetaEnum result; - enumerator(object, name, &result); - return result; -} - -void tst_QDeclarativeAudio::keyToValue(const QMetaEnum &enumeration, const char *key, int *result) -{ - bool ok = false; - *result = enumeration.keyToValue(key, &ok); - QVERIFY(ok); -} - -int tst_QDeclarativeAudio::keyToValue(const QMetaEnum &enumeration, const char *key) -{ - int result; - keyToValue(enumeration, key, &result); - return result; -} - -struct Surface : QAbstractVideoSurface -{ - Surface(QObject *parent = nullptr) : QAbstractVideoSurface(parent) { } - QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType) const override - { - return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32; - } - - bool present(const QVideoFrame &) override { return true; } -}; - -void tst_QDeclarativeAudio::videoOutput() -{ - QtTestMediaPlayerControl playerControl; - QtTestMediaServiceProvider provider(&playerControl, 0); - - QDeclarativeAudio audio; - QSignalSpy spy(&audio, &QDeclarativeAudio::videoOutputChanged); - - audio.classBegin(); - audio.componentComplete(); - - QVERIFY(audio.videoOutput().isNull()); - - QVariant surface; - surface.setValue(new Surface(this)); - audio.setVideoOutput(surface); - QCOMPARE(audio.videoOutput(), surface); - QCOMPARE(spy.count(), 1); - - QQmlEngine engine; - QJSValue jsArray = engine.newArray(5); - jsArray.setProperty(0, engine.newQObject(new Surface(this))); - jsArray.setProperty(1, engine.newQObject(new Surface(this))); - QDeclarativeVideoOutput output; - jsArray.setProperty(2, engine.newQObject(&output)); - jsArray.setProperty(3, 123); - jsArray.setProperty(4, QLatin1String("ignore this")); - - QVariant surfaces; - surfaces.setValue(jsArray); - audio.setVideoOutput(surfaces); - - auto arr = audio.videoOutput().value<QJSValue>(); - QVERIFY(arr.equals(jsArray)); - QCOMPARE(spy.count(), 2); -} - -QTEST_MAIN(tst_QDeclarativeAudio) - -#include "tst_qdeclarativeaudio.moc" |