diff options
author | Eckhart Koppen <eckhart.koppen@nokia.com> | 2011-04-20 11:52:57 +0300 |
---|---|---|
committer | Eckhart Koppen <eckhart.koppen@nokia.com> | 2011-04-20 11:52:57 +0300 |
commit | fb3e9bc2d941462f1244aaf0ea79425a307f883d (patch) | |
tree | afce91959098ec887ce466abc6e40342261df3db /plugins/multimedia/gstreamer/camerabin | |
parent | c61d909c7b815319e40ba27d7f84e92aa5f1f946 (diff) | |
parent | 6f0dc7cc40dd63763a581a7fb6d4e76649b8026c (diff) |
Merge branch 'master' into 1.2.0v1.2.0
Diffstat (limited to 'plugins/multimedia/gstreamer/camerabin')
6 files changed, 94 insertions, 140 deletions
diff --git a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp index 56b9e84bc5..8c5a31b627 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp +++ b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.cpp @@ -87,6 +87,8 @@ CameraBinControl::CameraBinControl(CameraBinSession *session) SLOT(reloadLater())); connect(m_session, SIGNAL(readyChanged(bool)), SLOT(reloadLater())); + connect(m_session, SIGNAL(error(int,QString)), + SLOT(handleCameraError(int,QString))); m_resourcePolicy = new CamerabinResourcePolicy(this); connect(m_resourcePolicy, SIGNAL(resourcesGranted()), @@ -121,6 +123,7 @@ void CameraBinControl::setCaptureMode(QCamera::CaptureMode mode) CamerabinResourcePolicy::ImageCaptureResources : CamerabinResourcePolicy::VideoCaptureResources); } + emit captureModeChanged(mode); } } @@ -293,6 +296,12 @@ void CameraBinControl::handleBusyChanged(bool busy) } } +void CameraBinControl::handleCameraError(int errorCode, const QString &errorString) +{ + emit error(errorCode, errorString); + setState(QCamera::UnloadedState); +} + void CameraBinControl::delayedReload() { #ifdef CAMEABIN_DEBUG diff --git a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h index 5e45d7a4df..bab17e5a49 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h +++ b/plugins/multimedia/gstreamer/camerabin/camerabincontrol.h @@ -82,6 +82,7 @@ private slots: void handleResourcesLost(); void handleBusyChanged(bool); + void handleCameraError(int error, const QString &errorString); private: void updateSupportedResolutions(const QString &device); diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp index 18a6b664b9..3df1105bc3 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp +++ b/plugins/multimedia/gstreamer/camerabin/camerabinimagecapture.cpp @@ -104,6 +104,12 @@ bool CameraBinImageCapture::isReadyForCapture() const int CameraBinImageCapture::capture(const QString &fileName) { m_requestId++; + + if (!m_ready) { + emit error(m_requestId, QCameraImageCapture::NotReadyError, tr("Camera not ready")); + return m_requestId; + } + #ifdef DEBUG_CAPTURE qDebug() << Q_FUNC_INFO << m_requestId << fileName; #endif diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp index a29831129c..0cd8a5aaf9 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp +++ b/plugins/multimedia/gstreamer/camerabin/camerabinrecorder.cpp @@ -51,7 +51,6 @@ CameraBinRecorder::CameraBinRecorder(CameraBinSession *session) m_state(QMediaRecorder::StoppedState) { connect(m_session, SIGNAL(stateChanged(QCamera::State)), SLOT(updateState())); - connect(m_session, SIGNAL(error(int,QString)), SIGNAL(error(int,QString))); connect(m_session, SIGNAL(durationChanged(qint64)), SIGNAL(durationChanged(qint64))); connect(m_session, SIGNAL(mutedChanged(bool)), this, SIGNAL(mutedChanged(bool))); } diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp index 0d1357ad16..db9218c4a2 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp +++ b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.cpp @@ -47,6 +47,7 @@ //#define DEBUG_RESOURCE_POLICY #include <QtCore/qdebug.h> +#include <QtCore/qset.h> #ifdef HAVE_RESOURCE_POLICY #include <policy/resource.h> @@ -56,57 +57,39 @@ CamerabinResourcePolicy::CamerabinResourcePolicy(QObject *parent) : QObject(parent), - m_resourceSet(NoResources) + m_resourceSet(NoResources), + m_releasingResources(false) { #ifdef HAVE_RESOURCE_POLICY - ResourcePolicy::ResourceSet *resourceSet; - //loaded resource set is also kept requested for image and video capture sets - resourceSet = new ResourcePolicy::ResourceSet("camera", this); - - resourceSet->addResource(ResourcePolicy::VideoRecorderType); - ResourcePolicy::LensCoverResource *lensCoverResource = new ResourcePolicy::LensCoverResource; - lensCoverResource->setOptional(true); - resourceSet->addResourceObject(lensCoverResource); - resourceSet->update(); - - m_resources.append(resourceSet); - m_resourceStatuses.append(Initial); - - //still image resources: - resourceSet = new ResourcePolicy::ResourceSet("camera", this); - resourceSet->addResource(ResourcePolicy::VideoPlaybackType); - resourceSet->addResource(ResourcePolicy::LedsType); - resourceSet->update(); - - m_resources.append(resourceSet); - m_resourceStatuses.append(Initial); - - //video capture resources: - resourceSet = new ResourcePolicy::ResourceSet("camera", this); - - resourceSet->addResource(ResourcePolicy::VideoPlaybackType); - resourceSet->addResource(ResourcePolicy::AudioPlaybackType); - resourceSet->addResource(ResourcePolicy::AudioRecorderType); - resourceSet->addResource(ResourcePolicy::LedsType); - resourceSet->update(); - - m_resources.append(resourceSet); - m_resourceStatuses.append(Initial); - - foreach (ResourcePolicy::ResourceSet *resource, m_resources) { - connect(resource, SIGNAL(resourcesGranted(const QList<ResourcePolicy::ResourceType>)), - this, SLOT(handleResourcesGranted())); - connect(resource, SIGNAL(resourcesDenied()), - this, SLOT(handleResourcesDenied())); - connect(resource, SIGNAL(lostResources()), - this, SLOT(handleResourcesLost())); - } + m_resource = new ResourcePolicy::ResourceSet("camera"); + m_resource->setAlwaysReply(); + m_resource->initAndConnect(); + + connect(m_resource, SIGNAL(resourcesGranted(const QList<ResourcePolicy::ResourceType>)), + SIGNAL(resourcesGranted())); + connect(m_resource, SIGNAL(resourcesDenied()), SIGNAL(resourcesDenied())); + connect(m_resource, SIGNAL(lostResources()), SIGNAL(resourcesLost())); + connect(m_resource, SIGNAL(resourcesReleased()), SLOT(handleResourcesReleased())); #endif } CamerabinResourcePolicy::~CamerabinResourcePolicy() { +#ifdef HAVE_RESOURCE_POLICY + //ensure the resources are released + if (m_resourceSet != NoResources) + setResourceSet(NoResources); + + //don't delete the resource set until resources are released + if (m_releasingResources) { + m_resource->connect(m_resource, SIGNAL(resourcesReleased()), + SLOT(deleteLater())); + } else { + delete m_resource; + m_resource = 0; + } +#endif } CamerabinResourcePolicy::ResourceSet CamerabinResourcePolicy::resourceSet() const @@ -116,8 +99,7 @@ CamerabinResourcePolicy::ResourceSet CamerabinResourcePolicy::resourceSet() cons void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSet set) { - if (m_resourceSet == set) - return; + CamerabinResourcePolicy::ResourceSet oldSet = m_resourceSet; m_resourceSet = set; #ifdef DEBUG_RESOURCE_POLICY @@ -125,108 +107,82 @@ void CamerabinResourcePolicy::setResourceSet(CamerabinResourcePolicy::ResourceSe #endif #ifdef HAVE_RESOURCE_POLICY - m_requestedSets.clear(); + QSet<ResourcePolicy::ResourceType> requestedTypes; + switch (set) { case NoResources: break; case LoadedResources: - m_requestedSets << LoadedResourcesSet; + requestedTypes << ResourcePolicy::LensCoverType //to detect lens cover is opened/closed + << ResourcePolicy::VideoRecorderType //to open camera device + << ResourcePolicy::SnapButtonType; //to detect capture button events break; case ImageCaptureResources: - m_requestedSets << LoadedResourcesSet << ImageResourcesSet; + requestedTypes << ResourcePolicy::LensCoverType + << ResourcePolicy::VideoPlaybackType + << ResourcePolicy::VideoRecorderType + << ResourcePolicy::AudioPlaybackType + << ResourcePolicy::ScaleButtonType + << ResourcePolicy::LedsType + << ResourcePolicy::SnapButtonType; break; case VideoCaptureResources: - m_requestedSets << LoadedResourcesSet << VideoResouresSet; + requestedTypes << ResourcePolicy::LensCoverType + << ResourcePolicy::VideoPlaybackType + << ResourcePolicy::VideoRecorderType + << ResourcePolicy::AudioPlaybackType + << ResourcePolicy::AudioRecorderType + << ResourcePolicy::ScaleButtonType + << ResourcePolicy::LedsType + << ResourcePolicy::SnapButtonType; break; } - //release the resource we don't need any more - for (int i=0; i<m_resources.count(); i++) { - if (!m_requestedSets.contains(i) && m_resourceStatuses[i] != Initial) { - m_resourceStatuses[i] = Initial; - m_resources[i]->release(); - } - } + QSet<ResourcePolicy::ResourceType> currentTypes; + foreach (ResourcePolicy::Resource *resource, m_resource->resources()) + currentTypes << resource->type(); - //and acquire ones we need - foreach (int i, m_requestedSets) { - if (m_resourceStatuses[i] == Initial) { - m_resourceStatuses[i] = RequestedResource; - m_resources[i]->acquire(); - } - } -#endif -} + foreach (ResourcePolicy::ResourceType resourceType, currentTypes - requestedTypes) + m_resource->deleteResource(resourceType); -bool CamerabinResourcePolicy::isResourcesGranted() const -{ - foreach (int i, m_requestedSets) { - if (m_resourceStatuses[i] != GrantedResource) - return false; + foreach (ResourcePolicy::ResourceType resourceType, requestedTypes - currentTypes) { + if (resourceType == ResourcePolicy::LensCoverType) { + ResourcePolicy::LensCoverResource *lensCoverResource = new ResourcePolicy::LensCoverResource; + lensCoverResource->setOptional(true); + m_resource->addResourceObject(lensCoverResource); + } else { + m_resource->addResource(resourceType); + } } - return true; -} - - - -void CamerabinResourcePolicy::handleResourcesGranted() -{ -#ifdef HAVE_RESOURCE_POLICY - for (int i=0; i<m_resources.count(); i++) { - if (sender() == m_resources[i]) { - m_resourceStatuses[i] = GrantedResource; - -#ifdef DEBUG_RESOURCE_POLICY - qDebug() << Q_FUNC_INFO << "Resource granted" << i; -#endif - if (m_requestedSets.contains(i)) { - if (isResourcesGranted()) - emit resourcesGranted(); - } - break; + m_resource->update(); + if (set != NoResources) { + m_resource->acquire(); + } else { + if (oldSet != NoResources) { + m_releasingResources = true; + m_resource->release(); } } #endif } -void CamerabinResourcePolicy::handleResourcesDenied() +bool CamerabinResourcePolicy::isResourcesGranted() const { #ifdef HAVE_RESOURCE_POLICY - for (int i=0; i<m_resources.count(); i++) { - if (sender() == m_resources[i]) { - bool wasGranted = isResourcesGranted(); - m_resourceStatuses[i] = RequestedResource; - -#ifdef DEBUG_RESOURCE_POLICY - qDebug() << Q_FUNC_INFO << "Resource denied" << i << "was granted:" << wasGranted; -#endif - if (wasGranted && m_requestedSets.contains(i)) - emit resourcesDenied(); - - break; - } - } + foreach (ResourcePolicy::Resource *resource, m_resource->resources()) + if (!resource->isOptional() && !resource->isGranted()) + return false; #endif + return true; } -void CamerabinResourcePolicy::handleResourcesLost() +void CamerabinResourcePolicy::handleResourcesReleased() { #ifdef HAVE_RESOURCE_POLICY - for (int i=0; i<m_resources.count(); i++) { - if (sender() == m_resources[i]) { - bool wasGranted = isResourcesGranted(); - m_resourceStatuses[i] = RequestedResource; - #ifdef DEBUG_RESOURCE_POLICY - qDebug() << Q_FUNC_INFO << "Resource lost" << i << "was granted:" << wasGranted; + qDebug() << Q_FUNC_INFO; #endif - - if (wasGranted && m_requestedSets.contains(i)) - emit resourcesLost(); - - break; - } - } + m_releasingResources = false; #endif } diff --git a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h index 4d30da7cc1..cd2d846881 100644 --- a/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h +++ b/plugins/multimedia/gstreamer/camerabin/camerabinresourcepolicy.h @@ -43,7 +43,6 @@ #define CAMERARESOURCEPOLICY_H #include <QtCore/qobject.h> -#include <QtCore/qlist.h> namespace ResourcePolicy { class ResourceSet; @@ -74,28 +73,12 @@ Q_SIGNALS: void resourcesLost(); private Q_SLOTS: - void handleResourcesGranted(); - void handleResourcesDenied(); - void handleResourcesLost(); + void handleResourcesReleased(); private: ResourceSet m_resourceSet; - - enum ResourceStatus { - Initial = 0, - RequestedResource, - GrantedResource - }; - - enum { - LoadedResourcesSet = 0, - ImageResourcesSet, - VideoResouresSet - }; - - QList<ResourcePolicy::ResourceSet *> m_resources; - QList<ResourceStatus> m_resourceStatuses; - QList<int> m_requestedSets; + ResourcePolicy::ResourceSet *m_resource; + bool m_releasingResources; }; #endif |