diff options
32 files changed, 271 insertions, 73 deletions
diff --git a/examples/multimedia/declarative-camera/Info.plist b/examples/multimedia/declarative-camera/Info.plist new file mode 100644 index 000000000..462df2ae0 --- /dev/null +++ b/examples/multimedia/declarative-camera/Info.plist @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundleIconFile</key> + <string></string> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleGetInfoString</key> + <string>Created by Qt/QMake</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleExecutable</key> + <string>declarative-camera</string> + <key>CFBundleIdentifier</key> + <string>com.qt-company.${PRODUCT_NAME:rfc1034identifier}</string> + <key>CFBundleDisplayName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundleName</key> + <string>${PRODUCT_NAME}</string> + <key>CFBundleShortVersionString</key> + <string>1.0</string> + <key>CFBundleVersion</key> + <string>1.0</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>UILaunchStoryboardName</key> + <string>LaunchScreen</string> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>NOTE</key> + <string>This file was generated by Qt/QMake.</string> + <key>NSCameraUsageDescription</key> + <string>Qt Multimedia Example</string> +</dict> +</plist> diff --git a/examples/multimedia/declarative-camera/declarative-camera.pro b/examples/multimedia/declarative-camera/declarative-camera.pro index 71d4f68b0..f0345f1e5 100644 --- a/examples/multimedia/declarative-camera/declarative-camera.pro +++ b/examples/multimedia/declarative-camera/declarative-camera.pro @@ -6,6 +6,8 @@ QT += quick qml multimedia SOURCES += qmlcamera.cpp RESOURCES += declarative-camera.qrc +QMAKE_INFO_PLIST = Info.plist + target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/declarative-camera INSTALLS += target diff --git a/examples/multimedia/video/qmlvideofx/Info.plist b/examples/multimedia/video/qmlvideofx/Info.plist index 8fc242516..5fbe35f1c 100644 --- a/examples/multimedia/video/qmlvideofx/Info.plist +++ b/examples/multimedia/video/qmlvideofx/Info.plist @@ -26,5 +26,7 @@ <string>1.0</string> <key>CFBundleVersion</key> <string>1.0</string> + <key>NSCameraUsageDescription</key> + <string>Qt Multimedia Example</string> </dict> </plist> diff --git a/qtmultimedia.pro b/qtmultimedia.pro index e7de1e703..c0a90bc56 100644 --- a/qtmultimedia.pro +++ b/qtmultimedia.pro @@ -8,7 +8,7 @@ win32 { } qtCompileTest(evr) qtCompileTest(wmsdk) - contains(QT_CONFIG, wmf-backend): qtCompileTest(wmf) + qtCompileTest(wmf) qtCompileTest(wasapi) } else:mac { qtCompileTest(avfoundation) diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp index 4c1c0a924..fd804316c 100644 --- a/src/multimedia/camera/qcamera.cpp +++ b/src/multimedia/camera/qcamera.cpp @@ -71,17 +71,15 @@ static void qRegisterCameraMetaTypes() Q_CONSTRUCTOR_FUNCTION(qRegisterCameraMetaTypes) -static bool qt_sizeLessThan(const QSize &s1, const QSize &s2) +Q_DECL_CONSTEXPR static bool qt_sizeLessThan(const QSize &s1, const QSize &s2) Q_DECL_NOTHROW { return (s1.width() * s1.height()) < (s2.width() * s2.height()); } -static bool qt_frameRateRangeLessThan(const QCamera::FrameRateRange &s1, const QCamera::FrameRateRange &s2) +Q_DECL_CONSTEXPR static bool qt_frameRateRangeLessThan(const QCamera::FrameRateRange &s1, const QCamera::FrameRateRange &s2) Q_DECL_NOTHROW { - if (s1.maximumFrameRate == s2.maximumFrameRate) - return s1.minimumFrameRate < s2.minimumFrameRate; - - return s1.maximumFrameRate < s2.maximumFrameRate; + return qFuzzyCompare(s1.maximumFrameRate, s2.maximumFrameRate) ? (s1.minimumFrameRate < s2.minimumFrameRate) + : (s1.maximumFrameRate < s2.maximumFrameRate); } /*! diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp index 191095e82..c9b9b4fc1 100644 --- a/src/multimedia/playback/qmediaplayer.cpp +++ b/src/multimedia/playback/qmediaplayer.cpp @@ -100,7 +100,6 @@ static void qRegisterMediaPlayerMetaTypes() Q_CONSTRUCTOR_FUNCTION(qRegisterMediaPlayerMetaTypes) - #define MAX_NESTED_PLAYLISTS 16 class QMediaPlayerPrivate : public QMediaObjectPrivate @@ -112,38 +111,39 @@ public: : provider(0) , control(0) , audioRoleControl(0) + , playlist(0) + , networkAccessControl(0) , state(QMediaPlayer::StoppedState) , status(QMediaPlayer::UnknownMediaStatus) , error(QMediaPlayer::NoError) , ignoreNextStatusChange(-1) - , playlist(0) - , networkAccessControl(0) - , hasStreamPlaybackFeature(false) , nestedPlaylists(0) + , hasStreamPlaybackFeature(false) {} QMediaServiceProvider *provider; QMediaPlayerControl* control; QAudioRoleControl *audioRoleControl; - QMediaPlayer::State state; - QMediaPlayer::MediaStatus status; - QMediaPlayer::Error error; QString errorString; - int ignoreNextStatusChange; QPointer<QObject> videoOutput; QMediaPlaylist *playlist; QMediaNetworkAccessControl *networkAccessControl; QVideoSurfaceOutput surfaceOutput; - bool hasStreamPlaybackFeature; QMediaContent qrcMedia; QScopedPointer<QFile> qrcFile; QMediaContent rootMedia; QMediaContent pendingPlaylist; + QMediaPlayer::State state; + QMediaPlayer::MediaStatus status; + QMediaPlayer::Error error; + int ignoreNextStatusChange; + int nestedPlaylists; + bool hasStreamPlaybackFeature; + QMediaPlaylist *parentPlaylist(QMediaPlaylist *pls); bool isInChain(const QUrl &url); - int nestedPlaylists; void setMedia(const QMediaContent &media, QIODevice *stream = 0); diff --git a/src/multimedia/qmediametadata.cpp b/src/multimedia/qmediametadata.cpp index 9ffd2a727..42fabbe7e 100644 --- a/src/multimedia/qmediametadata.cpp +++ b/src/multimedia/qmediametadata.cpp @@ -164,7 +164,7 @@ Q_DEFINE_METADATA(ThumbnailImage); \ingroup multimedia \inmodule QtMultimedia - This namespace provides identifiers for meta-data attributes. + \brief Provides identifiers for meta-data attributes. \note Not all identifiers are supported on all platforms. Please consult vendor documentation for specific support on different platforms. diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp index 68d2fc66b..1c6497eb0 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp @@ -59,11 +59,11 @@ public: if (--mControl->mActiveStateChangeNotifiers) return; - if (mPreviousState != mControl->state()) - Q_EMIT mControl->stateChanged(mControl->state()); - if (mPreviousMediaStatus != mControl->mediaStatus()) Q_EMIT mControl->mediaStatusChanged(mControl->mediaStatus()); + + if (mPreviousState != mControl->state()) + Q_EMIT mControl->stateChanged(mControl->state()); } private: diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.h b/src/plugins/android/src/wrappers/jni/androidcamera.h index f4694d7dc..1a59ff3c7 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.h +++ b/src/plugins/android/src/wrappers/jni/androidcamera.h @@ -62,6 +62,7 @@ struct AndroidCameraInfo QCamera::Position position; int orientation; }; +Q_DECLARE_TYPEINFO(AndroidCameraInfo, Q_MOVABLE_TYPE); class AndroidCamera : public QObject { diff --git a/src/plugins/directshow/directshow.pro b/src/plugins/directshow/directshow.pro index 10c6fe2b6..918a14210 100644 --- a/src/plugins/directshow/directshow.pro +++ b/src/plugins/directshow/directshow.pro @@ -13,7 +13,7 @@ SOURCES += dsserviceplugin.cpp mingw: DEFINES += NO_DSHOW_STRSAFE include(helpers/helpers.pri) -!config_wmf: include(player/player.pri) +!config_wmf|!contains(QT_CONFIG, wmf-backend): include(player/player.pri) include(camera/camera.pri) OTHER_FILES += \ diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp index 2919648a7..9ecd9b79c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp @@ -612,18 +612,18 @@ void QGstreamerPlayerControl::popAndNotifyState() QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatusStack.pop(); if (m_stateStack.isEmpty()) { - if (m_currentState != oldState) { + if (m_mediaStatus != oldMediaStatus) { #ifdef DEBUG_PLAYBIN - qDebug() << "State changed:" << m_currentState; + qDebug() << "Media status changed:" << m_mediaStatus; #endif - emit stateChanged(m_currentState); + emit mediaStatusChanged(m_mediaStatus); } - if (m_mediaStatus != oldMediaStatus) { + if (m_currentState != oldState) { #ifdef DEBUG_PLAYBIN - qDebug() << "Media status changed:" << m_mediaStatus; + qDebug() << "State changed:" << m_currentState; #endif - emit mediaStatusChanged(m_mediaStatus); + emit stateChanged(m_currentState); } } } diff --git a/src/plugins/qnx-audio/audio/qnxaudioinput.cpp b/src/plugins/qnx-audio/audio/qnxaudioinput.cpp index fc67f4211..35d11597c 100644 --- a/src/plugins/qnx-audio/audio/qnxaudioinput.cpp +++ b/src/plugins/qnx-audio/audio/qnxaudioinput.cpp @@ -282,7 +282,7 @@ bool QnxAudioInput::open() } // Necessary so that bytesFree() which uses the "free" member of the status struct works - snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_DISABLE_MMAP); + snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_MMAP); snd_pcm_channel_info_t info; memset(&info, 0, sizeof(info)); diff --git a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp index 2c196624b..d5805c2bd 100644 --- a/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp +++ b/src/plugins/qnx-audio/audio/qnxaudiooutput.cpp @@ -286,7 +286,7 @@ bool QnxAudioOutput::open() } // Necessary so that bytesFree() which uses the "free" member of the status struct works - snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_DISABLE_MMAP); + snd_pcm_plugin_set_disable(m_pcmHandle, PLUGIN_MMAP); snd_pcm_channel_info_t info; memset(&info, 0, sizeof(info)); diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index c4bbbe85d..815b78979 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -53,6 +53,7 @@ #include "qwindowsaudioutils.h" #include <QtEndian> #include <QtCore/QDataStream> +#include <private/qaudiohelpers_p.h> //#define DEBUG_AUDIO 1 @@ -72,7 +73,7 @@ QWindowsAudioOutput::QWindowsAudioOutput(const QByteArray &device) audioSource = 0; pullMode = true; finished = false; - volumeCache = (qreal)1.; + volumeCache = qreal(1.0); } QWindowsAudioOutput::~QWindowsAudioOutput() @@ -280,8 +281,6 @@ bool QWindowsAudioOutput::open() timeStampOpened.restart(); elapsedTimeOffset = 0; - setVolume(volumeCache); - errorState = QAudio::NoError; if(pullMode) { deviceState = QAudio::ActiveState; @@ -407,7 +406,11 @@ qint64 QWindowsAudioOutput::write( const char *data, qint64 len ) remain = l; else remain = period_size; - memcpy(current->lpData, p, remain); + + if (volumeCache < qreal(1.0)) + QAudioHelperInternal::qMultiplySamples(volumeCache, settings, p, current->lpData, remain); + else + memcpy(current->lpData, p, remain); l -= remain; p += remain; @@ -595,16 +598,10 @@ QAudio::State QWindowsAudioOutput::state() const void QWindowsAudioOutput::setVolume(qreal v) { - const qreal normalizedVolume = qBound(qreal(0.0), v, qreal(1.0)); - if (deviceState != QAudio::ActiveState) { - volumeCache = normalizedVolume; + if (qFuzzyCompare(volumeCache, v)) return; - } - const quint16 scaled = normalizedVolume * 0xFFFF; - DWORD vol = MAKELONG(scaled, scaled); - MMRESULT res = waveOutSetVolume(hWaveOut, vol); - if (res == MMSYSERR_NOERROR) - volumeCache = normalizedVolume; + + volumeCache = qBound(qreal(0), v, qreal(1)); } qreal QWindowsAudioOutput::volume() const diff --git a/src/plugins/wmf/mfstream.cpp b/src/plugins/wmf/mfstream.cpp index 3ae6324af..fd95bf20b 100644 --- a/src/plugins/wmf/mfstream.cpp +++ b/src/plugins/wmf/mfstream.cpp @@ -236,7 +236,7 @@ STDMETHODIMP MFStream::Seek( break; } bool seekOK = m_stream->seek(pos); - if (*pqwCurrentPosition) + if (pqwCurrentPosition) *pqwCurrentPosition = pos; if (seekOK) return S_OK; diff --git a/src/plugins/wmf/mfactivate.cpp b/src/plugins/wmf/player/mfactivate.cpp index e06906584..e06906584 100644 --- a/src/plugins/wmf/mfactivate.cpp +++ b/src/plugins/wmf/player/mfactivate.cpp diff --git a/src/plugins/wmf/mfactivate.h b/src/plugins/wmf/player/mfactivate.h index 3243296e8..3243296e8 100644 --- a/src/plugins/wmf/mfactivate.h +++ b/src/plugins/wmf/player/mfactivate.h diff --git a/src/plugins/wmf/mftvideo.cpp b/src/plugins/wmf/player/mftvideo.cpp index 747fe6aea..747fe6aea 100644 --- a/src/plugins/wmf/mftvideo.cpp +++ b/src/plugins/wmf/player/mftvideo.cpp diff --git a/src/plugins/wmf/mftvideo.h b/src/plugins/wmf/player/mftvideo.h index ffcb80b32..ffcb80b32 100644 --- a/src/plugins/wmf/mftvideo.h +++ b/src/plugins/wmf/player/mftvideo.h diff --git a/src/plugins/wmf/player/player.pri b/src/plugins/wmf/player/player.pri index c24370eea..a10e2df60 100644 --- a/src/plugins/wmf/player/player.pri +++ b/src/plugins/wmf/player/player.pri @@ -13,7 +13,10 @@ HEADERS += \ $$PWD/mfmetadatacontrol.h \ $$PWD/mfaudioprobecontrol.h \ $$PWD/mfvideoprobecontrol.h \ - $$PWD/mfevrvideowindowcontrol.h + $$PWD/mfevrvideowindowcontrol.h \ + $$PWD/samplegrabber.h \ + $$PWD/mftvideo.h \ + $$PWD/mfactivate.h SOURCES += \ $$PWD/mfplayerservice.cpp \ @@ -24,6 +27,9 @@ SOURCES += \ $$PWD/mfmetadatacontrol.cpp \ $$PWD/mfaudioprobecontrol.cpp \ $$PWD/mfvideoprobecontrol.cpp \ - $$PWD/mfevrvideowindowcontrol.cpp + $$PWD/mfevrvideowindowcontrol.cpp \ + $$PWD/samplegrabber.cpp \ + $$PWD/mftvideo.cpp \ + $$PWD/mfactivate.cpp include($$PWD/../../common/evr.pri) diff --git a/src/plugins/wmf/samplegrabber.cpp b/src/plugins/wmf/player/samplegrabber.cpp index d137335f3..d137335f3 100644 --- a/src/plugins/wmf/samplegrabber.cpp +++ b/src/plugins/wmf/player/samplegrabber.cpp diff --git a/src/plugins/wmf/samplegrabber.h b/src/plugins/wmf/player/samplegrabber.h index 9ca673a1b..9ca673a1b 100644 --- a/src/plugins/wmf/samplegrabber.h +++ b/src/plugins/wmf/player/samplegrabber.h diff --git a/src/plugins/wmf/sourceresolver.cpp b/src/plugins/wmf/sourceresolver.cpp index 78163e97f..f10f68c42 100644 --- a/src/plugins/wmf/sourceresolver.cpp +++ b/src/plugins/wmf/sourceresolver.cpp @@ -37,12 +37,13 @@ ** ****************************************************************************/ -#include "mfplayersession.h" #include "mfstream.h" #include "sourceresolver.h" #include <Mferror.h> #include <nserror.h> #include <QtCore/qfile.h> +#include <QtCore/qdebug.h> +#include <QtMultimedia/qmediaplayer.h> /* SourceResolver is separated from MFPlayerSession to handle the work of resolving a media source diff --git a/src/plugins/wmf/wmf.pro b/src/plugins/wmf/wmf.pro index e83c51595..c75efe28c 100644 --- a/src/plugins/wmf/wmf.pro +++ b/src/plugins/wmf/wmf.pro @@ -10,24 +10,19 @@ INCLUDEPATH += . HEADERS += \ wmfserviceplugin.h \ mfstream.h \ - sourceresolver.h \ - samplegrabber.h \ - mftvideo.h \ - mfactivate.h + sourceresolver.h SOURCES += \ wmfserviceplugin.cpp \ mfstream.cpp \ - sourceresolver.cpp \ - samplegrabber.cpp \ - mftvideo.cpp \ - mfactivate.cpp + sourceresolver.cpp -include (player/player.pri) +contains(QT_CONFIG, wmf-backend): include (player/player.pri) include (decoder/decoder.pri) OTHER_FILES += \ - wmf.json + wmf.json \ + wmf_audiodecode.json PLUGIN_TYPE = mediaservice PLUGIN_CLASS_NAME = WMFServicePlugin diff --git a/src/plugins/wmf/wmf_audiodecode.json b/src/plugins/wmf/wmf_audiodecode.json new file mode 100644 index 000000000..2a65dd758 --- /dev/null +++ b/src/plugins/wmf/wmf_audiodecode.json @@ -0,0 +1,4 @@ +{ + "Keys": ["windowsmediafoundation"], + "Services": ["org.qt-project.qt.audiodecode"] +} diff --git a/src/plugins/wmf/wmfserviceplugin.cpp b/src/plugins/wmf/wmfserviceplugin.cpp index ada1c8069..c6597ed78 100644 --- a/src/plugins/wmf/wmfserviceplugin.cpp +++ b/src/plugins/wmf/wmfserviceplugin.cpp @@ -97,9 +97,11 @@ void WMFServicePlugin::release(QMediaService *service) QMediaServiceProviderHint::Features WMFServicePlugin::supportedFeatures( const QByteArray &service) const { +#ifdef QMEDIA_MEDIAFOUNDATION_PLAYER if (service == Q_MEDIASERVICE_MEDIAPLAYER) return QMediaServiceProviderHint::StreamPlayback; else +#endif return QMediaServiceProviderHint::Features(); } diff --git a/src/plugins/wmf/wmfserviceplugin.h b/src/plugins/wmf/wmfserviceplugin.h index cd3000199..082358837 100644 --- a/src/plugins/wmf/wmfserviceplugin.h +++ b/src/plugins/wmf/wmfserviceplugin.h @@ -54,7 +54,11 @@ class WMFServicePlugin Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_INTERFACES(QMediaServiceDefaultDeviceInterface) Q_INTERFACES(QMediaServiceFeaturesInterface) +#ifdef QMEDIA_MEDIAFOUNDATION_PLAYER Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "wmf.json") +#else + Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "wmf_audiodecode.json") +#endif public: QMediaService* create(QString const& key); void release(QMediaService *service); diff --git a/tests/auto/integration/qaudiodecoderbackend/BLACKLIST b/tests/auto/integration/qaudiodecoderbackend/BLACKLIST new file mode 100644 index 000000000..316c5a083 --- /dev/null +++ b/tests/auto/integration/qaudiodecoderbackend/BLACKLIST @@ -0,0 +1,2 @@ +# QTBUG-56796 +windows diff --git a/tests/auto/integration/qmediaplayerbackend/BLACKLIST b/tests/auto/integration/qmediaplayerbackend/BLACKLIST index 5560abf75..e826fc079 100644 --- a/tests/auto/integration/qmediaplayerbackend/BLACKLIST +++ b/tests/auto/integration/qmediaplayerbackend/BLACKLIST @@ -7,15 +7,13 @@ osx-10.11 windows 32bit developer-build windows 64bit developer-build -[construction] +# Media player plugin not built at the moment on this platform opensuse-13.1 64bit [loadMedia] -opensuse-13.1 64bit windows 64bit developer-build [unloadMedia] -opensuse-13.1 64bit windows 64bit developer-build [playPauseStop] @@ -23,25 +21,15 @@ linux windows 64bit developer-build [processEOS] -opensuse-13.1 64bit windows 64bit developer-build [deleteLaterAtEOS] -opensuse-13.1 64bit windows 64bit developer-build -[volumeAndMuted] -opensuse-13.1 64bit - -[volumeAcrossFiles] -opensuse-13.1 64bit - [initialVolume] -opensuse-13.1 64bit windows 64bit developer-build [playlist] -opensuse-13.1 64bit redhatenterpriselinuxworkstation-6.6 [seekPauseSeek] diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp index 1f1df9aac..e60ea2cd7 100644 --- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp +++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp @@ -71,6 +71,7 @@ private slots: void subsequentPlayback(); void probes(); void playlist(); + void playlistObject(); void surfaceTest_data(); void surfaceTest(); void metadata(); @@ -993,6 +994,7 @@ void tst_QMediaPlayerBackend::playlist() QSignalSpy mediaSpy(&player, SIGNAL(mediaChanged(QMediaContent))); QSignalSpy currentMediaSpy(&player, SIGNAL(currentMediaChanged(QMediaContent))); QSignalSpy stateSpy(&player, SIGNAL(stateChanged(QMediaPlayer::State))); + QSignalSpy mediaStatusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); QFileInfo fileInfo(QFINDTESTDATA("testdata/sample.m3u")); @@ -1001,8 +1003,8 @@ void tst_QMediaPlayerBackend::playlist() player.play(); QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); - if (player.mediaStatus() == QMediaPlayer::InvalidMedia) - QSKIP("Media player does not support M3U playlists"); + if (player.mediaStatus() == QMediaPlayer::InvalidMedia || mediaSpy.count() == 1) + QSKIP("QMediaPlayer does not support loading M3U playlists as QMediaPlaylist"); QCOMPARE(mediaSpy.count(), 2); // sample.m3u -> sample.m3u resolved -> test.wav -> @@ -1015,10 +1017,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 11); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 19); // 6 x (LoadingMedia -> BufferedMedia -> EndOfMedia) + NoMedia mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); player.play(); @@ -1027,10 +1031,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 8); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 19); // 6 x (LoadingMedia -> BufferedMedia -> EndOfMedia) + NoMedia mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Invalid - 1st pass >>> @@ -1045,10 +1051,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 4); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 3); // LoadingMedia -> InvalidMedia -> NoMedia mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Invalid - 2nd pass >>> @@ -1060,10 +1068,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 3); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 3); // LoadingMedia -> InvalidMedia -> NoMedia mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Invalid2 - 1st pass >>> @@ -1078,10 +1088,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 6); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 9); // 3 x LoadingMedia + 2 x (BufferedMedia -> EndOfMedia) + InvalidMedia + NoMedia (not in this order) mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Invalid2 - 2nd pass >>> @@ -1093,10 +1105,12 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(currentMediaSpy.count(), 5); QCOMPARE(stateSpy.count(), 2); QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 9); // 3 x LoadingMedia + 2 x (BufferedMedia -> EndOfMedia) + InvalidMedia + NoMedia (not in this order) mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Recursive - 1st pass >>> @@ -1115,10 +1129,13 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(stateSpy.count(), 2); // there is one invalid media in the master playlist QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 6); // LoadingMedia -> InvalidMedia -> LoadingMedia -> BufferedMedia + // -> EndOfMedia -> NoMedia mediaSpy.clear(); currentMediaSpy.clear(); stateSpy.clear(); + mediaStatusSpy.clear(); errorSpy.clear(); // <<< Recursive - 2nd pass >>> @@ -1133,6 +1150,141 @@ void tst_QMediaPlayerBackend::playlist() QCOMPARE(stateSpy.count(), 2); // there is one invalid media in the master playlist QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 6); // LoadingMedia -> InvalidMedia -> LoadingMedia -> BufferedMedia + // -> EndOfMedia -> NoMedia +} + +void tst_QMediaPlayerBackend::playlistObject() +{ + QMediaPlayer player; + + QSignalSpy mediaSpy(&player, SIGNAL(mediaChanged(QMediaContent))); + QSignalSpy currentMediaSpy(&player, SIGNAL(currentMediaChanged(QMediaContent))); + QSignalSpy stateSpy(&player, SIGNAL(stateChanged(QMediaPlayer::State))); + QSignalSpy mediaStatusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); + QSignalSpy errorSpy(&player, SIGNAL(error(QMediaPlayer::Error))); + + // --- empty playlist + QMediaPlaylist emptyPlaylist; + player.setPlaylist(&emptyPlaylist); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 1); + QCOMPARE(currentMediaSpy.count(), 1); // Empty media + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 0); + + mediaSpy.clear(); + currentMediaSpy.clear(); + stateSpy.clear(); + mediaStatusSpy.clear(); + errorSpy.clear(); + + // --- Valid playlist + QMediaPlaylist playlist; + playlist.addMedia(QUrl::fromLocalFile(QFileInfo(QFINDTESTDATA("testdata/test.wav")).absoluteFilePath())); + playlist.addMedia(QUrl::fromLocalFile(QFileInfo(QFINDTESTDATA("testdata/_test.wav")).absoluteFilePath())); + player.setPlaylist(&playlist); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 1); + QCOMPARE(currentMediaSpy.count(), 3); // test.wav -> _test.wav -> NoMedia + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 7); // 2 x (LoadingMedia -> BufferedMedia -> EndOfMedia) + NoMedia + + mediaSpy.clear(); + currentMediaSpy.clear(); + stateSpy.clear(); + mediaStatusSpy.clear(); + errorSpy.clear(); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 0); + QCOMPARE(currentMediaSpy.count(), 4); // playlist -> test.wav -> _test.wav -> NoMedia + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 7); // 2 x (LoadingMedia -> BufferedMedia -> EndOfMedia) + NoMedia + + player.setPlaylist(Q_NULLPTR); + + mediaSpy.clear(); + currentMediaSpy.clear(); + stateSpy.clear(); + mediaStatusSpy.clear(); + errorSpy.clear(); + + // --- Nested playlist + QMediaPlaylist nestedPlaylist; + nestedPlaylist.addMedia(QUrl::fromLocalFile(QFileInfo(QFINDTESTDATA("testdata/_test.wav")).absoluteFilePath())); + nestedPlaylist.addMedia(QUrl::fromLocalFile(QFileInfo(QFINDTESTDATA("testdata/test.wav")).absoluteFilePath())); + nestedPlaylist.addMedia(&playlist); + player.setPlaylist(&nestedPlaylist); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 1); + QCOMPARE(currentMediaSpy.count(), 6); // _test.wav -> test.wav -> nested playlist + // -> test.wav -> _test.wav -> NoMedia + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(errorSpy.count(), 0); + QCOMPARE(mediaStatusSpy.count(), 13); // 4 x (LoadingMedia -> BufferedMedia -> EndOfMedia) + NoMedia + + player.setPlaylist(Q_NULLPTR); + + mediaSpy.clear(); + currentMediaSpy.clear(); + stateSpy.clear(); + mediaStatusSpy.clear(); + errorSpy.clear(); + + // --- playlist with invalid media + QMediaPlaylist invalidPlaylist; + invalidPlaylist.addMedia(QUrl("invalid")); + invalidPlaylist.addMedia(QUrl::fromLocalFile(QFileInfo(QFINDTESTDATA("testdata/test.wav")).absoluteFilePath())); + + player.setPlaylist(&invalidPlaylist); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 1); + QCOMPARE(currentMediaSpy.count(), 3); // invalid -> test.wav -> NoMedia + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(mediaStatusSpy.count(), 6); // Loading -> Invalid -> Loading -> Buffered -> EndOfMedia -> NoMedia + + player.setPlaylist(Q_NULLPTR); + + mediaSpy.clear(); + currentMediaSpy.clear(); + stateSpy.clear(); + mediaStatusSpy.clear(); + errorSpy.clear(); + + // --- playlist with only invalid media + QMediaPlaylist invalidPlaylist2; + invalidPlaylist2.addMedia(QUrl("invalid")); + invalidPlaylist2.addMedia(QUrl("invalid2")); + + player.setPlaylist(&invalidPlaylist2); + + player.play(); + QTRY_COMPARE_WITH_TIMEOUT(player.state(), QMediaPlayer::StoppedState, 10000); + + QCOMPARE(mediaSpy.count(), 1); + QCOMPARE(currentMediaSpy.count(), 3); // invalid -> invalid2 -> NoMedia + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(errorSpy.count(), 2); + QCOMPARE(mediaStatusSpy.count(), 5); // Loading -> Invalid -> Loading -> Invalid -> NoMedia } void tst_QMediaPlayerBackend::surfaceTest_data() diff --git a/tests/auto/integration/qsoundeffect/BLACKLIST b/tests/auto/integration/qsoundeffect/BLACKLIST index 0f872a576..467169fcf 100644 --- a/tests/auto/integration/qsoundeffect/BLACKLIST +++ b/tests/auto/integration/qsoundeffect/BLACKLIST @@ -4,3 +4,6 @@ linux #QTBUG-55735 [testSetSourceWhilePlaying] linux + +[testSetSourceWhileLoading] +linux diff --git a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp index 0548d1e1a..d2b43c56d 100644 --- a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp +++ b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp @@ -299,7 +299,7 @@ void tst_QMediaObject::notifySignals() QTRY_COMPARE(spy.count(), count); qint64 elapsed = timer.elapsed(); - int expectedElapsed = count * interval * 1.3; // give it some margin of error + int expectedElapsed = count * interval * 1.5; // give it some margin of error QVERIFY2(elapsed < expectedElapsed, QString("elapsed: %1, expected: %2").arg(elapsed).arg(expectedElapsed).toLocal8Bit().constData()); } |