summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp10
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp3
-rw-r--r--src/plugins/wasapi/qwasapiutils.cpp23
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp11
4 files changed, 41 insertions, 6 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index a7f0254ee..15aa027e4 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -697,7 +697,7 @@ void QAndroidCameraSession::onCameraTakePictureFailed()
void QAndroidCameraSession::onCameraPictureExposed()
{
- if (m_captureCanceled)
+ if (m_captureCanceled || !m_camera)
return;
emit imageExposed(m_currentImageCaptureId);
@@ -706,7 +706,7 @@ void QAndroidCameraSession::onCameraPictureExposed()
void QAndroidCameraSession::onLastPreviewFrameFetched(const QVideoFrame &frame)
{
- if (m_captureCanceled)
+ if (m_captureCanceled || !m_camera)
return;
QtConcurrent::run(this, &QAndroidCameraSession::processPreviewImage,
@@ -730,6 +730,9 @@ void QAndroidCameraSession::processPreviewImage(int id, const QVideoFrame &frame
void QAndroidCameraSession::onNewPreviewFrame(const QVideoFrame &frame)
{
+ if (!m_camera)
+ return;
+
m_videoProbesMutex.lock();
for (QAndroidMediaVideoProbeControl *probe : qAsConst(m_videoProbes))
@@ -756,7 +759,8 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
m_captureCanceled = false;
// Preview needs to be restarted after taking a picture
- m_camera->startPreview();
+ if (m_camera)
+ m_camera->startPreview();
}
void QAndroidCameraSession::onCameraPreviewStarted()
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp
index 9cbb62969..8ee5d67a1 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -402,7 +402,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
} else if (!m_resources.isEmpty()) {
m_pendingTasks |= SetUrlSource;
} else {
- m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
switch (hr) {
@@ -1688,8 +1687,6 @@ void DirectShowPlayerService::run()
QMutexLocker locker(&m_mutex);
for (;;) {
- ::ResetEvent(m_taskHandle);
-
while (m_pendingTasks == 0) {
DWORD result = 0;
diff --git a/src/plugins/wasapi/qwasapiutils.cpp b/src/plugins/wasapi/qwasapiutils.cpp
index 727c94c23..0d03982de 100644
--- a/src/plugins/wasapi/qwasapiutils.cpp
+++ b/src/plugins/wasapi/qwasapiutils.cpp
@@ -90,6 +90,26 @@ struct DeviceMapping {
Q_GLOBAL_STATIC(DeviceMapping, gMapping)
}
+struct CoInitializer
+{
+ CoInitializer()
+ {
+ const bool isGuiThread = QCoreApplication::instance() &&
+ QThread::currentThread() == QCoreApplication::instance()->thread();
+ CoInitializeEx(NULL, isGuiThread ? COINIT_APARTMENTTHREADED : COINIT_MULTITHREADED);
+ }
+
+ ~CoInitializer()
+ {
+ CoUninitialize();
+ }
+};
+
+static void CoInitIfNeeded()
+{
+ static CoInitializer initializer;
+}
+
AudioInterface::AudioInterface()
{
qCDebug(lcMmAudioInterface) << __FUNCTION__;
@@ -182,6 +202,7 @@ QByteArray QWasapiUtils::defaultDevice(QAudio::Mode mode)
{
qCDebug(lcMmUtils) << __FUNCTION__ << mode;
+ CoInitIfNeeded();
QList<QByteArray> &deviceNames = mode == QAudio::AudioInput ? gMapping->inputDeviceNames : gMapping->outputDeviceNames;
QList<QString> &deviceIds = mode == QAudio::AudioInput ? gMapping->inputDeviceIds : gMapping->outputDeviceIds;
if (deviceNames.isEmpty() || deviceIds.isEmpty()) // Initialize
@@ -214,6 +235,7 @@ QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
{
qCDebug(lcMmUtils) << __FUNCTION__ << mode;
+ CoInitIfNeeded();
ComPtr<IDeviceInformationStatics> statics;
HRESULT hr;
@@ -290,6 +312,7 @@ Microsoft::WRL::ComPtr<AudioInterface> QWasapiUtils::createOrGetInterface(const
{
qCDebug(lcMmUtils) << __FUNCTION__ << dev << mode;
Q_ASSERT((mode == QAudio::AudioInput ? gMapping->inputDeviceNames.indexOf(dev) : gMapping->outputDeviceNames.indexOf(dev)) != -1);
+ CoInitIfNeeded();
Microsoft::WRL::ComPtr<AudioInterface> result;
HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([dev, mode, &result]() {
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index 5a703f2e1..9fe0a39ec 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -59,6 +59,7 @@ private slots:
void construction();
void loadMedia();
void unloadMedia();
+ void loadMediaInLoadingState();
void playPauseStop();
void processEOS();
void deleteLaterAtEOS();
@@ -325,6 +326,16 @@ void tst_QMediaPlayerBackend::unloadMedia()
QVERIFY(!positionSpy.isEmpty());
}
+void tst_QMediaPlayerBackend::loadMediaInLoadingState()
+{
+ const QUrl url("http://unavailable.media/");
+ QMediaPlayer player;
+ player.setMedia(QMediaContent(url));
+ player.play();
+ // Sets new media while old has not been finished.
+ player.setMedia(QMediaContent(url));
+ QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::InvalidMedia);
+}
void tst_QMediaPlayerBackend::playPauseStop()
{