/*!
* This file is part of CameraPlus.
*
- * Copyright (C) 2012 Mohammed Sameer <msameer@foolab.org>
+ * Copyright (C) 2012-2013 Mohammed Sameer <msameer@foolab.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
*/
#include "cameraresources.h"
+#if defined(QT4)
#include <dbusconnectioneventloop.h>
+#endif
#include <QDebug>
+#define APPLICATION_CLASS "camera"
+
CameraResources::CameraResources(QObject *parent) :
QObject(parent),
m_worker(new CameraResourcesWorker) {
m_worker->moveToThread(&m_thread);
+
+#if defined(QT4)
DBUSConnectionEventLoop::getInstance().moveToThread(&m_thread);
+#endif
QObject::connect(&m_thread, SIGNAL(started()), m_worker, SLOT(init()));
m_thread.start();
qRegisterMetaType<CameraResources::Mode>("CameraResources::Mode");
- qRegisterMetaType<CameraResources::ResourceType>("CameraResources::ResourceType");
qRegisterMetaType<bool *>("bool *");
QObject::connect(m_worker, SIGNAL(acquiredChanged()), this, SIGNAL(acquiredChanged()));
QObject::connect(m_worker, SIGNAL(hijackedChanged()), this, SIGNAL(hijackedChanged()));
+ QObject::connect(m_worker, SIGNAL(updated()), this, SIGNAL(updated()));
+ QObject::connect(m_worker, SIGNAL(acquiredChanged()), this, SIGNAL(scaleAcquisitionChanged()));
+ QObject::connect(m_worker, SIGNAL(hijackedChanged()), this, SIGNAL(scaleAcquisitionChanged()));
+ QObject::connect(m_worker, SIGNAL(updated()), this, SIGNAL(scaleAcquisitionChanged()));
}
CameraResources::~CameraResources() {
- m_thread.quit();
- m_thread.wait();
+ acquire(CameraResources::None);
+ m_thread.exit(0);
+
+ while (m_thread.isRunning()) {
+ m_thread.wait(10);
+ }
delete m_worker;
m_worker = 0;
}
-bool CameraResources::isResourceGranted(const ResourceType& resource) {
+bool CameraResources::isResourceGranted(const ResourcePolicy::ResourceType& resource) const {
bool ok = false;
QMetaObject::invokeMethod(m_worker, "isResourceGranted", Qt::BlockingQueuedConnection,
- Q_ARG(bool *, &ok), Q_ARG(CameraResources::ResourceType, resource));
+ Q_ARG(bool *, &ok), Q_ARG(int, resource));
return ok;
}
return ok;
}
+bool CameraResources::isScaleAcquired() const {
+ return isResourceGranted(ResourcePolicy::ScaleButtonType);
+}
+
CameraResourcesWorker::CameraResourcesWorker(QObject *parent) :
QObject(parent),
m_set(0),
}
CameraResourcesWorker::~CameraResourcesWorker() {
- bool ok;
- acquire(&ok, CameraResources::None);
}
void CameraResourcesWorker::init() {
- m_set = new ResourcePolicy::ResourceSet("camera", this);
+ m_set = new ResourcePolicy::ResourceSet(APPLICATION_CLASS, this);
m_set->setAlwaysReply();
QObject::connect(m_set, SIGNAL(resourcesReleased()), this, SLOT(resourcesReleased()));
void CameraResourcesWorker::resourcesGranted(const QList<ResourcePolicy::ResourceType>& optional) {
Q_UNUSED(optional);
+ if (!m_acquiring) {
+ // This can happen when:
+ // 1) We lose/gain optional resources.
+ // 2) A higher priority application releases resources back.
+ emit updated();
+ }
+
m_acquiring = false;
setAcquired(true);
case CameraResources::Image:
*ok = updateSet(QList<ResourcePolicy::ResourceType>()
<< ResourcePolicy::VideoPlaybackType
- << ResourcePolicy::VideoRecorderType
- << ResourcePolicy::ScaleButtonType
- << ResourcePolicy::SnapButtonType);
+ << ResourcePolicy::VideoRecorderType,
+ QList<ResourcePolicy::ResourceType>()
+ << ResourcePolicy::ScaleButtonType);
break;
case CameraResources::Video:
*ok = updateSet(QList<ResourcePolicy::ResourceType>()
<< ResourcePolicy::VideoPlaybackType
- << ResourcePolicy::VideoRecorderType
- << ResourcePolicy::ScaleButtonType
- << ResourcePolicy::SnapButtonType);
+ << ResourcePolicy::VideoRecorderType,
+ QList<ResourcePolicy::ResourceType>()
+ << ResourcePolicy::ScaleButtonType);
break;
case CameraResources::Recording:
*ok = updateSet(QList<ResourcePolicy::ResourceType>()
<< ResourcePolicy::VideoPlaybackType
- << ResourcePolicy::VideoRecorderType
- << ResourcePolicy::ScaleButtonType
- << ResourcePolicy::SnapButtonType,
+ << ResourcePolicy::VideoRecorderType,
QList<ResourcePolicy::ResourceType>()
+ << ResourcePolicy::ScaleButtonType
<< ResourcePolicy::AudioRecorderType
<< ResourcePolicy::AudioPlaybackType);
break;
- case CameraResources::PostCapture:
+ case CameraResources::Player:
*ok = updateSet(QList<ResourcePolicy::ResourceType>()
<< ResourcePolicy::VideoPlaybackType
- << ResourcePolicy::ScaleButtonType,
+ << ResourcePolicy::AudioPlaybackType,
QList<ResourcePolicy::ResourceType>()
- << ResourcePolicy::AudioPlaybackType);
+ << ResourcePolicy::ScaleButtonType);
break;
default:
if (m_set->contains(ResourcePolicy::AudioPlaybackType)) {
bool isOptional = m_set->resource(ResourcePolicy::AudioPlaybackType)->isOptional();
- ResourcePolicy::AudioResource *audio = new ResourcePolicy::AudioResource("camera");
+ ResourcePolicy::AudioResource *audio = new ResourcePolicy::AudioResource(APPLICATION_CLASS);
audio->setProcessID(QCoreApplication::applicationPid());
+ audio->setStreamTag("media.name", "*");
audio->setOptional(isOptional);
m_set->addResourceObject(audio);
}
}
}
-void CameraResourcesWorker::isResourceGranted(bool *ok,
- const CameraResources::ResourceType& resource) {
+void CameraResourcesWorker::isResourceGranted(bool *ok, int resource) {
ResourcePolicy::ResourceType rt = (ResourcePolicy::ResourceType)resource;