summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/camera_hal_manager.cpp5
-rw-r--r--src/cam/main.cpp8
-rw-r--r--src/libcamera/camera_manager.cpp36
-rw-r--r--src/qcam/main.cpp4
4 files changed, 30 insertions, 23 deletions
diff --git a/src/android/camera_hal_manager.cpp b/src/android/camera_hal_manager.cpp
index cf981720..22f0323b 100644
--- a/src/android/camera_hal_manager.cpp
+++ b/src/android/camera_hal_manager.cpp
@@ -59,7 +59,7 @@ void CameraHalManager::run()
* order to bind them to the camera HAL manager thread that
* executes the event dispatcher.
*/
- cameraManager_ = libcamera::CameraManager::instance();
+ cameraManager_ = new CameraManager();
int ret = cameraManager_->start();
if (ret) {
@@ -93,7 +93,10 @@ void CameraHalManager::run()
/* Clean up the resources we have allocated. */
proxies_.clear();
+
cameraManager_->stop();
+ delete cameraManager_;
+ cameraManager_ = nullptr;
}
CameraProxy *CameraHalManager::open(unsigned int id,
diff --git a/src/cam/main.cpp b/src/cam/main.cpp
index 77bb20e9..9d99f558 100644
--- a/src/cam/main.cpp
+++ b/src/cam/main.cpp
@@ -23,6 +23,7 @@ class CamApp
{
public:
CamApp();
+ ~CamApp();
static CamApp *instance();
@@ -54,6 +55,11 @@ CamApp::CamApp()
CamApp::app_ = this;
}
+CamApp::~CamApp()
+{
+ delete cm_;
+}
+
CamApp *CamApp::instance()
{
return CamApp::app_;
@@ -67,7 +73,7 @@ int CamApp::init(int argc, char **argv)
if (ret < 0)
return ret;
- cm_ = CameraManager::instance();
+ cm_ = new CameraManager();
ret = cm_->start();
if (ret) {
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 4a880684..12cb5a0b 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -35,11 +35,14 @@ LOG_DEFINE_CATEGORY(Camera)
* in the system to applications. The manager owns all Camera objects and
* handles hot-plugging and hot-unplugging to manage the lifetime of cameras.
*
- * To interact with libcamera, an application retrieves the camera manager
- * instance with CameraManager::instance(). The manager is initially stopped,
- * and shall be configured before being started. In particular a custom event
- * dispatcher shall be installed if needed with
- * CameraManager::setEventDispatcher().
+ * To interact with libcamera, an application starts by creating a camera
+ * manager instance. Only a single instance of the camera manager may exist at
+ * a time. Attempting to create a second instance without first deleting the
+ * existing instance results in undefined behaviour.
+ *
+ * The manager is initially stopped, and shall be configured before being
+ * started. In particular a custom event dispatcher shall be installed if
+ * needed with CameraManager::setEventDispatcher().
*
* Once the camera manager is configured, it shall be started with start().
* This will enumerate all the cameras present in the system, which can then be
@@ -56,13 +59,21 @@ LOG_DEFINE_CATEGORY(Camera)
* removed due to hot-unplug.
*/
+CameraManager *CameraManager::self_ = nullptr;
+
CameraManager::CameraManager()
: enumerator_(nullptr)
{
+ if (self_)
+ LOG(Camera, Fatal)
+ << "Multiple CameraManager objects are not allowed";
+
+ self_ = this;
}
CameraManager::~CameraManager()
{
+ self_ = nullptr;
}
/**
@@ -213,21 +224,6 @@ void CameraManager::removeCamera(Camera *camera)
}
/**
- * \brief Retrieve the camera manager instance
- *
- * The CameraManager is a singleton and can't be constructed manually. This
- * function shall instead be used to retrieve the single global instance of the
- * manager.
- *
- * \return The camera manager instance
- */
-CameraManager *CameraManager::instance()
-{
- static CameraManager manager;
- return &manager;
-}
-
-/**
* \fn const std::string &CameraManager::version()
* \brief Retrieve the libcamera version string
* \return The libcamera version string
diff --git a/src/qcam/main.cpp b/src/qcam/main.cpp
index 05d3b77e..a7ff5c52 100644
--- a/src/qcam/main.cpp
+++ b/src/qcam/main.cpp
@@ -63,7 +63,7 @@ int main(int argc, char **argv)
sigaction(SIGINT, &sa, nullptr);
std::unique_ptr<EventDispatcher> dispatcher(new QtEventDispatcher());
- CameraManager *cm = CameraManager::instance();
+ CameraManager *cm = new CameraManager();
cm->setEventDispatcher(std::move(dispatcher));
ret = cm->start();
@@ -79,5 +79,7 @@ int main(int argc, char **argv)
delete mainWindow;
cm->stop();
+ delete cm;
+
return ret;
}