diff options
author | Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> | 2010-12-22 15:57:56 +1000 |
---|---|---|
committer | Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> | 2010-12-22 15:57:56 +1000 |
commit | d3a945e2f63eec24a2b0a1269c7bce21bffb6eb3 (patch) | |
tree | 5a48794c0859d73f9b833cbbb9e90166803db022 /plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp | |
parent | 52887b8909a20432266af2d8299d050733e2af18 (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.cpp | 54 |
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 |