summaryrefslogtreecommitdiffstats
path: root/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
diff options
context:
space:
mode:
authorDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>2010-12-22 15:57:56 +1000
committerDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>2010-12-22 15:57:56 +1000
commitd3a945e2f63eec24a2b0a1269c7bce21bffb6eb3 (patch)
tree5a48794c0859d73f9b833cbbb9e90166803db022 /plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
parent52887b8909a20432266af2d8299d050733e2af18 (diff)
Camerabin: postpone stopping the camera if it's busy.
To ensure the queued image is not lost, recording finished, etc. Reviewed-by: Justin McPherson
Diffstat (limited to 'plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp')
-rw-r--r--plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp54
1 files changed, 47 insertions, 7 deletions
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
index ad2f55747c..56b9e84bc5 100644
--- a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
+++ b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp
@@ -95,6 +95,9 @@ CameraBinControl::CameraBinControl(CameraBinSession *session)
SLOT(handleResourcesLost()));
connect(m_resourcePolicy, SIGNAL(resourcesLost()),
SLOT(handleResourcesLost()));
+
+ connect(m_session, SIGNAL(busyChanged(bool)),
+ SLOT(handleBusyChanged(bool)));
}
CameraBinControl::~CameraBinControl()
@@ -140,6 +143,18 @@ void CameraBinControl::setState(QCamera::State state)
if (m_state != state) {
m_state = state;
+ //special case for stopping the camera while it's busy,
+ //it should be delayed until the camera is idle
+ if (state == QCamera::LoadedState &&
+ m_session->state() == QCamera::ActiveState &&
+ m_session->isBusy()) {
+#ifdef CAMEABIN_DEBUG
+ qDebug() << Q_FUNC_INFO << "Camera is busy, QCamera::stop() is delayed";
+#endif
+ emit stateChanged(m_state);
+ return;
+ }
+
CamerabinResourcePolicy::ResourceSet resourceSet;
switch (state) {
case QCamera::UnloadedState:
@@ -190,10 +205,17 @@ void CameraBinControl::updateStatus()
m_status = QCamera::UnloadedStatus;
break;
case QCamera::LoadedState:
- if (sessionState != QCamera::UnloadedState)
- m_status = QCamera::LoadedStatus;
- else
+ switch (sessionState) {
+ case QCamera::UnloadedState:
m_status = QCamera::LoadingStatus;
+ break;
+ case QCamera::LoadedState:
+ m_status = QCamera::LoadedStatus;
+ break;
+ case QCamera::ActiveState:
+ m_status = QCamera::ActiveStatus;
+ break;
+ }
break;
case QCamera::ActiveState:
switch (sessionState) {
@@ -224,8 +246,11 @@ void CameraBinControl::reloadLater()
#endif
if (!m_reloadPending && m_state == QCamera::ActiveState) {
m_reloadPending = true;
- m_session->setState(QCamera::LoadedState);
- QMetaObject::invokeMethod(this, "delayedReload", Qt::QueuedConnection);
+
+ if (!m_session->isBusy()) {
+ m_session->setState(QCamera::LoadedState);
+ QMetaObject::invokeMethod(this, "delayedReload", Qt::QueuedConnection);
+ }
}
}
@@ -243,8 +268,8 @@ void CameraBinControl::handleResourcesGranted()
qDebug() << Q_FUNC_INFO << ENUM_NAME(QCamera, "State", m_state);
#endif
- //camera will be started soon
- if (m_reloadPending)
+ //camera will be started soon by delayedReload()
+ if (m_reloadPending && m_state == QCamera::ActiveState)
return;
if (m_state == QCamera::ActiveState && m_session->isReady())
@@ -253,6 +278,21 @@ void CameraBinControl::handleResourcesGranted()
m_session->setState(QCamera::LoadedState);
}
+void CameraBinControl::handleBusyChanged(bool busy)
+{
+ if (!busy && m_session->state() == QCamera::ActiveState) {
+ if (m_state == QCamera::LoadedState) {
+ //handle delayed stop() because of busy camera
+ m_resourcePolicy->setResourceSet(CamerabinResourcePolicy::LoadedResources);
+ m_session->setState(QCamera::LoadedState);
+ } else if (m_state == QCamera::ActiveState && m_reloadPending) {
+ //handle delayed reload because of busy camera
+ m_session->setState(QCamera::LoadedState);
+ QMetaObject::invokeMethod(this, "delayedReload", Qt::QueuedConnection);
+ }
+ }
+}
+
void CameraBinControl::delayedReload()
{
#ifdef CAMEABIN_DEBUG