Allow supported camera locks to change after initialization.

A camera backend may not be able to report which locks it supports
until after it is loaded, so query support on demand instead of caching
the value available at construction time.

Change-Id: I56fb1adee980ebc2fa893da3c983a6dce26329c0
Reviewed-by: Yoann Lopes <yoann.lopes@theqtcompany.com>
This commit is contained in:
Andrew den Exter
2014-11-25 09:18:32 +10:00
parent 108dda7a90
commit dc2fec1bd8
3 changed files with 26 additions and 32 deletions

View File

@@ -163,8 +163,6 @@ void QCameraPrivate::initControls()
{
Q_Q(QCamera);
supportedLocks = 0;
if (service) {
control = qobject_cast<QCameraControl *>(service->requestControl(QCameraControl_iid));
locksControl = qobject_cast<QCameraLocksControl *>(service->requestControl(QCameraLocksControl_iid));
@@ -183,7 +181,6 @@ void QCameraPrivate::initControls()
if (locksControl) {
q->connect(locksControl, SIGNAL(lockStatusChanged(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason)),
q, SLOT(_q_updateLockStatus(QCamera::LockType,QCamera::LockStatus,QCamera::LockChangeReason)));
supportedLocks = locksControl->supportedLocks();
}
error = QCamera::NoError;
@@ -225,7 +222,6 @@ void QCameraPrivate::clear()
deviceControl = 0;
infoControl = 0;
service = 0;
supportedLocks = 0;
}
void QCameraPrivate::updateLockStatus()
@@ -236,8 +232,8 @@ void QCameraPrivate::updateLockStatus()
QMap<QCamera::LockStatus, int> lockStatusPriority;
lockStatusPriority.insert(QCamera::Locked, 1);
lockStatusPriority.insert(QCamera::Searching, 2);
lockStatusPriority.insert(QCamera::Unlocked, 3);
lockStatusPriority.insert(QCamera::Unlocked, 2);
lockStatusPriority.insert(QCamera::Searching, 3);
lockStatus = requestedLocks ? QCamera::Locked : QCamera::Unlocked;
int priority = 0;
@@ -673,7 +669,11 @@ QCamera::Status QCamera::status() const
*/
QCamera::LockTypes QCamera::supportedLocks() const
{
return d_func()->supportedLocks;
Q_D(const QCamera);
return d->locksControl
? d->locksControl->supportedLocks()
: QCamera::LockTypes();
}
/*!
@@ -699,16 +699,13 @@ QCamera::LockStatus QCamera::lockStatus(QCamera::LockType lockType) const
{
const QCameraPrivate *d = d_func();
if (!(lockType & d->supportedLocks))
return lockType & d->requestedLocks ? QCamera::Locked : QCamera::Unlocked;
if (!(lockType & d->requestedLocks))
return QCamera::Unlocked;
if (d->locksControl)
return d->locksControl->lockStatus(lockType);
return QCamera::Unlocked;
return QCamera::Locked;
}
/*!
@@ -743,12 +740,11 @@ void QCamera::searchAndLock(QCamera::LockTypes locks)
QCamera::LockStatus oldStatus = d->lockStatus;
d->supressLockChangedSignal = true;
d->requestedLocks |= locks;
locks &= d->supportedLocks;
if (d->locksControl)
if (d->locksControl) {
locks &= d->locksControl->supportedLocks();
d->requestedLocks |= locks;
d->locksControl->searchAndLock(locks);
}
d->supressLockChangedSignal = false;
@@ -776,10 +772,10 @@ void QCamera::unlock(QCamera::LockTypes locks)
d->requestedLocks &= ~locks;
locks &= d->supportedLocks;
if (d->locksControl)
if (d->locksControl) {
locks &= d->locksControl->supportedLocks();
d->locksControl->unlock(locks);
}
d->supressLockChangedSignal = false;

View File

@@ -72,7 +72,6 @@ public:
capture(0),
state(QCamera::UnloadedState),
error(QCamera::NoError),
supportedLocks(QCamera::NoLock),
requestedLocks(QCamera::NoLock),
lockStatus(QCamera::Unlocked),
lockChangeReason(QCamera::UserRequest),
@@ -105,7 +104,6 @@ public:
QCamera::Error error;
QString errorString;
QCamera::LockTypes supportedLocks;
QCamera::LockTypes requestedLocks;
QCamera::LockStatus lockStatus;

View File

@@ -344,13 +344,13 @@ void tst_QCamera::testSimpleCameraLock()
QSignalSpy lockStatusChangedSignal(&camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)));
camera.searchAndLock();
QCOMPARE(camera.lockStatus(), QCamera::Locked);
QCOMPARE(camera.lockStatus(QCamera::LockExposure), QCamera::Locked);
QCOMPARE(camera.lockStatus(QCamera::LockFocus), QCamera::Locked);
QCOMPARE(camera.lockStatus(QCamera::LockWhiteBalance), QCamera::Locked);
QCOMPARE(lockedSignal.count(), 1);
QCOMPARE(camera.lockStatus(), QCamera::Unlocked);
QCOMPARE(camera.lockStatus(QCamera::LockExposure), QCamera::Unlocked);
QCOMPARE(camera.lockStatus(QCamera::LockFocus), QCamera::Unlocked);
QCOMPARE(camera.lockStatus(QCamera::LockWhiteBalance), QCamera::Unlocked);
QCOMPARE(lockedSignal.count(), 0);
QCOMPARE(lockFailedSignal.count(), 0);
QCOMPARE(lockStatusChangedSignal.count(), 1);
QCOMPARE(lockStatusChangedSignal.count(), 0);
lockedSignal.clear();
lockFailedSignal.clear();
@@ -364,7 +364,7 @@ void tst_QCamera::testSimpleCameraLock()
QCOMPARE(lockedSignal.count(), 0);
QCOMPARE(lockFailedSignal.count(), 0);
QCOMPARE(lockStatusChangedSignal.count(), 1);
QCOMPARE(lockStatusChangedSignal.count(), 0);
}
void tst_QCamera::testSimpleCaptureDestination()
@@ -1264,18 +1264,18 @@ void tst_QCamera::testRequestedLocks()
camera.unlock();
camera.searchAndLock(QCamera::LockWhiteBalance);
QCOMPARE(camera.requestedLocks(),QCamera::LockWhiteBalance);
QCOMPARE(camera.requestedLocks(),QCamera::NoLock);
camera.unlock();
camera.searchAndLock(QCamera::LockExposure |QCamera::LockFocus );
QCOMPARE(camera.requestedLocks(),QCamera::LockExposure |QCamera::LockFocus );
camera.searchAndLock(QCamera::LockWhiteBalance);
QCOMPARE(camera.requestedLocks(),QCamera::LockExposure |QCamera::LockFocus|QCamera::LockWhiteBalance );
QCOMPARE(camera.requestedLocks(),QCamera::LockExposure |QCamera::LockFocus);
camera.unlock(QCamera::LockExposure);
QCOMPARE(camera.requestedLocks(),QCamera::LockFocus|QCamera::LockWhiteBalance );
QCOMPARE(camera.requestedLocks(),QCamera::LockFocus);
camera.unlock(QCamera::LockFocus);
camera.searchAndLock(QCamera::LockExposure |QCamera::LockWhiteBalance );
QCOMPARE(camera.requestedLocks(),QCamera::LockExposure|QCamera::LockWhiteBalance );
QCOMPARE(camera.requestedLocks(),QCamera::LockExposure);
}
/* Test case for supportedLocks() */