summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt/qwinrtcameracontrol.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-06-29 16:11:26 +0200
committerLiang Qi <liang.qi@qt.io>2016-06-30 07:33:04 +0200
commit27681cba4695355f2a0a6b01b85c429186d11a34 (patch)
treef11df2ec52d983b552f2e1b673e0845bc7e3ef05 /src/plugins/winrt/qwinrtcameracontrol.cpp
parentf7a93757c709e8b2902bc4707752edb8649d009c (diff)
parentbc53bb7913bbf68519508a0ab76c513335b3e5bb (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Blacklisted a few functions in tst_QAudioInput. Conflicts: .qmake.conf src/plugins/avfoundation/camera/avfcameracontrol.mm src/plugins/avfoundation/camera/avfcameraservice.h src/plugins/avfoundation/camera/avfcameraservice.mm src/plugins/avfoundation/camera/avfcamerasession.h src/plugins/avfoundation/camera/avfcamerasession.mm src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.h src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm src/plugins/avfoundation/camera/avfimagecapturecontrol.mm src/plugins/avfoundation/camera/avfimageencodercontrol.mm src/plugins/avfoundation/camera/avfmediarecordercontrol.h src/plugins/avfoundation/camera/avfmediarecordercontrol.mm tests/auto/integration/qaudioinput/BLACKLIST Task-number: QTBUG-54459 Task-number: QTBUG-49736 Change-Id: I3a1fe8cef50b44d5c2785aaf4cf69fe3f16728e6
Diffstat (limited to 'src/plugins/winrt/qwinrtcameracontrol.cpp')
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp90
1 files changed, 51 insertions, 39 deletions
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index 856549438..390364eb8 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -1124,46 +1124,54 @@ bool QWinRTCameraControl::setFocus(QCameraFocus::FocusModes modes)
if (d->status == QCamera::UnloadedStatus)
return false;
- ComPtr<IFocusSettings> focusSettings;
- ComPtr<IInspectable> focusSettingsObject;
- HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Devices_FocusSettings).Get(), &focusSettingsObject);
- Q_ASSERT_SUCCEEDED(hr);
- hr = focusSettingsObject.As(&focusSettings);
- Q_ASSERT_SUCCEEDED(hr);
- FocusMode mode;
- if (modes.testFlag(QCameraFocus::ContinuousFocus)) {
- mode = FocusMode_Continuous;
- } else if (modes.testFlag(QCameraFocus::AutoFocus)
- || modes.testFlag(QCameraFocus::MacroFocus)
- || modes.testFlag(QCameraFocus::InfinityFocus)) {
- // The Macro and infinity focus modes are only supported in auto focus mode on WinRT.
- // QML camera focus doesn't support combined focus flags settings. In the case of macro
- // and infinity Focus modes, the auto focus setting is applied.
- mode = FocusMode_Single;
- } else {
- emit error(QCamera::NotSupportedFeatureError, QStringLiteral("Unsupported camera focus modes."));
- return false;
- }
- hr = focusSettings->put_Mode(mode);
- Q_ASSERT_SUCCEEDED(hr);
- AutoFocusRange range = AutoFocusRange_Normal;
- if (modes.testFlag(QCameraFocus::MacroFocus))
- range = AutoFocusRange_Macro;
- else if (modes.testFlag(QCameraFocus::InfinityFocus))
- range = AutoFocusRange_FullRange;
- hr = focusSettings->put_AutoFocusRange(range);
- Q_ASSERT_SUCCEEDED(hr);
- hr = focusSettings->put_WaitForFocus(true);
- Q_ASSERT_SUCCEEDED(hr);
- hr = focusSettings->put_DisableDriverFallback(false);
- Q_ASSERT_SUCCEEDED(hr);
+ bool result = false;
+ HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([modes, &result, d, this]() {
+ ComPtr<IFocusSettings> focusSettings;
+ ComPtr<IInspectable> focusSettingsObject;
+ HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Devices_FocusSettings).Get(), &focusSettingsObject);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusSettingsObject.As(&focusSettings);
+ Q_ASSERT_SUCCEEDED(hr);
+ FocusMode mode;
+ if (modes.testFlag(QCameraFocus::ContinuousFocus)) {
+ mode = FocusMode_Continuous;
+ } else if (modes.testFlag(QCameraFocus::AutoFocus)
+ || modes.testFlag(QCameraFocus::MacroFocus)
+ || modes.testFlag(QCameraFocus::InfinityFocus)) {
+ // The Macro and infinity focus modes are only supported in auto focus mode on WinRT.
+ // QML camera focus doesn't support combined focus flags settings. In the case of macro
+ // and infinity Focus modes, the auto focus setting is applied.
+ mode = FocusMode_Single;
+ } else {
+ emit error(QCamera::NotSupportedFeatureError, QStringLiteral("Unsupported camera focus modes."));
+ result = false;
+ return S_OK;
+ }
+ hr = focusSettings->put_Mode(mode);
+ Q_ASSERT_SUCCEEDED(hr);
+ AutoFocusRange range = AutoFocusRange_Normal;
+ if (modes.testFlag(QCameraFocus::MacroFocus))
+ range = AutoFocusRange_Macro;
+ else if (modes.testFlag(QCameraFocus::InfinityFocus))
+ range = AutoFocusRange_FullRange;
+ hr = focusSettings->put_AutoFocusRange(range);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusSettings->put_WaitForFocus(true);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusSettings->put_DisableDriverFallback(false);
+ Q_ASSERT_SUCCEEDED(hr);
- ComPtr<IFocusControl2> focusControl2;
- hr = d->focusControl.As(&focusControl2);
+ ComPtr<IFocusControl2> focusControl2;
+ hr = d->focusControl.As(&focusControl2);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusControl2->Configure(focusSettings.Get());
+ result = SUCCEEDED(hr);
+ RETURN_OK_IF_FAILED("Failed to configure camera focus control");
+ return S_OK;
+ });
Q_ASSERT_SUCCEEDED(hr);
- hr = focusControl2->Configure(focusSettings.Get());
- RETURN_FALSE_IF_FAILED("Failed to configure camera focus control");
- return true;
+ Q_UNUSED(hr); // Silence release build
+ return result;
}
bool QWinRTCameraControl::setFocusPoint(const QPointF &focusPoint)
@@ -1227,7 +1235,11 @@ bool QWinRTCameraControl::focus()
if (!d->focusControl || status == AsyncStatus::Started)
return false;
- hr = d->focusControl->FocusAsync(&d->focusOperation);
+ QEventDispatcherWinRT::runOnXamlThread([&d, &hr]() {
+ hr = d->focusControl->FocusAsync(&d->focusOperation);
+ Q_ASSERT_SUCCEEDED(hr);
+ return S_OK;
+ });
const long errorCode = HRESULT_CODE(hr);
if (errorCode == ERROR_OPERATION_IN_PROGRESS
|| errorCode == ERROR_WRITE_PROTECT) {