Added the ability to control playback volume from post capture
[harmattan/cameraplus] / src / cameraresources.cpp
index 007ebbc..cbaed5c 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * 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;
 }
@@ -84,6 +98,10 @@ bool CameraResources::hijacked() const {
   return ok;
 }
 
+bool CameraResources::isScaleAcquired() const {
+  return isResourceGranted(ResourcePolicy::ScaleButtonType);
+}
+
 CameraResourcesWorker::CameraResourcesWorker(QObject *parent) :
   QObject(parent),
   m_set(0),
@@ -95,13 +113,11 @@ CameraResourcesWorker::CameraResourcesWorker(QObject *parent) :
 }
 
 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()));
@@ -132,6 +148,13 @@ void CameraResourcesWorker::lostResources() {
 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);
@@ -175,36 +198,35 @@ void CameraResourcesWorker::acquire(bool *ok, const CameraResources::Mode& mode)
   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:
@@ -255,8 +277,9 @@ bool CameraResourcesWorker::updateSet(const QList<ResourcePolicy::ResourceType>&
   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);
   }
@@ -301,8 +324,7 @@ void CameraResourcesWorker::setHijacked(bool hijacked) {
   }
 }
 
-void CameraResourcesWorker::isResourceGranted(bool *ok,
-                                             const CameraResources::ResourceType& resource) {
+void CameraResourcesWorker::isResourceGranted(bool *ok, int resource) {
 
   ResourcePolicy::ResourceType rt = (ResourcePolicy::ResourceType)resource;