From 31bb25ae8d6dc669dddabf47d18c517ce9070578 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>
Date: Tue, 5 Feb 2019 13:42:14 +0100
Subject: libcamera: camera: Add helper to check for exclusive access
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Some operations on the camera requires the application to have exclusive
access to the camera. To help check for this in these operations add a
helper.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/camera.h |  1 +
 src/libcamera/camera.cpp   | 22 ++++++++++++++++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index bbe2696e..36bf1cbb 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -50,6 +50,7 @@ private:
 
 	friend class PipelineHandler;
 	void disconnect();
+	int exclusiveAccess();
 
 	std::shared_ptr<PipelineHandler> pipe_;
 	std::string name_;
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index e8dab6f0..62291d2c 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -240,6 +240,23 @@ Camera::streamConfiguration(std::vector<Stream *> &streams)
  * \retval -EINVAL The configuration is not valid
  */
 int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)
+{
+	int ret;
+
+	ret = exclusiveAccess();
+	if (ret)
+		return ret;
+
+	if (!config.size()) {
+		LOG(Camera, Error)
+			<< "Can't configure streams without a configuration";
+		return -EINVAL;
+	}
+
+	return pipe_->configureStreams(this, config);
+}
+
+int Camera::exclusiveAccess()
 {
 	if (disconnected_)
 		return -ENODEV;
@@ -247,10 +264,7 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)
 	if (!acquired_)
 		return -EACCES;
 
-	if (!config.size())
-		return -EINVAL;
-
-	return pipe_->configureStreams(this, config);
+	return 0;
 }
 
 } /* namespace libcamera */
-- 
cgit v1.2.1