summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp')
-rw-r--r--src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp52
1 files changed, 29 insertions, 23 deletions
diff --git a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
index 8ae7f37a9..07ec0b40d 100644
--- a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
@@ -46,8 +46,10 @@
#include <QtCore/QStandardPaths>
#include <QtCore/QVector>
#include <QtCore/qfunctions_winrt.h>
+#include <QtCore/private/qeventdispatcher_winrt_p.h>
#include <QtMultimedia/private/qmediastoragelocation_p.h>
+#include <functional>
#include <wrl.h>
#include <windows.media.capture.h>
#include <windows.media.devices.h>
@@ -161,33 +163,37 @@ int QWinRTCameraImageCaptureControl::capture(const QString &fileName)
fileName.isEmpty() ? QStringLiteral("jpg") : QFileInfo(fileName).suffix())
};
- HRESULT hr;
- hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream).Get(),
- &request.stream);
- Q_ASSERT_SUCCEEDED(hr);
+ HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([this, d, capture, &request]() {
+ HRESULT hr;
+ hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Storage_Streams_InMemoryRandomAccessStream).Get(),
+ &request.stream);
+ Q_ASSERT_SUCCEEDED(hr);
- hr = g->encodingPropertiesFactory->CreateBmp(&request.imageFormat);
- Q_ASSERT_SUCCEEDED(hr);
+ hr = g->encodingPropertiesFactory->CreateBmp(&request.imageFormat);
+ Q_ASSERT_SUCCEEDED(hr);
- const QSize imageSize = static_cast<QWinRTImageEncoderControl*>(d->cameraControl->imageEncoderControl())->imageSettings().resolution();
- hr = request.imageFormat->put_Width(imageSize.width());
- Q_ASSERT_SUCCEEDED(hr);
- hr = request.imageFormat->put_Height(imageSize.height());
- Q_ASSERT_SUCCEEDED(hr);
+ const QSize imageSize = static_cast<QWinRTImageEncoderControl*>(d->cameraControl->imageEncoderControl())->imageSettings().resolution();
+ hr = request.imageFormat->put_Width(imageSize.width());
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = request.imageFormat->put_Height(imageSize.height());
+ Q_ASSERT_SUCCEEDED(hr);
- hr = capture->CapturePhotoToStreamAsync(request.imageFormat.Get(), request.stream.Get(), &request.op);
- Q_ASSERT_SUCCEEDED(hr);
- if (!request.op) {
- qErrnoWarning("Camera photo capture failed.");
+ hr = capture->CapturePhotoToStreamAsync(request.imageFormat.Get(), request.stream.Get(), &request.op);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (!request.op) {
+ qErrnoWarning("Camera photo capture failed.");
+ return E_FAIL;
+ }
+ emit captureQueueChanged(false);
+ d->requests.insert(request.op.Get(), request);
+
+ hr = request.op->put_Completed(Callback<IAsyncActionCompletedHandler>(
+ this, &QWinRTCameraImageCaptureControl::onCaptureCompleted).Get());
+ Q_ASSERT_SUCCEEDED(hr);
+ return hr;
+ });
+ if (FAILED(hr))
return -1;
- }
- emit captureQueueChanged(false);
- d->requests.insert(request.op.Get(), request);
-
- hr = request.op->put_Completed(Callback<IAsyncActionCompletedHandler>(
- this, &QWinRTCameraImageCaptureControl::onCaptureCompleted).Get());
- Q_ASSERT_SUCCEEDED(hr);
-
return request.id;
}